#2021 feature - Added stadard WAR structure to run the application on a
Servlet engine
64 files added
5 files modified
| .. | .. |
|---|
| 1 | +<Context > |
|---|
| 2 | + |
|---|
| 3 | + <!-- maxActive: Maximum number of database connections in pool. Make sure you |
|---|
| 4 | + configure your mysqld max_connections large enough to handle |
|---|
| 5 | + all of your db connections. Set to -1 for no limit. |
|---|
| 6 | + --> |
|---|
| 7 | + |
|---|
| 8 | + <!-- maxIdle: Maximum number of idle database connections to retain in pool. |
|---|
| 9 | + Set to -1 for no limit. See also the DBCP documentation on this |
|---|
| 10 | + and the minEvictableIdleTimeMillis configuration parameter. |
|---|
| 11 | + --> |
|---|
| 12 | + |
|---|
| 13 | + <!-- maxWait: Maximum time to wait for a database connection to become available |
|---|
| 14 | + in ms, in this example 10 seconds. An Exception is thrown if |
|---|
| 15 | + this timeout is exceeded. Set to -1 to wait indefinitely. |
|---|
| 16 | + --> |
|---|
| 17 | + |
|---|
| 18 | + <!-- username and password: MySQL username and password for database connections --> |
|---|
| 19 | + |
|---|
| 20 | + <!-- driverClassName: Class name for the old mm.mysql JDBC driver is |
|---|
| 21 | + org.gjt.mm.mysql.Driver - we recommend using Connector/J though. |
|---|
| 22 | + Class name for the official MySQL Connector/J driver is com.mysql.jdbc.Driver. |
|---|
| 23 | + --> |
|---|
| 24 | + |
|---|
| 25 | + <!-- url: The JDBC connection url for connecting to your MySQL database. |
|---|
| 26 | + --> |
|---|
| 27 | +<!-- |
|---|
| 28 | + <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" /> |
|---|
| 29 | + <property name="javax.persistence.jdbc.user" value="curis" /> |
|---|
| 30 | + <property name="javax.persistence.jdbc.password" value="53curi5" /> |
|---|
| 31 | + <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" /> |
|---|
| 32 | + |
|---|
| 33 | + <property name="connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" /> |
|---|
| 34 | + <property name="hibernate.c3p0.acquire_increment" value="1" /> |
|---|
| 35 | + <property name="hibernate.c3p0.idle_test_period" value="60" /> |
|---|
| 36 | + <property name="hibernate.c3p0.min_size" value="1" /> |
|---|
| 37 | + <property name="hibernate.c3p0.max_size" value="10" /> |
|---|
| 38 | + <property name="hibernate.c3p0.max_statements" value="50" /> |
|---|
| 39 | + <property name="hibernate.c3p0.timeout" value="0" /> |
|---|
| 40 | + <property name="hibernate.c3p0.acquireRetryAttempts" value="1" /> |
|---|
| 41 | + <property name="hibernate.c3p0.acquireRetryDelay" value="250" /> |
|---|
| 42 | + --> |
|---|
| 43 | + <Resource name="jdbc/SeCurisDS" auth="Container" type="javax.sql.DataSource" |
|---|
| 44 | + maxActive="100" maxIdle="3" maxWait="5000" |
|---|
| 45 | + username="curis" password="cur151T 53curi5" driverClassName="org.h2.Driver" |
|---|
| 46 | + url="jdbc:h2:~/.SeCuris/db/securis"/> |
|---|
| 47 | + |
|---|
| 48 | +</Context> |
|---|
| .. | .. |
|---|
| 15 | 15 | <groupId>javax.servlet</groupId> |
|---|
| 16 | 16 | <artifactId>javax.servlet-api</artifactId> |
|---|
| 17 | 17 | <version>3.1.0</version> |
|---|
| 18 | | - </dependency> |
|---|
| 19 | | - <dependency> |
|---|
| 20 | | - <groupId>org.eclipse.jetty</groupId> |
|---|
| 21 | | - <artifactId>jetty-webapp</artifactId> |
|---|
| 22 | | - <version>9.0.7.v20131107</version> |
|---|
| 18 | + <scope>provided</scope> |
|---|
| 23 | 19 | </dependency> |
|---|
| 24 | 20 | <dependency> |
|---|
| 25 | 21 | <groupId>org.jboss.resteasy</groupId> |
|---|
| .. | .. |
|---|
| 1 | +package net.curisit.securis; |
|---|
| 2 | + |
|---|
| 3 | +import java.util.List; |
|---|
| 4 | + |
|---|
| 5 | +import javax.servlet.ServletContext; |
|---|
| 6 | +import javax.servlet.ServletContextEvent; |
|---|
| 7 | + |
|---|
| 8 | +import org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener; |
|---|
| 9 | + |
|---|
| 10 | +import com.google.inject.Injector; |
|---|
| 11 | +import com.google.inject.Module; |
|---|
| 12 | +import com.google.inject.persist.PersistService; |
|---|
| 13 | +import com.google.inject.persist.jpa.JpaPersistModule; |
|---|
| 14 | + |
|---|
| 15 | +public class BootstrapListener extends GuiceResteasyBootstrapServletContextListener { |
|---|
| 16 | + |
|---|
| 17 | + @Override |
|---|
| 18 | + public void contextInitialized(ServletContextEvent event) { |
|---|
| 19 | + try { |
|---|
| 20 | + super.contextInitialized(event); |
|---|
| 21 | + } catch (Exception ex) { |
|---|
| 22 | + ex.printStackTrace(); |
|---|
| 23 | + } |
|---|
| 24 | + } |
|---|
| 25 | + |
|---|
| 26 | + @SuppressWarnings("unchecked") |
|---|
| 27 | + @Override |
|---|
| 28 | + protected List<Module> getModules(ServletContext context) { |
|---|
| 29 | + List<Module> modules = (List<Module>) super.getModules(context); |
|---|
| 30 | + modules.add(new JpaPersistModule("localdb")); |
|---|
| 31 | + return modules; |
|---|
| 32 | + } |
|---|
| 33 | + |
|---|
| 34 | + @Override |
|---|
| 35 | + public void withInjector(Injector injector) { |
|---|
| 36 | + injector.getInstance(PersistService.class).start(); |
|---|
| 37 | + } |
|---|
| 38 | + |
|---|
| 39 | +} |
|---|
| .. | .. |
|---|
| 5 | 5 |
|
|---|
| 6 | 6 | import javax.ws.rs.core.Application;
|
|---|
| 7 | 7 |
|
|---|
| 8 | | -import net.curisit.securis.services.BasicServices;
|
|---|
| 9 | | -import net.curisit.securis.services.LicenseServices;
|
|---|
| 10 | | -
|
|---|
| 11 | 8 | import org.apache.logging.log4j.LogManager;
|
|---|
| 12 | 9 | import org.apache.logging.log4j.Logger;
|
|---|
| 13 | 10 |
|
|---|
| .. | .. |
|---|
| 18 | 15 | @Override
|
|---|
| 19 | 16 | public Set<Class<?>> getClasses() {
|
|---|
| 20 | 17 | Set<Class<?>> classes = new HashSet<>();
|
|---|
| 21 | | - classes.add(LicenseServices.class);
|
|---|
| 22 | | - classes.add(BasicServices.class);
|
|---|
| 18 | + // classes.add(LicenseServices.class);
|
|---|
| 19 | + // classes.add(BasicServices.class);
|
|---|
| 23 | 20 |
|
|---|
| 24 | 21 | LOG.info("Returnes classes for services: {}", classes);
|
|---|
| 25 | 22 | return classes;
|
|---|
| .. | .. |
|---|
| 1 | 1 | package net.curisit.securis;
|
|---|
| 2 | 2 |
|
|---|
| 3 | | -import java.io.File;
|
|---|
| 4 | | -import java.io.IOException;
|
|---|
| 5 | | -import java.lang.management.ManagementFactory;
|
|---|
| 6 | | -import java.net.URI;
|
|---|
| 7 | | -import java.net.URISyntaxException;
|
|---|
| 8 | | -import java.util.Properties;
|
|---|
| 9 | | -
|
|---|
| 10 | | -import javax.inject.Inject;
|
|---|
| 11 | | -import javax.inject.Named;
|
|---|
| 12 | | -
|
|---|
| 13 | | -import net.curisit.securis.ioc.RequestsModule;
|
|---|
| 14 | | -import net.curisit.securis.ioc.SecurisModule;
|
|---|
| 15 | | -import net.curisit.securis.utils.Config;
|
|---|
| 16 | | -
|
|---|
| 17 | | -import org.apache.commons.io.FileUtils;
|
|---|
| 18 | 3 | import org.apache.logging.log4j.LogManager;
|
|---|
| 19 | 4 | import org.apache.logging.log4j.Logger;
|
|---|
| 20 | | -import org.eclipse.jetty.http.HttpVersion;
|
|---|
| 21 | | -import org.eclipse.jetty.server.Handler;
|
|---|
| 22 | | -import org.eclipse.jetty.server.HttpConfiguration;
|
|---|
| 23 | | -import org.eclipse.jetty.server.HttpConnectionFactory;
|
|---|
| 24 | | -import org.eclipse.jetty.server.SecureRequestCustomizer;
|
|---|
| 25 | | -import org.eclipse.jetty.server.Server;
|
|---|
| 26 | | -import org.eclipse.jetty.server.ServerConnector;
|
|---|
| 27 | | -import org.eclipse.jetty.server.SslConnectionFactory;
|
|---|
| 28 | | -import org.eclipse.jetty.server.handler.ContextHandlerCollection;
|
|---|
| 29 | | -import org.eclipse.jetty.server.handler.ResourceHandler;
|
|---|
| 30 | | -import org.eclipse.jetty.servlet.ErrorPageErrorHandler;
|
|---|
| 31 | | -import org.eclipse.jetty.servlet.FilterHolder;
|
|---|
| 32 | | -import org.eclipse.jetty.servlet.ServletContextHandler;
|
|---|
| 33 | | -import org.eclipse.jetty.servlet.ServletHolder;
|
|---|
| 34 | | -import org.eclipse.jetty.util.component.AbstractLifeCycle.AbstractLifeCycleListener;
|
|---|
| 35 | | -import org.eclipse.jetty.util.component.LifeCycle;
|
|---|
| 36 | | -import org.eclipse.jetty.util.resource.Resource;
|
|---|
| 37 | | -import org.eclipse.jetty.util.ssl.SslContextFactory;
|
|---|
| 38 | | -import org.eclipse.jetty.util.thread.QueuedThreadPool;
|
|---|
| 39 | | -import org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener;
|
|---|
| 40 | | -import org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher;
|
|---|
| 41 | | -
|
|---|
| 42 | | -import com.google.inject.Guice;
|
|---|
| 43 | | -import com.google.inject.Injector;
|
|---|
| 44 | | -import com.google.inject.Key;
|
|---|
| 45 | | -import com.google.inject.name.Names;
|
|---|
| 46 | | -import com.google.inject.persist.PersistFilter;
|
|---|
| 47 | | -import com.google.inject.persist.jpa.JpaPersistModule;
|
|---|
| 48 | 5 |
|
|---|
| 49 | 6 | public class SeCurisServer {
|
|---|
| 50 | 7 |
|
|---|
| 51 | 8 | private static final Logger LOG = LogManager.getLogger(SeCurisServer.class);
|
|---|
| 52 | 9 | private static final Logger CONSOLE = LogManager.getLogger("console");
|
|---|
| 53 | | -
|
|---|
| 54 | | - private static final String PID_FILE = System.getProperty("user.home") + "/.SeCuris/securis-server.pid";
|
|---|
| 55 | | -
|
|---|
| 56 | | - private static Server server;
|
|---|
| 57 | | - private static Injector injector = null;
|
|---|
| 58 | | -
|
|---|
| 59 | | - @Inject
|
|---|
| 60 | | - @Named("base-uri")
|
|---|
| 61 | | - private URI uri;
|
|---|
| 62 | | -
|
|---|
| 63 | | - private static void showHelp() {
|
|---|
| 64 | | - CONSOLE.info("Execute SeCuris server using:");
|
|---|
| 65 | | - CONSOLE.info(" $ ./securis-server.sh {start|stop}");
|
|---|
| 66 | | - }
|
|---|
| 67 | | -
|
|---|
| 68 | | - public static void main(String[] args) throws Exception {
|
|---|
| 69 | | - String command;
|
|---|
| 70 | | - if (args.length > 0) {
|
|---|
| 71 | | - command = args[0].toLowerCase();
|
|---|
| 72 | | - } else {
|
|---|
| 73 | | - command = "start";
|
|---|
| 74 | | - }
|
|---|
| 75 | | -
|
|---|
| 76 | | - switch (command) {
|
|---|
| 77 | | - case "start":
|
|---|
| 78 | | - startServer();
|
|---|
| 79 | | - break;
|
|---|
| 80 | | - case "stop":
|
|---|
| 81 | | - stopServer();
|
|---|
| 82 | | - break;
|
|---|
| 83 | | -
|
|---|
| 84 | | - default:
|
|---|
| 85 | | - showHelp();
|
|---|
| 86 | | - System.exit(-1);
|
|---|
| 87 | | - }
|
|---|
| 88 | | - }
|
|---|
| 89 | | -
|
|---|
| 90 | | - private static void stopServer() {
|
|---|
| 91 | | - if (!new File(PID_FILE).exists()) {
|
|---|
| 92 | | - CONSOLE.error("SeCuris server is NOT running or PID file is missing");
|
|---|
| 93 | | - System.exit(-3);
|
|---|
| 94 | | - }
|
|---|
| 95 | | - try {
|
|---|
| 96 | | - int pid = Integer.parseInt(FileUtils.readFileToString(new File(PID_FILE)));
|
|---|
| 97 | | - Runtime.getRuntime().exec("kill -SIGINT " + pid);
|
|---|
| 98 | | - new File(PID_FILE).delete();
|
|---|
| 99 | | - CONSOLE.info("SeCuris server process stopped sucessfully (PID: {})", pid);
|
|---|
| 100 | | - } catch (NumberFormatException | IOException e) {
|
|---|
| 101 | | - LOG.error("Error getting SeCuris server process PID from file: {}", PID_FILE);
|
|---|
| 102 | | - }
|
|---|
| 103 | | - }
|
|---|
| 104 | | -
|
|---|
| 105 | | - private static void startServer() {
|
|---|
| 106 | | -
|
|---|
| 107 | | - if (new File(PID_FILE).exists()) {
|
|---|
| 108 | | - try {
|
|---|
| 109 | | - CONSOLE.error("SeCuris server is already running with PID: {}", FileUtils.readFileToString(new File(PID_FILE)));
|
|---|
| 110 | | - } catch (IOException e) {
|
|---|
| 111 | | - LOG.error("Unexpected error", e);
|
|---|
| 112 | | - }
|
|---|
| 113 | | - System.exit(-2);
|
|---|
| 114 | | - }
|
|---|
| 115 | | -
|
|---|
| 116 | | - SecurisModule securisModule = new SecurisModule();
|
|---|
| 117 | | - JpaPersistModule jpaPersistModule = new JpaPersistModule("localdb");
|
|---|
| 118 | | - Properties props = new Properties();
|
|---|
| 119 | | - props.put("javax.persistence.jdbc.password", securisModule.getPassword());
|
|---|
| 120 | | - props.put("javax.persistence.jdbc.url", securisModule.getUrl(securisModule.getAppDir()));
|
|---|
| 121 | | - // LOG.info("BD Url: {} {}",
|
|---|
| 122 | | - // securisModule.getUrl(securisModule.getAppDir()),
|
|---|
| 123 | | - // securisModule.getPassword());
|
|---|
| 124 | | - jpaPersistModule.properties(props);
|
|---|
| 125 | | -
|
|---|
| 126 | | - injector = Guice.createInjector(securisModule, new RequestsModule(), jpaPersistModule);
|
|---|
| 127 | | -
|
|---|
| 128 | | - try {
|
|---|
| 129 | | - startServer(injector.getInstance(Key.get(URI.class, Names.named("base-uri"))));
|
|---|
| 130 | | -
|
|---|
| 131 | | - } catch (SeCurisException e) {
|
|---|
| 132 | | - CONSOLE.error("Error launching the SeCuris server, {}", e);
|
|---|
| 133 | | - }
|
|---|
| 134 | | - }
|
|---|
| 135 | | -
|
|---|
| 136 | | - private static void savePID() throws SeCurisException {
|
|---|
| 137 | | - String runtimeName = ManagementFactory.getRuntimeMXBean().getName();
|
|---|
| 138 | | - // runtimeName contains something like: "12345@localhost"
|
|---|
| 139 | | - String pid = runtimeName.substring(0, runtimeName.indexOf('@'));
|
|---|
| 140 | | - try {
|
|---|
| 141 | | - FileUtils.writeStringToFile(new File(PID_FILE), pid);
|
|---|
| 142 | | - CONSOLE.info("SeCuris server process started sucessfully (PID: {})", pid);
|
|---|
| 143 | | - } catch (IOException e) {
|
|---|
| 144 | | - LOG.error("Error saving pid file", e);
|
|---|
| 145 | | - throw new SeCurisException("Error saving pid file");
|
|---|
| 146 | | - }
|
|---|
| 147 | | - }
|
|---|
| 148 | | -
|
|---|
| 149 | | - private static void startServer(URI uri) throws SeCurisException {
|
|---|
| 150 | | - System.out.println("Starting jetty...");
|
|---|
| 151 | | -
|
|---|
| 152 | | - QueuedThreadPool threadPool = new QueuedThreadPool();
|
|---|
| 153 | | - threadPool.setMaxThreads(50);
|
|---|
| 154 | | -
|
|---|
| 155 | | - server = new Server();
|
|---|
| 156 | | -
|
|---|
| 157 | | - ServerConnector httpConnector = new ServerConnector(server);
|
|---|
| 158 | | - httpConnector.setPort(Config.getInt(Config.KEYS.SERVER_PORT, 9080));
|
|---|
| 159 | | - httpConnector.setHost(Config.get(Config.KEYS.SERVER_HOSTNAME, "0.0.0.0"));
|
|---|
| 160 | | - server.addConnector(httpConnector);
|
|---|
| 161 | | -
|
|---|
| 162 | | - ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
|
|---|
| 163 | | - context.setContextPath("/");
|
|---|
| 164 | | - context.addEventListener(injector.getInstance(GuiceResteasyBootstrapServletContextListener.class));
|
|---|
| 165 | | -
|
|---|
| 166 | | - context.setInitParameter("resteasy.role.based.security", "true");
|
|---|
| 167 | | - context.setInitParameter("resteasy.providers", DefaultExceptionHandler.class.getName());
|
|---|
| 168 | | - context.addFilter(new FilterHolder(injector.getInstance(PersistFilter.class)), "/*", null);
|
|---|
| 169 | | - ServletHolder sh = new ServletHolder(HttpServletDispatcher.class);
|
|---|
| 170 | | - sh.setName("resteasy");
|
|---|
| 171 | | - context.addServlet(sh, "/*");
|
|---|
| 172 | | -
|
|---|
| 173 | | - ResourceHandler staticResources = new ResourceHandler();
|
|---|
| 174 | | - try {
|
|---|
| 175 | | - staticResources.setBaseResource(Resource.newResource(SeCurisServer.class.getResource("/static").toURI()));
|
|---|
| 176 | | - } catch (IOException | URISyntaxException e) {
|
|---|
| 177 | | - LOG.error("Error configuring static resources", e);
|
|---|
| 178 | | - throw new SeCurisException("Error configuring static resources");
|
|---|
| 179 | | - }
|
|---|
| 180 | | - staticResources.setWelcomeFiles(new String[] {
|
|---|
| 181 | | - "/main.html"
|
|---|
| 182 | | - });
|
|---|
| 183 | | - context.setHandler(staticResources);
|
|---|
| 184 | | -
|
|---|
| 185 | | - ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();
|
|---|
| 186 | | - context.setErrorHandler(errorHandler);
|
|---|
| 187 | | - ContextHandlerCollection contexts = new ContextHandlerCollection();
|
|---|
| 188 | | -
|
|---|
| 189 | | - contexts.setHandlers(new Handler[] {
|
|---|
| 190 | | - staticResources, context
|
|---|
| 191 | | - });
|
|---|
| 192 | | -
|
|---|
| 193 | | - HttpConfiguration http_config = new HttpConfiguration();
|
|---|
| 194 | | - http_config.setSecureScheme("https");
|
|---|
| 195 | | - http_config.setSecurePort(Config.getInt(Config.KEYS.SERVER_SSL_PORT, 9443));
|
|---|
| 196 | | - http_config.setOutputBufferSize(32768);
|
|---|
| 197 | | - http_config.setSendServerVersion(true);
|
|---|
| 198 | | - http_config.setSendDateHeader(false);
|
|---|
| 199 | | -
|
|---|
| 200 | | - HttpConfiguration https_config = new HttpConfiguration(http_config);
|
|---|
| 201 | | - https_config.addCustomizer(new SecureRequestCustomizer());
|
|---|
| 202 | | -
|
|---|
| 203 | | - SslContextFactory sslContextFactory = new SslContextFactory();
|
|---|
| 204 | | - sslContextFactory.setKeyStorePath(Config.get(Config.KEYS.KEYSTORE_PATH));
|
|---|
| 205 | | - sslContextFactory.setKeyStoreType(Config.get(Config.KEYS.KEYSTORE_TYPE, "JKS"));
|
|---|
| 206 | | - sslContextFactory.setKeyStorePassword(Config.get(Config.KEYS.KEYSTORE_PASSWORD, ""));
|
|---|
| 207 | | - // sslContextFactory.setCertAlias("1");
|
|---|
| 208 | | - // sslContextFactory.setKeyManagerPassword("curist3c");
|
|---|
| 209 | | - // sslContextFactory.setTrustStorePath("/Users/rob/.ssh/keys/keystore");
|
|---|
| 210 | | - // sslContextFactory.setTrustStorePassword("curist3c");
|
|---|
| 211 | | - sslContextFactory.checkKeyStore();
|
|---|
| 212 | | - sslContextFactory.setNeedClientAuth(false);
|
|---|
| 213 | | -
|
|---|
| 214 | | - ServerConnector sslConnector = new ServerConnector(server, new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
|
|---|
| 215 | | - new HttpConnectionFactory(https_config));
|
|---|
| 216 | | - sslConnector.setPort(Config.getInt(Config.KEYS.SERVER_SSL_PORT, 9443));
|
|---|
| 217 | | - sslConnector.setHost(Config.get(Config.KEYS.SERVER_HOSTNAME, "0.0.0.0"));
|
|---|
| 218 | | - server.addConnector(sslConnector);
|
|---|
| 219 | | -
|
|---|
| 220 | | - server.setHandler(context);
|
|---|
| 221 | | - server.setStopAtShutdown(true);
|
|---|
| 222 | | - server.addLifeCycleListener(new ServerStoppedListener());
|
|---|
| 223 | | - try {
|
|---|
| 224 | | - server.start();
|
|---|
| 225 | | - savePID();
|
|---|
| 226 | | - CONSOLE.info("Server running in: {}", String.format("http://%s:%d", httpConnector.getHost(), httpConnector.getPort()));
|
|---|
| 227 | | - server.join();
|
|---|
| 228 | | - } catch (Exception e) {
|
|---|
| 229 | | - LOG.error("Error starting SeCurisServer", e);
|
|---|
| 230 | | - throw new SeCurisException("Error starting SeCurisServer");
|
|---|
| 231 | | - }
|
|---|
| 232 | | -
|
|---|
| 233 | | - }
|
|---|
| 234 | | -
|
|---|
| 235 | | - static class ServerStoppedListener extends AbstractLifeCycleListener {
|
|---|
| 236 | | - @Override
|
|---|
| 237 | | - public void lifeCycleStopped(LifeCycle event) {
|
|---|
| 238 | | - if (new File(PID_FILE).exists())
|
|---|
| 239 | | - new File(PID_FILE).delete();
|
|---|
| 240 | | - }
|
|---|
| 241 | | - }
|
|---|
| 10 | + //
|
|---|
| 11 | + // private static final String PID_FILE = System.getProperty("user.home") +
|
|---|
| 12 | + // "/.SeCuris/securis-server.pid";
|
|---|
| 13 | + //
|
|---|
| 14 | + // private static Server server;
|
|---|
| 15 | + // private static Injector injector = null;
|
|---|
| 16 | + //
|
|---|
| 17 | + // @Inject
|
|---|
| 18 | + // @Named("base-uri")
|
|---|
| 19 | + // private URI uri;
|
|---|
| 20 | + //
|
|---|
| 21 | + // private static void showHelp() {
|
|---|
| 22 | + // CONSOLE.info("Execute SeCuris server using:");
|
|---|
| 23 | + // CONSOLE.info(" $ ./securis-server.sh {start|stop}");
|
|---|
| 24 | + // }
|
|---|
| 25 | + //
|
|---|
| 26 | + // public static void main(String[] args) throws Exception {
|
|---|
| 27 | + // String command;
|
|---|
| 28 | + // if (args.length > 0) {
|
|---|
| 29 | + // command = args[0].toLowerCase();
|
|---|
| 30 | + // } else {
|
|---|
| 31 | + // command = "start";
|
|---|
| 32 | + // }
|
|---|
| 33 | + //
|
|---|
| 34 | + // switch (command) {
|
|---|
| 35 | + // case "start":
|
|---|
| 36 | + // startServer();
|
|---|
| 37 | + // break;
|
|---|
| 38 | + // case "stop":
|
|---|
| 39 | + // stopServer();
|
|---|
| 40 | + // break;
|
|---|
| 41 | + //
|
|---|
| 42 | + // default:
|
|---|
| 43 | + // showHelp();
|
|---|
| 44 | + // System.exit(-1);
|
|---|
| 45 | + // }
|
|---|
| 46 | + // }
|
|---|
| 47 | + //
|
|---|
| 48 | + // private static void stopServer() {
|
|---|
| 49 | + // if (!new File(PID_FILE).exists()) {
|
|---|
| 50 | + // CONSOLE.error("SeCuris server is NOT running or PID file is missing");
|
|---|
| 51 | + // System.exit(-3);
|
|---|
| 52 | + // }
|
|---|
| 53 | + // try {
|
|---|
| 54 | + // int pid = Integer.parseInt(FileUtils.readFileToString(new
|
|---|
| 55 | + // File(PID_FILE)));
|
|---|
| 56 | + // Runtime.getRuntime().exec("kill -SIGINT " + pid);
|
|---|
| 57 | + // new File(PID_FILE).delete();
|
|---|
| 58 | + // CONSOLE.info("SeCuris server process stopped sucessfully (PID: {})",
|
|---|
| 59 | + // pid);
|
|---|
| 60 | + // } catch (NumberFormatException | IOException e) {
|
|---|
| 61 | + // LOG.error("Error getting SeCuris server process PID from file: {}",
|
|---|
| 62 | + // PID_FILE);
|
|---|
| 63 | + // }
|
|---|
| 64 | + // }
|
|---|
| 65 | + //
|
|---|
| 66 | + // private static void startServer() {
|
|---|
| 67 | + //
|
|---|
| 68 | + // if (new File(PID_FILE).exists()) {
|
|---|
| 69 | + // try {
|
|---|
| 70 | + // CONSOLE.error("SeCuris server is already running with PID: {}",
|
|---|
| 71 | + // FileUtils.readFileToString(new File(PID_FILE)));
|
|---|
| 72 | + // } catch (IOException e) {
|
|---|
| 73 | + // LOG.error("Unexpected error", e);
|
|---|
| 74 | + // }
|
|---|
| 75 | + // System.exit(-2);
|
|---|
| 76 | + // }
|
|---|
| 77 | + //
|
|---|
| 78 | + // SecurisModule securisModule = new SecurisModule();
|
|---|
| 79 | + // JpaPersistModule jpaPersistModule = new JpaPersistModule("localdb");
|
|---|
| 80 | + // Properties props = new Properties();
|
|---|
| 81 | + // props.put("javax.persistence.jdbc.password",
|
|---|
| 82 | + // securisModule.getPassword());
|
|---|
| 83 | + // props.put("javax.persistence.jdbc.url",
|
|---|
| 84 | + // securisModule.getUrl(securisModule.getAppDir()));
|
|---|
| 85 | + // // LOG.info("BD Url: {} {}",
|
|---|
| 86 | + // // securisModule.getUrl(securisModule.getAppDir()),
|
|---|
| 87 | + // // securisModule.getPassword());
|
|---|
| 88 | + // jpaPersistModule.properties(props);
|
|---|
| 89 | + //
|
|---|
| 90 | + // injector = Guice.createInjector(securisModule, new RequestsModule(),
|
|---|
| 91 | + // jpaPersistModule);
|
|---|
| 92 | + //
|
|---|
| 93 | + // try {
|
|---|
| 94 | + // startServer(injector.getInstance(Key.get(URI.class,
|
|---|
| 95 | + // Names.named("base-uri"))));
|
|---|
| 96 | + //
|
|---|
| 97 | + // } catch (SeCurisException e) {
|
|---|
| 98 | + // CONSOLE.error("Error launching the SeCuris server, {}", e);
|
|---|
| 99 | + // }
|
|---|
| 100 | + // }
|
|---|
| 101 | + //
|
|---|
| 102 | + // private static void savePID() throws SeCurisException {
|
|---|
| 103 | + // String runtimeName = ManagementFactory.getRuntimeMXBean().getName();
|
|---|
| 104 | + // // runtimeName contains something like: "12345@localhost"
|
|---|
| 105 | + // String pid = runtimeName.substring(0, runtimeName.indexOf('@'));
|
|---|
| 106 | + // try {
|
|---|
| 107 | + // FileUtils.writeStringToFile(new File(PID_FILE), pid);
|
|---|
| 108 | + // CONSOLE.info("SeCuris server process started sucessfully (PID: {})",
|
|---|
| 109 | + // pid);
|
|---|
| 110 | + // } catch (IOException e) {
|
|---|
| 111 | + // LOG.error("Error saving pid file", e);
|
|---|
| 112 | + // throw new SeCurisException("Error saving pid file");
|
|---|
| 113 | + // }
|
|---|
| 114 | + // }
|
|---|
| 115 | + //
|
|---|
| 116 | + // private static void startServer(URI uri) throws SeCurisException {
|
|---|
| 117 | + // System.out.println("Starting jetty...");
|
|---|
| 118 | + //
|
|---|
| 119 | + // QueuedThreadPool threadPool = new QueuedThreadPool();
|
|---|
| 120 | + // threadPool.setMaxThreads(50);
|
|---|
| 121 | + //
|
|---|
| 122 | + // server = new Server();
|
|---|
| 123 | + //
|
|---|
| 124 | + // ServerConnector httpConnector = new ServerConnector(server);
|
|---|
| 125 | + // httpConnector.setPort(Config.getInt(Config.KEYS.SERVER_PORT, 9080));
|
|---|
| 126 | + // httpConnector.setHost(Config.get(Config.KEYS.SERVER_HOSTNAME,
|
|---|
| 127 | + // "0.0.0.0"));
|
|---|
| 128 | + // server.addConnector(httpConnector);
|
|---|
| 129 | + //
|
|---|
| 130 | + // ServletContextHandler context = new
|
|---|
| 131 | + // ServletContextHandler(ServletContextHandler.SESSIONS);
|
|---|
| 132 | + // context.setContextPath("/");
|
|---|
| 133 | + // context.addEventListener(injector.getInstance(GuiceResteasyBootstrapServletContextListener.class));
|
|---|
| 134 | + //
|
|---|
| 135 | + // context.setInitParameter("resteasy.role.based.security", "true");
|
|---|
| 136 | + // context.setInitParameter("resteasy.providers",
|
|---|
| 137 | + // DefaultExceptionHandler.class.getName());
|
|---|
| 138 | + // context.addFilter(new
|
|---|
| 139 | + // FilterHolder(injector.getInstance(PersistFilter.class)), "/*", null);
|
|---|
| 140 | + // ServletHolder sh = new ServletHolder(HttpServletDispatcher.class);
|
|---|
| 141 | + // sh.setName("resteasy");
|
|---|
| 142 | + // context.addServlet(sh, "/*");
|
|---|
| 143 | + //
|
|---|
| 144 | + // ResourceHandler staticResources = new ResourceHandler();
|
|---|
| 145 | + // try {
|
|---|
| 146 | + // staticResources.setBaseResource(Resource.newResource(SeCurisServer.class.getResource("/static").toURI()));
|
|---|
| 147 | + // } catch (IOException | URISyntaxException e) {
|
|---|
| 148 | + // LOG.error("Error configuring static resources", e);
|
|---|
| 149 | + // throw new SeCurisException("Error configuring static resources");
|
|---|
| 150 | + // }
|
|---|
| 151 | + // staticResources.setWelcomeFiles(new String[] {
|
|---|
| 152 | + // "/main.html"
|
|---|
| 153 | + // });
|
|---|
| 154 | + // context.setHandler(staticResources);
|
|---|
| 155 | + //
|
|---|
| 156 | + // ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();
|
|---|
| 157 | + // context.setErrorHandler(errorHandler);
|
|---|
| 158 | + // ContextHandlerCollection contexts = new ContextHandlerCollection();
|
|---|
| 159 | + //
|
|---|
| 160 | + // contexts.setHandlers(new Handler[] {
|
|---|
| 161 | + // staticResources, context
|
|---|
| 162 | + // });
|
|---|
| 163 | + //
|
|---|
| 164 | + // HttpConfiguration http_config = new HttpConfiguration();
|
|---|
| 165 | + // http_config.setSecureScheme("https");
|
|---|
| 166 | + // http_config.setSecurePort(Config.getInt(Config.KEYS.SERVER_SSL_PORT,
|
|---|
| 167 | + // 9443));
|
|---|
| 168 | + // http_config.setOutputBufferSize(32768);
|
|---|
| 169 | + // http_config.setSendServerVersion(true);
|
|---|
| 170 | + // http_config.setSendDateHeader(false);
|
|---|
| 171 | + //
|
|---|
| 172 | + // HttpConfiguration https_config = new HttpConfiguration(http_config);
|
|---|
| 173 | + // https_config.addCustomizer(new SecureRequestCustomizer());
|
|---|
| 174 | + //
|
|---|
| 175 | + // SslContextFactory sslContextFactory = new SslContextFactory();
|
|---|
| 176 | + // sslContextFactory.setKeyStorePath(Config.get(Config.KEYS.KEYSTORE_PATH));
|
|---|
| 177 | + // sslContextFactory.setKeyStoreType(Config.get(Config.KEYS.KEYSTORE_TYPE,
|
|---|
| 178 | + // "JKS"));
|
|---|
| 179 | + // sslContextFactory.setKeyStorePassword(Config.get(Config.KEYS.KEYSTORE_PASSWORD,
|
|---|
| 180 | + // ""));
|
|---|
| 181 | + // // sslContextFactory.setCertAlias("1");
|
|---|
| 182 | + // // sslContextFactory.setKeyManagerPassword("curist3c");
|
|---|
| 183 | + // // sslContextFactory.setTrustStorePath("/Users/rob/.ssh/keys/keystore");
|
|---|
| 184 | + // // sslContextFactory.setTrustStorePassword("curist3c");
|
|---|
| 185 | + // sslContextFactory.checkKeyStore();
|
|---|
| 186 | + // sslContextFactory.setNeedClientAuth(false);
|
|---|
| 187 | + //
|
|---|
| 188 | + // ServerConnector sslConnector = new ServerConnector(server, new
|
|---|
| 189 | + // SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
|
|---|
| 190 | + // new HttpConnectionFactory(https_config));
|
|---|
| 191 | + // sslConnector.setPort(Config.getInt(Config.KEYS.SERVER_SSL_PORT, 9443));
|
|---|
| 192 | + // sslConnector.setHost(Config.get(Config.KEYS.SERVER_HOSTNAME, "0.0.0.0"));
|
|---|
| 193 | + // server.addConnector(sslConnector);
|
|---|
| 194 | + //
|
|---|
| 195 | + // server.setHandler(context);
|
|---|
| 196 | + // server.setStopAtShutdown(true);
|
|---|
| 197 | + // server.addLifeCycleListener(new ServerStoppedListener());
|
|---|
| 198 | + // try {
|
|---|
| 199 | + // server.start();
|
|---|
| 200 | + // savePID();
|
|---|
| 201 | + // CONSOLE.info("Server running in: {}", String.format("http://%s:%d",
|
|---|
| 202 | + // httpConnector.getHost(), httpConnector.getPort()));
|
|---|
| 203 | + // server.join();
|
|---|
| 204 | + // } catch (Exception e) {
|
|---|
| 205 | + // LOG.error("Error starting SeCurisServer", e);
|
|---|
| 206 | + // throw new SeCurisException("Error starting SeCurisServer");
|
|---|
| 207 | + // }
|
|---|
| 208 | + //
|
|---|
| 209 | + // }
|
|---|
| 210 | + //
|
|---|
| 211 | + // static class ServerStoppedListener extends AbstractLifeCycleListener {
|
|---|
| 212 | + // @Override
|
|---|
| 213 | + // public void lifeCycleStopped(LifeCycle event) {
|
|---|
| 214 | + // if (new File(PID_FILE).exists())
|
|---|
| 215 | + // new File(PID_FILE).delete();
|
|---|
| 216 | + // }
|
|---|
| 217 | + // }
|
|---|
| 242 | 218 |
|
|---|
| 243 | 219 | }
|
|---|
| .. | .. |
|---|
| 11 | 11 | import net.curisit.securis.services.PackResource; |
|---|
| 12 | 12 | import net.curisit.securis.services.UserResource; |
|---|
| 13 | 13 | |
|---|
| 14 | | -import org.eclipse.jetty.server.Authentication.User; |
|---|
| 15 | | -import org.jboss.resteasy.plugins.guice.RequestScoped; |
|---|
| 16 | 14 | import org.jboss.resteasy.plugins.guice.ext.RequestScopeModule; |
|---|
| 17 | | -import org.jboss.resteasy.spi.ResteasyProviderFactory; |
|---|
| 18 | | - |
|---|
| 19 | | -import com.google.inject.Provides; |
|---|
| 20 | 15 | |
|---|
| 21 | 16 | public class RequestsModule extends RequestScopeModule { |
|---|
| 22 | 17 | |
|---|
| .. | .. |
|---|
| 37 | 32 | bind(LicenseResource.class); |
|---|
| 38 | 33 | bind(PackResource.class); |
|---|
| 39 | 34 | } |
|---|
| 40 | | - |
|---|
| 41 | | - @Provides |
|---|
| 42 | | - @RequestScoped |
|---|
| 43 | | - public User provideUser() { |
|---|
| 44 | | - return ResteasyProviderFactory.getContextData(User.class); |
|---|
| 45 | | - } |
|---|
| 35 | + // @Provides |
|---|
| 36 | + // @RequestScoped |
|---|
| 37 | + // public User provideUser() { |
|---|
| 38 | + // return ResteasyProviderFactory.getContextData(User.class); |
|---|
| 39 | + // } |
|---|
| 46 | 40 | |
|---|
| 47 | 41 | } |
|---|
| .. | .. |
|---|
| 5 | 5 | <persistence-unit name="localdb" transaction-type="RESOURCE_LOCAL"> |
|---|
| 6 | 6 | <description>SeCuris LocalDB</description> |
|---|
| 7 | 7 | <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> |
|---|
| 8 | | - <!-- <jta-data-source>java:/DefaultDS</jta-data-source> --> |
|---|
| 8 | + |
|---|
| 9 | + <jta-data-source>java:comp/env/jdbc/SeCurisDS</jta-data-source> |
|---|
| 9 | 10 | |
|---|
| 10 | 11 | <!-- <class>net.curisit.securis.db.UserSettingsUnits</class> --> |
|---|
| 11 | 12 | |
|---|
| 12 | 13 | <properties> |
|---|
| 13 | | - <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" /> |
|---|
| 14 | | -<!-- <property name="javax.persistence.jdbc.url" value="jdbc:h2:~/.SeCuris/db/securis" /> --> |
|---|
| 15 | | - <property name="javax.persistence.jdbc.user" value="curis" /> |
|---|
| 16 | | - <property name="javax.persistence.jdbc.password" value="53curi5" /> |
|---|
| 17 | 14 | <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" /> |
|---|
| 15 | + <property name="hibernate.connection.datasource" value="java:comp/env/jdbc/SeCurisDS"/> |
|---|
| 18 | 16 | |
|---|
| 19 | | - <property name="connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" /> |
|---|
| 20 | | - <property name="hibernate.c3p0.acquire_increment" value="1" /> |
|---|
| 21 | | - <property name="hibernate.c3p0.idle_test_period" value="60" /> |
|---|
| 22 | | - <property name="hibernate.c3p0.min_size" value="1" /> |
|---|
| 23 | | - <property name="hibernate.c3p0.max_size" value="10" /> |
|---|
| 24 | | - <property name="hibernate.c3p0.max_statements" value="50" /> |
|---|
| 25 | | - <property name="hibernate.c3p0.timeout" value="0" /> |
|---|
| 26 | | - <property name="hibernate.c3p0.acquireRetryAttempts" value="1" /> |
|---|
| 27 | | - <property name="hibernate.c3p0.acquireRetryDelay" value="250" /> |
|---|
| 28 | | - |
|---|
| 29 | | - <property name="hibernate.show_sql" value="false" /> |
|---|
| 17 | + <property name="hibernate.show_sql" value="true" /> |
|---|
| 30 | 18 | </properties> |
|---|
| 31 | 19 | |
|---|
| 32 | 20 | </persistence-unit> |
|---|
| .. | .. |
|---|
| 1 | +org.apache.catalina.level=INFO |
|---|
| .. | .. |
|---|
| 1 | +<?xml version="1.0" encoding="utf-8"?> |
|---|
| 2 | +<!-- |
|---|
| 3 | + Licensed to the Apache Software Foundation (ASF) under one or more |
|---|
| 4 | + contributor license agreements. See the NOTICE file distributed with |
|---|
| 5 | + this work for additional information regarding copyright ownership. |
|---|
| 6 | + The ASF licenses this file to You under the Apache License, Version 2.0 |
|---|
| 7 | + (the "License"); you may not use this file except in compliance with |
|---|
| 8 | + the License. You may obtain a copy of the License at |
|---|
| 9 | + |
|---|
| 10 | + http://www.apache.org/licenses/LICENSE-2.0 |
|---|
| 11 | + |
|---|
| 12 | + Unless required by applicable law or agreed to in writing, software |
|---|
| 13 | + distributed under the License is distributed on an "AS IS" BASIS, |
|---|
| 14 | + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|---|
| 15 | + See the License for the specific language governing permissions and |
|---|
| 16 | + limitations under the License. |
|---|
| 17 | +--> |
|---|
| 18 | + |
|---|
| 19 | +<web-app xmlns="http://java.sun.com/xml/ns/javaee" |
|---|
| 20 | + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
|---|
| 21 | + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee |
|---|
| 22 | + http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" |
|---|
| 23 | + version="3.0" |
|---|
| 24 | + metadata-complete="true"> |
|---|
| 25 | + |
|---|
| 26 | + <display-name>SeCuris Server</display-name> |
|---|
| 27 | + <description> |
|---|
| 28 | + SeCuris Server application with client API and administration GUI |
|---|
| 29 | + </description> |
|---|
| 30 | + |
|---|
| 31 | + |
|---|
| 32 | + <context-param> |
|---|
| 33 | + <param-name>resteasy.guice.modules</param-name> |
|---|
| 34 | + <param-value>net.curisit.securis.ioc.SecurisModule,net.curisit.securis.ioc.RequestsModule</param-value> |
|---|
| 35 | + </context-param> |
|---|
| 36 | + <context-param> |
|---|
| 37 | + <param-name>resteasy.role.based.security</param-name> |
|---|
| 38 | + <param-value>true</param-value> |
|---|
| 39 | + </context-param> |
|---|
| 40 | + <context-param> |
|---|
| 41 | + <param-name>resteasy.providers</param-name> |
|---|
| 42 | + <param-value>net.curisit.securis.DefaultExceptionHandler</param-value> |
|---|
| 43 | + </context-param> |
|---|
| 44 | + |
|---|
| 45 | + |
|---|
| 46 | + <filter> |
|---|
| 47 | + <filter-name>Resteasy</filter-name> |
|---|
| 48 | + <filter-class> |
|---|
| 49 | + org.jboss.resteasy.plugins.server.servlet.FilterDispatcher |
|---|
| 50 | + </filter-class> |
|---|
| 51 | + <init-param> |
|---|
| 52 | + <param-name>javax.ws.rs.Application</param-name> |
|---|
| 53 | + <param-value>net.curisit.securis.RestServicesApplication</param-value> |
|---|
| 54 | + </init-param> |
|---|
| 55 | + </filter> |
|---|
| 56 | + |
|---|
| 57 | + <filter-mapping> |
|---|
| 58 | + <filter-name>Resteasy</filter-name> |
|---|
| 59 | + <url-pattern>/*</url-pattern> |
|---|
| 60 | + </filter-mapping> |
|---|
| 61 | + |
|---|
| 62 | + |
|---|
| 63 | + <listener> |
|---|
| 64 | + <listener-class> |
|---|
| 65 | + net.curisit.securis.BootstrapListener |
|---|
| 66 | + </listener-class> |
|---|
| 67 | + </listener> |
|---|
| 68 | + |
|---|
| 69 | + <welcome-file-list> |
|---|
| 70 | + <welcome-file>/main.html</welcome-file> |
|---|
| 71 | + </welcome-file-list> |
|---|
| 72 | + |
|---|
| 73 | + |
|---|
| 74 | + <!-- Security roles referenced by this web application --> |
|---|
| 75 | + <security-role> |
|---|
| 76 | + <description> |
|---|
| 77 | + Advance users, customers |
|---|
| 78 | + </description> |
|---|
| 79 | + <role-name>advance</role-name> |
|---|
| 80 | + </security-role> |
|---|
| 81 | + <security-role> |
|---|
| 82 | + <description> |
|---|
| 83 | + Administrator role |
|---|
| 84 | + </description> |
|---|
| 85 | + <role-name>admin</role-name> |
|---|
| 86 | + </security-role> |
|---|
| 87 | + |
|---|
| 88 | +<resource-env-ref> |
|---|
| 89 | + <resource-env-ref-name>jdbc/SeCurisDS</resource-env-ref-name> |
|---|
| 90 | + <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type> |
|---|
| 91 | + <res-auth>Container</res-auth> |
|---|
| 92 | +</resource-env-ref> |
|---|
| 93 | + |
|---|
| 94 | +</web-app> |
|---|
| .. | .. |
|---|
| 1 | + |
|---|
| 2 | + <div ng-include="'header.html'" ></div> |
|---|
| 3 | + |
|---|
| 4 | + <div class="container"> |
|---|
| 5 | + <div class="col-md-12"> </div> |
|---|
| 6 | + <div class="col-md-2"> |
|---|
| 7 | + |
|---|
| 8 | + <ul class="nav nav-pills nav-stacked"> |
|---|
| 9 | + <li ng-repeat="catalog in catalogsList" ng-class="{active: $index === catalogIndex}"><a ng-click="selectCatalog($index)" ng-bind="catalog.name"></a></li> |
|---|
| 10 | + </ul> |
|---|
| 11 | + |
|---|
| 12 | + </div> |
|---|
| 13 | + <div class="col-md-10"> |
|---|
| 14 | + <div id="toolbarAndForm" ng-controller="CatalogFormCtrl"> |
|---|
| 15 | + <nav class="navbar navbar-default navbar-static-top"> |
|---|
| 16 | + <!-- Brand and toggle get grouped for better mobile display --> |
|---|
| 17 | + <div class="navbar-header"> |
|---|
| 18 | + <a class="navbar-brand" ng-bind="catalogMetadata.name"></a> |
|---|
| 19 | + </div> |
|---|
| 20 | + |
|---|
| 21 | + <!-- Collect the nav links, forms, and other content for toggling --> |
|---|
| 22 | + <div class="collapse navbar-collapse" |
|---|
| 23 | + id="bs-example-navbar-collapse-1"> |
|---|
| 24 | + <ul class="nav navbar-nav"> |
|---|
| 25 | + <li><a i18n ng-click="editNew()"><span class="glyphicon glyphicon-plus"></span> |
|---|
| 26 | + New</a></li> |
|---|
| 27 | + <li><a i18n ng-click="cancel()"> <span |
|---|
| 28 | + class="glyphicon glyphicon-ban-circle"></span> Cancel |
|---|
| 29 | + </a></li> |
|---|
| 30 | + </ul> |
|---|
| 31 | + <div class="navbar-form navbar-right"> |
|---|
| 32 | + <div class="input-group input-group-sm"> |
|---|
| 33 | + <span class="input-group-addon glyphicon glyphicon-search" style="top: 0px;"></span> |
|---|
| 34 | + <input type="text" class="form-control" placeholder="Search" ng-model="$parent.searchText" > |
|---|
| 35 | + <span class="btn input-group-addon glyphicon glyphicon-remove" ng-click="$parent.searchText = ''" style="top: 0px;"></span> |
|---|
| 36 | + </div> |
|---|
| 37 | + </div> |
|---|
| 38 | + </div> |
|---|
| 39 | + </nav> |
|---|
| 40 | + |
|---|
| 41 | + <div class="panel panel-default animate-show ng-hide" ng-show="showForm"> |
|---|
| 42 | + <form role="form" class="form-horizontal " name="catalogForm" id="catalogForm" ng-submit="saveCatalog()" > |
|---|
| 43 | +<!-- <pre>formu: {{formu | json}}</pre>--> |
|---|
| 44 | + <div class="form-group" ng-repeat="field in catalogMetadata.fields" ng-if="(!isNew || !field.autogenerate) && !field.listingOnly"> |
|---|
| 45 | + <label class="col-md-3 control-label" for="{{field.name}}">{{field.display}}</label> |
|---|
| 46 | + <div class="col-md-5"> |
|---|
| 47 | + <div ng-switch on="inputType(field)"> |
|---|
| 48 | + <input catalog-field ng-switch-when="normal" type="{{field.type}}" id="{{field.name}}" name="{{field.name}}" placeholder="" |
|---|
| 49 | + class="form-control" ng-model="formu[field.name]" ng-required="field.mandatory" ng-maxlength="{{field.maxlength}}" /> |
|---|
| 50 | + <input catalog-field ng-switch-when="password" type="{{field.type}}" id="{{field.name}}" name="{{field.name}}" placeholder="" |
|---|
| 51 | + class="form-control" ng-model="formu[field.name]" ng-required="field.mandatory" ng-maxlength="{{field.maxlength}}" /> |
|---|
| 52 | + <textarea catalog-field ng-switch-when="textarea" type="{{field.type}}" id="{{field.name}}" name="{{field.name}}" placeholder="" |
|---|
| 53 | + class="form-control" ng-model="formu[field.name]" rows="{{field.multiline}}" ng-required="field.mandatory" ng-maxlength="{{field.maxlength}}"></textarea> |
|---|
| 54 | + <p ng-switch-when="readonly" class="form-control-static">{{formu[field.name]}}</p> |
|---|
| 55 | + <p ng-switch-when="readonly_date" class="form-control-static">{{formu[field.name] | date:'medium'}}</p> |
|---|
| 56 | + <select ng-switch-when="select" class="form-control" ng-required="field.mandatory" ng-model="formu[field.name]" |
|---|
| 57 | + ng-options="o.id as o.label for o in refs[field.name]" ng-change="selectFieldChanged(field.onchange)"> |
|---|
| 58 | + <option value="" ></option> |
|---|
| 59 | + </select> |
|---|
| 60 | + <select chosen multiple ng-switch-when="multiselect" class="form-control" ng-required="field.mandatory" ng-model="formu[field.name]" |
|---|
| 61 | + ng-options="o.id as o.label for o in refs[field.name]" data-placeholder="..."> |
|---|
| 62 | + </select> |
|---|
| 63 | + <div ng-switch-when="metadata" > |
|---|
| 64 | + <table class="table table-hover table-condensed"> |
|---|
| 65 | + <thead> |
|---|
| 66 | + <tr> |
|---|
| 67 | + <th i18n >Key</th> |
|---|
| 68 | + <th i18n >Value</th> |
|---|
| 69 | + <th i18n >Mandatory</th> |
|---|
| 70 | + <th ng-if="field.allow_creation"><span ng-click="createMetadataRow()" id="md_add" class="btn btn-success btn-xs glyphicon glyphicon-plus"></span></th> |
|---|
| 71 | + </tr> |
|---|
| 72 | + </thead> |
|---|
| 73 | + <tbody> |
|---|
| 74 | + <tr ng-repeat="row_md in formu['metadata']" > |
|---|
| 75 | + <td><input type="text" id="md_key" name="md_key" placeholder="" ng-readonly="!field.allow_creation" |
|---|
| 76 | + class="form-control" ng-model="row_md['key']" ng-required="true" ng-maxlength="150" /> |
|---|
| 77 | + </td> |
|---|
| 78 | + <td> |
|---|
| 79 | + <input type="text" id="md_value" name="md_value" placeholder="" |
|---|
| 80 | + class="form-control" ng-model="row_md['value']" ng-required="false" ng-maxlength="150" /> |
|---|
| 81 | + </td> |
|---|
| 82 | + <td> |
|---|
| 83 | + <input type="checkbox" id="md_mandatory" name="md_mandatory" ng-disabled="!field.allow_creation" |
|---|
| 84 | + class="form-control" ng-model="row_md['mandatory']" /> |
|---|
| 85 | + </td> |
|---|
| 86 | + <td ng-if="field.allow_creation"> |
|---|
| 87 | + <span ng-click="removeMetadataKey(row_md)" id="md_delete" class="btn btn-danger btn-xs glyphicon glyphicon-trash"></span> |
|---|
| 88 | + </td> |
|---|
| 89 | + </tr> |
|---|
| 90 | + </tbody> |
|---|
| 91 | + </table> |
|---|
| 92 | + </div> |
|---|
| 93 | + |
|---|
| 94 | + </div> |
|---|
| 95 | + <div class="alert inline-alert alert-warning" ng-show="catalogForm[field.name].$invalid"> |
|---|
| 96 | + <span class="glyphicon glyphicon-warning-sign"></span> |
|---|
| 97 | + <span ng-show="catalogForm[field.name].$error.maxlength">{{field.display}} length is too long (max: {{field.maxlength}}).<br/></span> |
|---|
| 98 | + <span ng-show="catalogForm[field.name].$error.required">{{field.display}} is required.</span> |
|---|
| 99 | + </div> |
|---|
| 100 | + </div> |
|---|
| 101 | + </div> |
|---|
| 102 | + <div class="form-group"> |
|---|
| 103 | + <div class="col-md-offset-3 col-md-10" id="saveContainer"> |
|---|
| 104 | + <button id="save" type="submit" class="btn btn-primary" > |
|---|
| 105 | + <span i18n class="glyphicon glyphicon-floppy-disk"></span> Save |
|---|
| 106 | + </button> |
|---|
| 107 | + </div> |
|---|
| 108 | + </div> |
|---|
| 109 | + </form> |
|---|
| 110 | + </div> |
|---|
| 111 | + |
|---|
| 112 | + </div> |
|---|
| 113 | + |
|---|
| 114 | + <div class="panel panel-default" ng-controller="CatalogListCtrl"> |
|---|
| 115 | + <div class="panel-heading"> |
|---|
| 116 | + {{catalog.name}} <span class="badge pull-right" ng-bind="list.length || 0"></span> |
|---|
| 117 | + </div> |
|---|
| 118 | + |
|---|
| 119 | + <table class="table table-hover table-condensed"> |
|---|
| 120 | + <thead> |
|---|
| 121 | + <tr> |
|---|
| 122 | + <th ng-repeat="field in catalogMetadata.list_fields" ng-bind="display(field)"></th> |
|---|
| 123 | + <th></th> |
|---|
| 124 | + </tr> |
|---|
| 125 | + </thead> |
|---|
| 126 | + <tbody> |
|---|
| 127 | + <tr ng-repeat="row in list | filter:searchText" ng-dblclick="edit(row)"> |
|---|
| 128 | + <td ng-repeat="field in catalogMetadata.list_fields" ng-bind="print(field, row)"></td> |
|---|
| 129 | + |
|---|
| 130 | + <td><span ng-click="edit(row)" |
|---|
| 131 | + class="glyphicon glyphicon-pencil"></span> |
|---|
| 132 | + <span ng-click="delete(row)" |
|---|
| 133 | + class="glyphicon glyphicon-remove"></span> |
|---|
| 134 | + </td> |
|---|
| 135 | + </tr> |
|---|
| 136 | + </tbody> |
|---|
| 137 | + <tfoot> |
|---|
| 138 | + </tfoot> |
|---|
| 139 | + </table> |
|---|
| 140 | + </div> |
|---|
| 141 | + </div> |
|---|
| 142 | + |
|---|
| 143 | + </div> |
|---|
| .. | .. |
|---|
| 1 | +.bootstrap-dialog { |
|---|
| 2 | + |
|---|
| 3 | +} |
|---|
| 4 | +.bootstrap-dialog .modal-header { |
|---|
| 5 | + border-top-left-radius: 4px; |
|---|
| 6 | + border-top-right-radius: 4px; |
|---|
| 7 | +} |
|---|
| 8 | +.bootstrap-dialog .bootstrap-dialog-title { |
|---|
| 9 | + color: #fff; |
|---|
| 10 | + display: inline-block; |
|---|
| 11 | +} |
|---|
| 12 | +.bootstrap-dialog.type-default .bootstrap-dialog-title { |
|---|
| 13 | + color: #333; |
|---|
| 14 | +} |
|---|
| 15 | +.bootstrap-dialog.size-normal .bootstrap-dialog-title { |
|---|
| 16 | + font-size: 16px; |
|---|
| 17 | +} |
|---|
| 18 | +.bootstrap-dialog.size-large .bootstrap-dialog-title { |
|---|
| 19 | + font-size: 24px; |
|---|
| 20 | +} |
|---|
| 21 | +.bootstrap-dialog .bootstrap-dialog-close-button { |
|---|
| 22 | + float: right; |
|---|
| 23 | + filter:alpha(opacity=90); |
|---|
| 24 | + -moz-opacity:0.9; |
|---|
| 25 | + -khtml-opacity: 0.9; |
|---|
| 26 | + opacity: 0.9; |
|---|
| 27 | +} |
|---|
| 28 | +.bootstrap-dialog.size-normal .bootstrap-dialog-close-button { |
|---|
| 29 | + font-size: 20px; |
|---|
| 30 | +} |
|---|
| 31 | +.bootstrap-dialog.size-large .bootstrap-dialog-close-button { |
|---|
| 32 | + font-size: 30px; |
|---|
| 33 | +} |
|---|
| 34 | +.bootstrap-dialog .bootstrap-dialog-close-button:hover { |
|---|
| 35 | + cursor: pointer; |
|---|
| 36 | + filter: alpha(opacity=100); |
|---|
| 37 | + -moz-opacity: 1; |
|---|
| 38 | + -khtml-opacity: 1; |
|---|
| 39 | + opacity: 1; |
|---|
| 40 | +} |
|---|
| 41 | +.bootstrap-dialog.size-normal .bootstrap-dialog-message { |
|---|
| 42 | + font-size: 14px; |
|---|
| 43 | +} |
|---|
| 44 | +.bootstrap-dialog.size-large .bootstrap-dialog-message { |
|---|
| 45 | + font-size: 18px; |
|---|
| 46 | +} |
|---|
| 47 | +.bootstrap-dialog.type-default .modal-header { |
|---|
| 48 | + background-color: #fff; |
|---|
| 49 | +} |
|---|
| 50 | +.bootstrap-dialog.type-info .modal-header { |
|---|
| 51 | + background-color: #5bc0de; |
|---|
| 52 | +} |
|---|
| 53 | +.bootstrap-dialog.type-primary .modal-header { |
|---|
| 54 | + background-color: #428bca; |
|---|
| 55 | +} |
|---|
| 56 | +.bootstrap-dialog.type-success .modal-header { |
|---|
| 57 | + background-color: #5cb85c; |
|---|
| 58 | +} |
|---|
| 59 | +.bootstrap-dialog.type-warning .modal-header { |
|---|
| 60 | + background-color: #f0ad4e; |
|---|
| 61 | +} |
|---|
| 62 | +.bootstrap-dialog.type-danger .modal-header { |
|---|
| 63 | + background-color: #d9534f; |
|---|
| 64 | +} |
|---|
| 65 | +.bootstrap-dialog .bootstrap-dialog-button-icon { |
|---|
| 66 | + margin-right: 3px; |
|---|
| 67 | +} |
|---|
| 68 | + |
|---|
| 69 | +/** |
|---|
| 70 | + * Icon animation |
|---|
| 71 | + * Copied from font-awesome: http://fontawesome.io/ |
|---|
| 72 | + **/ |
|---|
| 73 | +.icon-spin { |
|---|
| 74 | + display: inline-block; |
|---|
| 75 | + -moz-animation: spin 2s infinite linear; |
|---|
| 76 | + -o-animation: spin 2s infinite linear; |
|---|
| 77 | + -webkit-animation: spin 2s infinite linear; |
|---|
| 78 | + animation: spin 2s infinite linear; |
|---|
| 79 | +} |
|---|
| 80 | +@-moz-keyframes spin { |
|---|
| 81 | + 0% { |
|---|
| 82 | + -moz-transform: rotate(0deg); |
|---|
| 83 | +} |
|---|
| 84 | +100% { |
|---|
| 85 | + -moz-transform: rotate(359deg); |
|---|
| 86 | +} |
|---|
| 87 | +} |
|---|
| 88 | +@-webkit-keyframes spin { |
|---|
| 89 | + 0% { |
|---|
| 90 | + -webkit-transform: rotate(0deg); |
|---|
| 91 | +} |
|---|
| 92 | +100% { |
|---|
| 93 | + -webkit-transform: rotate(359deg); |
|---|
| 94 | +} |
|---|
| 95 | +} |
|---|
| 96 | +@-o-keyframes spin { |
|---|
| 97 | + 0% { |
|---|
| 98 | + -o-transform: rotate(0deg); |
|---|
| 99 | +} |
|---|
| 100 | +100% { |
|---|
| 101 | + -o-transform: rotate(359deg); |
|---|
| 102 | +} |
|---|
| 103 | +} |
|---|
| 104 | +@-ms-keyframes spin { |
|---|
| 105 | + 0% { |
|---|
| 106 | + -ms-transform: rotate(0deg); |
|---|
| 107 | +} |
|---|
| 108 | +100% { |
|---|
| 109 | + -ms-transform: rotate(359deg); |
|---|
| 110 | +} |
|---|
| 111 | +} |
|---|
| 112 | +@keyframes spin { |
|---|
| 113 | + 0% { |
|---|
| 114 | + transform: rotate(0deg); |
|---|
| 115 | +} |
|---|
| 116 | +100% { |
|---|
| 117 | + transform: rotate(359deg); |
|---|
| 118 | +} |
|---|
| 119 | +} |
|---|
| 120 | +/** End of icon animation **/ |
|---|
| .. | .. |
|---|
| 1 | +/*! |
|---|
| 2 | + * Bootstrap v3.2.0 (http://getbootstrap.com) |
|---|
| 3 | + * Copyright 2011-2014 Twitter, Inc. |
|---|
| 4 | + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
|---|
| 5 | + */ |
|---|
| 6 | + |
|---|
| 7 | +.btn-default, |
|---|
| 8 | +.btn-primary, |
|---|
| 9 | +.btn-success, |
|---|
| 10 | +.btn-info, |
|---|
| 11 | +.btn-warning, |
|---|
| 12 | +.btn-danger { |
|---|
| 13 | + text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); |
|---|
| 14 | + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); |
|---|
| 15 | + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); |
|---|
| 16 | +} |
|---|
| 17 | +.btn-default:active, |
|---|
| 18 | +.btn-primary:active, |
|---|
| 19 | +.btn-success:active, |
|---|
| 20 | +.btn-info:active, |
|---|
| 21 | +.btn-warning:active, |
|---|
| 22 | +.btn-danger:active, |
|---|
| 23 | +.btn-default.active, |
|---|
| 24 | +.btn-primary.active, |
|---|
| 25 | +.btn-success.active, |
|---|
| 26 | +.btn-info.active, |
|---|
| 27 | +.btn-warning.active, |
|---|
| 28 | +.btn-danger.active { |
|---|
| 29 | + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); |
|---|
| 30 | + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); |
|---|
| 31 | +} |
|---|
| 32 | +.btn:active, |
|---|
| 33 | +.btn.active { |
|---|
| 34 | + background-image: none; |
|---|
| 35 | +} |
|---|
| 36 | +.btn-default { |
|---|
| 37 | + text-shadow: 0 1px 0 #fff; |
|---|
| 38 | + background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); |
|---|
| 39 | + background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); |
|---|
| 40 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); |
|---|
| 41 | + background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); |
|---|
| 42 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); |
|---|
| 43 | + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); |
|---|
| 44 | + background-repeat: repeat-x; |
|---|
| 45 | + border-color: #dbdbdb; |
|---|
| 46 | + border-color: #ccc; |
|---|
| 47 | +} |
|---|
| 48 | +.btn-default:hover, |
|---|
| 49 | +.btn-default:focus { |
|---|
| 50 | + background-color: #e0e0e0; |
|---|
| 51 | + background-position: 0 -15px; |
|---|
| 52 | +} |
|---|
| 53 | +.btn-default:active, |
|---|
| 54 | +.btn-default.active { |
|---|
| 55 | + background-color: #e0e0e0; |
|---|
| 56 | + border-color: #dbdbdb; |
|---|
| 57 | +} |
|---|
| 58 | +.btn-default:disabled, |
|---|
| 59 | +.btn-default[disabled] { |
|---|
| 60 | + background-color: #e0e0e0; |
|---|
| 61 | + background-image: none; |
|---|
| 62 | +} |
|---|
| 63 | +.btn-primary { |
|---|
| 64 | + background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); |
|---|
| 65 | + background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%); |
|---|
| 66 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#2d6ca2)); |
|---|
| 67 | + background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); |
|---|
| 68 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); |
|---|
| 69 | + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); |
|---|
| 70 | + background-repeat: repeat-x; |
|---|
| 71 | + border-color: #2b669a; |
|---|
| 72 | +} |
|---|
| 73 | +.btn-primary:hover, |
|---|
| 74 | +.btn-primary:focus { |
|---|
| 75 | + background-color: #2d6ca2; |
|---|
| 76 | + background-position: 0 -15px; |
|---|
| 77 | +} |
|---|
| 78 | +.btn-primary:active, |
|---|
| 79 | +.btn-primary.active { |
|---|
| 80 | + background-color: #2d6ca2; |
|---|
| 81 | + border-color: #2b669a; |
|---|
| 82 | +} |
|---|
| 83 | +.btn-primary:disabled, |
|---|
| 84 | +.btn-primary[disabled] { |
|---|
| 85 | + background-color: #2d6ca2; |
|---|
| 86 | + background-image: none; |
|---|
| 87 | +} |
|---|
| 88 | +.btn-success { |
|---|
| 89 | + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); |
|---|
| 90 | + background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); |
|---|
| 91 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); |
|---|
| 92 | + background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); |
|---|
| 93 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); |
|---|
| 94 | + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); |
|---|
| 95 | + background-repeat: repeat-x; |
|---|
| 96 | + border-color: #3e8f3e; |
|---|
| 97 | +} |
|---|
| 98 | +.btn-success:hover, |
|---|
| 99 | +.btn-success:focus { |
|---|
| 100 | + background-color: #419641; |
|---|
| 101 | + background-position: 0 -15px; |
|---|
| 102 | +} |
|---|
| 103 | +.btn-success:active, |
|---|
| 104 | +.btn-success.active { |
|---|
| 105 | + background-color: #419641; |
|---|
| 106 | + border-color: #3e8f3e; |
|---|
| 107 | +} |
|---|
| 108 | +.btn-success:disabled, |
|---|
| 109 | +.btn-success[disabled] { |
|---|
| 110 | + background-color: #419641; |
|---|
| 111 | + background-image: none; |
|---|
| 112 | +} |
|---|
| 113 | +.btn-info { |
|---|
| 114 | + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); |
|---|
| 115 | + background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); |
|---|
| 116 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); |
|---|
| 117 | + background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); |
|---|
| 118 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); |
|---|
| 119 | + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); |
|---|
| 120 | + background-repeat: repeat-x; |
|---|
| 121 | + border-color: #28a4c9; |
|---|
| 122 | +} |
|---|
| 123 | +.btn-info:hover, |
|---|
| 124 | +.btn-info:focus { |
|---|
| 125 | + background-color: #2aabd2; |
|---|
| 126 | + background-position: 0 -15px; |
|---|
| 127 | +} |
|---|
| 128 | +.btn-info:active, |
|---|
| 129 | +.btn-info.active { |
|---|
| 130 | + background-color: #2aabd2; |
|---|
| 131 | + border-color: #28a4c9; |
|---|
| 132 | +} |
|---|
| 133 | +.btn-info:disabled, |
|---|
| 134 | +.btn-info[disabled] { |
|---|
| 135 | + background-color: #2aabd2; |
|---|
| 136 | + background-image: none; |
|---|
| 137 | +} |
|---|
| 138 | +.btn-warning { |
|---|
| 139 | + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); |
|---|
| 140 | + background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); |
|---|
| 141 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); |
|---|
| 142 | + background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); |
|---|
| 143 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); |
|---|
| 144 | + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); |
|---|
| 145 | + background-repeat: repeat-x; |
|---|
| 146 | + border-color: #e38d13; |
|---|
| 147 | +} |
|---|
| 148 | +.btn-warning:hover, |
|---|
| 149 | +.btn-warning:focus { |
|---|
| 150 | + background-color: #eb9316; |
|---|
| 151 | + background-position: 0 -15px; |
|---|
| 152 | +} |
|---|
| 153 | +.btn-warning:active, |
|---|
| 154 | +.btn-warning.active { |
|---|
| 155 | + background-color: #eb9316; |
|---|
| 156 | + border-color: #e38d13; |
|---|
| 157 | +} |
|---|
| 158 | +.btn-warning:disabled, |
|---|
| 159 | +.btn-warning[disabled] { |
|---|
| 160 | + background-color: #eb9316; |
|---|
| 161 | + background-image: none; |
|---|
| 162 | +} |
|---|
| 163 | +.btn-danger { |
|---|
| 164 | + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); |
|---|
| 165 | + background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); |
|---|
| 166 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); |
|---|
| 167 | + background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); |
|---|
| 168 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); |
|---|
| 169 | + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); |
|---|
| 170 | + background-repeat: repeat-x; |
|---|
| 171 | + border-color: #b92c28; |
|---|
| 172 | +} |
|---|
| 173 | +.btn-danger:hover, |
|---|
| 174 | +.btn-danger:focus { |
|---|
| 175 | + background-color: #c12e2a; |
|---|
| 176 | + background-position: 0 -15px; |
|---|
| 177 | +} |
|---|
| 178 | +.btn-danger:active, |
|---|
| 179 | +.btn-danger.active { |
|---|
| 180 | + background-color: #c12e2a; |
|---|
| 181 | + border-color: #b92c28; |
|---|
| 182 | +} |
|---|
| 183 | +.btn-danger:disabled, |
|---|
| 184 | +.btn-danger[disabled] { |
|---|
| 185 | + background-color: #c12e2a; |
|---|
| 186 | + background-image: none; |
|---|
| 187 | +} |
|---|
| 188 | +.thumbnail, |
|---|
| 189 | +.img-thumbnail { |
|---|
| 190 | + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); |
|---|
| 191 | + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); |
|---|
| 192 | +} |
|---|
| 193 | +.dropdown-menu > li > a:hover, |
|---|
| 194 | +.dropdown-menu > li > a:focus { |
|---|
| 195 | + background-color: #e8e8e8; |
|---|
| 196 | + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); |
|---|
| 197 | + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); |
|---|
| 198 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); |
|---|
| 199 | + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); |
|---|
| 200 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); |
|---|
| 201 | + background-repeat: repeat-x; |
|---|
| 202 | +} |
|---|
| 203 | +.dropdown-menu > .active > a, |
|---|
| 204 | +.dropdown-menu > .active > a:hover, |
|---|
| 205 | +.dropdown-menu > .active > a:focus { |
|---|
| 206 | + background-color: #357ebd; |
|---|
| 207 | + background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); |
|---|
| 208 | + background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%); |
|---|
| 209 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd)); |
|---|
| 210 | + background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); |
|---|
| 211 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); |
|---|
| 212 | + background-repeat: repeat-x; |
|---|
| 213 | +} |
|---|
| 214 | +.navbar-default { |
|---|
| 215 | + background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); |
|---|
| 216 | + background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); |
|---|
| 217 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); |
|---|
| 218 | + background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); |
|---|
| 219 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); |
|---|
| 220 | + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); |
|---|
| 221 | + background-repeat: repeat-x; |
|---|
| 222 | + border-radius: 4px; |
|---|
| 223 | + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); |
|---|
| 224 | + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); |
|---|
| 225 | +} |
|---|
| 226 | +.navbar-default .navbar-nav > .active > a { |
|---|
| 227 | + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); |
|---|
| 228 | + background-image: -o-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); |
|---|
| 229 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f3f3f3)); |
|---|
| 230 | + background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%); |
|---|
| 231 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0); |
|---|
| 232 | + background-repeat: repeat-x; |
|---|
| 233 | + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); |
|---|
| 234 | + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); |
|---|
| 235 | +} |
|---|
| 236 | +.navbar-brand, |
|---|
| 237 | +.navbar-nav > li > a { |
|---|
| 238 | + text-shadow: 0 1px 0 rgba(255, 255, 255, .25); |
|---|
| 239 | +} |
|---|
| 240 | +.navbar-inverse { |
|---|
| 241 | + background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); |
|---|
| 242 | + background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); |
|---|
| 243 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); |
|---|
| 244 | + background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); |
|---|
| 245 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); |
|---|
| 246 | + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); |
|---|
| 247 | + background-repeat: repeat-x; |
|---|
| 248 | +} |
|---|
| 249 | +.navbar-inverse .navbar-nav > .active > a { |
|---|
| 250 | + background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%); |
|---|
| 251 | + background-image: -o-linear-gradient(top, #222 0%, #282828 100%); |
|---|
| 252 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#222), to(#282828)); |
|---|
| 253 | + background-image: linear-gradient(to bottom, #222 0%, #282828 100%); |
|---|
| 254 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0); |
|---|
| 255 | + background-repeat: repeat-x; |
|---|
| 256 | + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); |
|---|
| 257 | + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); |
|---|
| 258 | +} |
|---|
| 259 | +.navbar-inverse .navbar-brand, |
|---|
| 260 | +.navbar-inverse .navbar-nav > li > a { |
|---|
| 261 | + text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); |
|---|
| 262 | +} |
|---|
| 263 | +.navbar-static-top, |
|---|
| 264 | +.navbar-fixed-top, |
|---|
| 265 | +.navbar-fixed-bottom { |
|---|
| 266 | + border-radius: 0; |
|---|
| 267 | +} |
|---|
| 268 | +.alert { |
|---|
| 269 | + text-shadow: 0 1px 0 rgba(255, 255, 255, .2); |
|---|
| 270 | + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); |
|---|
| 271 | + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); |
|---|
| 272 | +} |
|---|
| 273 | +.alert-success { |
|---|
| 274 | + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); |
|---|
| 275 | + background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); |
|---|
| 276 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); |
|---|
| 277 | + background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); |
|---|
| 278 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); |
|---|
| 279 | + background-repeat: repeat-x; |
|---|
| 280 | + border-color: #b2dba1; |
|---|
| 281 | +} |
|---|
| 282 | +.alert-info { |
|---|
| 283 | + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); |
|---|
| 284 | + background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); |
|---|
| 285 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); |
|---|
| 286 | + background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); |
|---|
| 287 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); |
|---|
| 288 | + background-repeat: repeat-x; |
|---|
| 289 | + border-color: #9acfea; |
|---|
| 290 | +} |
|---|
| 291 | +.alert-warning { |
|---|
| 292 | + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); |
|---|
| 293 | + background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); |
|---|
| 294 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); |
|---|
| 295 | + background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); |
|---|
| 296 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); |
|---|
| 297 | + background-repeat: repeat-x; |
|---|
| 298 | + border-color: #f5e79e; |
|---|
| 299 | +} |
|---|
| 300 | +.alert-danger { |
|---|
| 301 | + background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); |
|---|
| 302 | + background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); |
|---|
| 303 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); |
|---|
| 304 | + background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); |
|---|
| 305 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); |
|---|
| 306 | + background-repeat: repeat-x; |
|---|
| 307 | + border-color: #dca7a7; |
|---|
| 308 | +} |
|---|
| 309 | +.progress { |
|---|
| 310 | + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); |
|---|
| 311 | + background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); |
|---|
| 312 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); |
|---|
| 313 | + background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); |
|---|
| 314 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); |
|---|
| 315 | + background-repeat: repeat-x; |
|---|
| 316 | +} |
|---|
| 317 | +.progress-bar { |
|---|
| 318 | + background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); |
|---|
| 319 | + background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%); |
|---|
| 320 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3071a9)); |
|---|
| 321 | + background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); |
|---|
| 322 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); |
|---|
| 323 | + background-repeat: repeat-x; |
|---|
| 324 | +} |
|---|
| 325 | +.progress-bar-success { |
|---|
| 326 | + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); |
|---|
| 327 | + background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); |
|---|
| 328 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); |
|---|
| 329 | + background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); |
|---|
| 330 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); |
|---|
| 331 | + background-repeat: repeat-x; |
|---|
| 332 | +} |
|---|
| 333 | +.progress-bar-info { |
|---|
| 334 | + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); |
|---|
| 335 | + background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); |
|---|
| 336 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); |
|---|
| 337 | + background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); |
|---|
| 338 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); |
|---|
| 339 | + background-repeat: repeat-x; |
|---|
| 340 | +} |
|---|
| 341 | +.progress-bar-warning { |
|---|
| 342 | + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); |
|---|
| 343 | + background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); |
|---|
| 344 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); |
|---|
| 345 | + background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); |
|---|
| 346 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); |
|---|
| 347 | + background-repeat: repeat-x; |
|---|
| 348 | +} |
|---|
| 349 | +.progress-bar-danger { |
|---|
| 350 | + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); |
|---|
| 351 | + background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); |
|---|
| 352 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); |
|---|
| 353 | + background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); |
|---|
| 354 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); |
|---|
| 355 | + background-repeat: repeat-x; |
|---|
| 356 | +} |
|---|
| 357 | +.progress-bar-striped { |
|---|
| 358 | + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); |
|---|
| 359 | + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); |
|---|
| 360 | + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); |
|---|
| 361 | +} |
|---|
| 362 | +.list-group { |
|---|
| 363 | + border-radius: 4px; |
|---|
| 364 | + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); |
|---|
| 365 | + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); |
|---|
| 366 | +} |
|---|
| 367 | +.list-group-item.active, |
|---|
| 368 | +.list-group-item.active:hover, |
|---|
| 369 | +.list-group-item.active:focus { |
|---|
| 370 | + text-shadow: 0 -1px 0 #3071a9; |
|---|
| 371 | + background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); |
|---|
| 372 | + background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%); |
|---|
| 373 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3278b3)); |
|---|
| 374 | + background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); |
|---|
| 375 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); |
|---|
| 376 | + background-repeat: repeat-x; |
|---|
| 377 | + border-color: #3278b3; |
|---|
| 378 | +} |
|---|
| 379 | +.panel { |
|---|
| 380 | + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); |
|---|
| 381 | + box-shadow: 0 1px 2px rgba(0, 0, 0, .05); |
|---|
| 382 | +} |
|---|
| 383 | +.panel-default > .panel-heading { |
|---|
| 384 | + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); |
|---|
| 385 | + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); |
|---|
| 386 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); |
|---|
| 387 | + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); |
|---|
| 388 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); |
|---|
| 389 | + background-repeat: repeat-x; |
|---|
| 390 | +} |
|---|
| 391 | +.panel-primary > .panel-heading { |
|---|
| 392 | + background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); |
|---|
| 393 | + background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%); |
|---|
| 394 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd)); |
|---|
| 395 | + background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); |
|---|
| 396 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); |
|---|
| 397 | + background-repeat: repeat-x; |
|---|
| 398 | +} |
|---|
| 399 | +.panel-success > .panel-heading { |
|---|
| 400 | + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); |
|---|
| 401 | + background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); |
|---|
| 402 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); |
|---|
| 403 | + background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); |
|---|
| 404 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); |
|---|
| 405 | + background-repeat: repeat-x; |
|---|
| 406 | +} |
|---|
| 407 | +.panel-info > .panel-heading { |
|---|
| 408 | + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); |
|---|
| 409 | + background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); |
|---|
| 410 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); |
|---|
| 411 | + background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); |
|---|
| 412 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); |
|---|
| 413 | + background-repeat: repeat-x; |
|---|
| 414 | +} |
|---|
| 415 | +.panel-warning > .panel-heading { |
|---|
| 416 | + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); |
|---|
| 417 | + background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); |
|---|
| 418 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); |
|---|
| 419 | + background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); |
|---|
| 420 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); |
|---|
| 421 | + background-repeat: repeat-x; |
|---|
| 422 | +} |
|---|
| 423 | +.panel-danger > .panel-heading { |
|---|
| 424 | + background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); |
|---|
| 425 | + background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); |
|---|
| 426 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); |
|---|
| 427 | + background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); |
|---|
| 428 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); |
|---|
| 429 | + background-repeat: repeat-x; |
|---|
| 430 | +} |
|---|
| 431 | +.well { |
|---|
| 432 | + background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); |
|---|
| 433 | + background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); |
|---|
| 434 | + background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); |
|---|
| 435 | + background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); |
|---|
| 436 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); |
|---|
| 437 | + background-repeat: repeat-x; |
|---|
| 438 | + border-color: #dcdcdc; |
|---|
| 439 | + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); |
|---|
| 440 | + box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); |
|---|
| 441 | +} |
|---|
| 442 | +/*# sourceMappingURL=bootstrap-theme.css.map */ |
|---|
| .. | .. |
|---|
| 1 | +{"version":3,"file":"bootstrap-theme.css","sources":["less/theme.less","less/mixins/vendor-prefixes.less","bootstrap-theme.css","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAeA;;;;;;EAME,0CAAA;EC+CA,6FAAA;EACQ,qFAAA;EC5DT;AFiBC;;;;;;;;;;;;EC0CA,0DAAA;EACQ,kDAAA;EC7CT;AFqCC;;EAEE,wBAAA;EEnCH;AFwCD;EG/CI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EA+B2C,2BAAA;EAA2B,oBAAA;EE7BvE;AFAC;;EAEE,2BAAA;EACA,8BAAA;EEEH;AFCC;;EAEE,2BAAA;EACA,uBAAA;EECH;AFEC;;EAEE,2BAAA;EACA,wBAAA;EEAH;AFeD;EGhDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EE0BD;AFxBC;;EAEE,2BAAA;EACA,8BAAA;EE0BH;AFvBC;;EAEE,2BAAA;EACA,uBAAA;EEyBH;AFtBC;;EAEE,2BAAA;EACA,wBAAA;EEwBH;AFRD;EGjDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EEkDD;AFhDC;;EAEE,2BAAA;EACA,8BAAA;EEkDH;AF/CC;;EAEE,2BAAA;EACA,uBAAA;EEiDH;AF9CC;;EAEE,2BAAA;EACA,wBAAA;EEgDH;AF/BD;EGlDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EE0ED;AFxEC;;EAEE,2BAAA;EACA,8BAAA;EE0EH;AFvEC;;EAEE,2BAAA;EACA,uBAAA;EEyEH;AFtEC;;EAEE,2BAAA;EACA,wBAAA;EEwEH;AFtDD;EGnDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EEkGD;AFhGC;;EAEE,2BAAA;EACA,8BAAA;EEkGH;AF/FC;;EAEE,2BAAA;EACA,uBAAA;EEiGH;AF9FC;;EAEE,2BAAA;EACA,wBAAA;EEgGH;AF7ED;EGpDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EE0HD;AFxHC;;EAEE,2BAAA;EACA,8BAAA;EE0HH;AFvHC;;EAEE,2BAAA;EACA,uBAAA;EEyHH;AFtHC;;EAEE,2BAAA;EACA,wBAAA;EEwHH;AF7FD;;ECbE,oDAAA;EACQ,4CAAA;EC8GT;AFvFD;;EGvEI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHsEF,2BAAA;EE6FD;AF3FD;;;EG5EI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH4EF,2BAAA;EEiGD;AFvFD;EG1FI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ECnBF,qEAAA;EJ4GA,oBAAA;EC9CA,6FAAA;EACQ,qFAAA;EC4IT;AFlGD;EG1FI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EF2CF,0DAAA;EACQ,kDAAA;ECqJT;AF/FD;;EAEE,gDAAA;EEiGD;AF7FD;EG5GI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ECnBF,qEAAA;EFgOD;AFrGD;EG5GI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EF2CF,yDAAA;EACQ,iDAAA;EC0KT;AF9GD;;EAWI,2CAAA;EEuGH;AFlGD;;;EAGE,kBAAA;EEoGD;AF1FD;EACE,+CAAA;EC3FA,4FAAA;EACQ,oFAAA;ECwLT;AFlFD;EGtJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8IF,uBAAA;EE8FD;AFzFD;EGvJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8IF,uBAAA;EEsGD;AFhGD;EGxJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8IF,uBAAA;EE8GD;AFvGD;EGzJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8IF,uBAAA;EEsHD;AFtGD;EGlKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED2QH;AFnGD;EG5KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDkRH;AFzGD;EG7KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDyRH;AF/GD;EG9KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDgSH;AFrHD;EG/KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDuSH;AF3HD;EGhLI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED8SH;AF9HD;EGnJI,+MAAA;EACA,0MAAA;EACA,uMAAA;EDoRH;AF1HD;EACE,oBAAA;EC/IA,oDAAA;EACQ,4CAAA;EC4QT;AF3HD;;;EAGE,+BAAA;EGpME,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHkMF,uBAAA;EEiID;AFvHD;ECjKE,mDAAA;EACQ,2CAAA;EC2RT;AFjHD;EG1NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED8UH;AFvHD;EG3NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDqVH;AF7HD;EG5NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED4VH;AFnID;EG7NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDmWH;AFzID;EG9NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED0WH;AF/ID;EG/NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDiXH;AF9ID;EGvOI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHqOF,uBAAA;EC1LA,2FAAA;EACQ,mFAAA;EC+UT","sourcesContent":["\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &:disabled,\n &[disabled] {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-bg, 5%); @end-color: darken(@navbar-default-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-bg; @end-color: lighten(@navbar-inverse-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n}\n\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n &::-moz-placeholder { color: @color; // Firefox\n opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n",null,"// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} |
|---|
| .. | .. |
|---|
| 1 | +/*! |
|---|
| 2 | + * Bootstrap v3.2.0 (http://getbootstrap.com) |
|---|
| 3 | + * Copyright 2011-2014 Twitter, Inc. |
|---|
| 4 | + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
|---|
| 5 | + */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-o-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#2d6ca2));background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#2b669a}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-primary:disabled,.btn-primary[disabled]{background-color:#2d6ca2;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f3f3f3));background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:-o-linear-gradient(top,#222 0,#282828 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#222),to(#282828));background-image:linear-gradient(to bottom,#222 0,#282828 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-o-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3071a9));background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-o-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3278b3));background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);background-repeat:repeat-x;border-color:#3278b3}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} |
|---|
| .. | .. |
|---|
| 1 | +/*! |
|---|
| 2 | + * Bootstrap v3.2.0 (http://getbootstrap.com) |
|---|
| 3 | + * Copyright 2011-2014 Twitter, Inc. |
|---|
| 4 | + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
|---|
| 5 | + */ |
|---|
| 6 | + |
|---|
| 7 | +/*! normalize.css v3.0.1 | MIT License | git.io/normalize */ |
|---|
| 8 | +html { |
|---|
| 9 | + font-family: sans-serif; |
|---|
| 10 | + -webkit-text-size-adjust: 100%; |
|---|
| 11 | + -ms-text-size-adjust: 100%; |
|---|
| 12 | +} |
|---|
| 13 | +body { |
|---|
| 14 | + margin: 0; |
|---|
| 15 | +} |
|---|
| 16 | +article, |
|---|
| 17 | +aside, |
|---|
| 18 | +details, |
|---|
| 19 | +figcaption, |
|---|
| 20 | +figure, |
|---|
| 21 | +footer, |
|---|
| 22 | +header, |
|---|
| 23 | +hgroup, |
|---|
| 24 | +main, |
|---|
| 25 | +nav, |
|---|
| 26 | +section, |
|---|
| 27 | +summary { |
|---|
| 28 | + display: block; |
|---|
| 29 | +} |
|---|
| 30 | +audio, |
|---|
| 31 | +canvas, |
|---|
| 32 | +progress, |
|---|
| 33 | +video { |
|---|
| 34 | + display: inline-block; |
|---|
| 35 | + vertical-align: baseline; |
|---|
| 36 | +} |
|---|
| 37 | +audio:not([controls]) { |
|---|
| 38 | + display: none; |
|---|
| 39 | + height: 0; |
|---|
| 40 | +} |
|---|
| 41 | +[hidden], |
|---|
| 42 | +template { |
|---|
| 43 | + display: none; |
|---|
| 44 | +} |
|---|
| 45 | +a { |
|---|
| 46 | + background: transparent; |
|---|
| 47 | +} |
|---|
| 48 | +a:active, |
|---|
| 49 | +a:hover { |
|---|
| 50 | + outline: 0; |
|---|
| 51 | +} |
|---|
| 52 | +abbr[title] { |
|---|
| 53 | + border-bottom: 1px dotted; |
|---|
| 54 | +} |
|---|
| 55 | +b, |
|---|
| 56 | +strong { |
|---|
| 57 | + font-weight: bold; |
|---|
| 58 | +} |
|---|
| 59 | +dfn { |
|---|
| 60 | + font-style: italic; |
|---|
| 61 | +} |
|---|
| 62 | +h1 { |
|---|
| 63 | + margin: .67em 0; |
|---|
| 64 | + font-size: 2em; |
|---|
| 65 | +} |
|---|
| 66 | +mark { |
|---|
| 67 | + color: #000; |
|---|
| 68 | + background: #ff0; |
|---|
| 69 | +} |
|---|
| 70 | +small { |
|---|
| 71 | + font-size: 80%; |
|---|
| 72 | +} |
|---|
| 73 | +sub, |
|---|
| 74 | +sup { |
|---|
| 75 | + position: relative; |
|---|
| 76 | + font-size: 75%; |
|---|
| 77 | + line-height: 0; |
|---|
| 78 | + vertical-align: baseline; |
|---|
| 79 | +} |
|---|
| 80 | +sup { |
|---|
| 81 | + top: -.5em; |
|---|
| 82 | +} |
|---|
| 83 | +sub { |
|---|
| 84 | + bottom: -.25em; |
|---|
| 85 | +} |
|---|
| 86 | +img { |
|---|
| 87 | + border: 0; |
|---|
| 88 | +} |
|---|
| 89 | +svg:not(:root) { |
|---|
| 90 | + overflow: hidden; |
|---|
| 91 | +} |
|---|
| 92 | +figure { |
|---|
| 93 | + margin: 1em 40px; |
|---|
| 94 | +} |
|---|
| 95 | +hr { |
|---|
| 96 | + height: 0; |
|---|
| 97 | + -webkit-box-sizing: content-box; |
|---|
| 98 | + -moz-box-sizing: content-box; |
|---|
| 99 | + box-sizing: content-box; |
|---|
| 100 | +} |
|---|
| 101 | +pre { |
|---|
| 102 | + overflow: auto; |
|---|
| 103 | +} |
|---|
| 104 | +code, |
|---|
| 105 | +kbd, |
|---|
| 106 | +pre, |
|---|
| 107 | +samp { |
|---|
| 108 | + font-family: monospace, monospace; |
|---|
| 109 | + font-size: 1em; |
|---|
| 110 | +} |
|---|
| 111 | +button, |
|---|
| 112 | +input, |
|---|
| 113 | +optgroup, |
|---|
| 114 | +select, |
|---|
| 115 | +textarea { |
|---|
| 116 | + margin: 0; |
|---|
| 117 | + font: inherit; |
|---|
| 118 | + color: inherit; |
|---|
| 119 | +} |
|---|
| 120 | +button { |
|---|
| 121 | + overflow: visible; |
|---|
| 122 | +} |
|---|
| 123 | +button, |
|---|
| 124 | +select { |
|---|
| 125 | + text-transform: none; |
|---|
| 126 | +} |
|---|
| 127 | +button, |
|---|
| 128 | +html input[type="button"], |
|---|
| 129 | +input[type="reset"], |
|---|
| 130 | +input[type="submit"] { |
|---|
| 131 | + -webkit-appearance: button; |
|---|
| 132 | + cursor: pointer; |
|---|
| 133 | +} |
|---|
| 134 | +button[disabled], |
|---|
| 135 | +html input[disabled] { |
|---|
| 136 | + cursor: default; |
|---|
| 137 | +} |
|---|
| 138 | +button::-moz-focus-inner, |
|---|
| 139 | +input::-moz-focus-inner { |
|---|
| 140 | + padding: 0; |
|---|
| 141 | + border: 0; |
|---|
| 142 | +} |
|---|
| 143 | +input { |
|---|
| 144 | + line-height: normal; |
|---|
| 145 | +} |
|---|
| 146 | +input[type="checkbox"], |
|---|
| 147 | +input[type="radio"] { |
|---|
| 148 | + -webkit-box-sizing: border-box; |
|---|
| 149 | + -moz-box-sizing: border-box; |
|---|
| 150 | + box-sizing: border-box; |
|---|
| 151 | + padding: 0; |
|---|
| 152 | +} |
|---|
| 153 | +input[type="number"]::-webkit-inner-spin-button, |
|---|
| 154 | +input[type="number"]::-webkit-outer-spin-button { |
|---|
| 155 | + height: auto; |
|---|
| 156 | +} |
|---|
| 157 | +input[type="search"] { |
|---|
| 158 | + -webkit-box-sizing: content-box; |
|---|
| 159 | + -moz-box-sizing: content-box; |
|---|
| 160 | + box-sizing: content-box; |
|---|
| 161 | + -webkit-appearance: textfield; |
|---|
| 162 | +} |
|---|
| 163 | +input[type="search"]::-webkit-search-cancel-button, |
|---|
| 164 | +input[type="search"]::-webkit-search-decoration { |
|---|
| 165 | + -webkit-appearance: none; |
|---|
| 166 | +} |
|---|
| 167 | +fieldset { |
|---|
| 168 | + padding: .35em .625em .75em; |
|---|
| 169 | + margin: 0 2px; |
|---|
| 170 | + border: 1px solid #c0c0c0; |
|---|
| 171 | +} |
|---|
| 172 | +legend { |
|---|
| 173 | + padding: 0; |
|---|
| 174 | + border: 0; |
|---|
| 175 | +} |
|---|
| 176 | +textarea { |
|---|
| 177 | + overflow: auto; |
|---|
| 178 | +} |
|---|
| 179 | +optgroup { |
|---|
| 180 | + font-weight: bold; |
|---|
| 181 | +} |
|---|
| 182 | +table { |
|---|
| 183 | + border-spacing: 0; |
|---|
| 184 | + border-collapse: collapse; |
|---|
| 185 | +} |
|---|
| 186 | +td, |
|---|
| 187 | +th { |
|---|
| 188 | + padding: 0; |
|---|
| 189 | +} |
|---|
| 190 | +@media print { |
|---|
| 191 | + * { |
|---|
| 192 | + color: #000 !important; |
|---|
| 193 | + text-shadow: none !important; |
|---|
| 194 | + background: transparent !important; |
|---|
| 195 | + -webkit-box-shadow: none !important; |
|---|
| 196 | + box-shadow: none !important; |
|---|
| 197 | + } |
|---|
| 198 | + a, |
|---|
| 199 | + a:visited { |
|---|
| 200 | + text-decoration: underline; |
|---|
| 201 | + } |
|---|
| 202 | + a[href]:after { |
|---|
| 203 | + content: " (" attr(href) ")"; |
|---|
| 204 | + } |
|---|
| 205 | + abbr[title]:after { |
|---|
| 206 | + content: " (" attr(title) ")"; |
|---|
| 207 | + } |
|---|
| 208 | + a[href^="javascript:"]:after, |
|---|
| 209 | + a[href^="#"]:after { |
|---|
| 210 | + content: ""; |
|---|
| 211 | + } |
|---|
| 212 | + pre, |
|---|
| 213 | + blockquote { |
|---|
| 214 | + border: 1px solid #999; |
|---|
| 215 | + |
|---|
| 216 | + page-break-inside: avoid; |
|---|
| 217 | + } |
|---|
| 218 | + thead { |
|---|
| 219 | + display: table-header-group; |
|---|
| 220 | + } |
|---|
| 221 | + tr, |
|---|
| 222 | + img { |
|---|
| 223 | + page-break-inside: avoid; |
|---|
| 224 | + } |
|---|
| 225 | + img { |
|---|
| 226 | + max-width: 100% !important; |
|---|
| 227 | + } |
|---|
| 228 | + p, |
|---|
| 229 | + h2, |
|---|
| 230 | + h3 { |
|---|
| 231 | + orphans: 3; |
|---|
| 232 | + widows: 3; |
|---|
| 233 | + } |
|---|
| 234 | + h2, |
|---|
| 235 | + h3 { |
|---|
| 236 | + page-break-after: avoid; |
|---|
| 237 | + } |
|---|
| 238 | + select { |
|---|
| 239 | + background: #fff !important; |
|---|
| 240 | + } |
|---|
| 241 | + .navbar { |
|---|
| 242 | + display: none; |
|---|
| 243 | + } |
|---|
| 244 | + .table td, |
|---|
| 245 | + .table th { |
|---|
| 246 | + background-color: #fff !important; |
|---|
| 247 | + } |
|---|
| 248 | + .btn > .caret, |
|---|
| 249 | + .dropup > .btn > .caret { |
|---|
| 250 | + border-top-color: #000 !important; |
|---|
| 251 | + } |
|---|
| 252 | + .label { |
|---|
| 253 | + border: 1px solid #000; |
|---|
| 254 | + } |
|---|
| 255 | + .table { |
|---|
| 256 | + border-collapse: collapse !important; |
|---|
| 257 | + } |
|---|
| 258 | + .table-bordered th, |
|---|
| 259 | + .table-bordered td { |
|---|
| 260 | + border: 1px solid #ddd !important; |
|---|
| 261 | + } |
|---|
| 262 | +} |
|---|
| 263 | +@font-face { |
|---|
| 264 | + font-family: 'Glyphicons Halflings'; |
|---|
| 265 | + |
|---|
| 266 | + src: url('../fonts/glyphicons-halflings-regular.eot'); |
|---|
| 267 | + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); |
|---|
| 268 | +} |
|---|
| 269 | +.glyphicon { |
|---|
| 270 | + position: relative; |
|---|
| 271 | + top: 1px; |
|---|
| 272 | + display: inline-block; |
|---|
| 273 | + font-family: 'Glyphicons Halflings'; |
|---|
| 274 | + font-style: normal; |
|---|
| 275 | + font-weight: normal; |
|---|
| 276 | + line-height: 1; |
|---|
| 277 | + |
|---|
| 278 | + -webkit-font-smoothing: antialiased; |
|---|
| 279 | + -moz-osx-font-smoothing: grayscale; |
|---|
| 280 | +} |
|---|
| 281 | +.glyphicon-asterisk:before { |
|---|
| 282 | + content: "\2a"; |
|---|
| 283 | +} |
|---|
| 284 | +.glyphicon-plus:before { |
|---|
| 285 | + content: "\2b"; |
|---|
| 286 | +} |
|---|
| 287 | +.glyphicon-euro:before { |
|---|
| 288 | + content: "\20ac"; |
|---|
| 289 | +} |
|---|
| 290 | +.glyphicon-minus:before { |
|---|
| 291 | + content: "\2212"; |
|---|
| 292 | +} |
|---|
| 293 | +.glyphicon-cloud:before { |
|---|
| 294 | + content: "\2601"; |
|---|
| 295 | +} |
|---|
| 296 | +.glyphicon-envelope:before { |
|---|
| 297 | + content: "\2709"; |
|---|
| 298 | +} |
|---|
| 299 | +.glyphicon-pencil:before { |
|---|
| 300 | + content: "\270f"; |
|---|
| 301 | +} |
|---|
| 302 | +.glyphicon-glass:before { |
|---|
| 303 | + content: "\e001"; |
|---|
| 304 | +} |
|---|
| 305 | +.glyphicon-music:before { |
|---|
| 306 | + content: "\e002"; |
|---|
| 307 | +} |
|---|
| 308 | +.glyphicon-search:before { |
|---|
| 309 | + content: "\e003"; |
|---|
| 310 | +} |
|---|
| 311 | +.glyphicon-heart:before { |
|---|
| 312 | + content: "\e005"; |
|---|
| 313 | +} |
|---|
| 314 | +.glyphicon-star:before { |
|---|
| 315 | + content: "\e006"; |
|---|
| 316 | +} |
|---|
| 317 | +.glyphicon-star-empty:before { |
|---|
| 318 | + content: "\e007"; |
|---|
| 319 | +} |
|---|
| 320 | +.glyphicon-user:before { |
|---|
| 321 | + content: "\e008"; |
|---|
| 322 | +} |
|---|
| 323 | +.glyphicon-film:before { |
|---|
| 324 | + content: "\e009"; |
|---|
| 325 | +} |
|---|
| 326 | +.glyphicon-th-large:before { |
|---|
| 327 | + content: "\e010"; |
|---|
| 328 | +} |
|---|
| 329 | +.glyphicon-th:before { |
|---|
| 330 | + content: "\e011"; |
|---|
| 331 | +} |
|---|
| 332 | +.glyphicon-th-list:before { |
|---|
| 333 | + content: "\e012"; |
|---|
| 334 | +} |
|---|
| 335 | +.glyphicon-ok:before { |
|---|
| 336 | + content: "\e013"; |
|---|
| 337 | +} |
|---|
| 338 | +.glyphicon-remove:before { |
|---|
| 339 | + content: "\e014"; |
|---|
| 340 | +} |
|---|
| 341 | +.glyphicon-zoom-in:before { |
|---|
| 342 | + content: "\e015"; |
|---|
| 343 | +} |
|---|
| 344 | +.glyphicon-zoom-out:before { |
|---|
| 345 | + content: "\e016"; |
|---|
| 346 | +} |
|---|
| 347 | +.glyphicon-off:before { |
|---|
| 348 | + content: "\e017"; |
|---|
| 349 | +} |
|---|
| 350 | +.glyphicon-signal:before { |
|---|
| 351 | + content: "\e018"; |
|---|
| 352 | +} |
|---|
| 353 | +.glyphicon-cog:before { |
|---|
| 354 | + content: "\e019"; |
|---|
| 355 | +} |
|---|
| 356 | +.glyphicon-trash:before { |
|---|
| 357 | + content: "\e020"; |
|---|
| 358 | +} |
|---|
| 359 | +.glyphicon-home:before { |
|---|
| 360 | + content: "\e021"; |
|---|
| 361 | +} |
|---|
| 362 | +.glyphicon-file:before { |
|---|
| 363 | + content: "\e022"; |
|---|
| 364 | +} |
|---|
| 365 | +.glyphicon-time:before { |
|---|
| 366 | + content: "\e023"; |
|---|
| 367 | +} |
|---|
| 368 | +.glyphicon-road:before { |
|---|
| 369 | + content: "\e024"; |
|---|
| 370 | +} |
|---|
| 371 | +.glyphicon-download-alt:before { |
|---|
| 372 | + content: "\e025"; |
|---|
| 373 | +} |
|---|
| 374 | +.glyphicon-download:before { |
|---|
| 375 | + content: "\e026"; |
|---|
| 376 | +} |
|---|
| 377 | +.glyphicon-upload:before { |
|---|
| 378 | + content: "\e027"; |
|---|
| 379 | +} |
|---|
| 380 | +.glyphicon-inbox:before { |
|---|
| 381 | + content: "\e028"; |
|---|
| 382 | +} |
|---|
| 383 | +.glyphicon-play-circle:before { |
|---|
| 384 | + content: "\e029"; |
|---|
| 385 | +} |
|---|
| 386 | +.glyphicon-repeat:before { |
|---|
| 387 | + content: "\e030"; |
|---|
| 388 | +} |
|---|
| 389 | +.glyphicon-refresh:before { |
|---|
| 390 | + content: "\e031"; |
|---|
| 391 | +} |
|---|
| 392 | +.glyphicon-list-alt:before { |
|---|
| 393 | + content: "\e032"; |
|---|
| 394 | +} |
|---|
| 395 | +.glyphicon-lock:before { |
|---|
| 396 | + content: "\e033"; |
|---|
| 397 | +} |
|---|
| 398 | +.glyphicon-flag:before { |
|---|
| 399 | + content: "\e034"; |
|---|
| 400 | +} |
|---|
| 401 | +.glyphicon-headphones:before { |
|---|
| 402 | + content: "\e035"; |
|---|
| 403 | +} |
|---|
| 404 | +.glyphicon-volume-off:before { |
|---|
| 405 | + content: "\e036"; |
|---|
| 406 | +} |
|---|
| 407 | +.glyphicon-volume-down:before { |
|---|
| 408 | + content: "\e037"; |
|---|
| 409 | +} |
|---|
| 410 | +.glyphicon-volume-up:before { |
|---|
| 411 | + content: "\e038"; |
|---|
| 412 | +} |
|---|
| 413 | +.glyphicon-qrcode:before { |
|---|
| 414 | + content: "\e039"; |
|---|
| 415 | +} |
|---|
| 416 | +.glyphicon-barcode:before { |
|---|
| 417 | + content: "\e040"; |
|---|
| 418 | +} |
|---|
| 419 | +.glyphicon-tag:before { |
|---|
| 420 | + content: "\e041"; |
|---|
| 421 | +} |
|---|
| 422 | +.glyphicon-tags:before { |
|---|
| 423 | + content: "\e042"; |
|---|
| 424 | +} |
|---|
| 425 | +.glyphicon-book:before { |
|---|
| 426 | + content: "\e043"; |
|---|
| 427 | +} |
|---|
| 428 | +.glyphicon-bookmark:before { |
|---|
| 429 | + content: "\e044"; |
|---|
| 430 | +} |
|---|
| 431 | +.glyphicon-print:before { |
|---|
| 432 | + content: "\e045"; |
|---|
| 433 | +} |
|---|
| 434 | +.glyphicon-camera:before { |
|---|
| 435 | + content: "\e046"; |
|---|
| 436 | +} |
|---|
| 437 | +.glyphicon-font:before { |
|---|
| 438 | + content: "\e047"; |
|---|
| 439 | +} |
|---|
| 440 | +.glyphicon-bold:before { |
|---|
| 441 | + content: "\e048"; |
|---|
| 442 | +} |
|---|
| 443 | +.glyphicon-italic:before { |
|---|
| 444 | + content: "\e049"; |
|---|
| 445 | +} |
|---|
| 446 | +.glyphicon-text-height:before { |
|---|
| 447 | + content: "\e050"; |
|---|
| 448 | +} |
|---|
| 449 | +.glyphicon-text-width:before { |
|---|
| 450 | + content: "\e051"; |
|---|
| 451 | +} |
|---|
| 452 | +.glyphicon-align-left:before { |
|---|
| 453 | + content: "\e052"; |
|---|
| 454 | +} |
|---|
| 455 | +.glyphicon-align-center:before { |
|---|
| 456 | + content: "\e053"; |
|---|
| 457 | +} |
|---|
| 458 | +.glyphicon-align-right:before { |
|---|
| 459 | + content: "\e054"; |
|---|
| 460 | +} |
|---|
| 461 | +.glyphicon-align-justify:before { |
|---|
| 462 | + content: "\e055"; |
|---|
| 463 | +} |
|---|
| 464 | +.glyphicon-list:before { |
|---|
| 465 | + content: "\e056"; |
|---|
| 466 | +} |
|---|
| 467 | +.glyphicon-indent-left:before { |
|---|
| 468 | + content: "\e057"; |
|---|
| 469 | +} |
|---|
| 470 | +.glyphicon-indent-right:before { |
|---|
| 471 | + content: "\e058"; |
|---|
| 472 | +} |
|---|
| 473 | +.glyphicon-facetime-video:before { |
|---|
| 474 | + content: "\e059"; |
|---|
| 475 | +} |
|---|
| 476 | +.glyphicon-picture:before { |
|---|
| 477 | + content: "\e060"; |
|---|
| 478 | +} |
|---|
| 479 | +.glyphicon-map-marker:before { |
|---|
| 480 | + content: "\e062"; |
|---|
| 481 | +} |
|---|
| 482 | +.glyphicon-adjust:before { |
|---|
| 483 | + content: "\e063"; |
|---|
| 484 | +} |
|---|
| 485 | +.glyphicon-tint:before { |
|---|
| 486 | + content: "\e064"; |
|---|
| 487 | +} |
|---|
| 488 | +.glyphicon-edit:before { |
|---|
| 489 | + content: "\e065"; |
|---|
| 490 | +} |
|---|
| 491 | +.glyphicon-share:before { |
|---|
| 492 | + content: "\e066"; |
|---|
| 493 | +} |
|---|
| 494 | +.glyphicon-check:before { |
|---|
| 495 | + content: "\e067"; |
|---|
| 496 | +} |
|---|
| 497 | +.glyphicon-move:before { |
|---|
| 498 | + content: "\e068"; |
|---|
| 499 | +} |
|---|
| 500 | +.glyphicon-step-backward:before { |
|---|
| 501 | + content: "\e069"; |
|---|
| 502 | +} |
|---|
| 503 | +.glyphicon-fast-backward:before { |
|---|
| 504 | + content: "\e070"; |
|---|
| 505 | +} |
|---|
| 506 | +.glyphicon-backward:before { |
|---|
| 507 | + content: "\e071"; |
|---|
| 508 | +} |
|---|
| 509 | +.glyphicon-play:before { |
|---|
| 510 | + content: "\e072"; |
|---|
| 511 | +} |
|---|
| 512 | +.glyphicon-pause:before { |
|---|
| 513 | + content: "\e073"; |
|---|
| 514 | +} |
|---|
| 515 | +.glyphicon-stop:before { |
|---|
| 516 | + content: "\e074"; |
|---|
| 517 | +} |
|---|
| 518 | +.glyphicon-forward:before { |
|---|
| 519 | + content: "\e075"; |
|---|
| 520 | +} |
|---|
| 521 | +.glyphicon-fast-forward:before { |
|---|
| 522 | + content: "\e076"; |
|---|
| 523 | +} |
|---|
| 524 | +.glyphicon-step-forward:before { |
|---|
| 525 | + content: "\e077"; |
|---|
| 526 | +} |
|---|
| 527 | +.glyphicon-eject:before { |
|---|
| 528 | + content: "\e078"; |
|---|
| 529 | +} |
|---|
| 530 | +.glyphicon-chevron-left:before { |
|---|
| 531 | + content: "\e079"; |
|---|
| 532 | +} |
|---|
| 533 | +.glyphicon-chevron-right:before { |
|---|
| 534 | + content: "\e080"; |
|---|
| 535 | +} |
|---|
| 536 | +.glyphicon-plus-sign:before { |
|---|
| 537 | + content: "\e081"; |
|---|
| 538 | +} |
|---|
| 539 | +.glyphicon-minus-sign:before { |
|---|
| 540 | + content: "\e082"; |
|---|
| 541 | +} |
|---|
| 542 | +.glyphicon-remove-sign:before { |
|---|
| 543 | + content: "\e083"; |
|---|
| 544 | +} |
|---|
| 545 | +.glyphicon-ok-sign:before { |
|---|
| 546 | + content: "\e084"; |
|---|
| 547 | +} |
|---|
| 548 | +.glyphicon-question-sign:before { |
|---|
| 549 | + content: "\e085"; |
|---|
| 550 | +} |
|---|
| 551 | +.glyphicon-info-sign:before { |
|---|
| 552 | + content: "\e086"; |
|---|
| 553 | +} |
|---|
| 554 | +.glyphicon-screenshot:before { |
|---|
| 555 | + content: "\e087"; |
|---|
| 556 | +} |
|---|
| 557 | +.glyphicon-remove-circle:before { |
|---|
| 558 | + content: "\e088"; |
|---|
| 559 | +} |
|---|
| 560 | +.glyphicon-ok-circle:before { |
|---|
| 561 | + content: "\e089"; |
|---|
| 562 | +} |
|---|
| 563 | +.glyphicon-ban-circle:before { |
|---|
| 564 | + content: "\e090"; |
|---|
| 565 | +} |
|---|
| 566 | +.glyphicon-arrow-left:before { |
|---|
| 567 | + content: "\e091"; |
|---|
| 568 | +} |
|---|
| 569 | +.glyphicon-arrow-right:before { |
|---|
| 570 | + content: "\e092"; |
|---|
| 571 | +} |
|---|
| 572 | +.glyphicon-arrow-up:before { |
|---|
| 573 | + content: "\e093"; |
|---|
| 574 | +} |
|---|
| 575 | +.glyphicon-arrow-down:before { |
|---|
| 576 | + content: "\e094"; |
|---|
| 577 | +} |
|---|
| 578 | +.glyphicon-share-alt:before { |
|---|
| 579 | + content: "\e095"; |
|---|
| 580 | +} |
|---|
| 581 | +.glyphicon-resize-full:before { |
|---|
| 582 | + content: "\e096"; |
|---|
| 583 | +} |
|---|
| 584 | +.glyphicon-resize-small:before { |
|---|
| 585 | + content: "\e097"; |
|---|
| 586 | +} |
|---|
| 587 | +.glyphicon-exclamation-sign:before { |
|---|
| 588 | + content: "\e101"; |
|---|
| 589 | +} |
|---|
| 590 | +.glyphicon-gift:before { |
|---|
| 591 | + content: "\e102"; |
|---|
| 592 | +} |
|---|
| 593 | +.glyphicon-leaf:before { |
|---|
| 594 | + content: "\e103"; |
|---|
| 595 | +} |
|---|
| 596 | +.glyphicon-fire:before { |
|---|
| 597 | + content: "\e104"; |
|---|
| 598 | +} |
|---|
| 599 | +.glyphicon-eye-open:before { |
|---|
| 600 | + content: "\e105"; |
|---|
| 601 | +} |
|---|
| 602 | +.glyphicon-eye-close:before { |
|---|
| 603 | + content: "\e106"; |
|---|
| 604 | +} |
|---|
| 605 | +.glyphicon-warning-sign:before { |
|---|
| 606 | + content: "\e107"; |
|---|
| 607 | +} |
|---|
| 608 | +.glyphicon-plane:before { |
|---|
| 609 | + content: "\e108"; |
|---|
| 610 | +} |
|---|
| 611 | +.glyphicon-calendar:before { |
|---|
| 612 | + content: "\e109"; |
|---|
| 613 | +} |
|---|
| 614 | +.glyphicon-random:before { |
|---|
| 615 | + content: "\e110"; |
|---|
| 616 | +} |
|---|
| 617 | +.glyphicon-comment:before { |
|---|
| 618 | + content: "\e111"; |
|---|
| 619 | +} |
|---|
| 620 | +.glyphicon-magnet:before { |
|---|
| 621 | + content: "\e112"; |
|---|
| 622 | +} |
|---|
| 623 | +.glyphicon-chevron-up:before { |
|---|
| 624 | + content: "\e113"; |
|---|
| 625 | +} |
|---|
| 626 | +.glyphicon-chevron-down:before { |
|---|
| 627 | + content: "\e114"; |
|---|
| 628 | +} |
|---|
| 629 | +.glyphicon-retweet:before { |
|---|
| 630 | + content: "\e115"; |
|---|
| 631 | +} |
|---|
| 632 | +.glyphicon-shopping-cart:before { |
|---|
| 633 | + content: "\e116"; |
|---|
| 634 | +} |
|---|
| 635 | +.glyphicon-folder-close:before { |
|---|
| 636 | + content: "\e117"; |
|---|
| 637 | +} |
|---|
| 638 | +.glyphicon-folder-open:before { |
|---|
| 639 | + content: "\e118"; |
|---|
| 640 | +} |
|---|
| 641 | +.glyphicon-resize-vertical:before { |
|---|
| 642 | + content: "\e119"; |
|---|
| 643 | +} |
|---|
| 644 | +.glyphicon-resize-horizontal:before { |
|---|
| 645 | + content: "\e120"; |
|---|
| 646 | +} |
|---|
| 647 | +.glyphicon-hdd:before { |
|---|
| 648 | + content: "\e121"; |
|---|
| 649 | +} |
|---|
| 650 | +.glyphicon-bullhorn:before { |
|---|
| 651 | + content: "\e122"; |
|---|
| 652 | +} |
|---|
| 653 | +.glyphicon-bell:before { |
|---|
| 654 | + content: "\e123"; |
|---|
| 655 | +} |
|---|
| 656 | +.glyphicon-certificate:before { |
|---|
| 657 | + content: "\e124"; |
|---|
| 658 | +} |
|---|
| 659 | +.glyphicon-thumbs-up:before { |
|---|
| 660 | + content: "\e125"; |
|---|
| 661 | +} |
|---|
| 662 | +.glyphicon-thumbs-down:before { |
|---|
| 663 | + content: "\e126"; |
|---|
| 664 | +} |
|---|
| 665 | +.glyphicon-hand-right:before { |
|---|
| 666 | + content: "\e127"; |
|---|
| 667 | +} |
|---|
| 668 | +.glyphicon-hand-left:before { |
|---|
| 669 | + content: "\e128"; |
|---|
| 670 | +} |
|---|
| 671 | +.glyphicon-hand-up:before { |
|---|
| 672 | + content: "\e129"; |
|---|
| 673 | +} |
|---|
| 674 | +.glyphicon-hand-down:before { |
|---|
| 675 | + content: "\e130"; |
|---|
| 676 | +} |
|---|
| 677 | +.glyphicon-circle-arrow-right:before { |
|---|
| 678 | + content: "\e131"; |
|---|
| 679 | +} |
|---|
| 680 | +.glyphicon-circle-arrow-left:before { |
|---|
| 681 | + content: "\e132"; |
|---|
| 682 | +} |
|---|
| 683 | +.glyphicon-circle-arrow-up:before { |
|---|
| 684 | + content: "\e133"; |
|---|
| 685 | +} |
|---|
| 686 | +.glyphicon-circle-arrow-down:before { |
|---|
| 687 | + content: "\e134"; |
|---|
| 688 | +} |
|---|
| 689 | +.glyphicon-globe:before { |
|---|
| 690 | + content: "\e135"; |
|---|
| 691 | +} |
|---|
| 692 | +.glyphicon-wrench:before { |
|---|
| 693 | + content: "\e136"; |
|---|
| 694 | +} |
|---|
| 695 | +.glyphicon-tasks:before { |
|---|
| 696 | + content: "\e137"; |
|---|
| 697 | +} |
|---|
| 698 | +.glyphicon-filter:before { |
|---|
| 699 | + content: "\e138"; |
|---|
| 700 | +} |
|---|
| 701 | +.glyphicon-briefcase:before { |
|---|
| 702 | + content: "\e139"; |
|---|
| 703 | +} |
|---|
| 704 | +.glyphicon-fullscreen:before { |
|---|
| 705 | + content: "\e140"; |
|---|
| 706 | +} |
|---|
| 707 | +.glyphicon-dashboard:before { |
|---|
| 708 | + content: "\e141"; |
|---|
| 709 | +} |
|---|
| 710 | +.glyphicon-paperclip:before { |
|---|
| 711 | + content: "\e142"; |
|---|
| 712 | +} |
|---|
| 713 | +.glyphicon-heart-empty:before { |
|---|
| 714 | + content: "\e143"; |
|---|
| 715 | +} |
|---|
| 716 | +.glyphicon-link:before { |
|---|
| 717 | + content: "\e144"; |
|---|
| 718 | +} |
|---|
| 719 | +.glyphicon-phone:before { |
|---|
| 720 | + content: "\e145"; |
|---|
| 721 | +} |
|---|
| 722 | +.glyphicon-pushpin:before { |
|---|
| 723 | + content: "\e146"; |
|---|
| 724 | +} |
|---|
| 725 | +.glyphicon-usd:before { |
|---|
| 726 | + content: "\e148"; |
|---|
| 727 | +} |
|---|
| 728 | +.glyphicon-gbp:before { |
|---|
| 729 | + content: "\e149"; |
|---|
| 730 | +} |
|---|
| 731 | +.glyphicon-sort:before { |
|---|
| 732 | + content: "\e150"; |
|---|
| 733 | +} |
|---|
| 734 | +.glyphicon-sort-by-alphabet:before { |
|---|
| 735 | + content: "\e151"; |
|---|
| 736 | +} |
|---|
| 737 | +.glyphicon-sort-by-alphabet-alt:before { |
|---|
| 738 | + content: "\e152"; |
|---|
| 739 | +} |
|---|
| 740 | +.glyphicon-sort-by-order:before { |
|---|
| 741 | + content: "\e153"; |
|---|
| 742 | +} |
|---|
| 743 | +.glyphicon-sort-by-order-alt:before { |
|---|
| 744 | + content: "\e154"; |
|---|
| 745 | +} |
|---|
| 746 | +.glyphicon-sort-by-attributes:before { |
|---|
| 747 | + content: "\e155"; |
|---|
| 748 | +} |
|---|
| 749 | +.glyphicon-sort-by-attributes-alt:before { |
|---|
| 750 | + content: "\e156"; |
|---|
| 751 | +} |
|---|
| 752 | +.glyphicon-unchecked:before { |
|---|
| 753 | + content: "\e157"; |
|---|
| 754 | +} |
|---|
| 755 | +.glyphicon-expand:before { |
|---|
| 756 | + content: "\e158"; |
|---|
| 757 | +} |
|---|
| 758 | +.glyphicon-collapse-down:before { |
|---|
| 759 | + content: "\e159"; |
|---|
| 760 | +} |
|---|
| 761 | +.glyphicon-collapse-up:before { |
|---|
| 762 | + content: "\e160"; |
|---|
| 763 | +} |
|---|
| 764 | +.glyphicon-log-in:before { |
|---|
| 765 | + content: "\e161"; |
|---|
| 766 | +} |
|---|
| 767 | +.glyphicon-flash:before { |
|---|
| 768 | + content: "\e162"; |
|---|
| 769 | +} |
|---|
| 770 | +.glyphicon-log-out:before { |
|---|
| 771 | + content: "\e163"; |
|---|
| 772 | +} |
|---|
| 773 | +.glyphicon-new-window:before { |
|---|
| 774 | + content: "\e164"; |
|---|
| 775 | +} |
|---|
| 776 | +.glyphicon-record:before { |
|---|
| 777 | + content: "\e165"; |
|---|
| 778 | +} |
|---|
| 779 | +.glyphicon-save:before { |
|---|
| 780 | + content: "\e166"; |
|---|
| 781 | +} |
|---|
| 782 | +.glyphicon-open:before { |
|---|
| 783 | + content: "\e167"; |
|---|
| 784 | +} |
|---|
| 785 | +.glyphicon-saved:before { |
|---|
| 786 | + content: "\e168"; |
|---|
| 787 | +} |
|---|
| 788 | +.glyphicon-import:before { |
|---|
| 789 | + content: "\e169"; |
|---|
| 790 | +} |
|---|
| 791 | +.glyphicon-export:before { |
|---|
| 792 | + content: "\e170"; |
|---|
| 793 | +} |
|---|
| 794 | +.glyphicon-send:before { |
|---|
| 795 | + content: "\e171"; |
|---|
| 796 | +} |
|---|
| 797 | +.glyphicon-floppy-disk:before { |
|---|
| 798 | + content: "\e172"; |
|---|
| 799 | +} |
|---|
| 800 | +.glyphicon-floppy-saved:before { |
|---|
| 801 | + content: "\e173"; |
|---|
| 802 | +} |
|---|
| 803 | +.glyphicon-floppy-remove:before { |
|---|
| 804 | + content: "\e174"; |
|---|
| 805 | +} |
|---|
| 806 | +.glyphicon-floppy-save:before { |
|---|
| 807 | + content: "\e175"; |
|---|
| 808 | +} |
|---|
| 809 | +.glyphicon-floppy-open:before { |
|---|
| 810 | + content: "\e176"; |
|---|
| 811 | +} |
|---|
| 812 | +.glyphicon-credit-card:before { |
|---|
| 813 | + content: "\e177"; |
|---|
| 814 | +} |
|---|
| 815 | +.glyphicon-transfer:before { |
|---|
| 816 | + content: "\e178"; |
|---|
| 817 | +} |
|---|
| 818 | +.glyphicon-cutlery:before { |
|---|
| 819 | + content: "\e179"; |
|---|
| 820 | +} |
|---|
| 821 | +.glyphicon-header:before { |
|---|
| 822 | + content: "\e180"; |
|---|
| 823 | +} |
|---|
| 824 | +.glyphicon-compressed:before { |
|---|
| 825 | + content: "\e181"; |
|---|
| 826 | +} |
|---|
| 827 | +.glyphicon-earphone:before { |
|---|
| 828 | + content: "\e182"; |
|---|
| 829 | +} |
|---|
| 830 | +.glyphicon-phone-alt:before { |
|---|
| 831 | + content: "\e183"; |
|---|
| 832 | +} |
|---|
| 833 | +.glyphicon-tower:before { |
|---|
| 834 | + content: "\e184"; |
|---|
| 835 | +} |
|---|
| 836 | +.glyphicon-stats:before { |
|---|
| 837 | + content: "\e185"; |
|---|
| 838 | +} |
|---|
| 839 | +.glyphicon-sd-video:before { |
|---|
| 840 | + content: "\e186"; |
|---|
| 841 | +} |
|---|
| 842 | +.glyphicon-hd-video:before { |
|---|
| 843 | + content: "\e187"; |
|---|
| 844 | +} |
|---|
| 845 | +.glyphicon-subtitles:before { |
|---|
| 846 | + content: "\e188"; |
|---|
| 847 | +} |
|---|
| 848 | +.glyphicon-sound-stereo:before { |
|---|
| 849 | + content: "\e189"; |
|---|
| 850 | +} |
|---|
| 851 | +.glyphicon-sound-dolby:before { |
|---|
| 852 | + content: "\e190"; |
|---|
| 853 | +} |
|---|
| 854 | +.glyphicon-sound-5-1:before { |
|---|
| 855 | + content: "\e191"; |
|---|
| 856 | +} |
|---|
| 857 | +.glyphicon-sound-6-1:before { |
|---|
| 858 | + content: "\e192"; |
|---|
| 859 | +} |
|---|
| 860 | +.glyphicon-sound-7-1:before { |
|---|
| 861 | + content: "\e193"; |
|---|
| 862 | +} |
|---|
| 863 | +.glyphicon-copyright-mark:before { |
|---|
| 864 | + content: "\e194"; |
|---|
| 865 | +} |
|---|
| 866 | +.glyphicon-registration-mark:before { |
|---|
| 867 | + content: "\e195"; |
|---|
| 868 | +} |
|---|
| 869 | +.glyphicon-cloud-download:before { |
|---|
| 870 | + content: "\e197"; |
|---|
| 871 | +} |
|---|
| 872 | +.glyphicon-cloud-upload:before { |
|---|
| 873 | + content: "\e198"; |
|---|
| 874 | +} |
|---|
| 875 | +.glyphicon-tree-conifer:before { |
|---|
| 876 | + content: "\e199"; |
|---|
| 877 | +} |
|---|
| 878 | +.glyphicon-tree-deciduous:before { |
|---|
| 879 | + content: "\e200"; |
|---|
| 880 | +} |
|---|
| 881 | +* { |
|---|
| 882 | + -webkit-box-sizing: border-box; |
|---|
| 883 | + -moz-box-sizing: border-box; |
|---|
| 884 | + box-sizing: border-box; |
|---|
| 885 | +} |
|---|
| 886 | +*:before, |
|---|
| 887 | +*:after { |
|---|
| 888 | + -webkit-box-sizing: border-box; |
|---|
| 889 | + -moz-box-sizing: border-box; |
|---|
| 890 | + box-sizing: border-box; |
|---|
| 891 | +} |
|---|
| 892 | +html { |
|---|
| 893 | + font-size: 10px; |
|---|
| 894 | + |
|---|
| 895 | + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); |
|---|
| 896 | +} |
|---|
| 897 | +body { |
|---|
| 898 | + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; |
|---|
| 899 | + font-size: 14px; |
|---|
| 900 | + line-height: 1.42857143; |
|---|
| 901 | + color: #333; |
|---|
| 902 | + background-color: #fff; |
|---|
| 903 | +} |
|---|
| 904 | +input, |
|---|
| 905 | +button, |
|---|
| 906 | +select, |
|---|
| 907 | +textarea { |
|---|
| 908 | + font-family: inherit; |
|---|
| 909 | + font-size: inherit; |
|---|
| 910 | + line-height: inherit; |
|---|
| 911 | +} |
|---|
| 912 | +a { |
|---|
| 913 | + color: #428bca; |
|---|
| 914 | + text-decoration: none; |
|---|
| 915 | +} |
|---|
| 916 | +a:hover, |
|---|
| 917 | +a:focus { |
|---|
| 918 | + color: #2a6496; |
|---|
| 919 | + text-decoration: underline; |
|---|
| 920 | +} |
|---|
| 921 | +a:focus { |
|---|
| 922 | + outline: thin dotted; |
|---|
| 923 | + outline: 5px auto -webkit-focus-ring-color; |
|---|
| 924 | + outline-offset: -2px; |
|---|
| 925 | +} |
|---|
| 926 | +figure { |
|---|
| 927 | + margin: 0; |
|---|
| 928 | +} |
|---|
| 929 | +img { |
|---|
| 930 | + vertical-align: middle; |
|---|
| 931 | +} |
|---|
| 932 | +.img-responsive, |
|---|
| 933 | +.thumbnail > img, |
|---|
| 934 | +.thumbnail a > img, |
|---|
| 935 | +.carousel-inner > .item > img, |
|---|
| 936 | +.carousel-inner > .item > a > img { |
|---|
| 937 | + display: block; |
|---|
| 938 | + width: 100% \9; |
|---|
| 939 | + max-width: 100%; |
|---|
| 940 | + height: auto; |
|---|
| 941 | +} |
|---|
| 942 | +.img-rounded { |
|---|
| 943 | + border-radius: 6px; |
|---|
| 944 | +} |
|---|
| 945 | +.img-thumbnail { |
|---|
| 946 | + display: inline-block; |
|---|
| 947 | + width: 100% \9; |
|---|
| 948 | + max-width: 100%; |
|---|
| 949 | + height: auto; |
|---|
| 950 | + padding: 4px; |
|---|
| 951 | + line-height: 1.42857143; |
|---|
| 952 | + background-color: #fff; |
|---|
| 953 | + border: 1px solid #ddd; |
|---|
| 954 | + border-radius: 4px; |
|---|
| 955 | + -webkit-transition: all .2s ease-in-out; |
|---|
| 956 | + -o-transition: all .2s ease-in-out; |
|---|
| 957 | + transition: all .2s ease-in-out; |
|---|
| 958 | +} |
|---|
| 959 | +.img-circle { |
|---|
| 960 | + border-radius: 50%; |
|---|
| 961 | +} |
|---|
| 962 | +hr { |
|---|
| 963 | + margin-top: 20px; |
|---|
| 964 | + margin-bottom: 20px; |
|---|
| 965 | + border: 0; |
|---|
| 966 | + border-top: 1px solid #eee; |
|---|
| 967 | +} |
|---|
| 968 | +.sr-only { |
|---|
| 969 | + position: absolute; |
|---|
| 970 | + width: 1px; |
|---|
| 971 | + height: 1px; |
|---|
| 972 | + padding: 0; |
|---|
| 973 | + margin: -1px; |
|---|
| 974 | + overflow: hidden; |
|---|
| 975 | + clip: rect(0, 0, 0, 0); |
|---|
| 976 | + border: 0; |
|---|
| 977 | +} |
|---|
| 978 | +.sr-only-focusable:active, |
|---|
| 979 | +.sr-only-focusable:focus { |
|---|
| 980 | + position: static; |
|---|
| 981 | + width: auto; |
|---|
| 982 | + height: auto; |
|---|
| 983 | + margin: 0; |
|---|
| 984 | + overflow: visible; |
|---|
| 985 | + clip: auto; |
|---|
| 986 | +} |
|---|
| 987 | +h1, |
|---|
| 988 | +h2, |
|---|
| 989 | +h3, |
|---|
| 990 | +h4, |
|---|
| 991 | +h5, |
|---|
| 992 | +h6, |
|---|
| 993 | +.h1, |
|---|
| 994 | +.h2, |
|---|
| 995 | +.h3, |
|---|
| 996 | +.h4, |
|---|
| 997 | +.h5, |
|---|
| 998 | +.h6 { |
|---|
| 999 | + font-family: inherit; |
|---|
| 1000 | + font-weight: 500; |
|---|
| 1001 | + line-height: 1.1; |
|---|
| 1002 | + color: inherit; |
|---|
| 1003 | +} |
|---|
| 1004 | +h1 small, |
|---|
| 1005 | +h2 small, |
|---|
| 1006 | +h3 small, |
|---|
| 1007 | +h4 small, |
|---|
| 1008 | +h5 small, |
|---|
| 1009 | +h6 small, |
|---|
| 1010 | +.h1 small, |
|---|
| 1011 | +.h2 small, |
|---|
| 1012 | +.h3 small, |
|---|
| 1013 | +.h4 small, |
|---|
| 1014 | +.h5 small, |
|---|
| 1015 | +.h6 small, |
|---|
| 1016 | +h1 .small, |
|---|
| 1017 | +h2 .small, |
|---|
| 1018 | +h3 .small, |
|---|
| 1019 | +h4 .small, |
|---|
| 1020 | +h5 .small, |
|---|
| 1021 | +h6 .small, |
|---|
| 1022 | +.h1 .small, |
|---|
| 1023 | +.h2 .small, |
|---|
| 1024 | +.h3 .small, |
|---|
| 1025 | +.h4 .small, |
|---|
| 1026 | +.h5 .small, |
|---|
| 1027 | +.h6 .small { |
|---|
| 1028 | + font-weight: normal; |
|---|
| 1029 | + line-height: 1; |
|---|
| 1030 | + color: #777; |
|---|
| 1031 | +} |
|---|
| 1032 | +h1, |
|---|
| 1033 | +.h1, |
|---|
| 1034 | +h2, |
|---|
| 1035 | +.h2, |
|---|
| 1036 | +h3, |
|---|
| 1037 | +.h3 { |
|---|
| 1038 | + margin-top: 20px; |
|---|
| 1039 | + margin-bottom: 10px; |
|---|
| 1040 | +} |
|---|
| 1041 | +h1 small, |
|---|
| 1042 | +.h1 small, |
|---|
| 1043 | +h2 small, |
|---|
| 1044 | +.h2 small, |
|---|
| 1045 | +h3 small, |
|---|
| 1046 | +.h3 small, |
|---|
| 1047 | +h1 .small, |
|---|
| 1048 | +.h1 .small, |
|---|
| 1049 | +h2 .small, |
|---|
| 1050 | +.h2 .small, |
|---|
| 1051 | +h3 .small, |
|---|
| 1052 | +.h3 .small { |
|---|
| 1053 | + font-size: 65%; |
|---|
| 1054 | +} |
|---|
| 1055 | +h4, |
|---|
| 1056 | +.h4, |
|---|
| 1057 | +h5, |
|---|
| 1058 | +.h5, |
|---|
| 1059 | +h6, |
|---|
| 1060 | +.h6 { |
|---|
| 1061 | + margin-top: 10px; |
|---|
| 1062 | + margin-bottom: 10px; |
|---|
| 1063 | +} |
|---|
| 1064 | +h4 small, |
|---|
| 1065 | +.h4 small, |
|---|
| 1066 | +h5 small, |
|---|
| 1067 | +.h5 small, |
|---|
| 1068 | +h6 small, |
|---|
| 1069 | +.h6 small, |
|---|
| 1070 | +h4 .small, |
|---|
| 1071 | +.h4 .small, |
|---|
| 1072 | +h5 .small, |
|---|
| 1073 | +.h5 .small, |
|---|
| 1074 | +h6 .small, |
|---|
| 1075 | +.h6 .small { |
|---|
| 1076 | + font-size: 75%; |
|---|
| 1077 | +} |
|---|
| 1078 | +h1, |
|---|
| 1079 | +.h1 { |
|---|
| 1080 | + font-size: 36px; |
|---|
| 1081 | +} |
|---|
| 1082 | +h2, |
|---|
| 1083 | +.h2 { |
|---|
| 1084 | + font-size: 30px; |
|---|
| 1085 | +} |
|---|
| 1086 | +h3, |
|---|
| 1087 | +.h3 { |
|---|
| 1088 | + font-size: 24px; |
|---|
| 1089 | +} |
|---|
| 1090 | +h4, |
|---|
| 1091 | +.h4 { |
|---|
| 1092 | + font-size: 18px; |
|---|
| 1093 | +} |
|---|
| 1094 | +h5, |
|---|
| 1095 | +.h5 { |
|---|
| 1096 | + font-size: 14px; |
|---|
| 1097 | +} |
|---|
| 1098 | +h6, |
|---|
| 1099 | +.h6 { |
|---|
| 1100 | + font-size: 12px; |
|---|
| 1101 | +} |
|---|
| 1102 | +p { |
|---|
| 1103 | + margin: 0 0 10px; |
|---|
| 1104 | +} |
|---|
| 1105 | +.lead { |
|---|
| 1106 | + margin-bottom: 20px; |
|---|
| 1107 | + font-size: 16px; |
|---|
| 1108 | + font-weight: 300; |
|---|
| 1109 | + line-height: 1.4; |
|---|
| 1110 | +} |
|---|
| 1111 | +@media (min-width: 768px) { |
|---|
| 1112 | + .lead { |
|---|
| 1113 | + font-size: 21px; |
|---|
| 1114 | + } |
|---|
| 1115 | +} |
|---|
| 1116 | +small, |
|---|
| 1117 | +.small { |
|---|
| 1118 | + font-size: 85%; |
|---|
| 1119 | +} |
|---|
| 1120 | +cite { |
|---|
| 1121 | + font-style: normal; |
|---|
| 1122 | +} |
|---|
| 1123 | +mark, |
|---|
| 1124 | +.mark { |
|---|
| 1125 | + padding: .2em; |
|---|
| 1126 | + background-color: #fcf8e3; |
|---|
| 1127 | +} |
|---|
| 1128 | +.text-left { |
|---|
| 1129 | + text-align: left; |
|---|
| 1130 | +} |
|---|
| 1131 | +.text-right { |
|---|
| 1132 | + text-align: right; |
|---|
| 1133 | +} |
|---|
| 1134 | +.text-center { |
|---|
| 1135 | + text-align: center; |
|---|
| 1136 | +} |
|---|
| 1137 | +.text-justify { |
|---|
| 1138 | + text-align: justify; |
|---|
| 1139 | +} |
|---|
| 1140 | +.text-nowrap { |
|---|
| 1141 | + white-space: nowrap; |
|---|
| 1142 | +} |
|---|
| 1143 | +.text-lowercase { |
|---|
| 1144 | + text-transform: lowercase; |
|---|
| 1145 | +} |
|---|
| 1146 | +.text-uppercase { |
|---|
| 1147 | + text-transform: uppercase; |
|---|
| 1148 | +} |
|---|
| 1149 | +.text-capitalize { |
|---|
| 1150 | + text-transform: capitalize; |
|---|
| 1151 | +} |
|---|
| 1152 | +.text-muted { |
|---|
| 1153 | + color: #777; |
|---|
| 1154 | +} |
|---|
| 1155 | +.text-primary { |
|---|
| 1156 | + color: #428bca; |
|---|
| 1157 | +} |
|---|
| 1158 | +a.text-primary:hover { |
|---|
| 1159 | + color: #3071a9; |
|---|
| 1160 | +} |
|---|
| 1161 | +.text-success { |
|---|
| 1162 | + color: #3c763d; |
|---|
| 1163 | +} |
|---|
| 1164 | +a.text-success:hover { |
|---|
| 1165 | + color: #2b542c; |
|---|
| 1166 | +} |
|---|
| 1167 | +.text-info { |
|---|
| 1168 | + color: #31708f; |
|---|
| 1169 | +} |
|---|
| 1170 | +a.text-info:hover { |
|---|
| 1171 | + color: #245269; |
|---|
| 1172 | +} |
|---|
| 1173 | +.text-warning { |
|---|
| 1174 | + color: #8a6d3b; |
|---|
| 1175 | +} |
|---|
| 1176 | +a.text-warning:hover { |
|---|
| 1177 | + color: #66512c; |
|---|
| 1178 | +} |
|---|
| 1179 | +.text-danger { |
|---|
| 1180 | + color: #a94442; |
|---|
| 1181 | +} |
|---|
| 1182 | +a.text-danger:hover { |
|---|
| 1183 | + color: #843534; |
|---|
| 1184 | +} |
|---|
| 1185 | +.bg-primary { |
|---|
| 1186 | + color: #fff; |
|---|
| 1187 | + background-color: #428bca; |
|---|
| 1188 | +} |
|---|
| 1189 | +a.bg-primary:hover { |
|---|
| 1190 | + background-color: #3071a9; |
|---|
| 1191 | +} |
|---|
| 1192 | +.bg-success { |
|---|
| 1193 | + background-color: #dff0d8; |
|---|
| 1194 | +} |
|---|
| 1195 | +a.bg-success:hover { |
|---|
| 1196 | + background-color: #c1e2b3; |
|---|
| 1197 | +} |
|---|
| 1198 | +.bg-info { |
|---|
| 1199 | + background-color: #d9edf7; |
|---|
| 1200 | +} |
|---|
| 1201 | +a.bg-info:hover { |
|---|
| 1202 | + background-color: #afd9ee; |
|---|
| 1203 | +} |
|---|
| 1204 | +.bg-warning { |
|---|
| 1205 | + background-color: #fcf8e3; |
|---|
| 1206 | +} |
|---|
| 1207 | +a.bg-warning:hover { |
|---|
| 1208 | + background-color: #f7ecb5; |
|---|
| 1209 | +} |
|---|
| 1210 | +.bg-danger { |
|---|
| 1211 | + background-color: #f2dede; |
|---|
| 1212 | +} |
|---|
| 1213 | +a.bg-danger:hover { |
|---|
| 1214 | + background-color: #e4b9b9; |
|---|
| 1215 | +} |
|---|
| 1216 | +.page-header { |
|---|
| 1217 | + padding-bottom: 9px; |
|---|
| 1218 | + margin: 40px 0 20px; |
|---|
| 1219 | + border-bottom: 1px solid #eee; |
|---|
| 1220 | +} |
|---|
| 1221 | +ul, |
|---|
| 1222 | +ol { |
|---|
| 1223 | + margin-top: 0; |
|---|
| 1224 | + margin-bottom: 10px; |
|---|
| 1225 | +} |
|---|
| 1226 | +ul ul, |
|---|
| 1227 | +ol ul, |
|---|
| 1228 | +ul ol, |
|---|
| 1229 | +ol ol { |
|---|
| 1230 | + margin-bottom: 0; |
|---|
| 1231 | +} |
|---|
| 1232 | +.list-unstyled { |
|---|
| 1233 | + padding-left: 0; |
|---|
| 1234 | + list-style: none; |
|---|
| 1235 | +} |
|---|
| 1236 | +.list-inline { |
|---|
| 1237 | + padding-left: 0; |
|---|
| 1238 | + margin-left: -5px; |
|---|
| 1239 | + list-style: none; |
|---|
| 1240 | +} |
|---|
| 1241 | +.list-inline > li { |
|---|
| 1242 | + display: inline-block; |
|---|
| 1243 | + padding-right: 5px; |
|---|
| 1244 | + padding-left: 5px; |
|---|
| 1245 | +} |
|---|
| 1246 | +dl { |
|---|
| 1247 | + margin-top: 0; |
|---|
| 1248 | + margin-bottom: 20px; |
|---|
| 1249 | +} |
|---|
| 1250 | +dt, |
|---|
| 1251 | +dd { |
|---|
| 1252 | + line-height: 1.42857143; |
|---|
| 1253 | +} |
|---|
| 1254 | +dt { |
|---|
| 1255 | + font-weight: bold; |
|---|
| 1256 | +} |
|---|
| 1257 | +dd { |
|---|
| 1258 | + margin-left: 0; |
|---|
| 1259 | +} |
|---|
| 1260 | +@media (min-width: 768px) { |
|---|
| 1261 | + .dl-horizontal dt { |
|---|
| 1262 | + float: left; |
|---|
| 1263 | + width: 160px; |
|---|
| 1264 | + overflow: hidden; |
|---|
| 1265 | + clear: left; |
|---|
| 1266 | + text-align: right; |
|---|
| 1267 | + text-overflow: ellipsis; |
|---|
| 1268 | + white-space: nowrap; |
|---|
| 1269 | + } |
|---|
| 1270 | + .dl-horizontal dd { |
|---|
| 1271 | + margin-left: 180px; |
|---|
| 1272 | + } |
|---|
| 1273 | +} |
|---|
| 1274 | +abbr[title], |
|---|
| 1275 | +abbr[data-original-title] { |
|---|
| 1276 | + cursor: help; |
|---|
| 1277 | + border-bottom: 1px dotted #777; |
|---|
| 1278 | +} |
|---|
| 1279 | +.initialism { |
|---|
| 1280 | + font-size: 90%; |
|---|
| 1281 | + text-transform: uppercase; |
|---|
| 1282 | +} |
|---|
| 1283 | +blockquote { |
|---|
| 1284 | + padding: 10px 20px; |
|---|
| 1285 | + margin: 0 0 20px; |
|---|
| 1286 | + font-size: 17.5px; |
|---|
| 1287 | + border-left: 5px solid #eee; |
|---|
| 1288 | +} |
|---|
| 1289 | +blockquote p:last-child, |
|---|
| 1290 | +blockquote ul:last-child, |
|---|
| 1291 | +blockquote ol:last-child { |
|---|
| 1292 | + margin-bottom: 0; |
|---|
| 1293 | +} |
|---|
| 1294 | +blockquote footer, |
|---|
| 1295 | +blockquote small, |
|---|
| 1296 | +blockquote .small { |
|---|
| 1297 | + display: block; |
|---|
| 1298 | + font-size: 80%; |
|---|
| 1299 | + line-height: 1.42857143; |
|---|
| 1300 | + color: #777; |
|---|
| 1301 | +} |
|---|
| 1302 | +blockquote footer:before, |
|---|
| 1303 | +blockquote small:before, |
|---|
| 1304 | +blockquote .small:before { |
|---|
| 1305 | + content: '\2014 \00A0'; |
|---|
| 1306 | +} |
|---|
| 1307 | +.blockquote-reverse, |
|---|
| 1308 | +blockquote.pull-right { |
|---|
| 1309 | + padding-right: 15px; |
|---|
| 1310 | + padding-left: 0; |
|---|
| 1311 | + text-align: right; |
|---|
| 1312 | + border-right: 5px solid #eee; |
|---|
| 1313 | + border-left: 0; |
|---|
| 1314 | +} |
|---|
| 1315 | +.blockquote-reverse footer:before, |
|---|
| 1316 | +blockquote.pull-right footer:before, |
|---|
| 1317 | +.blockquote-reverse small:before, |
|---|
| 1318 | +blockquote.pull-right small:before, |
|---|
| 1319 | +.blockquote-reverse .small:before, |
|---|
| 1320 | +blockquote.pull-right .small:before { |
|---|
| 1321 | + content: ''; |
|---|
| 1322 | +} |
|---|
| 1323 | +.blockquote-reverse footer:after, |
|---|
| 1324 | +blockquote.pull-right footer:after, |
|---|
| 1325 | +.blockquote-reverse small:after, |
|---|
| 1326 | +blockquote.pull-right small:after, |
|---|
| 1327 | +.blockquote-reverse .small:after, |
|---|
| 1328 | +blockquote.pull-right .small:after { |
|---|
| 1329 | + content: '\00A0 \2014'; |
|---|
| 1330 | +} |
|---|
| 1331 | +blockquote:before, |
|---|
| 1332 | +blockquote:after { |
|---|
| 1333 | + content: ""; |
|---|
| 1334 | +} |
|---|
| 1335 | +address { |
|---|
| 1336 | + margin-bottom: 20px; |
|---|
| 1337 | + font-style: normal; |
|---|
| 1338 | + line-height: 1.42857143; |
|---|
| 1339 | +} |
|---|
| 1340 | +code, |
|---|
| 1341 | +kbd, |
|---|
| 1342 | +pre, |
|---|
| 1343 | +samp { |
|---|
| 1344 | + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; |
|---|
| 1345 | +} |
|---|
| 1346 | +code { |
|---|
| 1347 | + padding: 2px 4px; |
|---|
| 1348 | + font-size: 90%; |
|---|
| 1349 | + color: #c7254e; |
|---|
| 1350 | + background-color: #f9f2f4; |
|---|
| 1351 | + border-radius: 4px; |
|---|
| 1352 | +} |
|---|
| 1353 | +kbd { |
|---|
| 1354 | + padding: 2px 4px; |
|---|
| 1355 | + font-size: 90%; |
|---|
| 1356 | + color: #fff; |
|---|
| 1357 | + background-color: #333; |
|---|
| 1358 | + border-radius: 3px; |
|---|
| 1359 | + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); |
|---|
| 1360 | + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); |
|---|
| 1361 | +} |
|---|
| 1362 | +kbd kbd { |
|---|
| 1363 | + padding: 0; |
|---|
| 1364 | + font-size: 100%; |
|---|
| 1365 | + -webkit-box-shadow: none; |
|---|
| 1366 | + box-shadow: none; |
|---|
| 1367 | +} |
|---|
| 1368 | +pre { |
|---|
| 1369 | + display: block; |
|---|
| 1370 | + padding: 9.5px; |
|---|
| 1371 | + margin: 0 0 10px; |
|---|
| 1372 | + font-size: 13px; |
|---|
| 1373 | + line-height: 1.42857143; |
|---|
| 1374 | + color: #333; |
|---|
| 1375 | + word-break: break-all; |
|---|
| 1376 | + word-wrap: break-word; |
|---|
| 1377 | + background-color: #f5f5f5; |
|---|
| 1378 | + border: 1px solid #ccc; |
|---|
| 1379 | + border-radius: 4px; |
|---|
| 1380 | +} |
|---|
| 1381 | +pre code { |
|---|
| 1382 | + padding: 0; |
|---|
| 1383 | + font-size: inherit; |
|---|
| 1384 | + color: inherit; |
|---|
| 1385 | + white-space: pre-wrap; |
|---|
| 1386 | + background-color: transparent; |
|---|
| 1387 | + border-radius: 0; |
|---|
| 1388 | +} |
|---|
| 1389 | +.pre-scrollable { |
|---|
| 1390 | + max-height: 340px; |
|---|
| 1391 | + overflow-y: scroll; |
|---|
| 1392 | +} |
|---|
| 1393 | +.container { |
|---|
| 1394 | + padding-right: 15px; |
|---|
| 1395 | + padding-left: 15px; |
|---|
| 1396 | + margin-right: auto; |
|---|
| 1397 | + margin-left: auto; |
|---|
| 1398 | +} |
|---|
| 1399 | +@media (min-width: 768px) { |
|---|
| 1400 | + .container { |
|---|
| 1401 | + width: 750px; |
|---|
| 1402 | + } |
|---|
| 1403 | +} |
|---|
| 1404 | +@media (min-width: 992px) { |
|---|
| 1405 | + .container { |
|---|
| 1406 | + width: 970px; |
|---|
| 1407 | + } |
|---|
| 1408 | +} |
|---|
| 1409 | +@media (min-width: 1200px) { |
|---|
| 1410 | + .container { |
|---|
| 1411 | + width: 1170px; |
|---|
| 1412 | + } |
|---|
| 1413 | +} |
|---|
| 1414 | +.container-fluid { |
|---|
| 1415 | + padding-right: 15px; |
|---|
| 1416 | + padding-left: 15px; |
|---|
| 1417 | + margin-right: auto; |
|---|
| 1418 | + margin-left: auto; |
|---|
| 1419 | +} |
|---|
| 1420 | +.row { |
|---|
| 1421 | + margin-right: -15px; |
|---|
| 1422 | + margin-left: -15px; |
|---|
| 1423 | +} |
|---|
| 1424 | +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { |
|---|
| 1425 | + position: relative; |
|---|
| 1426 | + min-height: 1px; |
|---|
| 1427 | + padding-right: 15px; |
|---|
| 1428 | + padding-left: 15px; |
|---|
| 1429 | +} |
|---|
| 1430 | +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { |
|---|
| 1431 | + float: left; |
|---|
| 1432 | +} |
|---|
| 1433 | +.col-xs-12 { |
|---|
| 1434 | + width: 100%; |
|---|
| 1435 | +} |
|---|
| 1436 | +.col-xs-11 { |
|---|
| 1437 | + width: 91.66666667%; |
|---|
| 1438 | +} |
|---|
| 1439 | +.col-xs-10 { |
|---|
| 1440 | + width: 83.33333333%; |
|---|
| 1441 | +} |
|---|
| 1442 | +.col-xs-9 { |
|---|
| 1443 | + width: 75%; |
|---|
| 1444 | +} |
|---|
| 1445 | +.col-xs-8 { |
|---|
| 1446 | + width: 66.66666667%; |
|---|
| 1447 | +} |
|---|
| 1448 | +.col-xs-7 { |
|---|
| 1449 | + width: 58.33333333%; |
|---|
| 1450 | +} |
|---|
| 1451 | +.col-xs-6 { |
|---|
| 1452 | + width: 50%; |
|---|
| 1453 | +} |
|---|
| 1454 | +.col-xs-5 { |
|---|
| 1455 | + width: 41.66666667%; |
|---|
| 1456 | +} |
|---|
| 1457 | +.col-xs-4 { |
|---|
| 1458 | + width: 33.33333333%; |
|---|
| 1459 | +} |
|---|
| 1460 | +.col-xs-3 { |
|---|
| 1461 | + width: 25%; |
|---|
| 1462 | +} |
|---|
| 1463 | +.col-xs-2 { |
|---|
| 1464 | + width: 16.66666667%; |
|---|
| 1465 | +} |
|---|
| 1466 | +.col-xs-1 { |
|---|
| 1467 | + width: 8.33333333%; |
|---|
| 1468 | +} |
|---|
| 1469 | +.col-xs-pull-12 { |
|---|
| 1470 | + right: 100%; |
|---|
| 1471 | +} |
|---|
| 1472 | +.col-xs-pull-11 { |
|---|
| 1473 | + right: 91.66666667%; |
|---|
| 1474 | +} |
|---|
| 1475 | +.col-xs-pull-10 { |
|---|
| 1476 | + right: 83.33333333%; |
|---|
| 1477 | +} |
|---|
| 1478 | +.col-xs-pull-9 { |
|---|
| 1479 | + right: 75%; |
|---|
| 1480 | +} |
|---|
| 1481 | +.col-xs-pull-8 { |
|---|
| 1482 | + right: 66.66666667%; |
|---|
| 1483 | +} |
|---|
| 1484 | +.col-xs-pull-7 { |
|---|
| 1485 | + right: 58.33333333%; |
|---|
| 1486 | +} |
|---|
| 1487 | +.col-xs-pull-6 { |
|---|
| 1488 | + right: 50%; |
|---|
| 1489 | +} |
|---|
| 1490 | +.col-xs-pull-5 { |
|---|
| 1491 | + right: 41.66666667%; |
|---|
| 1492 | +} |
|---|
| 1493 | +.col-xs-pull-4 { |
|---|
| 1494 | + right: 33.33333333%; |
|---|
| 1495 | +} |
|---|
| 1496 | +.col-xs-pull-3 { |
|---|
| 1497 | + right: 25%; |
|---|
| 1498 | +} |
|---|
| 1499 | +.col-xs-pull-2 { |
|---|
| 1500 | + right: 16.66666667%; |
|---|
| 1501 | +} |
|---|
| 1502 | +.col-xs-pull-1 { |
|---|
| 1503 | + right: 8.33333333%; |
|---|
| 1504 | +} |
|---|
| 1505 | +.col-xs-pull-0 { |
|---|
| 1506 | + right: auto; |
|---|
| 1507 | +} |
|---|
| 1508 | +.col-xs-push-12 { |
|---|
| 1509 | + left: 100%; |
|---|
| 1510 | +} |
|---|
| 1511 | +.col-xs-push-11 { |
|---|
| 1512 | + left: 91.66666667%; |
|---|
| 1513 | +} |
|---|
| 1514 | +.col-xs-push-10 { |
|---|
| 1515 | + left: 83.33333333%; |
|---|
| 1516 | +} |
|---|
| 1517 | +.col-xs-push-9 { |
|---|
| 1518 | + left: 75%; |
|---|
| 1519 | +} |
|---|
| 1520 | +.col-xs-push-8 { |
|---|
| 1521 | + left: 66.66666667%; |
|---|
| 1522 | +} |
|---|
| 1523 | +.col-xs-push-7 { |
|---|
| 1524 | + left: 58.33333333%; |
|---|
| 1525 | +} |
|---|
| 1526 | +.col-xs-push-6 { |
|---|
| 1527 | + left: 50%; |
|---|
| 1528 | +} |
|---|
| 1529 | +.col-xs-push-5 { |
|---|
| 1530 | + left: 41.66666667%; |
|---|
| 1531 | +} |
|---|
| 1532 | +.col-xs-push-4 { |
|---|
| 1533 | + left: 33.33333333%; |
|---|
| 1534 | +} |
|---|
| 1535 | +.col-xs-push-3 { |
|---|
| 1536 | + left: 25%; |
|---|
| 1537 | +} |
|---|
| 1538 | +.col-xs-push-2 { |
|---|
| 1539 | + left: 16.66666667%; |
|---|
| 1540 | +} |
|---|
| 1541 | +.col-xs-push-1 { |
|---|
| 1542 | + left: 8.33333333%; |
|---|
| 1543 | +} |
|---|
| 1544 | +.col-xs-push-0 { |
|---|
| 1545 | + left: auto; |
|---|
| 1546 | +} |
|---|
| 1547 | +.col-xs-offset-12 { |
|---|
| 1548 | + margin-left: 100%; |
|---|
| 1549 | +} |
|---|
| 1550 | +.col-xs-offset-11 { |
|---|
| 1551 | + margin-left: 91.66666667%; |
|---|
| 1552 | +} |
|---|
| 1553 | +.col-xs-offset-10 { |
|---|
| 1554 | + margin-left: 83.33333333%; |
|---|
| 1555 | +} |
|---|
| 1556 | +.col-xs-offset-9 { |
|---|
| 1557 | + margin-left: 75%; |
|---|
| 1558 | +} |
|---|
| 1559 | +.col-xs-offset-8 { |
|---|
| 1560 | + margin-left: 66.66666667%; |
|---|
| 1561 | +} |
|---|
| 1562 | +.col-xs-offset-7 { |
|---|
| 1563 | + margin-left: 58.33333333%; |
|---|
| 1564 | +} |
|---|
| 1565 | +.col-xs-offset-6 { |
|---|
| 1566 | + margin-left: 50%; |
|---|
| 1567 | +} |
|---|
| 1568 | +.col-xs-offset-5 { |
|---|
| 1569 | + margin-left: 41.66666667%; |
|---|
| 1570 | +} |
|---|
| 1571 | +.col-xs-offset-4 { |
|---|
| 1572 | + margin-left: 33.33333333%; |
|---|
| 1573 | +} |
|---|
| 1574 | +.col-xs-offset-3 { |
|---|
| 1575 | + margin-left: 25%; |
|---|
| 1576 | +} |
|---|
| 1577 | +.col-xs-offset-2 { |
|---|
| 1578 | + margin-left: 16.66666667%; |
|---|
| 1579 | +} |
|---|
| 1580 | +.col-xs-offset-1 { |
|---|
| 1581 | + margin-left: 8.33333333%; |
|---|
| 1582 | +} |
|---|
| 1583 | +.col-xs-offset-0 { |
|---|
| 1584 | + margin-left: 0; |
|---|
| 1585 | +} |
|---|
| 1586 | +@media (min-width: 768px) { |
|---|
| 1587 | + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { |
|---|
| 1588 | + float: left; |
|---|
| 1589 | + } |
|---|
| 1590 | + .col-sm-12 { |
|---|
| 1591 | + width: 100%; |
|---|
| 1592 | + } |
|---|
| 1593 | + .col-sm-11 { |
|---|
| 1594 | + width: 91.66666667%; |
|---|
| 1595 | + } |
|---|
| 1596 | + .col-sm-10 { |
|---|
| 1597 | + width: 83.33333333%; |
|---|
| 1598 | + } |
|---|
| 1599 | + .col-sm-9 { |
|---|
| 1600 | + width: 75%; |
|---|
| 1601 | + } |
|---|
| 1602 | + .col-sm-8 { |
|---|
| 1603 | + width: 66.66666667%; |
|---|
| 1604 | + } |
|---|
| 1605 | + .col-sm-7 { |
|---|
| 1606 | + width: 58.33333333%; |
|---|
| 1607 | + } |
|---|
| 1608 | + .col-sm-6 { |
|---|
| 1609 | + width: 50%; |
|---|
| 1610 | + } |
|---|
| 1611 | + .col-sm-5 { |
|---|
| 1612 | + width: 41.66666667%; |
|---|
| 1613 | + } |
|---|
| 1614 | + .col-sm-4 { |
|---|
| 1615 | + width: 33.33333333%; |
|---|
| 1616 | + } |
|---|
| 1617 | + .col-sm-3 { |
|---|
| 1618 | + width: 25%; |
|---|
| 1619 | + } |
|---|
| 1620 | + .col-sm-2 { |
|---|
| 1621 | + width: 16.66666667%; |
|---|
| 1622 | + } |
|---|
| 1623 | + .col-sm-1 { |
|---|
| 1624 | + width: 8.33333333%; |
|---|
| 1625 | + } |
|---|
| 1626 | + .col-sm-pull-12 { |
|---|
| 1627 | + right: 100%; |
|---|
| 1628 | + } |
|---|
| 1629 | + .col-sm-pull-11 { |
|---|
| 1630 | + right: 91.66666667%; |
|---|
| 1631 | + } |
|---|
| 1632 | + .col-sm-pull-10 { |
|---|
| 1633 | + right: 83.33333333%; |
|---|
| 1634 | + } |
|---|
| 1635 | + .col-sm-pull-9 { |
|---|
| 1636 | + right: 75%; |
|---|
| 1637 | + } |
|---|
| 1638 | + .col-sm-pull-8 { |
|---|
| 1639 | + right: 66.66666667%; |
|---|
| 1640 | + } |
|---|
| 1641 | + .col-sm-pull-7 { |
|---|
| 1642 | + right: 58.33333333%; |
|---|
| 1643 | + } |
|---|
| 1644 | + .col-sm-pull-6 { |
|---|
| 1645 | + right: 50%; |
|---|
| 1646 | + } |
|---|
| 1647 | + .col-sm-pull-5 { |
|---|
| 1648 | + right: 41.66666667%; |
|---|
| 1649 | + } |
|---|
| 1650 | + .col-sm-pull-4 { |
|---|
| 1651 | + right: 33.33333333%; |
|---|
| 1652 | + } |
|---|
| 1653 | + .col-sm-pull-3 { |
|---|
| 1654 | + right: 25%; |
|---|
| 1655 | + } |
|---|
| 1656 | + .col-sm-pull-2 { |
|---|
| 1657 | + right: 16.66666667%; |
|---|
| 1658 | + } |
|---|
| 1659 | + .col-sm-pull-1 { |
|---|
| 1660 | + right: 8.33333333%; |
|---|
| 1661 | + } |
|---|
| 1662 | + .col-sm-pull-0 { |
|---|
| 1663 | + right: auto; |
|---|
| 1664 | + } |
|---|
| 1665 | + .col-sm-push-12 { |
|---|
| 1666 | + left: 100%; |
|---|
| 1667 | + } |
|---|
| 1668 | + .col-sm-push-11 { |
|---|
| 1669 | + left: 91.66666667%; |
|---|
| 1670 | + } |
|---|
| 1671 | + .col-sm-push-10 { |
|---|
| 1672 | + left: 83.33333333%; |
|---|
| 1673 | + } |
|---|
| 1674 | + .col-sm-push-9 { |
|---|
| 1675 | + left: 75%; |
|---|
| 1676 | + } |
|---|
| 1677 | + .col-sm-push-8 { |
|---|
| 1678 | + left: 66.66666667%; |
|---|
| 1679 | + } |
|---|
| 1680 | + .col-sm-push-7 { |
|---|
| 1681 | + left: 58.33333333%; |
|---|
| 1682 | + } |
|---|
| 1683 | + .col-sm-push-6 { |
|---|
| 1684 | + left: 50%; |
|---|
| 1685 | + } |
|---|
| 1686 | + .col-sm-push-5 { |
|---|
| 1687 | + left: 41.66666667%; |
|---|
| 1688 | + } |
|---|
| 1689 | + .col-sm-push-4 { |
|---|
| 1690 | + left: 33.33333333%; |
|---|
| 1691 | + } |
|---|
| 1692 | + .col-sm-push-3 { |
|---|
| 1693 | + left: 25%; |
|---|
| 1694 | + } |
|---|
| 1695 | + .col-sm-push-2 { |
|---|
| 1696 | + left: 16.66666667%; |
|---|
| 1697 | + } |
|---|
| 1698 | + .col-sm-push-1 { |
|---|
| 1699 | + left: 8.33333333%; |
|---|
| 1700 | + } |
|---|
| 1701 | + .col-sm-push-0 { |
|---|
| 1702 | + left: auto; |
|---|
| 1703 | + } |
|---|
| 1704 | + .col-sm-offset-12 { |
|---|
| 1705 | + margin-left: 100%; |
|---|
| 1706 | + } |
|---|
| 1707 | + .col-sm-offset-11 { |
|---|
| 1708 | + margin-left: 91.66666667%; |
|---|
| 1709 | + } |
|---|
| 1710 | + .col-sm-offset-10 { |
|---|
| 1711 | + margin-left: 83.33333333%; |
|---|
| 1712 | + } |
|---|
| 1713 | + .col-sm-offset-9 { |
|---|
| 1714 | + margin-left: 75%; |
|---|
| 1715 | + } |
|---|
| 1716 | + .col-sm-offset-8 { |
|---|
| 1717 | + margin-left: 66.66666667%; |
|---|
| 1718 | + } |
|---|
| 1719 | + .col-sm-offset-7 { |
|---|
| 1720 | + margin-left: 58.33333333%; |
|---|
| 1721 | + } |
|---|
| 1722 | + .col-sm-offset-6 { |
|---|
| 1723 | + margin-left: 50%; |
|---|
| 1724 | + } |
|---|
| 1725 | + .col-sm-offset-5 { |
|---|
| 1726 | + margin-left: 41.66666667%; |
|---|
| 1727 | + } |
|---|
| 1728 | + .col-sm-offset-4 { |
|---|
| 1729 | + margin-left: 33.33333333%; |
|---|
| 1730 | + } |
|---|
| 1731 | + .col-sm-offset-3 { |
|---|
| 1732 | + margin-left: 25%; |
|---|
| 1733 | + } |
|---|
| 1734 | + .col-sm-offset-2 { |
|---|
| 1735 | + margin-left: 16.66666667%; |
|---|
| 1736 | + } |
|---|
| 1737 | + .col-sm-offset-1 { |
|---|
| 1738 | + margin-left: 8.33333333%; |
|---|
| 1739 | + } |
|---|
| 1740 | + .col-sm-offset-0 { |
|---|
| 1741 | + margin-left: 0; |
|---|
| 1742 | + } |
|---|
| 1743 | +} |
|---|
| 1744 | +@media (min-width: 992px) { |
|---|
| 1745 | + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { |
|---|
| 1746 | + float: left; |
|---|
| 1747 | + } |
|---|
| 1748 | + .col-md-12 { |
|---|
| 1749 | + width: 100%; |
|---|
| 1750 | + } |
|---|
| 1751 | + .col-md-11 { |
|---|
| 1752 | + width: 91.66666667%; |
|---|
| 1753 | + } |
|---|
| 1754 | + .col-md-10 { |
|---|
| 1755 | + width: 83.33333333%; |
|---|
| 1756 | + } |
|---|
| 1757 | + .col-md-9 { |
|---|
| 1758 | + width: 75%; |
|---|
| 1759 | + } |
|---|
| 1760 | + .col-md-8 { |
|---|
| 1761 | + width: 66.66666667%; |
|---|
| 1762 | + } |
|---|
| 1763 | + .col-md-7 { |
|---|
| 1764 | + width: 58.33333333%; |
|---|
| 1765 | + } |
|---|
| 1766 | + .col-md-6 { |
|---|
| 1767 | + width: 50%; |
|---|
| 1768 | + } |
|---|
| 1769 | + .col-md-5 { |
|---|
| 1770 | + width: 41.66666667%; |
|---|
| 1771 | + } |
|---|
| 1772 | + .col-md-4 { |
|---|
| 1773 | + width: 33.33333333%; |
|---|
| 1774 | + } |
|---|
| 1775 | + .col-md-3 { |
|---|
| 1776 | + width: 25%; |
|---|
| 1777 | + } |
|---|
| 1778 | + .col-md-2 { |
|---|
| 1779 | + width: 16.66666667%; |
|---|
| 1780 | + } |
|---|
| 1781 | + .col-md-1 { |
|---|
| 1782 | + width: 8.33333333%; |
|---|
| 1783 | + } |
|---|
| 1784 | + .col-md-pull-12 { |
|---|
| 1785 | + right: 100%; |
|---|
| 1786 | + } |
|---|
| 1787 | + .col-md-pull-11 { |
|---|
| 1788 | + right: 91.66666667%; |
|---|
| 1789 | + } |
|---|
| 1790 | + .col-md-pull-10 { |
|---|
| 1791 | + right: 83.33333333%; |
|---|
| 1792 | + } |
|---|
| 1793 | + .col-md-pull-9 { |
|---|
| 1794 | + right: 75%; |
|---|
| 1795 | + } |
|---|
| 1796 | + .col-md-pull-8 { |
|---|
| 1797 | + right: 66.66666667%; |
|---|
| 1798 | + } |
|---|
| 1799 | + .col-md-pull-7 { |
|---|
| 1800 | + right: 58.33333333%; |
|---|
| 1801 | + } |
|---|
| 1802 | + .col-md-pull-6 { |
|---|
| 1803 | + right: 50%; |
|---|
| 1804 | + } |
|---|
| 1805 | + .col-md-pull-5 { |
|---|
| 1806 | + right: 41.66666667%; |
|---|
| 1807 | + } |
|---|
| 1808 | + .col-md-pull-4 { |
|---|
| 1809 | + right: 33.33333333%; |
|---|
| 1810 | + } |
|---|
| 1811 | + .col-md-pull-3 { |
|---|
| 1812 | + right: 25%; |
|---|
| 1813 | + } |
|---|
| 1814 | + .col-md-pull-2 { |
|---|
| 1815 | + right: 16.66666667%; |
|---|
| 1816 | + } |
|---|
| 1817 | + .col-md-pull-1 { |
|---|
| 1818 | + right: 8.33333333%; |
|---|
| 1819 | + } |
|---|
| 1820 | + .col-md-pull-0 { |
|---|
| 1821 | + right: auto; |
|---|
| 1822 | + } |
|---|
| 1823 | + .col-md-push-12 { |
|---|
| 1824 | + left: 100%; |
|---|
| 1825 | + } |
|---|
| 1826 | + .col-md-push-11 { |
|---|
| 1827 | + left: 91.66666667%; |
|---|
| 1828 | + } |
|---|
| 1829 | + .col-md-push-10 { |
|---|
| 1830 | + left: 83.33333333%; |
|---|
| 1831 | + } |
|---|
| 1832 | + .col-md-push-9 { |
|---|
| 1833 | + left: 75%; |
|---|
| 1834 | + } |
|---|
| 1835 | + .col-md-push-8 { |
|---|
| 1836 | + left: 66.66666667%; |
|---|
| 1837 | + } |
|---|
| 1838 | + .col-md-push-7 { |
|---|
| 1839 | + left: 58.33333333%; |
|---|
| 1840 | + } |
|---|
| 1841 | + .col-md-push-6 { |
|---|
| 1842 | + left: 50%; |
|---|
| 1843 | + } |
|---|
| 1844 | + .col-md-push-5 { |
|---|
| 1845 | + left: 41.66666667%; |
|---|
| 1846 | + } |
|---|
| 1847 | + .col-md-push-4 { |
|---|
| 1848 | + left: 33.33333333%; |
|---|
| 1849 | + } |
|---|
| 1850 | + .col-md-push-3 { |
|---|
| 1851 | + left: 25%; |
|---|
| 1852 | + } |
|---|
| 1853 | + .col-md-push-2 { |
|---|
| 1854 | + left: 16.66666667%; |
|---|
| 1855 | + } |
|---|
| 1856 | + .col-md-push-1 { |
|---|
| 1857 | + left: 8.33333333%; |
|---|
| 1858 | + } |
|---|
| 1859 | + .col-md-push-0 { |
|---|
| 1860 | + left: auto; |
|---|
| 1861 | + } |
|---|
| 1862 | + .col-md-offset-12 { |
|---|
| 1863 | + margin-left: 100%; |
|---|
| 1864 | + } |
|---|
| 1865 | + .col-md-offset-11 { |
|---|
| 1866 | + margin-left: 91.66666667%; |
|---|
| 1867 | + } |
|---|
| 1868 | + .col-md-offset-10 { |
|---|
| 1869 | + margin-left: 83.33333333%; |
|---|
| 1870 | + } |
|---|
| 1871 | + .col-md-offset-9 { |
|---|
| 1872 | + margin-left: 75%; |
|---|
| 1873 | + } |
|---|
| 1874 | + .col-md-offset-8 { |
|---|
| 1875 | + margin-left: 66.66666667%; |
|---|
| 1876 | + } |
|---|
| 1877 | + .col-md-offset-7 { |
|---|
| 1878 | + margin-left: 58.33333333%; |
|---|
| 1879 | + } |
|---|
| 1880 | + .col-md-offset-6 { |
|---|
| 1881 | + margin-left: 50%; |
|---|
| 1882 | + } |
|---|
| 1883 | + .col-md-offset-5 { |
|---|
| 1884 | + margin-left: 41.66666667%; |
|---|
| 1885 | + } |
|---|
| 1886 | + .col-md-offset-4 { |
|---|
| 1887 | + margin-left: 33.33333333%; |
|---|
| 1888 | + } |
|---|
| 1889 | + .col-md-offset-3 { |
|---|
| 1890 | + margin-left: 25%; |
|---|
| 1891 | + } |
|---|
| 1892 | + .col-md-offset-2 { |
|---|
| 1893 | + margin-left: 16.66666667%; |
|---|
| 1894 | + } |
|---|
| 1895 | + .col-md-offset-1 { |
|---|
| 1896 | + margin-left: 8.33333333%; |
|---|
| 1897 | + } |
|---|
| 1898 | + .col-md-offset-0 { |
|---|
| 1899 | + margin-left: 0; |
|---|
| 1900 | + } |
|---|
| 1901 | +} |
|---|
| 1902 | +@media (min-width: 1200px) { |
|---|
| 1903 | + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { |
|---|
| 1904 | + float: left; |
|---|
| 1905 | + } |
|---|
| 1906 | + .col-lg-12 { |
|---|
| 1907 | + width: 100%; |
|---|
| 1908 | + } |
|---|
| 1909 | + .col-lg-11 { |
|---|
| 1910 | + width: 91.66666667%; |
|---|
| 1911 | + } |
|---|
| 1912 | + .col-lg-10 { |
|---|
| 1913 | + width: 83.33333333%; |
|---|
| 1914 | + } |
|---|
| 1915 | + .col-lg-9 { |
|---|
| 1916 | + width: 75%; |
|---|
| 1917 | + } |
|---|
| 1918 | + .col-lg-8 { |
|---|
| 1919 | + width: 66.66666667%; |
|---|
| 1920 | + } |
|---|
| 1921 | + .col-lg-7 { |
|---|
| 1922 | + width: 58.33333333%; |
|---|
| 1923 | + } |
|---|
| 1924 | + .col-lg-6 { |
|---|
| 1925 | + width: 50%; |
|---|
| 1926 | + } |
|---|
| 1927 | + .col-lg-5 { |
|---|
| 1928 | + width: 41.66666667%; |
|---|
| 1929 | + } |
|---|
| 1930 | + .col-lg-4 { |
|---|
| 1931 | + width: 33.33333333%; |
|---|
| 1932 | + } |
|---|
| 1933 | + .col-lg-3 { |
|---|
| 1934 | + width: 25%; |
|---|
| 1935 | + } |
|---|
| 1936 | + .col-lg-2 { |
|---|
| 1937 | + width: 16.66666667%; |
|---|
| 1938 | + } |
|---|
| 1939 | + .col-lg-1 { |
|---|
| 1940 | + width: 8.33333333%; |
|---|
| 1941 | + } |
|---|
| 1942 | + .col-lg-pull-12 { |
|---|
| 1943 | + right: 100%; |
|---|
| 1944 | + } |
|---|
| 1945 | + .col-lg-pull-11 { |
|---|
| 1946 | + right: 91.66666667%; |
|---|
| 1947 | + } |
|---|
| 1948 | + .col-lg-pull-10 { |
|---|
| 1949 | + right: 83.33333333%; |
|---|
| 1950 | + } |
|---|
| 1951 | + .col-lg-pull-9 { |
|---|
| 1952 | + right: 75%; |
|---|
| 1953 | + } |
|---|
| 1954 | + .col-lg-pull-8 { |
|---|
| 1955 | + right: 66.66666667%; |
|---|
| 1956 | + } |
|---|
| 1957 | + .col-lg-pull-7 { |
|---|
| 1958 | + right: 58.33333333%; |
|---|
| 1959 | + } |
|---|
| 1960 | + .col-lg-pull-6 { |
|---|
| 1961 | + right: 50%; |
|---|
| 1962 | + } |
|---|
| 1963 | + .col-lg-pull-5 { |
|---|
| 1964 | + right: 41.66666667%; |
|---|
| 1965 | + } |
|---|
| 1966 | + .col-lg-pull-4 { |
|---|
| 1967 | + right: 33.33333333%; |
|---|
| 1968 | + } |
|---|
| 1969 | + .col-lg-pull-3 { |
|---|
| 1970 | + right: 25%; |
|---|
| 1971 | + } |
|---|
| 1972 | + .col-lg-pull-2 { |
|---|
| 1973 | + right: 16.66666667%; |
|---|
| 1974 | + } |
|---|
| 1975 | + .col-lg-pull-1 { |
|---|
| 1976 | + right: 8.33333333%; |
|---|
| 1977 | + } |
|---|
| 1978 | + .col-lg-pull-0 { |
|---|
| 1979 | + right: auto; |
|---|
| 1980 | + } |
|---|
| 1981 | + .col-lg-push-12 { |
|---|
| 1982 | + left: 100%; |
|---|
| 1983 | + } |
|---|
| 1984 | + .col-lg-push-11 { |
|---|
| 1985 | + left: 91.66666667%; |
|---|
| 1986 | + } |
|---|
| 1987 | + .col-lg-push-10 { |
|---|
| 1988 | + left: 83.33333333%; |
|---|
| 1989 | + } |
|---|
| 1990 | + .col-lg-push-9 { |
|---|
| 1991 | + left: 75%; |
|---|
| 1992 | + } |
|---|
| 1993 | + .col-lg-push-8 { |
|---|
| 1994 | + left: 66.66666667%; |
|---|
| 1995 | + } |
|---|
| 1996 | + .col-lg-push-7 { |
|---|
| 1997 | + left: 58.33333333%; |
|---|
| 1998 | + } |
|---|
| 1999 | + .col-lg-push-6 { |
|---|
| 2000 | + left: 50%; |
|---|
| 2001 | + } |
|---|
| 2002 | + .col-lg-push-5 { |
|---|
| 2003 | + left: 41.66666667%; |
|---|
| 2004 | + } |
|---|
| 2005 | + .col-lg-push-4 { |
|---|
| 2006 | + left: 33.33333333%; |
|---|
| 2007 | + } |
|---|
| 2008 | + .col-lg-push-3 { |
|---|
| 2009 | + left: 25%; |
|---|
| 2010 | + } |
|---|
| 2011 | + .col-lg-push-2 { |
|---|
| 2012 | + left: 16.66666667%; |
|---|
| 2013 | + } |
|---|
| 2014 | + .col-lg-push-1 { |
|---|
| 2015 | + left: 8.33333333%; |
|---|
| 2016 | + } |
|---|
| 2017 | + .col-lg-push-0 { |
|---|
| 2018 | + left: auto; |
|---|
| 2019 | + } |
|---|
| 2020 | + .col-lg-offset-12 { |
|---|
| 2021 | + margin-left: 100%; |
|---|
| 2022 | + } |
|---|
| 2023 | + .col-lg-offset-11 { |
|---|
| 2024 | + margin-left: 91.66666667%; |
|---|
| 2025 | + } |
|---|
| 2026 | + .col-lg-offset-10 { |
|---|
| 2027 | + margin-left: 83.33333333%; |
|---|
| 2028 | + } |
|---|
| 2029 | + .col-lg-offset-9 { |
|---|
| 2030 | + margin-left: 75%; |
|---|
| 2031 | + } |
|---|
| 2032 | + .col-lg-offset-8 { |
|---|
| 2033 | + margin-left: 66.66666667%; |
|---|
| 2034 | + } |
|---|
| 2035 | + .col-lg-offset-7 { |
|---|
| 2036 | + margin-left: 58.33333333%; |
|---|
| 2037 | + } |
|---|
| 2038 | + .col-lg-offset-6 { |
|---|
| 2039 | + margin-left: 50%; |
|---|
| 2040 | + } |
|---|
| 2041 | + .col-lg-offset-5 { |
|---|
| 2042 | + margin-left: 41.66666667%; |
|---|
| 2043 | + } |
|---|
| 2044 | + .col-lg-offset-4 { |
|---|
| 2045 | + margin-left: 33.33333333%; |
|---|
| 2046 | + } |
|---|
| 2047 | + .col-lg-offset-3 { |
|---|
| 2048 | + margin-left: 25%; |
|---|
| 2049 | + } |
|---|
| 2050 | + .col-lg-offset-2 { |
|---|
| 2051 | + margin-left: 16.66666667%; |
|---|
| 2052 | + } |
|---|
| 2053 | + .col-lg-offset-1 { |
|---|
| 2054 | + margin-left: 8.33333333%; |
|---|
| 2055 | + } |
|---|
| 2056 | + .col-lg-offset-0 { |
|---|
| 2057 | + margin-left: 0; |
|---|
| 2058 | + } |
|---|
| 2059 | +} |
|---|
| 2060 | +table { |
|---|
| 2061 | + background-color: transparent; |
|---|
| 2062 | +} |
|---|
| 2063 | +th { |
|---|
| 2064 | + text-align: left; |
|---|
| 2065 | +} |
|---|
| 2066 | +.table { |
|---|
| 2067 | + width: 100%; |
|---|
| 2068 | + max-width: 100%; |
|---|
| 2069 | + margin-bottom: 20px; |
|---|
| 2070 | +} |
|---|
| 2071 | +.table > thead > tr > th, |
|---|
| 2072 | +.table > tbody > tr > th, |
|---|
| 2073 | +.table > tfoot > tr > th, |
|---|
| 2074 | +.table > thead > tr > td, |
|---|
| 2075 | +.table > tbody > tr > td, |
|---|
| 2076 | +.table > tfoot > tr > td { |
|---|
| 2077 | + padding: 8px; |
|---|
| 2078 | + line-height: 1.42857143; |
|---|
| 2079 | + vertical-align: top; |
|---|
| 2080 | + border-top: 1px solid #ddd; |
|---|
| 2081 | +} |
|---|
| 2082 | +.table > thead > tr > th { |
|---|
| 2083 | + vertical-align: bottom; |
|---|
| 2084 | + border-bottom: 2px solid #ddd; |
|---|
| 2085 | +} |
|---|
| 2086 | +.table > caption + thead > tr:first-child > th, |
|---|
| 2087 | +.table > colgroup + thead > tr:first-child > th, |
|---|
| 2088 | +.table > thead:first-child > tr:first-child > th, |
|---|
| 2089 | +.table > caption + thead > tr:first-child > td, |
|---|
| 2090 | +.table > colgroup + thead > tr:first-child > td, |
|---|
| 2091 | +.table > thead:first-child > tr:first-child > td { |
|---|
| 2092 | + border-top: 0; |
|---|
| 2093 | +} |
|---|
| 2094 | +.table > tbody + tbody { |
|---|
| 2095 | + border-top: 2px solid #ddd; |
|---|
| 2096 | +} |
|---|
| 2097 | +.table .table { |
|---|
| 2098 | + background-color: #fff; |
|---|
| 2099 | +} |
|---|
| 2100 | +.table-condensed > thead > tr > th, |
|---|
| 2101 | +.table-condensed > tbody > tr > th, |
|---|
| 2102 | +.table-condensed > tfoot > tr > th, |
|---|
| 2103 | +.table-condensed > thead > tr > td, |
|---|
| 2104 | +.table-condensed > tbody > tr > td, |
|---|
| 2105 | +.table-condensed > tfoot > tr > td { |
|---|
| 2106 | + padding: 5px; |
|---|
| 2107 | +} |
|---|
| 2108 | +.table-bordered { |
|---|
| 2109 | + border: 1px solid #ddd; |
|---|
| 2110 | +} |
|---|
| 2111 | +.table-bordered > thead > tr > th, |
|---|
| 2112 | +.table-bordered > tbody > tr > th, |
|---|
| 2113 | +.table-bordered > tfoot > tr > th, |
|---|
| 2114 | +.table-bordered > thead > tr > td, |
|---|
| 2115 | +.table-bordered > tbody > tr > td, |
|---|
| 2116 | +.table-bordered > tfoot > tr > td { |
|---|
| 2117 | + border: 1px solid #ddd; |
|---|
| 2118 | +} |
|---|
| 2119 | +.table-bordered > thead > tr > th, |
|---|
| 2120 | +.table-bordered > thead > tr > td { |
|---|
| 2121 | + border-bottom-width: 2px; |
|---|
| 2122 | +} |
|---|
| 2123 | +.table-striped > tbody > tr:nth-child(odd) > td, |
|---|
| 2124 | +.table-striped > tbody > tr:nth-child(odd) > th { |
|---|
| 2125 | + background-color: #f9f9f9; |
|---|
| 2126 | +} |
|---|
| 2127 | +.table-hover > tbody > tr:hover > td, |
|---|
| 2128 | +.table-hover > tbody > tr:hover > th { |
|---|
| 2129 | + background-color: #f5f5f5; |
|---|
| 2130 | +} |
|---|
| 2131 | +table col[class*="col-"] { |
|---|
| 2132 | + position: static; |
|---|
| 2133 | + display: table-column; |
|---|
| 2134 | + float: none; |
|---|
| 2135 | +} |
|---|
| 2136 | +table td[class*="col-"], |
|---|
| 2137 | +table th[class*="col-"] { |
|---|
| 2138 | + position: static; |
|---|
| 2139 | + display: table-cell; |
|---|
| 2140 | + float: none; |
|---|
| 2141 | +} |
|---|
| 2142 | +.table > thead > tr > td.active, |
|---|
| 2143 | +.table > tbody > tr > td.active, |
|---|
| 2144 | +.table > tfoot > tr > td.active, |
|---|
| 2145 | +.table > thead > tr > th.active, |
|---|
| 2146 | +.table > tbody > tr > th.active, |
|---|
| 2147 | +.table > tfoot > tr > th.active, |
|---|
| 2148 | +.table > thead > tr.active > td, |
|---|
| 2149 | +.table > tbody > tr.active > td, |
|---|
| 2150 | +.table > tfoot > tr.active > td, |
|---|
| 2151 | +.table > thead > tr.active > th, |
|---|
| 2152 | +.table > tbody > tr.active > th, |
|---|
| 2153 | +.table > tfoot > tr.active > th { |
|---|
| 2154 | + background-color: #f5f5f5; |
|---|
| 2155 | +} |
|---|
| 2156 | +.table-hover > tbody > tr > td.active:hover, |
|---|
| 2157 | +.table-hover > tbody > tr > th.active:hover, |
|---|
| 2158 | +.table-hover > tbody > tr.active:hover > td, |
|---|
| 2159 | +.table-hover > tbody > tr:hover > .active, |
|---|
| 2160 | +.table-hover > tbody > tr.active:hover > th { |
|---|
| 2161 | + background-color: #e8e8e8; |
|---|
| 2162 | +} |
|---|
| 2163 | +.table > thead > tr > td.success, |
|---|
| 2164 | +.table > tbody > tr > td.success, |
|---|
| 2165 | +.table > tfoot > tr > td.success, |
|---|
| 2166 | +.table > thead > tr > th.success, |
|---|
| 2167 | +.table > tbody > tr > th.success, |
|---|
| 2168 | +.table > tfoot > tr > th.success, |
|---|
| 2169 | +.table > thead > tr.success > td, |
|---|
| 2170 | +.table > tbody > tr.success > td, |
|---|
| 2171 | +.table > tfoot > tr.success > td, |
|---|
| 2172 | +.table > thead > tr.success > th, |
|---|
| 2173 | +.table > tbody > tr.success > th, |
|---|
| 2174 | +.table > tfoot > tr.success > th { |
|---|
| 2175 | + background-color: #dff0d8; |
|---|
| 2176 | +} |
|---|
| 2177 | +.table-hover > tbody > tr > td.success:hover, |
|---|
| 2178 | +.table-hover > tbody > tr > th.success:hover, |
|---|
| 2179 | +.table-hover > tbody > tr.success:hover > td, |
|---|
| 2180 | +.table-hover > tbody > tr:hover > .success, |
|---|
| 2181 | +.table-hover > tbody > tr.success:hover > th { |
|---|
| 2182 | + background-color: #d0e9c6; |
|---|
| 2183 | +} |
|---|
| 2184 | +.table > thead > tr > td.info, |
|---|
| 2185 | +.table > tbody > tr > td.info, |
|---|
| 2186 | +.table > tfoot > tr > td.info, |
|---|
| 2187 | +.table > thead > tr > th.info, |
|---|
| 2188 | +.table > tbody > tr > th.info, |
|---|
| 2189 | +.table > tfoot > tr > th.info, |
|---|
| 2190 | +.table > thead > tr.info > td, |
|---|
| 2191 | +.table > tbody > tr.info > td, |
|---|
| 2192 | +.table > tfoot > tr.info > td, |
|---|
| 2193 | +.table > thead > tr.info > th, |
|---|
| 2194 | +.table > tbody > tr.info > th, |
|---|
| 2195 | +.table > tfoot > tr.info > th { |
|---|
| 2196 | + background-color: #d9edf7; |
|---|
| 2197 | +} |
|---|
| 2198 | +.table-hover > tbody > tr > td.info:hover, |
|---|
| 2199 | +.table-hover > tbody > tr > th.info:hover, |
|---|
| 2200 | +.table-hover > tbody > tr.info:hover > td, |
|---|
| 2201 | +.table-hover > tbody > tr:hover > .info, |
|---|
| 2202 | +.table-hover > tbody > tr.info:hover > th { |
|---|
| 2203 | + background-color: #c4e3f3; |
|---|
| 2204 | +} |
|---|
| 2205 | +.table > thead > tr > td.warning, |
|---|
| 2206 | +.table > tbody > tr > td.warning, |
|---|
| 2207 | +.table > tfoot > tr > td.warning, |
|---|
| 2208 | +.table > thead > tr > th.warning, |
|---|
| 2209 | +.table > tbody > tr > th.warning, |
|---|
| 2210 | +.table > tfoot > tr > th.warning, |
|---|
| 2211 | +.table > thead > tr.warning > td, |
|---|
| 2212 | +.table > tbody > tr.warning > td, |
|---|
| 2213 | +.table > tfoot > tr.warning > td, |
|---|
| 2214 | +.table > thead > tr.warning > th, |
|---|
| 2215 | +.table > tbody > tr.warning > th, |
|---|
| 2216 | +.table > tfoot > tr.warning > th { |
|---|
| 2217 | + background-color: #fcf8e3; |
|---|
| 2218 | +} |
|---|
| 2219 | +.table-hover > tbody > tr > td.warning:hover, |
|---|
| 2220 | +.table-hover > tbody > tr > th.warning:hover, |
|---|
| 2221 | +.table-hover > tbody > tr.warning:hover > td, |
|---|
| 2222 | +.table-hover > tbody > tr:hover > .warning, |
|---|
| 2223 | +.table-hover > tbody > tr.warning:hover > th { |
|---|
| 2224 | + background-color: #faf2cc; |
|---|
| 2225 | +} |
|---|
| 2226 | +.table > thead > tr > td.danger, |
|---|
| 2227 | +.table > tbody > tr > td.danger, |
|---|
| 2228 | +.table > tfoot > tr > td.danger, |
|---|
| 2229 | +.table > thead > tr > th.danger, |
|---|
| 2230 | +.table > tbody > tr > th.danger, |
|---|
| 2231 | +.table > tfoot > tr > th.danger, |
|---|
| 2232 | +.table > thead > tr.danger > td, |
|---|
| 2233 | +.table > tbody > tr.danger > td, |
|---|
| 2234 | +.table > tfoot > tr.danger > td, |
|---|
| 2235 | +.table > thead > tr.danger > th, |
|---|
| 2236 | +.table > tbody > tr.danger > th, |
|---|
| 2237 | +.table > tfoot > tr.danger > th { |
|---|
| 2238 | + background-color: #f2dede; |
|---|
| 2239 | +} |
|---|
| 2240 | +.table-hover > tbody > tr > td.danger:hover, |
|---|
| 2241 | +.table-hover > tbody > tr > th.danger:hover, |
|---|
| 2242 | +.table-hover > tbody > tr.danger:hover > td, |
|---|
| 2243 | +.table-hover > tbody > tr:hover > .danger, |
|---|
| 2244 | +.table-hover > tbody > tr.danger:hover > th { |
|---|
| 2245 | + background-color: #ebcccc; |
|---|
| 2246 | +} |
|---|
| 2247 | +@media screen and (max-width: 767px) { |
|---|
| 2248 | + .table-responsive { |
|---|
| 2249 | + width: 100%; |
|---|
| 2250 | + margin-bottom: 15px; |
|---|
| 2251 | + overflow-x: auto; |
|---|
| 2252 | + overflow-y: hidden; |
|---|
| 2253 | + -webkit-overflow-scrolling: touch; |
|---|
| 2254 | + -ms-overflow-style: -ms-autohiding-scrollbar; |
|---|
| 2255 | + border: 1px solid #ddd; |
|---|
| 2256 | + } |
|---|
| 2257 | + .table-responsive > .table { |
|---|
| 2258 | + margin-bottom: 0; |
|---|
| 2259 | + } |
|---|
| 2260 | + .table-responsive > .table > thead > tr > th, |
|---|
| 2261 | + .table-responsive > .table > tbody > tr > th, |
|---|
| 2262 | + .table-responsive > .table > tfoot > tr > th, |
|---|
| 2263 | + .table-responsive > .table > thead > tr > td, |
|---|
| 2264 | + .table-responsive > .table > tbody > tr > td, |
|---|
| 2265 | + .table-responsive > .table > tfoot > tr > td { |
|---|
| 2266 | + white-space: nowrap; |
|---|
| 2267 | + } |
|---|
| 2268 | + .table-responsive > .table-bordered { |
|---|
| 2269 | + border: 0; |
|---|
| 2270 | + } |
|---|
| 2271 | + .table-responsive > .table-bordered > thead > tr > th:first-child, |
|---|
| 2272 | + .table-responsive > .table-bordered > tbody > tr > th:first-child, |
|---|
| 2273 | + .table-responsive > .table-bordered > tfoot > tr > th:first-child, |
|---|
| 2274 | + .table-responsive > .table-bordered > thead > tr > td:first-child, |
|---|
| 2275 | + .table-responsive > .table-bordered > tbody > tr > td:first-child, |
|---|
| 2276 | + .table-responsive > .table-bordered > tfoot > tr > td:first-child { |
|---|
| 2277 | + border-left: 0; |
|---|
| 2278 | + } |
|---|
| 2279 | + .table-responsive > .table-bordered > thead > tr > th:last-child, |
|---|
| 2280 | + .table-responsive > .table-bordered > tbody > tr > th:last-child, |
|---|
| 2281 | + .table-responsive > .table-bordered > tfoot > tr > th:last-child, |
|---|
| 2282 | + .table-responsive > .table-bordered > thead > tr > td:last-child, |
|---|
| 2283 | + .table-responsive > .table-bordered > tbody > tr > td:last-child, |
|---|
| 2284 | + .table-responsive > .table-bordered > tfoot > tr > td:last-child { |
|---|
| 2285 | + border-right: 0; |
|---|
| 2286 | + } |
|---|
| 2287 | + .table-responsive > .table-bordered > tbody > tr:last-child > th, |
|---|
| 2288 | + .table-responsive > .table-bordered > tfoot > tr:last-child > th, |
|---|
| 2289 | + .table-responsive > .table-bordered > tbody > tr:last-child > td, |
|---|
| 2290 | + .table-responsive > .table-bordered > tfoot > tr:last-child > td { |
|---|
| 2291 | + border-bottom: 0; |
|---|
| 2292 | + } |
|---|
| 2293 | +} |
|---|
| 2294 | +fieldset { |
|---|
| 2295 | + min-width: 0; |
|---|
| 2296 | + padding: 0; |
|---|
| 2297 | + margin: 0; |
|---|
| 2298 | + border: 0; |
|---|
| 2299 | +} |
|---|
| 2300 | +legend { |
|---|
| 2301 | + display: block; |
|---|
| 2302 | + width: 100%; |
|---|
| 2303 | + padding: 0; |
|---|
| 2304 | + margin-bottom: 20px; |
|---|
| 2305 | + font-size: 21px; |
|---|
| 2306 | + line-height: inherit; |
|---|
| 2307 | + color: #333; |
|---|
| 2308 | + border: 0; |
|---|
| 2309 | + border-bottom: 1px solid #e5e5e5; |
|---|
| 2310 | +} |
|---|
| 2311 | +label { |
|---|
| 2312 | + display: inline-block; |
|---|
| 2313 | + max-width: 100%; |
|---|
| 2314 | + margin-bottom: 5px; |
|---|
| 2315 | + font-weight: bold; |
|---|
| 2316 | +} |
|---|
| 2317 | +input[type="search"] { |
|---|
| 2318 | + -webkit-box-sizing: border-box; |
|---|
| 2319 | + -moz-box-sizing: border-box; |
|---|
| 2320 | + box-sizing: border-box; |
|---|
| 2321 | +} |
|---|
| 2322 | +input[type="radio"], |
|---|
| 2323 | +input[type="checkbox"] { |
|---|
| 2324 | + margin: 4px 0 0; |
|---|
| 2325 | + margin-top: 1px \9; |
|---|
| 2326 | + line-height: normal; |
|---|
| 2327 | +} |
|---|
| 2328 | +input[type="file"] { |
|---|
| 2329 | + display: block; |
|---|
| 2330 | +} |
|---|
| 2331 | +input[type="range"] { |
|---|
| 2332 | + display: block; |
|---|
| 2333 | + width: 100%; |
|---|
| 2334 | +} |
|---|
| 2335 | +select[multiple], |
|---|
| 2336 | +select[size] { |
|---|
| 2337 | + height: auto; |
|---|
| 2338 | +} |
|---|
| 2339 | +input[type="file"]:focus, |
|---|
| 2340 | +input[type="radio"]:focus, |
|---|
| 2341 | +input[type="checkbox"]:focus { |
|---|
| 2342 | + outline: thin dotted; |
|---|
| 2343 | + outline: 5px auto -webkit-focus-ring-color; |
|---|
| 2344 | + outline-offset: -2px; |
|---|
| 2345 | +} |
|---|
| 2346 | +output { |
|---|
| 2347 | + display: block; |
|---|
| 2348 | + padding-top: 7px; |
|---|
| 2349 | + font-size: 14px; |
|---|
| 2350 | + line-height: 1.42857143; |
|---|
| 2351 | + color: #555; |
|---|
| 2352 | +} |
|---|
| 2353 | +.form-control { |
|---|
| 2354 | + display: block; |
|---|
| 2355 | + width: 100%; |
|---|
| 2356 | + height: 34px; |
|---|
| 2357 | + padding: 6px 12px; |
|---|
| 2358 | + font-size: 14px; |
|---|
| 2359 | + line-height: 1.42857143; |
|---|
| 2360 | + color: #555; |
|---|
| 2361 | + background-color: #fff; |
|---|
| 2362 | + background-image: none; |
|---|
| 2363 | + border: 1px solid #ccc; |
|---|
| 2364 | + border-radius: 4px; |
|---|
| 2365 | + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); |
|---|
| 2366 | + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); |
|---|
| 2367 | + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; |
|---|
| 2368 | + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; |
|---|
| 2369 | + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; |
|---|
| 2370 | +} |
|---|
| 2371 | +.form-control:focus { |
|---|
| 2372 | + border-color: #66afe9; |
|---|
| 2373 | + outline: 0; |
|---|
| 2374 | + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); |
|---|
| 2375 | + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); |
|---|
| 2376 | +} |
|---|
| 2377 | +.form-control::-moz-placeholder { |
|---|
| 2378 | + color: #777; |
|---|
| 2379 | + opacity: 1; |
|---|
| 2380 | +} |
|---|
| 2381 | +.form-control:-ms-input-placeholder { |
|---|
| 2382 | + color: #777; |
|---|
| 2383 | +} |
|---|
| 2384 | +.form-control::-webkit-input-placeholder { |
|---|
| 2385 | + color: #777; |
|---|
| 2386 | +} |
|---|
| 2387 | +.form-control[disabled], |
|---|
| 2388 | +.form-control[readonly], |
|---|
| 2389 | +fieldset[disabled] .form-control { |
|---|
| 2390 | + cursor: not-allowed; |
|---|
| 2391 | + background-color: #eee; |
|---|
| 2392 | + opacity: 1; |
|---|
| 2393 | +} |
|---|
| 2394 | +textarea.form-control { |
|---|
| 2395 | + height: auto; |
|---|
| 2396 | +} |
|---|
| 2397 | +input[type="search"] { |
|---|
| 2398 | + -webkit-appearance: none; |
|---|
| 2399 | +} |
|---|
| 2400 | +input[type="date"], |
|---|
| 2401 | +input[type="time"], |
|---|
| 2402 | +input[type="datetime-local"], |
|---|
| 2403 | +input[type="month"] { |
|---|
| 2404 | + line-height: 34px; |
|---|
| 2405 | + line-height: 1.42857143 \0; |
|---|
| 2406 | +} |
|---|
| 2407 | +input[type="date"].input-sm, |
|---|
| 2408 | +input[type="time"].input-sm, |
|---|
| 2409 | +input[type="datetime-local"].input-sm, |
|---|
| 2410 | +input[type="month"].input-sm { |
|---|
| 2411 | + line-height: 30px; |
|---|
| 2412 | +} |
|---|
| 2413 | +input[type="date"].input-lg, |
|---|
| 2414 | +input[type="time"].input-lg, |
|---|
| 2415 | +input[type="datetime-local"].input-lg, |
|---|
| 2416 | +input[type="month"].input-lg { |
|---|
| 2417 | + line-height: 46px; |
|---|
| 2418 | +} |
|---|
| 2419 | +.form-group { |
|---|
| 2420 | + margin-bottom: 15px; |
|---|
| 2421 | +} |
|---|
| 2422 | +.radio, |
|---|
| 2423 | +.checkbox { |
|---|
| 2424 | + position: relative; |
|---|
| 2425 | + display: block; |
|---|
| 2426 | + min-height: 20px; |
|---|
| 2427 | + margin-top: 10px; |
|---|
| 2428 | + margin-bottom: 10px; |
|---|
| 2429 | +} |
|---|
| 2430 | +.radio label, |
|---|
| 2431 | +.checkbox label { |
|---|
| 2432 | + padding-left: 20px; |
|---|
| 2433 | + margin-bottom: 0; |
|---|
| 2434 | + font-weight: normal; |
|---|
| 2435 | + cursor: pointer; |
|---|
| 2436 | +} |
|---|
| 2437 | +.radio input[type="radio"], |
|---|
| 2438 | +.radio-inline input[type="radio"], |
|---|
| 2439 | +.checkbox input[type="checkbox"], |
|---|
| 2440 | +.checkbox-inline input[type="checkbox"] { |
|---|
| 2441 | + position: absolute; |
|---|
| 2442 | + margin-top: 4px \9; |
|---|
| 2443 | + margin-left: -20px; |
|---|
| 2444 | +} |
|---|
| 2445 | +.radio + .radio, |
|---|
| 2446 | +.checkbox + .checkbox { |
|---|
| 2447 | + margin-top: -5px; |
|---|
| 2448 | +} |
|---|
| 2449 | +.radio-inline, |
|---|
| 2450 | +.checkbox-inline { |
|---|
| 2451 | + display: inline-block; |
|---|
| 2452 | + padding-left: 20px; |
|---|
| 2453 | + margin-bottom: 0; |
|---|
| 2454 | + font-weight: normal; |
|---|
| 2455 | + vertical-align: middle; |
|---|
| 2456 | + cursor: pointer; |
|---|
| 2457 | +} |
|---|
| 2458 | +.radio-inline + .radio-inline, |
|---|
| 2459 | +.checkbox-inline + .checkbox-inline { |
|---|
| 2460 | + margin-top: 0; |
|---|
| 2461 | + margin-left: 10px; |
|---|
| 2462 | +} |
|---|
| 2463 | +input[type="radio"][disabled], |
|---|
| 2464 | +input[type="checkbox"][disabled], |
|---|
| 2465 | +input[type="radio"].disabled, |
|---|
| 2466 | +input[type="checkbox"].disabled, |
|---|
| 2467 | +fieldset[disabled] input[type="radio"], |
|---|
| 2468 | +fieldset[disabled] input[type="checkbox"] { |
|---|
| 2469 | + cursor: not-allowed; |
|---|
| 2470 | +} |
|---|
| 2471 | +.radio-inline.disabled, |
|---|
| 2472 | +.checkbox-inline.disabled, |
|---|
| 2473 | +fieldset[disabled] .radio-inline, |
|---|
| 2474 | +fieldset[disabled] .checkbox-inline { |
|---|
| 2475 | + cursor: not-allowed; |
|---|
| 2476 | +} |
|---|
| 2477 | +.radio.disabled label, |
|---|
| 2478 | +.checkbox.disabled label, |
|---|
| 2479 | +fieldset[disabled] .radio label, |
|---|
| 2480 | +fieldset[disabled] .checkbox label { |
|---|
| 2481 | + cursor: not-allowed; |
|---|
| 2482 | +} |
|---|
| 2483 | +.form-control-static { |
|---|
| 2484 | + padding-top: 7px; |
|---|
| 2485 | + padding-bottom: 7px; |
|---|
| 2486 | + margin-bottom: 0; |
|---|
| 2487 | +} |
|---|
| 2488 | +.form-control-static.input-lg, |
|---|
| 2489 | +.form-control-static.input-sm { |
|---|
| 2490 | + padding-right: 0; |
|---|
| 2491 | + padding-left: 0; |
|---|
| 2492 | +} |
|---|
| 2493 | +.input-sm, |
|---|
| 2494 | +.form-horizontal .form-group-sm .form-control { |
|---|
| 2495 | + height: 30px; |
|---|
| 2496 | + padding: 5px 10px; |
|---|
| 2497 | + font-size: 12px; |
|---|
| 2498 | + line-height: 1.5; |
|---|
| 2499 | + border-radius: 3px; |
|---|
| 2500 | +} |
|---|
| 2501 | +select.input-sm { |
|---|
| 2502 | + height: 30px; |
|---|
| 2503 | + line-height: 30px; |
|---|
| 2504 | +} |
|---|
| 2505 | +textarea.input-sm, |
|---|
| 2506 | +select[multiple].input-sm { |
|---|
| 2507 | + height: auto; |
|---|
| 2508 | +} |
|---|
| 2509 | +.input-lg, |
|---|
| 2510 | +.form-horizontal .form-group-lg .form-control { |
|---|
| 2511 | + height: 46px; |
|---|
| 2512 | + padding: 10px 16px; |
|---|
| 2513 | + font-size: 18px; |
|---|
| 2514 | + line-height: 1.33; |
|---|
| 2515 | + border-radius: 6px; |
|---|
| 2516 | +} |
|---|
| 2517 | +select.input-lg { |
|---|
| 2518 | + height: 46px; |
|---|
| 2519 | + line-height: 46px; |
|---|
| 2520 | +} |
|---|
| 2521 | +textarea.input-lg, |
|---|
| 2522 | +select[multiple].input-lg { |
|---|
| 2523 | + height: auto; |
|---|
| 2524 | +} |
|---|
| 2525 | +.has-feedback { |
|---|
| 2526 | + position: relative; |
|---|
| 2527 | +} |
|---|
| 2528 | +.has-feedback .form-control { |
|---|
| 2529 | + padding-right: 42.5px; |
|---|
| 2530 | +} |
|---|
| 2531 | +.form-control-feedback { |
|---|
| 2532 | + position: absolute; |
|---|
| 2533 | + top: 25px; |
|---|
| 2534 | + right: 0; |
|---|
| 2535 | + z-index: 2; |
|---|
| 2536 | + display: block; |
|---|
| 2537 | + width: 34px; |
|---|
| 2538 | + height: 34px; |
|---|
| 2539 | + line-height: 34px; |
|---|
| 2540 | + text-align: center; |
|---|
| 2541 | +} |
|---|
| 2542 | +.input-lg + .form-control-feedback { |
|---|
| 2543 | + width: 46px; |
|---|
| 2544 | + height: 46px; |
|---|
| 2545 | + line-height: 46px; |
|---|
| 2546 | +} |
|---|
| 2547 | +.input-sm + .form-control-feedback { |
|---|
| 2548 | + width: 30px; |
|---|
| 2549 | + height: 30px; |
|---|
| 2550 | + line-height: 30px; |
|---|
| 2551 | +} |
|---|
| 2552 | +.has-success .help-block, |
|---|
| 2553 | +.has-success .control-label, |
|---|
| 2554 | +.has-success .radio, |
|---|
| 2555 | +.has-success .checkbox, |
|---|
| 2556 | +.has-success .radio-inline, |
|---|
| 2557 | +.has-success .checkbox-inline { |
|---|
| 2558 | + color: #3c763d; |
|---|
| 2559 | +} |
|---|
| 2560 | +.has-success .form-control { |
|---|
| 2561 | + border-color: #3c763d; |
|---|
| 2562 | + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); |
|---|
| 2563 | + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); |
|---|
| 2564 | +} |
|---|
| 2565 | +.has-success .form-control:focus { |
|---|
| 2566 | + border-color: #2b542c; |
|---|
| 2567 | + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; |
|---|
| 2568 | + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; |
|---|
| 2569 | +} |
|---|
| 2570 | +.has-success .input-group-addon { |
|---|
| 2571 | + color: #3c763d; |
|---|
| 2572 | + background-color: #dff0d8; |
|---|
| 2573 | + border-color: #3c763d; |
|---|
| 2574 | +} |
|---|
| 2575 | +.has-success .form-control-feedback { |
|---|
| 2576 | + color: #3c763d; |
|---|
| 2577 | +} |
|---|
| 2578 | +.has-warning .help-block, |
|---|
| 2579 | +.has-warning .control-label, |
|---|
| 2580 | +.has-warning .radio, |
|---|
| 2581 | +.has-warning .checkbox, |
|---|
| 2582 | +.has-warning .radio-inline, |
|---|
| 2583 | +.has-warning .checkbox-inline { |
|---|
| 2584 | + color: #8a6d3b; |
|---|
| 2585 | +} |
|---|
| 2586 | +.has-warning .form-control { |
|---|
| 2587 | + border-color: #8a6d3b; |
|---|
| 2588 | + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); |
|---|
| 2589 | + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); |
|---|
| 2590 | +} |
|---|
| 2591 | +.has-warning .form-control:focus { |
|---|
| 2592 | + border-color: #66512c; |
|---|
| 2593 | + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; |
|---|
| 2594 | + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; |
|---|
| 2595 | +} |
|---|
| 2596 | +.has-warning .input-group-addon { |
|---|
| 2597 | + color: #8a6d3b; |
|---|
| 2598 | + background-color: #fcf8e3; |
|---|
| 2599 | + border-color: #8a6d3b; |
|---|
| 2600 | +} |
|---|
| 2601 | +.has-warning .form-control-feedback { |
|---|
| 2602 | + color: #8a6d3b; |
|---|
| 2603 | +} |
|---|
| 2604 | +.has-error .help-block, |
|---|
| 2605 | +.has-error .control-label, |
|---|
| 2606 | +.has-error .radio, |
|---|
| 2607 | +.has-error .checkbox, |
|---|
| 2608 | +.has-error .radio-inline, |
|---|
| 2609 | +.has-error .checkbox-inline { |
|---|
| 2610 | + color: #a94442; |
|---|
| 2611 | +} |
|---|
| 2612 | +.has-error .form-control { |
|---|
| 2613 | + border-color: #a94442; |
|---|
| 2614 | + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); |
|---|
| 2615 | + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); |
|---|
| 2616 | +} |
|---|
| 2617 | +.has-error .form-control:focus { |
|---|
| 2618 | + border-color: #843534; |
|---|
| 2619 | + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; |
|---|
| 2620 | + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; |
|---|
| 2621 | +} |
|---|
| 2622 | +.has-error .input-group-addon { |
|---|
| 2623 | + color: #a94442; |
|---|
| 2624 | + background-color: #f2dede; |
|---|
| 2625 | + border-color: #a94442; |
|---|
| 2626 | +} |
|---|
| 2627 | +.has-error .form-control-feedback { |
|---|
| 2628 | + color: #a94442; |
|---|
| 2629 | +} |
|---|
| 2630 | +.has-feedback label.sr-only ~ .form-control-feedback { |
|---|
| 2631 | + top: 0; |
|---|
| 2632 | +} |
|---|
| 2633 | +.help-block { |
|---|
| 2634 | + display: block; |
|---|
| 2635 | + margin-top: 5px; |
|---|
| 2636 | + margin-bottom: 10px; |
|---|
| 2637 | + color: #737373; |
|---|
| 2638 | +} |
|---|
| 2639 | +@media (min-width: 768px) { |
|---|
| 2640 | + .form-inline .form-group { |
|---|
| 2641 | + display: inline-block; |
|---|
| 2642 | + margin-bottom: 0; |
|---|
| 2643 | + vertical-align: middle; |
|---|
| 2644 | + } |
|---|
| 2645 | + .form-inline .form-control { |
|---|
| 2646 | + display: inline-block; |
|---|
| 2647 | + width: auto; |
|---|
| 2648 | + vertical-align: middle; |
|---|
| 2649 | + } |
|---|
| 2650 | + .form-inline .input-group { |
|---|
| 2651 | + display: inline-table; |
|---|
| 2652 | + vertical-align: middle; |
|---|
| 2653 | + } |
|---|
| 2654 | + .form-inline .input-group .input-group-addon, |
|---|
| 2655 | + .form-inline .input-group .input-group-btn, |
|---|
| 2656 | + .form-inline .input-group .form-control { |
|---|
| 2657 | + width: auto; |
|---|
| 2658 | + } |
|---|
| 2659 | + .form-inline .input-group > .form-control { |
|---|
| 2660 | + width: 100%; |
|---|
| 2661 | + } |
|---|
| 2662 | + .form-inline .control-label { |
|---|
| 2663 | + margin-bottom: 0; |
|---|
| 2664 | + vertical-align: middle; |
|---|
| 2665 | + } |
|---|
| 2666 | + .form-inline .radio, |
|---|
| 2667 | + .form-inline .checkbox { |
|---|
| 2668 | + display: inline-block; |
|---|
| 2669 | + margin-top: 0; |
|---|
| 2670 | + margin-bottom: 0; |
|---|
| 2671 | + vertical-align: middle; |
|---|
| 2672 | + } |
|---|
| 2673 | + .form-inline .radio label, |
|---|
| 2674 | + .form-inline .checkbox label { |
|---|
| 2675 | + padding-left: 0; |
|---|
| 2676 | + } |
|---|
| 2677 | + .form-inline .radio input[type="radio"], |
|---|
| 2678 | + .form-inline .checkbox input[type="checkbox"] { |
|---|
| 2679 | + position: relative; |
|---|
| 2680 | + margin-left: 0; |
|---|
| 2681 | + } |
|---|
| 2682 | + .form-inline .has-feedback .form-control-feedback { |
|---|
| 2683 | + top: 0; |
|---|
| 2684 | + } |
|---|
| 2685 | +} |
|---|
| 2686 | +.form-horizontal .radio, |
|---|
| 2687 | +.form-horizontal .checkbox, |
|---|
| 2688 | +.form-horizontal .radio-inline, |
|---|
| 2689 | +.form-horizontal .checkbox-inline { |
|---|
| 2690 | + padding-top: 7px; |
|---|
| 2691 | + margin-top: 0; |
|---|
| 2692 | + margin-bottom: 0; |
|---|
| 2693 | +} |
|---|
| 2694 | +.form-horizontal .radio, |
|---|
| 2695 | +.form-horizontal .checkbox { |
|---|
| 2696 | + min-height: 27px; |
|---|
| 2697 | +} |
|---|
| 2698 | +.form-horizontal .form-group { |
|---|
| 2699 | + margin-right: -15px; |
|---|
| 2700 | + margin-left: -15px; |
|---|
| 2701 | +} |
|---|
| 2702 | +@media (min-width: 768px) { |
|---|
| 2703 | + .form-horizontal .control-label { |
|---|
| 2704 | + padding-top: 7px; |
|---|
| 2705 | + margin-bottom: 0; |
|---|
| 2706 | + text-align: right; |
|---|
| 2707 | + } |
|---|
| 2708 | +} |
|---|
| 2709 | +.form-horizontal .has-feedback .form-control-feedback { |
|---|
| 2710 | + top: 0; |
|---|
| 2711 | + right: 15px; |
|---|
| 2712 | +} |
|---|
| 2713 | +@media (min-width: 768px) { |
|---|
| 2714 | + .form-horizontal .form-group-lg .control-label { |
|---|
| 2715 | + padding-top: 14.3px; |
|---|
| 2716 | + } |
|---|
| 2717 | +} |
|---|
| 2718 | +@media (min-width: 768px) { |
|---|
| 2719 | + .form-horizontal .form-group-sm .control-label { |
|---|
| 2720 | + padding-top: 6px; |
|---|
| 2721 | + } |
|---|
| 2722 | +} |
|---|
| 2723 | +.btn { |
|---|
| 2724 | + display: inline-block; |
|---|
| 2725 | + padding: 6px 12px; |
|---|
| 2726 | + margin-bottom: 0; |
|---|
| 2727 | + font-size: 14px; |
|---|
| 2728 | + font-weight: normal; |
|---|
| 2729 | + line-height: 1.42857143; |
|---|
| 2730 | + text-align: center; |
|---|
| 2731 | + white-space: nowrap; |
|---|
| 2732 | + vertical-align: middle; |
|---|
| 2733 | + cursor: pointer; |
|---|
| 2734 | + -webkit-user-select: none; |
|---|
| 2735 | + -moz-user-select: none; |
|---|
| 2736 | + -ms-user-select: none; |
|---|
| 2737 | + user-select: none; |
|---|
| 2738 | + background-image: none; |
|---|
| 2739 | + border: 1px solid transparent; |
|---|
| 2740 | + border-radius: 4px; |
|---|
| 2741 | +} |
|---|
| 2742 | +.btn:focus, |
|---|
| 2743 | +.btn:active:focus, |
|---|
| 2744 | +.btn.active:focus { |
|---|
| 2745 | + outline: thin dotted; |
|---|
| 2746 | + outline: 5px auto -webkit-focus-ring-color; |
|---|
| 2747 | + outline-offset: -2px; |
|---|
| 2748 | +} |
|---|
| 2749 | +.btn:hover, |
|---|
| 2750 | +.btn:focus { |
|---|
| 2751 | + color: #333; |
|---|
| 2752 | + text-decoration: none; |
|---|
| 2753 | +} |
|---|
| 2754 | +.btn:active, |
|---|
| 2755 | +.btn.active { |
|---|
| 2756 | + background-image: none; |
|---|
| 2757 | + outline: 0; |
|---|
| 2758 | + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); |
|---|
| 2759 | + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); |
|---|
| 2760 | +} |
|---|
| 2761 | +.btn.disabled, |
|---|
| 2762 | +.btn[disabled], |
|---|
| 2763 | +fieldset[disabled] .btn { |
|---|
| 2764 | + pointer-events: none; |
|---|
| 2765 | + cursor: not-allowed; |
|---|
| 2766 | + filter: alpha(opacity=65); |
|---|
| 2767 | + -webkit-box-shadow: none; |
|---|
| 2768 | + box-shadow: none; |
|---|
| 2769 | + opacity: .65; |
|---|
| 2770 | +} |
|---|
| 2771 | +.btn-default { |
|---|
| 2772 | + color: #333; |
|---|
| 2773 | + background-color: #fff; |
|---|
| 2774 | + border-color: #ccc; |
|---|
| 2775 | +} |
|---|
| 2776 | +.btn-default:hover, |
|---|
| 2777 | +.btn-default:focus, |
|---|
| 2778 | +.btn-default:active, |
|---|
| 2779 | +.btn-default.active, |
|---|
| 2780 | +.open > .dropdown-toggle.btn-default { |
|---|
| 2781 | + color: #333; |
|---|
| 2782 | + background-color: #e6e6e6; |
|---|
| 2783 | + border-color: #adadad; |
|---|
| 2784 | +} |
|---|
| 2785 | +.btn-default:active, |
|---|
| 2786 | +.btn-default.active, |
|---|
| 2787 | +.open > .dropdown-toggle.btn-default { |
|---|
| 2788 | + background-image: none; |
|---|
| 2789 | +} |
|---|
| 2790 | +.btn-default.disabled, |
|---|
| 2791 | +.btn-default[disabled], |
|---|
| 2792 | +fieldset[disabled] .btn-default, |
|---|
| 2793 | +.btn-default.disabled:hover, |
|---|
| 2794 | +.btn-default[disabled]:hover, |
|---|
| 2795 | +fieldset[disabled] .btn-default:hover, |
|---|
| 2796 | +.btn-default.disabled:focus, |
|---|
| 2797 | +.btn-default[disabled]:focus, |
|---|
| 2798 | +fieldset[disabled] .btn-default:focus, |
|---|
| 2799 | +.btn-default.disabled:active, |
|---|
| 2800 | +.btn-default[disabled]:active, |
|---|
| 2801 | +fieldset[disabled] .btn-default:active, |
|---|
| 2802 | +.btn-default.disabled.active, |
|---|
| 2803 | +.btn-default[disabled].active, |
|---|
| 2804 | +fieldset[disabled] .btn-default.active { |
|---|
| 2805 | + background-color: #fff; |
|---|
| 2806 | + border-color: #ccc; |
|---|
| 2807 | +} |
|---|
| 2808 | +.btn-default .badge { |
|---|
| 2809 | + color: #fff; |
|---|
| 2810 | + background-color: #333; |
|---|
| 2811 | +} |
|---|
| 2812 | +.btn-primary { |
|---|
| 2813 | + color: #fff; |
|---|
| 2814 | + background-color: #428bca; |
|---|
| 2815 | + border-color: #357ebd; |
|---|
| 2816 | +} |
|---|
| 2817 | +.btn-primary:hover, |
|---|
| 2818 | +.btn-primary:focus, |
|---|
| 2819 | +.btn-primary:active, |
|---|
| 2820 | +.btn-primary.active, |
|---|
| 2821 | +.open > .dropdown-toggle.btn-primary { |
|---|
| 2822 | + color: #fff; |
|---|
| 2823 | + background-color: #3071a9; |
|---|
| 2824 | + border-color: #285e8e; |
|---|
| 2825 | +} |
|---|
| 2826 | +.btn-primary:active, |
|---|
| 2827 | +.btn-primary.active, |
|---|
| 2828 | +.open > .dropdown-toggle.btn-primary { |
|---|
| 2829 | + background-image: none; |
|---|
| 2830 | +} |
|---|
| 2831 | +.btn-primary.disabled, |
|---|
| 2832 | +.btn-primary[disabled], |
|---|
| 2833 | +fieldset[disabled] .btn-primary, |
|---|
| 2834 | +.btn-primary.disabled:hover, |
|---|
| 2835 | +.btn-primary[disabled]:hover, |
|---|
| 2836 | +fieldset[disabled] .btn-primary:hover, |
|---|
| 2837 | +.btn-primary.disabled:focus, |
|---|
| 2838 | +.btn-primary[disabled]:focus, |
|---|
| 2839 | +fieldset[disabled] .btn-primary:focus, |
|---|
| 2840 | +.btn-primary.disabled:active, |
|---|
| 2841 | +.btn-primary[disabled]:active, |
|---|
| 2842 | +fieldset[disabled] .btn-primary:active, |
|---|
| 2843 | +.btn-primary.disabled.active, |
|---|
| 2844 | +.btn-primary[disabled].active, |
|---|
| 2845 | +fieldset[disabled] .btn-primary.active { |
|---|
| 2846 | + background-color: #428bca; |
|---|
| 2847 | + border-color: #357ebd; |
|---|
| 2848 | +} |
|---|
| 2849 | +.btn-primary .badge { |
|---|
| 2850 | + color: #428bca; |
|---|
| 2851 | + background-color: #fff; |
|---|
| 2852 | +} |
|---|
| 2853 | +.btn-success { |
|---|
| 2854 | + color: #fff; |
|---|
| 2855 | + background-color: #5cb85c; |
|---|
| 2856 | + border-color: #4cae4c; |
|---|
| 2857 | +} |
|---|
| 2858 | +.btn-success:hover, |
|---|
| 2859 | +.btn-success:focus, |
|---|
| 2860 | +.btn-success:active, |
|---|
| 2861 | +.btn-success.active, |
|---|
| 2862 | +.open > .dropdown-toggle.btn-success { |
|---|
| 2863 | + color: #fff; |
|---|
| 2864 | + background-color: #449d44; |
|---|
| 2865 | + border-color: #398439; |
|---|
| 2866 | +} |
|---|
| 2867 | +.btn-success:active, |
|---|
| 2868 | +.btn-success.active, |
|---|
| 2869 | +.open > .dropdown-toggle.btn-success { |
|---|
| 2870 | + background-image: none; |
|---|
| 2871 | +} |
|---|
| 2872 | +.btn-success.disabled, |
|---|
| 2873 | +.btn-success[disabled], |
|---|
| 2874 | +fieldset[disabled] .btn-success, |
|---|
| 2875 | +.btn-success.disabled:hover, |
|---|
| 2876 | +.btn-success[disabled]:hover, |
|---|
| 2877 | +fieldset[disabled] .btn-success:hover, |
|---|
| 2878 | +.btn-success.disabled:focus, |
|---|
| 2879 | +.btn-success[disabled]:focus, |
|---|
| 2880 | +fieldset[disabled] .btn-success:focus, |
|---|
| 2881 | +.btn-success.disabled:active, |
|---|
| 2882 | +.btn-success[disabled]:active, |
|---|
| 2883 | +fieldset[disabled] .btn-success:active, |
|---|
| 2884 | +.btn-success.disabled.active, |
|---|
| 2885 | +.btn-success[disabled].active, |
|---|
| 2886 | +fieldset[disabled] .btn-success.active { |
|---|
| 2887 | + background-color: #5cb85c; |
|---|
| 2888 | + border-color: #4cae4c; |
|---|
| 2889 | +} |
|---|
| 2890 | +.btn-success .badge { |
|---|
| 2891 | + color: #5cb85c; |
|---|
| 2892 | + background-color: #fff; |
|---|
| 2893 | +} |
|---|
| 2894 | +.btn-info { |
|---|
| 2895 | + color: #fff; |
|---|
| 2896 | + background-color: #5bc0de; |
|---|
| 2897 | + border-color: #46b8da; |
|---|
| 2898 | +} |
|---|
| 2899 | +.btn-info:hover, |
|---|
| 2900 | +.btn-info:focus, |
|---|
| 2901 | +.btn-info:active, |
|---|
| 2902 | +.btn-info.active, |
|---|
| 2903 | +.open > .dropdown-toggle.btn-info { |
|---|
| 2904 | + color: #fff; |
|---|
| 2905 | + background-color: #31b0d5; |
|---|
| 2906 | + border-color: #269abc; |
|---|
| 2907 | +} |
|---|
| 2908 | +.btn-info:active, |
|---|
| 2909 | +.btn-info.active, |
|---|
| 2910 | +.open > .dropdown-toggle.btn-info { |
|---|
| 2911 | + background-image: none; |
|---|
| 2912 | +} |
|---|
| 2913 | +.btn-info.disabled, |
|---|
| 2914 | +.btn-info[disabled], |
|---|
| 2915 | +fieldset[disabled] .btn-info, |
|---|
| 2916 | +.btn-info.disabled:hover, |
|---|
| 2917 | +.btn-info[disabled]:hover, |
|---|
| 2918 | +fieldset[disabled] .btn-info:hover, |
|---|
| 2919 | +.btn-info.disabled:focus, |
|---|
| 2920 | +.btn-info[disabled]:focus, |
|---|
| 2921 | +fieldset[disabled] .btn-info:focus, |
|---|
| 2922 | +.btn-info.disabled:active, |
|---|
| 2923 | +.btn-info[disabled]:active, |
|---|
| 2924 | +fieldset[disabled] .btn-info:active, |
|---|
| 2925 | +.btn-info.disabled.active, |
|---|
| 2926 | +.btn-info[disabled].active, |
|---|
| 2927 | +fieldset[disabled] .btn-info.active { |
|---|
| 2928 | + background-color: #5bc0de; |
|---|
| 2929 | + border-color: #46b8da; |
|---|
| 2930 | +} |
|---|
| 2931 | +.btn-info .badge { |
|---|
| 2932 | + color: #5bc0de; |
|---|
| 2933 | + background-color: #fff; |
|---|
| 2934 | +} |
|---|
| 2935 | +.btn-warning { |
|---|
| 2936 | + color: #fff; |
|---|
| 2937 | + background-color: #f0ad4e; |
|---|
| 2938 | + border-color: #eea236; |
|---|
| 2939 | +} |
|---|
| 2940 | +.btn-warning:hover, |
|---|
| 2941 | +.btn-warning:focus, |
|---|
| 2942 | +.btn-warning:active, |
|---|
| 2943 | +.btn-warning.active, |
|---|
| 2944 | +.open > .dropdown-toggle.btn-warning { |
|---|
| 2945 | + color: #fff; |
|---|
| 2946 | + background-color: #ec971f; |
|---|
| 2947 | + border-color: #d58512; |
|---|
| 2948 | +} |
|---|
| 2949 | +.btn-warning:active, |
|---|
| 2950 | +.btn-warning.active, |
|---|
| 2951 | +.open > .dropdown-toggle.btn-warning { |
|---|
| 2952 | + background-image: none; |
|---|
| 2953 | +} |
|---|
| 2954 | +.btn-warning.disabled, |
|---|
| 2955 | +.btn-warning[disabled], |
|---|
| 2956 | +fieldset[disabled] .btn-warning, |
|---|
| 2957 | +.btn-warning.disabled:hover, |
|---|
| 2958 | +.btn-warning[disabled]:hover, |
|---|
| 2959 | +fieldset[disabled] .btn-warning:hover, |
|---|
| 2960 | +.btn-warning.disabled:focus, |
|---|
| 2961 | +.btn-warning[disabled]:focus, |
|---|
| 2962 | +fieldset[disabled] .btn-warning:focus, |
|---|
| 2963 | +.btn-warning.disabled:active, |
|---|
| 2964 | +.btn-warning[disabled]:active, |
|---|
| 2965 | +fieldset[disabled] .btn-warning:active, |
|---|
| 2966 | +.btn-warning.disabled.active, |
|---|
| 2967 | +.btn-warning[disabled].active, |
|---|
| 2968 | +fieldset[disabled] .btn-warning.active { |
|---|
| 2969 | + background-color: #f0ad4e; |
|---|
| 2970 | + border-color: #eea236; |
|---|
| 2971 | +} |
|---|
| 2972 | +.btn-warning .badge { |
|---|
| 2973 | + color: #f0ad4e; |
|---|
| 2974 | + background-color: #fff; |
|---|
| 2975 | +} |
|---|
| 2976 | +.btn-danger { |
|---|
| 2977 | + color: #fff; |
|---|
| 2978 | + background-color: #d9534f; |
|---|
| 2979 | + border-color: #d43f3a; |
|---|
| 2980 | +} |
|---|
| 2981 | +.btn-danger:hover, |
|---|
| 2982 | +.btn-danger:focus, |
|---|
| 2983 | +.btn-danger:active, |
|---|
| 2984 | +.btn-danger.active, |
|---|
| 2985 | +.open > .dropdown-toggle.btn-danger { |
|---|
| 2986 | + color: #fff; |
|---|
| 2987 | + background-color: #c9302c; |
|---|
| 2988 | + border-color: #ac2925; |
|---|
| 2989 | +} |
|---|
| 2990 | +.btn-danger:active, |
|---|
| 2991 | +.btn-danger.active, |
|---|
| 2992 | +.open > .dropdown-toggle.btn-danger { |
|---|
| 2993 | + background-image: none; |
|---|
| 2994 | +} |
|---|
| 2995 | +.btn-danger.disabled, |
|---|
| 2996 | +.btn-danger[disabled], |
|---|
| 2997 | +fieldset[disabled] .btn-danger, |
|---|
| 2998 | +.btn-danger.disabled:hover, |
|---|
| 2999 | +.btn-danger[disabled]:hover, |
|---|
| 3000 | +fieldset[disabled] .btn-danger:hover, |
|---|
| 3001 | +.btn-danger.disabled:focus, |
|---|
| 3002 | +.btn-danger[disabled]:focus, |
|---|
| 3003 | +fieldset[disabled] .btn-danger:focus, |
|---|
| 3004 | +.btn-danger.disabled:active, |
|---|
| 3005 | +.btn-danger[disabled]:active, |
|---|
| 3006 | +fieldset[disabled] .btn-danger:active, |
|---|
| 3007 | +.btn-danger.disabled.active, |
|---|
| 3008 | +.btn-danger[disabled].active, |
|---|
| 3009 | +fieldset[disabled] .btn-danger.active { |
|---|
| 3010 | + background-color: #d9534f; |
|---|
| 3011 | + border-color: #d43f3a; |
|---|
| 3012 | +} |
|---|
| 3013 | +.btn-danger .badge { |
|---|
| 3014 | + color: #d9534f; |
|---|
| 3015 | + background-color: #fff; |
|---|
| 3016 | +} |
|---|
| 3017 | +.btn-link { |
|---|
| 3018 | + font-weight: normal; |
|---|
| 3019 | + color: #428bca; |
|---|
| 3020 | + cursor: pointer; |
|---|
| 3021 | + border-radius: 0; |
|---|
| 3022 | +} |
|---|
| 3023 | +.btn-link, |
|---|
| 3024 | +.btn-link:active, |
|---|
| 3025 | +.btn-link[disabled], |
|---|
| 3026 | +fieldset[disabled] .btn-link { |
|---|
| 3027 | + background-color: transparent; |
|---|
| 3028 | + -webkit-box-shadow: none; |
|---|
| 3029 | + box-shadow: none; |
|---|
| 3030 | +} |
|---|
| 3031 | +.btn-link, |
|---|
| 3032 | +.btn-link:hover, |
|---|
| 3033 | +.btn-link:focus, |
|---|
| 3034 | +.btn-link:active { |
|---|
| 3035 | + border-color: transparent; |
|---|
| 3036 | +} |
|---|
| 3037 | +.btn-link:hover, |
|---|
| 3038 | +.btn-link:focus { |
|---|
| 3039 | + color: #2a6496; |
|---|
| 3040 | + text-decoration: underline; |
|---|
| 3041 | + background-color: transparent; |
|---|
| 3042 | +} |
|---|
| 3043 | +.btn-link[disabled]:hover, |
|---|
| 3044 | +fieldset[disabled] .btn-link:hover, |
|---|
| 3045 | +.btn-link[disabled]:focus, |
|---|
| 3046 | +fieldset[disabled] .btn-link:focus { |
|---|
| 3047 | + color: #777; |
|---|
| 3048 | + text-decoration: none; |
|---|
| 3049 | +} |
|---|
| 3050 | +.btn-lg, |
|---|
| 3051 | +.btn-group-lg > .btn { |
|---|
| 3052 | + padding: 10px 16px; |
|---|
| 3053 | + font-size: 18px; |
|---|
| 3054 | + line-height: 1.33; |
|---|
| 3055 | + border-radius: 6px; |
|---|
| 3056 | +} |
|---|
| 3057 | +.btn-sm, |
|---|
| 3058 | +.btn-group-sm > .btn { |
|---|
| 3059 | + padding: 5px 10px; |
|---|
| 3060 | + font-size: 12px; |
|---|
| 3061 | + line-height: 1.5; |
|---|
| 3062 | + border-radius: 3px; |
|---|
| 3063 | +} |
|---|
| 3064 | +.btn-xs, |
|---|
| 3065 | +.btn-group-xs > .btn { |
|---|
| 3066 | + padding: 1px 5px; |
|---|
| 3067 | + font-size: 12px; |
|---|
| 3068 | + line-height: 1.5; |
|---|
| 3069 | + border-radius: 3px; |
|---|
| 3070 | +} |
|---|
| 3071 | +.btn-block { |
|---|
| 3072 | + display: block; |
|---|
| 3073 | + width: 100%; |
|---|
| 3074 | +} |
|---|
| 3075 | +.btn-block + .btn-block { |
|---|
| 3076 | + margin-top: 5px; |
|---|
| 3077 | +} |
|---|
| 3078 | +input[type="submit"].btn-block, |
|---|
| 3079 | +input[type="reset"].btn-block, |
|---|
| 3080 | +input[type="button"].btn-block { |
|---|
| 3081 | + width: 100%; |
|---|
| 3082 | +} |
|---|
| 3083 | +.fade { |
|---|
| 3084 | + opacity: 0; |
|---|
| 3085 | + -webkit-transition: opacity .15s linear; |
|---|
| 3086 | + -o-transition: opacity .15s linear; |
|---|
| 3087 | + transition: opacity .15s linear; |
|---|
| 3088 | +} |
|---|
| 3089 | +.fade.in { |
|---|
| 3090 | + opacity: 1; |
|---|
| 3091 | +} |
|---|
| 3092 | +.collapse { |
|---|
| 3093 | + display: none; |
|---|
| 3094 | +} |
|---|
| 3095 | +.collapse.in { |
|---|
| 3096 | + display: block; |
|---|
| 3097 | +} |
|---|
| 3098 | +tr.collapse.in { |
|---|
| 3099 | + display: table-row; |
|---|
| 3100 | +} |
|---|
| 3101 | +tbody.collapse.in { |
|---|
| 3102 | + display: table-row-group; |
|---|
| 3103 | +} |
|---|
| 3104 | +.collapsing { |
|---|
| 3105 | + position: relative; |
|---|
| 3106 | + height: 0; |
|---|
| 3107 | + overflow: hidden; |
|---|
| 3108 | + -webkit-transition: height .35s ease; |
|---|
| 3109 | + -o-transition: height .35s ease; |
|---|
| 3110 | + transition: height .35s ease; |
|---|
| 3111 | +} |
|---|
| 3112 | +.caret { |
|---|
| 3113 | + display: inline-block; |
|---|
| 3114 | + width: 0; |
|---|
| 3115 | + height: 0; |
|---|
| 3116 | + margin-left: 2px; |
|---|
| 3117 | + vertical-align: middle; |
|---|
| 3118 | + border-top: 4px solid; |
|---|
| 3119 | + border-right: 4px solid transparent; |
|---|
| 3120 | + border-left: 4px solid transparent; |
|---|
| 3121 | +} |
|---|
| 3122 | +.dropdown { |
|---|
| 3123 | + position: relative; |
|---|
| 3124 | +} |
|---|
| 3125 | +.dropdown-toggle:focus { |
|---|
| 3126 | + outline: 0; |
|---|
| 3127 | +} |
|---|
| 3128 | +.dropdown-menu { |
|---|
| 3129 | + position: absolute; |
|---|
| 3130 | + top: 100%; |
|---|
| 3131 | + left: 0; |
|---|
| 3132 | + z-index: 1000; |
|---|
| 3133 | + display: none; |
|---|
| 3134 | + float: left; |
|---|
| 3135 | + min-width: 160px; |
|---|
| 3136 | + padding: 5px 0; |
|---|
| 3137 | + margin: 2px 0 0; |
|---|
| 3138 | + font-size: 14px; |
|---|
| 3139 | + text-align: left; |
|---|
| 3140 | + list-style: none; |
|---|
| 3141 | + background-color: #fff; |
|---|
| 3142 | + -webkit-background-clip: padding-box; |
|---|
| 3143 | + background-clip: padding-box; |
|---|
| 3144 | + border: 1px solid #ccc; |
|---|
| 3145 | + border: 1px solid rgba(0, 0, 0, .15); |
|---|
| 3146 | + border-radius: 4px; |
|---|
| 3147 | + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); |
|---|
| 3148 | + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); |
|---|
| 3149 | +} |
|---|
| 3150 | +.dropdown-menu.pull-right { |
|---|
| 3151 | + right: 0; |
|---|
| 3152 | + left: auto; |
|---|
| 3153 | +} |
|---|
| 3154 | +.dropdown-menu .divider { |
|---|
| 3155 | + height: 1px; |
|---|
| 3156 | + margin: 9px 0; |
|---|
| 3157 | + overflow: hidden; |
|---|
| 3158 | + background-color: #e5e5e5; |
|---|
| 3159 | +} |
|---|
| 3160 | +.dropdown-menu > li > a { |
|---|
| 3161 | + display: block; |
|---|
| 3162 | + padding: 3px 20px; |
|---|
| 3163 | + clear: both; |
|---|
| 3164 | + font-weight: normal; |
|---|
| 3165 | + line-height: 1.42857143; |
|---|
| 3166 | + color: #333; |
|---|
| 3167 | + white-space: nowrap; |
|---|
| 3168 | +} |
|---|
| 3169 | +.dropdown-menu > li > a:hover, |
|---|
| 3170 | +.dropdown-menu > li > a:focus { |
|---|
| 3171 | + color: #262626; |
|---|
| 3172 | + text-decoration: none; |
|---|
| 3173 | + background-color: #f5f5f5; |
|---|
| 3174 | +} |
|---|
| 3175 | +.dropdown-menu > .active > a, |
|---|
| 3176 | +.dropdown-menu > .active > a:hover, |
|---|
| 3177 | +.dropdown-menu > .active > a:focus { |
|---|
| 3178 | + color: #fff; |
|---|
| 3179 | + text-decoration: none; |
|---|
| 3180 | + background-color: #428bca; |
|---|
| 3181 | + outline: 0; |
|---|
| 3182 | +} |
|---|
| 3183 | +.dropdown-menu > .disabled > a, |
|---|
| 3184 | +.dropdown-menu > .disabled > a:hover, |
|---|
| 3185 | +.dropdown-menu > .disabled > a:focus { |
|---|
| 3186 | + color: #777; |
|---|
| 3187 | +} |
|---|
| 3188 | +.dropdown-menu > .disabled > a:hover, |
|---|
| 3189 | +.dropdown-menu > .disabled > a:focus { |
|---|
| 3190 | + text-decoration: none; |
|---|
| 3191 | + cursor: not-allowed; |
|---|
| 3192 | + background-color: transparent; |
|---|
| 3193 | + background-image: none; |
|---|
| 3194 | + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); |
|---|
| 3195 | +} |
|---|
| 3196 | +.open > .dropdown-menu { |
|---|
| 3197 | + display: block; |
|---|
| 3198 | +} |
|---|
| 3199 | +.open > a { |
|---|
| 3200 | + outline: 0; |
|---|
| 3201 | +} |
|---|
| 3202 | +.dropdown-menu-right { |
|---|
| 3203 | + right: 0; |
|---|
| 3204 | + left: auto; |
|---|
| 3205 | +} |
|---|
| 3206 | +.dropdown-menu-left { |
|---|
| 3207 | + right: auto; |
|---|
| 3208 | + left: 0; |
|---|
| 3209 | +} |
|---|
| 3210 | +.dropdown-header { |
|---|
| 3211 | + display: block; |
|---|
| 3212 | + padding: 3px 20px; |
|---|
| 3213 | + font-size: 12px; |
|---|
| 3214 | + line-height: 1.42857143; |
|---|
| 3215 | + color: #777; |
|---|
| 3216 | + white-space: nowrap; |
|---|
| 3217 | +} |
|---|
| 3218 | +.dropdown-backdrop { |
|---|
| 3219 | + position: fixed; |
|---|
| 3220 | + top: 0; |
|---|
| 3221 | + right: 0; |
|---|
| 3222 | + bottom: 0; |
|---|
| 3223 | + left: 0; |
|---|
| 3224 | + z-index: 990; |
|---|
| 3225 | +} |
|---|
| 3226 | +.pull-right > .dropdown-menu { |
|---|
| 3227 | + right: 0; |
|---|
| 3228 | + left: auto; |
|---|
| 3229 | +} |
|---|
| 3230 | +.dropup .caret, |
|---|
| 3231 | +.navbar-fixed-bottom .dropdown .caret { |
|---|
| 3232 | + content: ""; |
|---|
| 3233 | + border-top: 0; |
|---|
| 3234 | + border-bottom: 4px solid; |
|---|
| 3235 | +} |
|---|
| 3236 | +.dropup .dropdown-menu, |
|---|
| 3237 | +.navbar-fixed-bottom .dropdown .dropdown-menu { |
|---|
| 3238 | + top: auto; |
|---|
| 3239 | + bottom: 100%; |
|---|
| 3240 | + margin-bottom: 1px; |
|---|
| 3241 | +} |
|---|
| 3242 | +@media (min-width: 768px) { |
|---|
| 3243 | + .navbar-right .dropdown-menu { |
|---|
| 3244 | + right: 0; |
|---|
| 3245 | + left: auto; |
|---|
| 3246 | + } |
|---|
| 3247 | + .navbar-right .dropdown-menu-left { |
|---|
| 3248 | + right: auto; |
|---|
| 3249 | + left: 0; |
|---|
| 3250 | + } |
|---|
| 3251 | +} |
|---|
| 3252 | +.btn-group, |
|---|
| 3253 | +.btn-group-vertical { |
|---|
| 3254 | + position: relative; |
|---|
| 3255 | + display: inline-block; |
|---|
| 3256 | + vertical-align: middle; |
|---|
| 3257 | +} |
|---|
| 3258 | +.btn-group > .btn, |
|---|
| 3259 | +.btn-group-vertical > .btn { |
|---|
| 3260 | + position: relative; |
|---|
| 3261 | + float: left; |
|---|
| 3262 | +} |
|---|
| 3263 | +.btn-group > .btn:hover, |
|---|
| 3264 | +.btn-group-vertical > .btn:hover, |
|---|
| 3265 | +.btn-group > .btn:focus, |
|---|
| 3266 | +.btn-group-vertical > .btn:focus, |
|---|
| 3267 | +.btn-group > .btn:active, |
|---|
| 3268 | +.btn-group-vertical > .btn:active, |
|---|
| 3269 | +.btn-group > .btn.active, |
|---|
| 3270 | +.btn-group-vertical > .btn.active { |
|---|
| 3271 | + z-index: 2; |
|---|
| 3272 | +} |
|---|
| 3273 | +.btn-group > .btn:focus, |
|---|
| 3274 | +.btn-group-vertical > .btn:focus { |
|---|
| 3275 | + outline: 0; |
|---|
| 3276 | +} |
|---|
| 3277 | +.btn-group .btn + .btn, |
|---|
| 3278 | +.btn-group .btn + .btn-group, |
|---|
| 3279 | +.btn-group .btn-group + .btn, |
|---|
| 3280 | +.btn-group .btn-group + .btn-group { |
|---|
| 3281 | + margin-left: -1px; |
|---|
| 3282 | +} |
|---|
| 3283 | +.btn-toolbar { |
|---|
| 3284 | + margin-left: -5px; |
|---|
| 3285 | +} |
|---|
| 3286 | +.btn-toolbar .btn-group, |
|---|
| 3287 | +.btn-toolbar .input-group { |
|---|
| 3288 | + float: left; |
|---|
| 3289 | +} |
|---|
| 3290 | +.btn-toolbar > .btn, |
|---|
| 3291 | +.btn-toolbar > .btn-group, |
|---|
| 3292 | +.btn-toolbar > .input-group { |
|---|
| 3293 | + margin-left: 5px; |
|---|
| 3294 | +} |
|---|
| 3295 | +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { |
|---|
| 3296 | + border-radius: 0; |
|---|
| 3297 | +} |
|---|
| 3298 | +.btn-group > .btn:first-child { |
|---|
| 3299 | + margin-left: 0; |
|---|
| 3300 | +} |
|---|
| 3301 | +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { |
|---|
| 3302 | + border-top-right-radius: 0; |
|---|
| 3303 | + border-bottom-right-radius: 0; |
|---|
| 3304 | +} |
|---|
| 3305 | +.btn-group > .btn:last-child:not(:first-child), |
|---|
| 3306 | +.btn-group > .dropdown-toggle:not(:first-child) { |
|---|
| 3307 | + border-top-left-radius: 0; |
|---|
| 3308 | + border-bottom-left-radius: 0; |
|---|
| 3309 | +} |
|---|
| 3310 | +.btn-group > .btn-group { |
|---|
| 3311 | + float: left; |
|---|
| 3312 | +} |
|---|
| 3313 | +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { |
|---|
| 3314 | + border-radius: 0; |
|---|
| 3315 | +} |
|---|
| 3316 | +.btn-group > .btn-group:first-child > .btn:last-child, |
|---|
| 3317 | +.btn-group > .btn-group:first-child > .dropdown-toggle { |
|---|
| 3318 | + border-top-right-radius: 0; |
|---|
| 3319 | + border-bottom-right-radius: 0; |
|---|
| 3320 | +} |
|---|
| 3321 | +.btn-group > .btn-group:last-child > .btn:first-child { |
|---|
| 3322 | + border-top-left-radius: 0; |
|---|
| 3323 | + border-bottom-left-radius: 0; |
|---|
| 3324 | +} |
|---|
| 3325 | +.btn-group .dropdown-toggle:active, |
|---|
| 3326 | +.btn-group.open .dropdown-toggle { |
|---|
| 3327 | + outline: 0; |
|---|
| 3328 | +} |
|---|
| 3329 | +.btn-group > .btn + .dropdown-toggle { |
|---|
| 3330 | + padding-right: 8px; |
|---|
| 3331 | + padding-left: 8px; |
|---|
| 3332 | +} |
|---|
| 3333 | +.btn-group > .btn-lg + .dropdown-toggle { |
|---|
| 3334 | + padding-right: 12px; |
|---|
| 3335 | + padding-left: 12px; |
|---|
| 3336 | +} |
|---|
| 3337 | +.btn-group.open .dropdown-toggle { |
|---|
| 3338 | + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); |
|---|
| 3339 | + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); |
|---|
| 3340 | +} |
|---|
| 3341 | +.btn-group.open .dropdown-toggle.btn-link { |
|---|
| 3342 | + -webkit-box-shadow: none; |
|---|
| 3343 | + box-shadow: none; |
|---|
| 3344 | +} |
|---|
| 3345 | +.btn .caret { |
|---|
| 3346 | + margin-left: 0; |
|---|
| 3347 | +} |
|---|
| 3348 | +.btn-lg .caret { |
|---|
| 3349 | + border-width: 5px 5px 0; |
|---|
| 3350 | + border-bottom-width: 0; |
|---|
| 3351 | +} |
|---|
| 3352 | +.dropup .btn-lg .caret { |
|---|
| 3353 | + border-width: 0 5px 5px; |
|---|
| 3354 | +} |
|---|
| 3355 | +.btn-group-vertical > .btn, |
|---|
| 3356 | +.btn-group-vertical > .btn-group, |
|---|
| 3357 | +.btn-group-vertical > .btn-group > .btn { |
|---|
| 3358 | + display: block; |
|---|
| 3359 | + float: none; |
|---|
| 3360 | + width: 100%; |
|---|
| 3361 | + max-width: 100%; |
|---|
| 3362 | +} |
|---|
| 3363 | +.btn-group-vertical > .btn-group > .btn { |
|---|
| 3364 | + float: none; |
|---|
| 3365 | +} |
|---|
| 3366 | +.btn-group-vertical > .btn + .btn, |
|---|
| 3367 | +.btn-group-vertical > .btn + .btn-group, |
|---|
| 3368 | +.btn-group-vertical > .btn-group + .btn, |
|---|
| 3369 | +.btn-group-vertical > .btn-group + .btn-group { |
|---|
| 3370 | + margin-top: -1px; |
|---|
| 3371 | + margin-left: 0; |
|---|
| 3372 | +} |
|---|
| 3373 | +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { |
|---|
| 3374 | + border-radius: 0; |
|---|
| 3375 | +} |
|---|
| 3376 | +.btn-group-vertical > .btn:first-child:not(:last-child) { |
|---|
| 3377 | + border-top-right-radius: 4px; |
|---|
| 3378 | + border-bottom-right-radius: 0; |
|---|
| 3379 | + border-bottom-left-radius: 0; |
|---|
| 3380 | +} |
|---|
| 3381 | +.btn-group-vertical > .btn:last-child:not(:first-child) { |
|---|
| 3382 | + border-top-left-radius: 0; |
|---|
| 3383 | + border-top-right-radius: 0; |
|---|
| 3384 | + border-bottom-left-radius: 4px; |
|---|
| 3385 | +} |
|---|
| 3386 | +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { |
|---|
| 3387 | + border-radius: 0; |
|---|
| 3388 | +} |
|---|
| 3389 | +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, |
|---|
| 3390 | +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { |
|---|
| 3391 | + border-bottom-right-radius: 0; |
|---|
| 3392 | + border-bottom-left-radius: 0; |
|---|
| 3393 | +} |
|---|
| 3394 | +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { |
|---|
| 3395 | + border-top-left-radius: 0; |
|---|
| 3396 | + border-top-right-radius: 0; |
|---|
| 3397 | +} |
|---|
| 3398 | +.btn-group-justified { |
|---|
| 3399 | + display: table; |
|---|
| 3400 | + width: 100%; |
|---|
| 3401 | + table-layout: fixed; |
|---|
| 3402 | + border-collapse: separate; |
|---|
| 3403 | +} |
|---|
| 3404 | +.btn-group-justified > .btn, |
|---|
| 3405 | +.btn-group-justified > .btn-group { |
|---|
| 3406 | + display: table-cell; |
|---|
| 3407 | + float: none; |
|---|
| 3408 | + width: 1%; |
|---|
| 3409 | +} |
|---|
| 3410 | +.btn-group-justified > .btn-group .btn { |
|---|
| 3411 | + width: 100%; |
|---|
| 3412 | +} |
|---|
| 3413 | +.btn-group-justified > .btn-group .dropdown-menu { |
|---|
| 3414 | + left: auto; |
|---|
| 3415 | +} |
|---|
| 3416 | +[data-toggle="buttons"] > .btn > input[type="radio"], |
|---|
| 3417 | +[data-toggle="buttons"] > .btn > input[type="checkbox"] { |
|---|
| 3418 | + position: absolute; |
|---|
| 3419 | + z-index: -1; |
|---|
| 3420 | + filter: alpha(opacity=0); |
|---|
| 3421 | + opacity: 0; |
|---|
| 3422 | +} |
|---|
| 3423 | +.input-group { |
|---|
| 3424 | + position: relative; |
|---|
| 3425 | + display: table; |
|---|
| 3426 | + border-collapse: separate; |
|---|
| 3427 | +} |
|---|
| 3428 | +.input-group[class*="col-"] { |
|---|
| 3429 | + float: none; |
|---|
| 3430 | + padding-right: 0; |
|---|
| 3431 | + padding-left: 0; |
|---|
| 3432 | +} |
|---|
| 3433 | +.input-group .form-control { |
|---|
| 3434 | + position: relative; |
|---|
| 3435 | + z-index: 2; |
|---|
| 3436 | + float: left; |
|---|
| 3437 | + width: 100%; |
|---|
| 3438 | + margin-bottom: 0; |
|---|
| 3439 | +} |
|---|
| 3440 | +.input-group-lg > .form-control, |
|---|
| 3441 | +.input-group-lg > .input-group-addon, |
|---|
| 3442 | +.input-group-lg > .input-group-btn > .btn { |
|---|
| 3443 | + height: 46px; |
|---|
| 3444 | + padding: 10px 16px; |
|---|
| 3445 | + font-size: 18px; |
|---|
| 3446 | + line-height: 1.33; |
|---|
| 3447 | + border-radius: 6px; |
|---|
| 3448 | +} |
|---|
| 3449 | +select.input-group-lg > .form-control, |
|---|
| 3450 | +select.input-group-lg > .input-group-addon, |
|---|
| 3451 | +select.input-group-lg > .input-group-btn > .btn { |
|---|
| 3452 | + height: 46px; |
|---|
| 3453 | + line-height: 46px; |
|---|
| 3454 | +} |
|---|
| 3455 | +textarea.input-group-lg > .form-control, |
|---|
| 3456 | +textarea.input-group-lg > .input-group-addon, |
|---|
| 3457 | +textarea.input-group-lg > .input-group-btn > .btn, |
|---|
| 3458 | +select[multiple].input-group-lg > .form-control, |
|---|
| 3459 | +select[multiple].input-group-lg > .input-group-addon, |
|---|
| 3460 | +select[multiple].input-group-lg > .input-group-btn > .btn { |
|---|
| 3461 | + height: auto; |
|---|
| 3462 | +} |
|---|
| 3463 | +.input-group-sm > .form-control, |
|---|
| 3464 | +.input-group-sm > .input-group-addon, |
|---|
| 3465 | +.input-group-sm > .input-group-btn > .btn { |
|---|
| 3466 | + height: 30px; |
|---|
| 3467 | + padding: 5px 10px; |
|---|
| 3468 | + font-size: 12px; |
|---|
| 3469 | + line-height: 1.5; |
|---|
| 3470 | + border-radius: 3px; |
|---|
| 3471 | +} |
|---|
| 3472 | +select.input-group-sm > .form-control, |
|---|
| 3473 | +select.input-group-sm > .input-group-addon, |
|---|
| 3474 | +select.input-group-sm > .input-group-btn > .btn { |
|---|
| 3475 | + height: 30px; |
|---|
| 3476 | + line-height: 30px; |
|---|
| 3477 | +} |
|---|
| 3478 | +textarea.input-group-sm > .form-control, |
|---|
| 3479 | +textarea.input-group-sm > .input-group-addon, |
|---|
| 3480 | +textarea.input-group-sm > .input-group-btn > .btn, |
|---|
| 3481 | +select[multiple].input-group-sm > .form-control, |
|---|
| 3482 | +select[multiple].input-group-sm > .input-group-addon, |
|---|
| 3483 | +select[multiple].input-group-sm > .input-group-btn > .btn { |
|---|
| 3484 | + height: auto; |
|---|
| 3485 | +} |
|---|
| 3486 | +.input-group-addon, |
|---|
| 3487 | +.input-group-btn, |
|---|
| 3488 | +.input-group .form-control { |
|---|
| 3489 | + display: table-cell; |
|---|
| 3490 | +} |
|---|
| 3491 | +.input-group-addon:not(:first-child):not(:last-child), |
|---|
| 3492 | +.input-group-btn:not(:first-child):not(:last-child), |
|---|
| 3493 | +.input-group .form-control:not(:first-child):not(:last-child) { |
|---|
| 3494 | + border-radius: 0; |
|---|
| 3495 | +} |
|---|
| 3496 | +.input-group-addon, |
|---|
| 3497 | +.input-group-btn { |
|---|
| 3498 | + width: 1%; |
|---|
| 3499 | + white-space: nowrap; |
|---|
| 3500 | + vertical-align: middle; |
|---|
| 3501 | +} |
|---|
| 3502 | +.input-group-addon { |
|---|
| 3503 | + padding: 6px 12px; |
|---|
| 3504 | + font-size: 14px; |
|---|
| 3505 | + font-weight: normal; |
|---|
| 3506 | + line-height: 1; |
|---|
| 3507 | + color: #555; |
|---|
| 3508 | + text-align: center; |
|---|
| 3509 | + background-color: #eee; |
|---|
| 3510 | + border: 1px solid #ccc; |
|---|
| 3511 | + border-radius: 4px; |
|---|
| 3512 | +} |
|---|
| 3513 | +.input-group-addon.input-sm { |
|---|
| 3514 | + padding: 5px 10px; |
|---|
| 3515 | + font-size: 12px; |
|---|
| 3516 | + border-radius: 3px; |
|---|
| 3517 | +} |
|---|
| 3518 | +.input-group-addon.input-lg { |
|---|
| 3519 | + padding: 10px 16px; |
|---|
| 3520 | + font-size: 18px; |
|---|
| 3521 | + border-radius: 6px; |
|---|
| 3522 | +} |
|---|
| 3523 | +.input-group-addon input[type="radio"], |
|---|
| 3524 | +.input-group-addon input[type="checkbox"] { |
|---|
| 3525 | + margin-top: 0; |
|---|
| 3526 | +} |
|---|
| 3527 | +.input-group .form-control:first-child, |
|---|
| 3528 | +.input-group-addon:first-child, |
|---|
| 3529 | +.input-group-btn:first-child > .btn, |
|---|
| 3530 | +.input-group-btn:first-child > .btn-group > .btn, |
|---|
| 3531 | +.input-group-btn:first-child > .dropdown-toggle, |
|---|
| 3532 | +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), |
|---|
| 3533 | +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { |
|---|
| 3534 | + border-top-right-radius: 0; |
|---|
| 3535 | + border-bottom-right-radius: 0; |
|---|
| 3536 | +} |
|---|
| 3537 | +.input-group-addon:first-child { |
|---|
| 3538 | + border-right: 0; |
|---|
| 3539 | +} |
|---|
| 3540 | +.input-group .form-control:last-child, |
|---|
| 3541 | +.input-group-addon:last-child, |
|---|
| 3542 | +.input-group-btn:last-child > .btn, |
|---|
| 3543 | +.input-group-btn:last-child > .btn-group > .btn, |
|---|
| 3544 | +.input-group-btn:last-child > .dropdown-toggle, |
|---|
| 3545 | +.input-group-btn:first-child > .btn:not(:first-child), |
|---|
| 3546 | +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { |
|---|
| 3547 | + border-top-left-radius: 0; |
|---|
| 3548 | + border-bottom-left-radius: 0; |
|---|
| 3549 | +} |
|---|
| 3550 | +.input-group-addon:last-child { |
|---|
| 3551 | + border-left: 0; |
|---|
| 3552 | +} |
|---|
| 3553 | +.input-group-btn { |
|---|
| 3554 | + position: relative; |
|---|
| 3555 | + font-size: 0; |
|---|
| 3556 | + white-space: nowrap; |
|---|
| 3557 | +} |
|---|
| 3558 | +.input-group-btn > .btn { |
|---|
| 3559 | + position: relative; |
|---|
| 3560 | +} |
|---|
| 3561 | +.input-group-btn > .btn + .btn { |
|---|
| 3562 | + margin-left: -1px; |
|---|
| 3563 | +} |
|---|
| 3564 | +.input-group-btn > .btn:hover, |
|---|
| 3565 | +.input-group-btn > .btn:focus, |
|---|
| 3566 | +.input-group-btn > .btn:active { |
|---|
| 3567 | + z-index: 2; |
|---|
| 3568 | +} |
|---|
| 3569 | +.input-group-btn:first-child > .btn, |
|---|
| 3570 | +.input-group-btn:first-child > .btn-group { |
|---|
| 3571 | + margin-right: -1px; |
|---|
| 3572 | +} |
|---|
| 3573 | +.input-group-btn:last-child > .btn, |
|---|
| 3574 | +.input-group-btn:last-child > .btn-group { |
|---|
| 3575 | + margin-left: -1px; |
|---|
| 3576 | +} |
|---|
| 3577 | +.nav { |
|---|
| 3578 | + padding-left: 0; |
|---|
| 3579 | + margin-bottom: 0; |
|---|
| 3580 | + list-style: none; |
|---|
| 3581 | +} |
|---|
| 3582 | +.nav > li { |
|---|
| 3583 | + position: relative; |
|---|
| 3584 | + display: block; |
|---|
| 3585 | +} |
|---|
| 3586 | +.nav > li > a { |
|---|
| 3587 | + position: relative; |
|---|
| 3588 | + display: block; |
|---|
| 3589 | + padding: 10px 15px; |
|---|
| 3590 | +} |
|---|
| 3591 | +.nav > li > a:hover, |
|---|
| 3592 | +.nav > li > a:focus { |
|---|
| 3593 | + text-decoration: none; |
|---|
| 3594 | + background-color: #eee; |
|---|
| 3595 | +} |
|---|
| 3596 | +.nav > li.disabled > a { |
|---|
| 3597 | + color: #777; |
|---|
| 3598 | +} |
|---|
| 3599 | +.nav > li.disabled > a:hover, |
|---|
| 3600 | +.nav > li.disabled > a:focus { |
|---|
| 3601 | + color: #777; |
|---|
| 3602 | + text-decoration: none; |
|---|
| 3603 | + cursor: not-allowed; |
|---|
| 3604 | + background-color: transparent; |
|---|
| 3605 | +} |
|---|
| 3606 | +.nav .open > a, |
|---|
| 3607 | +.nav .open > a:hover, |
|---|
| 3608 | +.nav .open > a:focus { |
|---|
| 3609 | + background-color: #eee; |
|---|
| 3610 | + border-color: #428bca; |
|---|
| 3611 | +} |
|---|
| 3612 | +.nav .nav-divider { |
|---|
| 3613 | + height: 1px; |
|---|
| 3614 | + margin: 9px 0; |
|---|
| 3615 | + overflow: hidden; |
|---|
| 3616 | + background-color: #e5e5e5; |
|---|
| 3617 | +} |
|---|
| 3618 | +.nav > li > a > img { |
|---|
| 3619 | + max-width: none; |
|---|
| 3620 | +} |
|---|
| 3621 | +.nav-tabs { |
|---|
| 3622 | + border-bottom: 1px solid #ddd; |
|---|
| 3623 | +} |
|---|
| 3624 | +.nav-tabs > li { |
|---|
| 3625 | + float: left; |
|---|
| 3626 | + margin-bottom: -1px; |
|---|
| 3627 | +} |
|---|
| 3628 | +.nav-tabs > li > a { |
|---|
| 3629 | + margin-right: 2px; |
|---|
| 3630 | + line-height: 1.42857143; |
|---|
| 3631 | + border: 1px solid transparent; |
|---|
| 3632 | + border-radius: 4px 4px 0 0; |
|---|
| 3633 | +} |
|---|
| 3634 | +.nav-tabs > li > a:hover { |
|---|
| 3635 | + border-color: #eee #eee #ddd; |
|---|
| 3636 | +} |
|---|
| 3637 | +.nav-tabs > li.active > a, |
|---|
| 3638 | +.nav-tabs > li.active > a:hover, |
|---|
| 3639 | +.nav-tabs > li.active > a:focus { |
|---|
| 3640 | + color: #555; |
|---|
| 3641 | + cursor: default; |
|---|
| 3642 | + background-color: #fff; |
|---|
| 3643 | + border: 1px solid #ddd; |
|---|
| 3644 | + border-bottom-color: transparent; |
|---|
| 3645 | +} |
|---|
| 3646 | +.nav-tabs.nav-justified { |
|---|
| 3647 | + width: 100%; |
|---|
| 3648 | + border-bottom: 0; |
|---|
| 3649 | +} |
|---|
| 3650 | +.nav-tabs.nav-justified > li { |
|---|
| 3651 | + float: none; |
|---|
| 3652 | +} |
|---|
| 3653 | +.nav-tabs.nav-justified > li > a { |
|---|
| 3654 | + margin-bottom: 5px; |
|---|
| 3655 | + text-align: center; |
|---|
| 3656 | +} |
|---|
| 3657 | +.nav-tabs.nav-justified > .dropdown .dropdown-menu { |
|---|
| 3658 | + top: auto; |
|---|
| 3659 | + left: auto; |
|---|
| 3660 | +} |
|---|
| 3661 | +@media (min-width: 768px) { |
|---|
| 3662 | + .nav-tabs.nav-justified > li { |
|---|
| 3663 | + display: table-cell; |
|---|
| 3664 | + width: 1%; |
|---|
| 3665 | + } |
|---|
| 3666 | + .nav-tabs.nav-justified > li > a { |
|---|
| 3667 | + margin-bottom: 0; |
|---|
| 3668 | + } |
|---|
| 3669 | +} |
|---|
| 3670 | +.nav-tabs.nav-justified > li > a { |
|---|
| 3671 | + margin-right: 0; |
|---|
| 3672 | + border-radius: 4px; |
|---|
| 3673 | +} |
|---|
| 3674 | +.nav-tabs.nav-justified > .active > a, |
|---|
| 3675 | +.nav-tabs.nav-justified > .active > a:hover, |
|---|
| 3676 | +.nav-tabs.nav-justified > .active > a:focus { |
|---|
| 3677 | + border: 1px solid #ddd; |
|---|
| 3678 | +} |
|---|
| 3679 | +@media (min-width: 768px) { |
|---|
| 3680 | + .nav-tabs.nav-justified > li > a { |
|---|
| 3681 | + border-bottom: 1px solid #ddd; |
|---|
| 3682 | + border-radius: 4px 4px 0 0; |
|---|
| 3683 | + } |
|---|
| 3684 | + .nav-tabs.nav-justified > .active > a, |
|---|
| 3685 | + .nav-tabs.nav-justified > .active > a:hover, |
|---|
| 3686 | + .nav-tabs.nav-justified > .active > a:focus { |
|---|
| 3687 | + border-bottom-color: #fff; |
|---|
| 3688 | + } |
|---|
| 3689 | +} |
|---|
| 3690 | +.nav-pills > li { |
|---|
| 3691 | + float: left; |
|---|
| 3692 | +} |
|---|
| 3693 | +.nav-pills > li > a { |
|---|
| 3694 | + border-radius: 4px; |
|---|
| 3695 | +} |
|---|
| 3696 | +.nav-pills > li + li { |
|---|
| 3697 | + margin-left: 2px; |
|---|
| 3698 | +} |
|---|
| 3699 | +.nav-pills > li.active > a, |
|---|
| 3700 | +.nav-pills > li.active > a:hover, |
|---|
| 3701 | +.nav-pills > li.active > a:focus { |
|---|
| 3702 | + color: #fff; |
|---|
| 3703 | + background-color: #428bca; |
|---|
| 3704 | +} |
|---|
| 3705 | +.nav-stacked > li { |
|---|
| 3706 | + float: none; |
|---|
| 3707 | +} |
|---|
| 3708 | +.nav-stacked > li + li { |
|---|
| 3709 | + margin-top: 2px; |
|---|
| 3710 | + margin-left: 0; |
|---|
| 3711 | +} |
|---|
| 3712 | +.nav-justified { |
|---|
| 3713 | + width: 100%; |
|---|
| 3714 | +} |
|---|
| 3715 | +.nav-justified > li { |
|---|
| 3716 | + float: none; |
|---|
| 3717 | +} |
|---|
| 3718 | +.nav-justified > li > a { |
|---|
| 3719 | + margin-bottom: 5px; |
|---|
| 3720 | + text-align: center; |
|---|
| 3721 | +} |
|---|
| 3722 | +.nav-justified > .dropdown .dropdown-menu { |
|---|
| 3723 | + top: auto; |
|---|
| 3724 | + left: auto; |
|---|
| 3725 | +} |
|---|
| 3726 | +@media (min-width: 768px) { |
|---|
| 3727 | + .nav-justified > li { |
|---|
| 3728 | + display: table-cell; |
|---|
| 3729 | + width: 1%; |
|---|
| 3730 | + } |
|---|
| 3731 | + .nav-justified > li > a { |
|---|
| 3732 | + margin-bottom: 0; |
|---|
| 3733 | + } |
|---|
| 3734 | +} |
|---|
| 3735 | +.nav-tabs-justified { |
|---|
| 3736 | + border-bottom: 0; |
|---|
| 3737 | +} |
|---|
| 3738 | +.nav-tabs-justified > li > a { |
|---|
| 3739 | + margin-right: 0; |
|---|
| 3740 | + border-radius: 4px; |
|---|
| 3741 | +} |
|---|
| 3742 | +.nav-tabs-justified > .active > a, |
|---|
| 3743 | +.nav-tabs-justified > .active > a:hover, |
|---|
| 3744 | +.nav-tabs-justified > .active > a:focus { |
|---|
| 3745 | + border: 1px solid #ddd; |
|---|
| 3746 | +} |
|---|
| 3747 | +@media (min-width: 768px) { |
|---|
| 3748 | + .nav-tabs-justified > li > a { |
|---|
| 3749 | + border-bottom: 1px solid #ddd; |
|---|
| 3750 | + border-radius: 4px 4px 0 0; |
|---|
| 3751 | + } |
|---|
| 3752 | + .nav-tabs-justified > .active > a, |
|---|
| 3753 | + .nav-tabs-justified > .active > a:hover, |
|---|
| 3754 | + .nav-tabs-justified > .active > a:focus { |
|---|
| 3755 | + border-bottom-color: #fff; |
|---|
| 3756 | + } |
|---|
| 3757 | +} |
|---|
| 3758 | +.tab-content > .tab-pane { |
|---|
| 3759 | + display: none; |
|---|
| 3760 | +} |
|---|
| 3761 | +.tab-content > .active { |
|---|
| 3762 | + display: block; |
|---|
| 3763 | +} |
|---|
| 3764 | +.nav-tabs .dropdown-menu { |
|---|
| 3765 | + margin-top: -1px; |
|---|
| 3766 | + border-top-left-radius: 0; |
|---|
| 3767 | + border-top-right-radius: 0; |
|---|
| 3768 | +} |
|---|
| 3769 | +.navbar { |
|---|
| 3770 | + position: relative; |
|---|
| 3771 | + min-height: 50px; |
|---|
| 3772 | + margin-bottom: 20px; |
|---|
| 3773 | + border: 1px solid transparent; |
|---|
| 3774 | +} |
|---|
| 3775 | +@media (min-width: 768px) { |
|---|
| 3776 | + .navbar { |
|---|
| 3777 | + border-radius: 4px; |
|---|
| 3778 | + } |
|---|
| 3779 | +} |
|---|
| 3780 | +@media (min-width: 768px) { |
|---|
| 3781 | + .navbar-header { |
|---|
| 3782 | + float: left; |
|---|
| 3783 | + } |
|---|
| 3784 | +} |
|---|
| 3785 | +.navbar-collapse { |
|---|
| 3786 | + padding-right: 15px; |
|---|
| 3787 | + padding-left: 15px; |
|---|
| 3788 | + overflow-x: visible; |
|---|
| 3789 | + -webkit-overflow-scrolling: touch; |
|---|
| 3790 | + border-top: 1px solid transparent; |
|---|
| 3791 | + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); |
|---|
| 3792 | + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); |
|---|
| 3793 | +} |
|---|
| 3794 | +.navbar-collapse.in { |
|---|
| 3795 | + overflow-y: auto; |
|---|
| 3796 | +} |
|---|
| 3797 | +@media (min-width: 768px) { |
|---|
| 3798 | + .navbar-collapse { |
|---|
| 3799 | + width: auto; |
|---|
| 3800 | + border-top: 0; |
|---|
| 3801 | + -webkit-box-shadow: none; |
|---|
| 3802 | + box-shadow: none; |
|---|
| 3803 | + } |
|---|
| 3804 | + .navbar-collapse.collapse { |
|---|
| 3805 | + display: block !important; |
|---|
| 3806 | + height: auto !important; |
|---|
| 3807 | + padding-bottom: 0; |
|---|
| 3808 | + overflow: visible !important; |
|---|
| 3809 | + } |
|---|
| 3810 | + .navbar-collapse.in { |
|---|
| 3811 | + overflow-y: visible; |
|---|
| 3812 | + } |
|---|
| 3813 | + .navbar-fixed-top .navbar-collapse, |
|---|
| 3814 | + .navbar-static-top .navbar-collapse, |
|---|
| 3815 | + .navbar-fixed-bottom .navbar-collapse { |
|---|
| 3816 | + padding-right: 0; |
|---|
| 3817 | + padding-left: 0; |
|---|
| 3818 | + } |
|---|
| 3819 | +} |
|---|
| 3820 | +.navbar-fixed-top .navbar-collapse, |
|---|
| 3821 | +.navbar-fixed-bottom .navbar-collapse { |
|---|
| 3822 | + max-height: 340px; |
|---|
| 3823 | +} |
|---|
| 3824 | +@media (max-width: 480px) and (orientation: landscape) { |
|---|
| 3825 | + .navbar-fixed-top .navbar-collapse, |
|---|
| 3826 | + .navbar-fixed-bottom .navbar-collapse { |
|---|
| 3827 | + max-height: 200px; |
|---|
| 3828 | + } |
|---|
| 3829 | +} |
|---|
| 3830 | +.container > .navbar-header, |
|---|
| 3831 | +.container-fluid > .navbar-header, |
|---|
| 3832 | +.container > .navbar-collapse, |
|---|
| 3833 | +.container-fluid > .navbar-collapse { |
|---|
| 3834 | + margin-right: -15px; |
|---|
| 3835 | + margin-left: -15px; |
|---|
| 3836 | +} |
|---|
| 3837 | +@media (min-width: 768px) { |
|---|
| 3838 | + .container > .navbar-header, |
|---|
| 3839 | + .container-fluid > .navbar-header, |
|---|
| 3840 | + .container > .navbar-collapse, |
|---|
| 3841 | + .container-fluid > .navbar-collapse { |
|---|
| 3842 | + margin-right: 0; |
|---|
| 3843 | + margin-left: 0; |
|---|
| 3844 | + } |
|---|
| 3845 | +} |
|---|
| 3846 | +.navbar-static-top { |
|---|
| 3847 | + z-index: 1000; |
|---|
| 3848 | + border-width: 0 0 1px; |
|---|
| 3849 | +} |
|---|
| 3850 | +@media (min-width: 768px) { |
|---|
| 3851 | + .navbar-static-top { |
|---|
| 3852 | + border-radius: 0; |
|---|
| 3853 | + } |
|---|
| 3854 | +} |
|---|
| 3855 | +.navbar-fixed-top, |
|---|
| 3856 | +.navbar-fixed-bottom { |
|---|
| 3857 | + position: fixed; |
|---|
| 3858 | + right: 0; |
|---|
| 3859 | + left: 0; |
|---|
| 3860 | + z-index: 1030; |
|---|
| 3861 | + -webkit-transform: translate3d(0, 0, 0); |
|---|
| 3862 | + -o-transform: translate3d(0, 0, 0); |
|---|
| 3863 | + transform: translate3d(0, 0, 0); |
|---|
| 3864 | +} |
|---|
| 3865 | +@media (min-width: 768px) { |
|---|
| 3866 | + .navbar-fixed-top, |
|---|
| 3867 | + .navbar-fixed-bottom { |
|---|
| 3868 | + border-radius: 0; |
|---|
| 3869 | + } |
|---|
| 3870 | +} |
|---|
| 3871 | +.navbar-fixed-top { |
|---|
| 3872 | + top: 0; |
|---|
| 3873 | + border-width: 0 0 1px; |
|---|
| 3874 | +} |
|---|
| 3875 | +.navbar-fixed-bottom { |
|---|
| 3876 | + bottom: 0; |
|---|
| 3877 | + margin-bottom: 0; |
|---|
| 3878 | + border-width: 1px 0 0; |
|---|
| 3879 | +} |
|---|
| 3880 | +.navbar-brand { |
|---|
| 3881 | + float: left; |
|---|
| 3882 | + height: 50px; |
|---|
| 3883 | + padding: 15px 15px; |
|---|
| 3884 | + font-size: 18px; |
|---|
| 3885 | + line-height: 20px; |
|---|
| 3886 | +} |
|---|
| 3887 | +.navbar-brand:hover, |
|---|
| 3888 | +.navbar-brand:focus { |
|---|
| 3889 | + text-decoration: none; |
|---|
| 3890 | +} |
|---|
| 3891 | +@media (min-width: 768px) { |
|---|
| 3892 | + .navbar > .container .navbar-brand, |
|---|
| 3893 | + .navbar > .container-fluid .navbar-brand { |
|---|
| 3894 | + margin-left: -15px; |
|---|
| 3895 | + } |
|---|
| 3896 | +} |
|---|
| 3897 | +.navbar-toggle { |
|---|
| 3898 | + position: relative; |
|---|
| 3899 | + float: right; |
|---|
| 3900 | + padding: 9px 10px; |
|---|
| 3901 | + margin-top: 8px; |
|---|
| 3902 | + margin-right: 15px; |
|---|
| 3903 | + margin-bottom: 8px; |
|---|
| 3904 | + background-color: transparent; |
|---|
| 3905 | + background-image: none; |
|---|
| 3906 | + border: 1px solid transparent; |
|---|
| 3907 | + border-radius: 4px; |
|---|
| 3908 | +} |
|---|
| 3909 | +.navbar-toggle:focus { |
|---|
| 3910 | + outline: 0; |
|---|
| 3911 | +} |
|---|
| 3912 | +.navbar-toggle .icon-bar { |
|---|
| 3913 | + display: block; |
|---|
| 3914 | + width: 22px; |
|---|
| 3915 | + height: 2px; |
|---|
| 3916 | + border-radius: 1px; |
|---|
| 3917 | +} |
|---|
| 3918 | +.navbar-toggle .icon-bar + .icon-bar { |
|---|
| 3919 | + margin-top: 4px; |
|---|
| 3920 | +} |
|---|
| 3921 | +@media (min-width: 768px) { |
|---|
| 3922 | + .navbar-toggle { |
|---|
| 3923 | + display: none; |
|---|
| 3924 | + } |
|---|
| 3925 | +} |
|---|
| 3926 | +.navbar-nav { |
|---|
| 3927 | + margin: 7.5px -15px; |
|---|
| 3928 | +} |
|---|
| 3929 | +.navbar-nav > li > a { |
|---|
| 3930 | + padding-top: 10px; |
|---|
| 3931 | + padding-bottom: 10px; |
|---|
| 3932 | + line-height: 20px; |
|---|
| 3933 | +} |
|---|
| 3934 | +@media (max-width: 767px) { |
|---|
| 3935 | + .navbar-nav .open .dropdown-menu { |
|---|
| 3936 | + position: static; |
|---|
| 3937 | + float: none; |
|---|
| 3938 | + width: auto; |
|---|
| 3939 | + margin-top: 0; |
|---|
| 3940 | + background-color: transparent; |
|---|
| 3941 | + border: 0; |
|---|
| 3942 | + -webkit-box-shadow: none; |
|---|
| 3943 | + box-shadow: none; |
|---|
| 3944 | + } |
|---|
| 3945 | + .navbar-nav .open .dropdown-menu > li > a, |
|---|
| 3946 | + .navbar-nav .open .dropdown-menu .dropdown-header { |
|---|
| 3947 | + padding: 5px 15px 5px 25px; |
|---|
| 3948 | + } |
|---|
| 3949 | + .navbar-nav .open .dropdown-menu > li > a { |
|---|
| 3950 | + line-height: 20px; |
|---|
| 3951 | + } |
|---|
| 3952 | + .navbar-nav .open .dropdown-menu > li > a:hover, |
|---|
| 3953 | + .navbar-nav .open .dropdown-menu > li > a:focus { |
|---|
| 3954 | + background-image: none; |
|---|
| 3955 | + } |
|---|
| 3956 | +} |
|---|
| 3957 | +@media (min-width: 768px) { |
|---|
| 3958 | + .navbar-nav { |
|---|
| 3959 | + float: left; |
|---|
| 3960 | + margin: 0; |
|---|
| 3961 | + } |
|---|
| 3962 | + .navbar-nav > li { |
|---|
| 3963 | + float: left; |
|---|
| 3964 | + } |
|---|
| 3965 | + .navbar-nav > li > a { |
|---|
| 3966 | + padding-top: 15px; |
|---|
| 3967 | + padding-bottom: 15px; |
|---|
| 3968 | + } |
|---|
| 3969 | + .navbar-nav.navbar-right:last-child { |
|---|
| 3970 | + margin-right: -15px; |
|---|
| 3971 | + } |
|---|
| 3972 | +} |
|---|
| 3973 | +@media (min-width: 768px) { |
|---|
| 3974 | + .navbar-left { |
|---|
| 3975 | + float: left !important; |
|---|
| 3976 | + } |
|---|
| 3977 | + .navbar-right { |
|---|
| 3978 | + float: right !important; |
|---|
| 3979 | + } |
|---|
| 3980 | +} |
|---|
| 3981 | +.navbar-form { |
|---|
| 3982 | + padding: 10px 15px; |
|---|
| 3983 | + margin-top: 8px; |
|---|
| 3984 | + margin-right: -15px; |
|---|
| 3985 | + margin-bottom: 8px; |
|---|
| 3986 | + margin-left: -15px; |
|---|
| 3987 | + border-top: 1px solid transparent; |
|---|
| 3988 | + border-bottom: 1px solid transparent; |
|---|
| 3989 | + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); |
|---|
| 3990 | + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); |
|---|
| 3991 | +} |
|---|
| 3992 | +@media (min-width: 768px) { |
|---|
| 3993 | + .navbar-form .form-group { |
|---|
| 3994 | + display: inline-block; |
|---|
| 3995 | + margin-bottom: 0; |
|---|
| 3996 | + vertical-align: middle; |
|---|
| 3997 | + } |
|---|
| 3998 | + .navbar-form .form-control { |
|---|
| 3999 | + display: inline-block; |
|---|
| 4000 | + width: auto; |
|---|
| 4001 | + vertical-align: middle; |
|---|
| 4002 | + } |
|---|
| 4003 | + .navbar-form .input-group { |
|---|
| 4004 | + display: inline-table; |
|---|
| 4005 | + vertical-align: middle; |
|---|
| 4006 | + } |
|---|
| 4007 | + .navbar-form .input-group .input-group-addon, |
|---|
| 4008 | + .navbar-form .input-group .input-group-btn, |
|---|
| 4009 | + .navbar-form .input-group .form-control { |
|---|
| 4010 | + width: auto; |
|---|
| 4011 | + } |
|---|
| 4012 | + .navbar-form .input-group > .form-control { |
|---|
| 4013 | + width: 100%; |
|---|
| 4014 | + } |
|---|
| 4015 | + .navbar-form .control-label { |
|---|
| 4016 | + margin-bottom: 0; |
|---|
| 4017 | + vertical-align: middle; |
|---|
| 4018 | + } |
|---|
| 4019 | + .navbar-form .radio, |
|---|
| 4020 | + .navbar-form .checkbox { |
|---|
| 4021 | + display: inline-block; |
|---|
| 4022 | + margin-top: 0; |
|---|
| 4023 | + margin-bottom: 0; |
|---|
| 4024 | + vertical-align: middle; |
|---|
| 4025 | + } |
|---|
| 4026 | + .navbar-form .radio label, |
|---|
| 4027 | + .navbar-form .checkbox label { |
|---|
| 4028 | + padding-left: 0; |
|---|
| 4029 | + } |
|---|
| 4030 | + .navbar-form .radio input[type="radio"], |
|---|
| 4031 | + .navbar-form .checkbox input[type="checkbox"] { |
|---|
| 4032 | + position: relative; |
|---|
| 4033 | + margin-left: 0; |
|---|
| 4034 | + } |
|---|
| 4035 | + .navbar-form .has-feedback .form-control-feedback { |
|---|
| 4036 | + top: 0; |
|---|
| 4037 | + } |
|---|
| 4038 | +} |
|---|
| 4039 | +@media (max-width: 767px) { |
|---|
| 4040 | + .navbar-form .form-group { |
|---|
| 4041 | + margin-bottom: 5px; |
|---|
| 4042 | + } |
|---|
| 4043 | +} |
|---|
| 4044 | +@media (min-width: 768px) { |
|---|
| 4045 | + .navbar-form { |
|---|
| 4046 | + width: auto; |
|---|
| 4047 | + padding-top: 0; |
|---|
| 4048 | + padding-bottom: 0; |
|---|
| 4049 | + margin-right: 0; |
|---|
| 4050 | + margin-left: 0; |
|---|
| 4051 | + border: 0; |
|---|
| 4052 | + -webkit-box-shadow: none; |
|---|
| 4053 | + box-shadow: none; |
|---|
| 4054 | + } |
|---|
| 4055 | + .navbar-form.navbar-right:last-child { |
|---|
| 4056 | + margin-right: -15px; |
|---|
| 4057 | + } |
|---|
| 4058 | +} |
|---|
| 4059 | +.navbar-nav > li > .dropdown-menu { |
|---|
| 4060 | + margin-top: 0; |
|---|
| 4061 | + border-top-left-radius: 0; |
|---|
| 4062 | + border-top-right-radius: 0; |
|---|
| 4063 | +} |
|---|
| 4064 | +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { |
|---|
| 4065 | + border-bottom-right-radius: 0; |
|---|
| 4066 | + border-bottom-left-radius: 0; |
|---|
| 4067 | +} |
|---|
| 4068 | +.navbar-btn { |
|---|
| 4069 | + margin-top: 8px; |
|---|
| 4070 | + margin-bottom: 8px; |
|---|
| 4071 | +} |
|---|
| 4072 | +.navbar-btn.btn-sm { |
|---|
| 4073 | + margin-top: 10px; |
|---|
| 4074 | + margin-bottom: 10px; |
|---|
| 4075 | +} |
|---|
| 4076 | +.navbar-btn.btn-xs { |
|---|
| 4077 | + margin-top: 14px; |
|---|
| 4078 | + margin-bottom: 14px; |
|---|
| 4079 | +} |
|---|
| 4080 | +.navbar-text { |
|---|
| 4081 | + margin-top: 15px; |
|---|
| 4082 | + margin-bottom: 15px; |
|---|
| 4083 | +} |
|---|
| 4084 | +@media (min-width: 768px) { |
|---|
| 4085 | + .navbar-text { |
|---|
| 4086 | + float: left; |
|---|
| 4087 | + margin-right: 15px; |
|---|
| 4088 | + margin-left: 15px; |
|---|
| 4089 | + } |
|---|
| 4090 | + .navbar-text.navbar-right:last-child { |
|---|
| 4091 | + margin-right: 0; |
|---|
| 4092 | + } |
|---|
| 4093 | +} |
|---|
| 4094 | +.navbar-default { |
|---|
| 4095 | + background-color: #f8f8f8; |
|---|
| 4096 | + border-color: #e7e7e7; |
|---|
| 4097 | +} |
|---|
| 4098 | +.navbar-default .navbar-brand { |
|---|
| 4099 | + color: #777; |
|---|
| 4100 | +} |
|---|
| 4101 | +.navbar-default .navbar-brand:hover, |
|---|
| 4102 | +.navbar-default .navbar-brand:focus { |
|---|
| 4103 | + color: #5e5e5e; |
|---|
| 4104 | + background-color: transparent; |
|---|
| 4105 | +} |
|---|
| 4106 | +.navbar-default .navbar-text { |
|---|
| 4107 | + color: #777; |
|---|
| 4108 | +} |
|---|
| 4109 | +.navbar-default .navbar-nav > li > a { |
|---|
| 4110 | + color: #777; |
|---|
| 4111 | +} |
|---|
| 4112 | +.navbar-default .navbar-nav > li > a:hover, |
|---|
| 4113 | +.navbar-default .navbar-nav > li > a:focus { |
|---|
| 4114 | + color: #333; |
|---|
| 4115 | + background-color: transparent; |
|---|
| 4116 | +} |
|---|
| 4117 | +.navbar-default .navbar-nav > .active > a, |
|---|
| 4118 | +.navbar-default .navbar-nav > .active > a:hover, |
|---|
| 4119 | +.navbar-default .navbar-nav > .active > a:focus { |
|---|
| 4120 | + color: #555; |
|---|
| 4121 | + background-color: #e7e7e7; |
|---|
| 4122 | +} |
|---|
| 4123 | +.navbar-default .navbar-nav > .disabled > a, |
|---|
| 4124 | +.navbar-default .navbar-nav > .disabled > a:hover, |
|---|
| 4125 | +.navbar-default .navbar-nav > .disabled > a:focus { |
|---|
| 4126 | + color: #ccc; |
|---|
| 4127 | + background-color: transparent; |
|---|
| 4128 | +} |
|---|
| 4129 | +.navbar-default .navbar-toggle { |
|---|
| 4130 | + border-color: #ddd; |
|---|
| 4131 | +} |
|---|
| 4132 | +.navbar-default .navbar-toggle:hover, |
|---|
| 4133 | +.navbar-default .navbar-toggle:focus { |
|---|
| 4134 | + background-color: #ddd; |
|---|
| 4135 | +} |
|---|
| 4136 | +.navbar-default .navbar-toggle .icon-bar { |
|---|
| 4137 | + background-color: #888; |
|---|
| 4138 | +} |
|---|
| 4139 | +.navbar-default .navbar-collapse, |
|---|
| 4140 | +.navbar-default .navbar-form { |
|---|
| 4141 | + border-color: #e7e7e7; |
|---|
| 4142 | +} |
|---|
| 4143 | +.navbar-default .navbar-nav > .open > a, |
|---|
| 4144 | +.navbar-default .navbar-nav > .open > a:hover, |
|---|
| 4145 | +.navbar-default .navbar-nav > .open > a:focus { |
|---|
| 4146 | + color: #555; |
|---|
| 4147 | + background-color: #e7e7e7; |
|---|
| 4148 | +} |
|---|
| 4149 | +@media (max-width: 767px) { |
|---|
| 4150 | + .navbar-default .navbar-nav .open .dropdown-menu > li > a { |
|---|
| 4151 | + color: #777; |
|---|
| 4152 | + } |
|---|
| 4153 | + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, |
|---|
| 4154 | + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { |
|---|
| 4155 | + color: #333; |
|---|
| 4156 | + background-color: transparent; |
|---|
| 4157 | + } |
|---|
| 4158 | + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, |
|---|
| 4159 | + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, |
|---|
| 4160 | + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { |
|---|
| 4161 | + color: #555; |
|---|
| 4162 | + background-color: #e7e7e7; |
|---|
| 4163 | + } |
|---|
| 4164 | + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, |
|---|
| 4165 | + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, |
|---|
| 4166 | + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { |
|---|
| 4167 | + color: #ccc; |
|---|
| 4168 | + background-color: transparent; |
|---|
| 4169 | + } |
|---|
| 4170 | +} |
|---|
| 4171 | +.navbar-default .navbar-link { |
|---|
| 4172 | + color: #777; |
|---|
| 4173 | +} |
|---|
| 4174 | +.navbar-default .navbar-link:hover { |
|---|
| 4175 | + color: #333; |
|---|
| 4176 | +} |
|---|
| 4177 | +.navbar-default .btn-link { |
|---|
| 4178 | + color: #777; |
|---|
| 4179 | +} |
|---|
| 4180 | +.navbar-default .btn-link:hover, |
|---|
| 4181 | +.navbar-default .btn-link:focus { |
|---|
| 4182 | + color: #333; |
|---|
| 4183 | +} |
|---|
| 4184 | +.navbar-default .btn-link[disabled]:hover, |
|---|
| 4185 | +fieldset[disabled] .navbar-default .btn-link:hover, |
|---|
| 4186 | +.navbar-default .btn-link[disabled]:focus, |
|---|
| 4187 | +fieldset[disabled] .navbar-default .btn-link:focus { |
|---|
| 4188 | + color: #ccc; |
|---|
| 4189 | +} |
|---|
| 4190 | +.navbar-inverse { |
|---|
| 4191 | + background-color: #222; |
|---|
| 4192 | + border-color: #080808; |
|---|
| 4193 | +} |
|---|
| 4194 | +.navbar-inverse .navbar-brand { |
|---|
| 4195 | + color: #777; |
|---|
| 4196 | +} |
|---|
| 4197 | +.navbar-inverse .navbar-brand:hover, |
|---|
| 4198 | +.navbar-inverse .navbar-brand:focus { |
|---|
| 4199 | + color: #fff; |
|---|
| 4200 | + background-color: transparent; |
|---|
| 4201 | +} |
|---|
| 4202 | +.navbar-inverse .navbar-text { |
|---|
| 4203 | + color: #777; |
|---|
| 4204 | +} |
|---|
| 4205 | +.navbar-inverse .navbar-nav > li > a { |
|---|
| 4206 | + color: #777; |
|---|
| 4207 | +} |
|---|
| 4208 | +.navbar-inverse .navbar-nav > li > a:hover, |
|---|
| 4209 | +.navbar-inverse .navbar-nav > li > a:focus { |
|---|
| 4210 | + color: #fff; |
|---|
| 4211 | + background-color: transparent; |
|---|
| 4212 | +} |
|---|
| 4213 | +.navbar-inverse .navbar-nav > .active > a, |
|---|
| 4214 | +.navbar-inverse .navbar-nav > .active > a:hover, |
|---|
| 4215 | +.navbar-inverse .navbar-nav > .active > a:focus { |
|---|
| 4216 | + color: #fff; |
|---|
| 4217 | + background-color: #080808; |
|---|
| 4218 | +} |
|---|
| 4219 | +.navbar-inverse .navbar-nav > .disabled > a, |
|---|
| 4220 | +.navbar-inverse .navbar-nav > .disabled > a:hover, |
|---|
| 4221 | +.navbar-inverse .navbar-nav > .disabled > a:focus { |
|---|
| 4222 | + color: #444; |
|---|
| 4223 | + background-color: transparent; |
|---|
| 4224 | +} |
|---|
| 4225 | +.navbar-inverse .navbar-toggle { |
|---|
| 4226 | + border-color: #333; |
|---|
| 4227 | +} |
|---|
| 4228 | +.navbar-inverse .navbar-toggle:hover, |
|---|
| 4229 | +.navbar-inverse .navbar-toggle:focus { |
|---|
| 4230 | + background-color: #333; |
|---|
| 4231 | +} |
|---|
| 4232 | +.navbar-inverse .navbar-toggle .icon-bar { |
|---|
| 4233 | + background-color: #fff; |
|---|
| 4234 | +} |
|---|
| 4235 | +.navbar-inverse .navbar-collapse, |
|---|
| 4236 | +.navbar-inverse .navbar-form { |
|---|
| 4237 | + border-color: #101010; |
|---|
| 4238 | +} |
|---|
| 4239 | +.navbar-inverse .navbar-nav > .open > a, |
|---|
| 4240 | +.navbar-inverse .navbar-nav > .open > a:hover, |
|---|
| 4241 | +.navbar-inverse .navbar-nav > .open > a:focus { |
|---|
| 4242 | + color: #fff; |
|---|
| 4243 | + background-color: #080808; |
|---|
| 4244 | +} |
|---|
| 4245 | +@media (max-width: 767px) { |
|---|
| 4246 | + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { |
|---|
| 4247 | + border-color: #080808; |
|---|
| 4248 | + } |
|---|
| 4249 | + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { |
|---|
| 4250 | + background-color: #080808; |
|---|
| 4251 | + } |
|---|
| 4252 | + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { |
|---|
| 4253 | + color: #777; |
|---|
| 4254 | + } |
|---|
| 4255 | + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, |
|---|
| 4256 | + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { |
|---|
| 4257 | + color: #fff; |
|---|
| 4258 | + background-color: transparent; |
|---|
| 4259 | + } |
|---|
| 4260 | + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, |
|---|
| 4261 | + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, |
|---|
| 4262 | + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { |
|---|
| 4263 | + color: #fff; |
|---|
| 4264 | + background-color: #080808; |
|---|
| 4265 | + } |
|---|
| 4266 | + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, |
|---|
| 4267 | + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, |
|---|
| 4268 | + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { |
|---|
| 4269 | + color: #444; |
|---|
| 4270 | + background-color: transparent; |
|---|
| 4271 | + } |
|---|
| 4272 | +} |
|---|
| 4273 | +.navbar-inverse .navbar-link { |
|---|
| 4274 | + color: #777; |
|---|
| 4275 | +} |
|---|
| 4276 | +.navbar-inverse .navbar-link:hover { |
|---|
| 4277 | + color: #fff; |
|---|
| 4278 | +} |
|---|
| 4279 | +.navbar-inverse .btn-link { |
|---|
| 4280 | + color: #777; |
|---|
| 4281 | +} |
|---|
| 4282 | +.navbar-inverse .btn-link:hover, |
|---|
| 4283 | +.navbar-inverse .btn-link:focus { |
|---|
| 4284 | + color: #fff; |
|---|
| 4285 | +} |
|---|
| 4286 | +.navbar-inverse .btn-link[disabled]:hover, |
|---|
| 4287 | +fieldset[disabled] .navbar-inverse .btn-link:hover, |
|---|
| 4288 | +.navbar-inverse .btn-link[disabled]:focus, |
|---|
| 4289 | +fieldset[disabled] .navbar-inverse .btn-link:focus { |
|---|
| 4290 | + color: #444; |
|---|
| 4291 | +} |
|---|
| 4292 | +.breadcrumb { |
|---|
| 4293 | + padding: 8px 15px; |
|---|
| 4294 | + margin-bottom: 20px; |
|---|
| 4295 | + list-style: none; |
|---|
| 4296 | + background-color: #f5f5f5; |
|---|
| 4297 | + border-radius: 4px; |
|---|
| 4298 | +} |
|---|
| 4299 | +.breadcrumb > li { |
|---|
| 4300 | + display: inline-block; |
|---|
| 4301 | +} |
|---|
| 4302 | +.breadcrumb > li + li:before { |
|---|
| 4303 | + padding: 0 5px; |
|---|
| 4304 | + color: #ccc; |
|---|
| 4305 | + content: "/\00a0"; |
|---|
| 4306 | +} |
|---|
| 4307 | +.breadcrumb > .active { |
|---|
| 4308 | + color: #777; |
|---|
| 4309 | +} |
|---|
| 4310 | +.pagination { |
|---|
| 4311 | + display: inline-block; |
|---|
| 4312 | + padding-left: 0; |
|---|
| 4313 | + margin: 20px 0; |
|---|
| 4314 | + border-radius: 4px; |
|---|
| 4315 | +} |
|---|
| 4316 | +.pagination > li { |
|---|
| 4317 | + display: inline; |
|---|
| 4318 | +} |
|---|
| 4319 | +.pagination > li > a, |
|---|
| 4320 | +.pagination > li > span { |
|---|
| 4321 | + position: relative; |
|---|
| 4322 | + float: left; |
|---|
| 4323 | + padding: 6px 12px; |
|---|
| 4324 | + margin-left: -1px; |
|---|
| 4325 | + line-height: 1.42857143; |
|---|
| 4326 | + color: #428bca; |
|---|
| 4327 | + text-decoration: none; |
|---|
| 4328 | + background-color: #fff; |
|---|
| 4329 | + border: 1px solid #ddd; |
|---|
| 4330 | +} |
|---|
| 4331 | +.pagination > li:first-child > a, |
|---|
| 4332 | +.pagination > li:first-child > span { |
|---|
| 4333 | + margin-left: 0; |
|---|
| 4334 | + border-top-left-radius: 4px; |
|---|
| 4335 | + border-bottom-left-radius: 4px; |
|---|
| 4336 | +} |
|---|
| 4337 | +.pagination > li:last-child > a, |
|---|
| 4338 | +.pagination > li:last-child > span { |
|---|
| 4339 | + border-top-right-radius: 4px; |
|---|
| 4340 | + border-bottom-right-radius: 4px; |
|---|
| 4341 | +} |
|---|
| 4342 | +.pagination > li > a:hover, |
|---|
| 4343 | +.pagination > li > span:hover, |
|---|
| 4344 | +.pagination > li > a:focus, |
|---|
| 4345 | +.pagination > li > span:focus { |
|---|
| 4346 | + color: #2a6496; |
|---|
| 4347 | + background-color: #eee; |
|---|
| 4348 | + border-color: #ddd; |
|---|
| 4349 | +} |
|---|
| 4350 | +.pagination > .active > a, |
|---|
| 4351 | +.pagination > .active > span, |
|---|
| 4352 | +.pagination > .active > a:hover, |
|---|
| 4353 | +.pagination > .active > span:hover, |
|---|
| 4354 | +.pagination > .active > a:focus, |
|---|
| 4355 | +.pagination > .active > span:focus { |
|---|
| 4356 | + z-index: 2; |
|---|
| 4357 | + color: #fff; |
|---|
| 4358 | + cursor: default; |
|---|
| 4359 | + background-color: #428bca; |
|---|
| 4360 | + border-color: #428bca; |
|---|
| 4361 | +} |
|---|
| 4362 | +.pagination > .disabled > span, |
|---|
| 4363 | +.pagination > .disabled > span:hover, |
|---|
| 4364 | +.pagination > .disabled > span:focus, |
|---|
| 4365 | +.pagination > .disabled > a, |
|---|
| 4366 | +.pagination > .disabled > a:hover, |
|---|
| 4367 | +.pagination > .disabled > a:focus { |
|---|
| 4368 | + color: #777; |
|---|
| 4369 | + cursor: not-allowed; |
|---|
| 4370 | + background-color: #fff; |
|---|
| 4371 | + border-color: #ddd; |
|---|
| 4372 | +} |
|---|
| 4373 | +.pagination-lg > li > a, |
|---|
| 4374 | +.pagination-lg > li > span { |
|---|
| 4375 | + padding: 10px 16px; |
|---|
| 4376 | + font-size: 18px; |
|---|
| 4377 | +} |
|---|
| 4378 | +.pagination-lg > li:first-child > a, |
|---|
| 4379 | +.pagination-lg > li:first-child > span { |
|---|
| 4380 | + border-top-left-radius: 6px; |
|---|
| 4381 | + border-bottom-left-radius: 6px; |
|---|
| 4382 | +} |
|---|
| 4383 | +.pagination-lg > li:last-child > a, |
|---|
| 4384 | +.pagination-lg > li:last-child > span { |
|---|
| 4385 | + border-top-right-radius: 6px; |
|---|
| 4386 | + border-bottom-right-radius: 6px; |
|---|
| 4387 | +} |
|---|
| 4388 | +.pagination-sm > li > a, |
|---|
| 4389 | +.pagination-sm > li > span { |
|---|
| 4390 | + padding: 5px 10px; |
|---|
| 4391 | + font-size: 12px; |
|---|
| 4392 | +} |
|---|
| 4393 | +.pagination-sm > li:first-child > a, |
|---|
| 4394 | +.pagination-sm > li:first-child > span { |
|---|
| 4395 | + border-top-left-radius: 3px; |
|---|
| 4396 | + border-bottom-left-radius: 3px; |
|---|
| 4397 | +} |
|---|
| 4398 | +.pagination-sm > li:last-child > a, |
|---|
| 4399 | +.pagination-sm > li:last-child > span { |
|---|
| 4400 | + border-top-right-radius: 3px; |
|---|
| 4401 | + border-bottom-right-radius: 3px; |
|---|
| 4402 | +} |
|---|
| 4403 | +.pager { |
|---|
| 4404 | + padding-left: 0; |
|---|
| 4405 | + margin: 20px 0; |
|---|
| 4406 | + text-align: center; |
|---|
| 4407 | + list-style: none; |
|---|
| 4408 | +} |
|---|
| 4409 | +.pager li { |
|---|
| 4410 | + display: inline; |
|---|
| 4411 | +} |
|---|
| 4412 | +.pager li > a, |
|---|
| 4413 | +.pager li > span { |
|---|
| 4414 | + display: inline-block; |
|---|
| 4415 | + padding: 5px 14px; |
|---|
| 4416 | + background-color: #fff; |
|---|
| 4417 | + border: 1px solid #ddd; |
|---|
| 4418 | + border-radius: 15px; |
|---|
| 4419 | +} |
|---|
| 4420 | +.pager li > a:hover, |
|---|
| 4421 | +.pager li > a:focus { |
|---|
| 4422 | + text-decoration: none; |
|---|
| 4423 | + background-color: #eee; |
|---|
| 4424 | +} |
|---|
| 4425 | +.pager .next > a, |
|---|
| 4426 | +.pager .next > span { |
|---|
| 4427 | + float: right; |
|---|
| 4428 | +} |
|---|
| 4429 | +.pager .previous > a, |
|---|
| 4430 | +.pager .previous > span { |
|---|
| 4431 | + float: left; |
|---|
| 4432 | +} |
|---|
| 4433 | +.pager .disabled > a, |
|---|
| 4434 | +.pager .disabled > a:hover, |
|---|
| 4435 | +.pager .disabled > a:focus, |
|---|
| 4436 | +.pager .disabled > span { |
|---|
| 4437 | + color: #777; |
|---|
| 4438 | + cursor: not-allowed; |
|---|
| 4439 | + background-color: #fff; |
|---|
| 4440 | +} |
|---|
| 4441 | +.label { |
|---|
| 4442 | + display: inline; |
|---|
| 4443 | + padding: .2em .6em .3em; |
|---|
| 4444 | + font-size: 75%; |
|---|
| 4445 | + font-weight: bold; |
|---|
| 4446 | + line-height: 1; |
|---|
| 4447 | + color: #fff; |
|---|
| 4448 | + text-align: center; |
|---|
| 4449 | + white-space: nowrap; |
|---|
| 4450 | + vertical-align: baseline; |
|---|
| 4451 | + border-radius: .25em; |
|---|
| 4452 | +} |
|---|
| 4453 | +a.label:hover, |
|---|
| 4454 | +a.label:focus { |
|---|
| 4455 | + color: #fff; |
|---|
| 4456 | + text-decoration: none; |
|---|
| 4457 | + cursor: pointer; |
|---|
| 4458 | +} |
|---|
| 4459 | +.label:empty { |
|---|
| 4460 | + display: none; |
|---|
| 4461 | +} |
|---|
| 4462 | +.btn .label { |
|---|
| 4463 | + position: relative; |
|---|
| 4464 | + top: -1px; |
|---|
| 4465 | +} |
|---|
| 4466 | +.label-default { |
|---|
| 4467 | + background-color: #777; |
|---|
| 4468 | +} |
|---|
| 4469 | +.label-default[href]:hover, |
|---|
| 4470 | +.label-default[href]:focus { |
|---|
| 4471 | + background-color: #5e5e5e; |
|---|
| 4472 | +} |
|---|
| 4473 | +.label-primary { |
|---|
| 4474 | + background-color: #428bca; |
|---|
| 4475 | +} |
|---|
| 4476 | +.label-primary[href]:hover, |
|---|
| 4477 | +.label-primary[href]:focus { |
|---|
| 4478 | + background-color: #3071a9; |
|---|
| 4479 | +} |
|---|
| 4480 | +.label-success { |
|---|
| 4481 | + background-color: #5cb85c; |
|---|
| 4482 | +} |
|---|
| 4483 | +.label-success[href]:hover, |
|---|
| 4484 | +.label-success[href]:focus { |
|---|
| 4485 | + background-color: #449d44; |
|---|
| 4486 | +} |
|---|
| 4487 | +.label-info { |
|---|
| 4488 | + background-color: #5bc0de; |
|---|
| 4489 | +} |
|---|
| 4490 | +.label-info[href]:hover, |
|---|
| 4491 | +.label-info[href]:focus { |
|---|
| 4492 | + background-color: #31b0d5; |
|---|
| 4493 | +} |
|---|
| 4494 | +.label-warning { |
|---|
| 4495 | + background-color: #f0ad4e; |
|---|
| 4496 | +} |
|---|
| 4497 | +.label-warning[href]:hover, |
|---|
| 4498 | +.label-warning[href]:focus { |
|---|
| 4499 | + background-color: #ec971f; |
|---|
| 4500 | +} |
|---|
| 4501 | +.label-danger { |
|---|
| 4502 | + background-color: #d9534f; |
|---|
| 4503 | +} |
|---|
| 4504 | +.label-danger[href]:hover, |
|---|
| 4505 | +.label-danger[href]:focus { |
|---|
| 4506 | + background-color: #c9302c; |
|---|
| 4507 | +} |
|---|
| 4508 | +.badge { |
|---|
| 4509 | + display: inline-block; |
|---|
| 4510 | + min-width: 10px; |
|---|
| 4511 | + padding: 3px 7px; |
|---|
| 4512 | + font-size: 12px; |
|---|
| 4513 | + font-weight: bold; |
|---|
| 4514 | + line-height: 1; |
|---|
| 4515 | + color: #fff; |
|---|
| 4516 | + text-align: center; |
|---|
| 4517 | + white-space: nowrap; |
|---|
| 4518 | + vertical-align: baseline; |
|---|
| 4519 | + background-color: #777; |
|---|
| 4520 | + border-radius: 10px; |
|---|
| 4521 | +} |
|---|
| 4522 | +.badge:empty { |
|---|
| 4523 | + display: none; |
|---|
| 4524 | +} |
|---|
| 4525 | +.btn .badge { |
|---|
| 4526 | + position: relative; |
|---|
| 4527 | + top: -1px; |
|---|
| 4528 | +} |
|---|
| 4529 | +.btn-xs .badge { |
|---|
| 4530 | + top: 0; |
|---|
| 4531 | + padding: 1px 5px; |
|---|
| 4532 | +} |
|---|
| 4533 | +a.badge:hover, |
|---|
| 4534 | +a.badge:focus { |
|---|
| 4535 | + color: #fff; |
|---|
| 4536 | + text-decoration: none; |
|---|
| 4537 | + cursor: pointer; |
|---|
| 4538 | +} |
|---|
| 4539 | +a.list-group-item.active > .badge, |
|---|
| 4540 | +.nav-pills > .active > a > .badge { |
|---|
| 4541 | + color: #428bca; |
|---|
| 4542 | + background-color: #fff; |
|---|
| 4543 | +} |
|---|
| 4544 | +.nav-pills > li > a > .badge { |
|---|
| 4545 | + margin-left: 3px; |
|---|
| 4546 | +} |
|---|
| 4547 | +.jumbotron { |
|---|
| 4548 | + padding: 30px; |
|---|
| 4549 | + margin-bottom: 30px; |
|---|
| 4550 | + color: inherit; |
|---|
| 4551 | + background-color: #eee; |
|---|
| 4552 | +} |
|---|
| 4553 | +.jumbotron h1, |
|---|
| 4554 | +.jumbotron .h1 { |
|---|
| 4555 | + color: inherit; |
|---|
| 4556 | +} |
|---|
| 4557 | +.jumbotron p { |
|---|
| 4558 | + margin-bottom: 15px; |
|---|
| 4559 | + font-size: 21px; |
|---|
| 4560 | + font-weight: 200; |
|---|
| 4561 | +} |
|---|
| 4562 | +.jumbotron > hr { |
|---|
| 4563 | + border-top-color: #d5d5d5; |
|---|
| 4564 | +} |
|---|
| 4565 | +.container .jumbotron { |
|---|
| 4566 | + border-radius: 6px; |
|---|
| 4567 | +} |
|---|
| 4568 | +.jumbotron .container { |
|---|
| 4569 | + max-width: 100%; |
|---|
| 4570 | +} |
|---|
| 4571 | +@media screen and (min-width: 768px) { |
|---|
| 4572 | + .jumbotron { |
|---|
| 4573 | + padding-top: 48px; |
|---|
| 4574 | + padding-bottom: 48px; |
|---|
| 4575 | + } |
|---|
| 4576 | + .container .jumbotron { |
|---|
| 4577 | + padding-right: 60px; |
|---|
| 4578 | + padding-left: 60px; |
|---|
| 4579 | + } |
|---|
| 4580 | + .jumbotron h1, |
|---|
| 4581 | + .jumbotron .h1 { |
|---|
| 4582 | + font-size: 63px; |
|---|
| 4583 | + } |
|---|
| 4584 | +} |
|---|
| 4585 | +.thumbnail { |
|---|
| 4586 | + display: block; |
|---|
| 4587 | + padding: 4px; |
|---|
| 4588 | + margin-bottom: 20px; |
|---|
| 4589 | + line-height: 1.42857143; |
|---|
| 4590 | + background-color: #fff; |
|---|
| 4591 | + border: 1px solid #ddd; |
|---|
| 4592 | + border-radius: 4px; |
|---|
| 4593 | + -webkit-transition: all .2s ease-in-out; |
|---|
| 4594 | + -o-transition: all .2s ease-in-out; |
|---|
| 4595 | + transition: all .2s ease-in-out; |
|---|
| 4596 | +} |
|---|
| 4597 | +.thumbnail > img, |
|---|
| 4598 | +.thumbnail a > img { |
|---|
| 4599 | + margin-right: auto; |
|---|
| 4600 | + margin-left: auto; |
|---|
| 4601 | +} |
|---|
| 4602 | +a.thumbnail:hover, |
|---|
| 4603 | +a.thumbnail:focus, |
|---|
| 4604 | +a.thumbnail.active { |
|---|
| 4605 | + border-color: #428bca; |
|---|
| 4606 | +} |
|---|
| 4607 | +.thumbnail .caption { |
|---|
| 4608 | + padding: 9px; |
|---|
| 4609 | + color: #333; |
|---|
| 4610 | +} |
|---|
| 4611 | +.alert { |
|---|
| 4612 | + padding: 15px; |
|---|
| 4613 | + margin-bottom: 20px; |
|---|
| 4614 | + border: 1px solid transparent; |
|---|
| 4615 | + border-radius: 4px; |
|---|
| 4616 | +} |
|---|
| 4617 | +.alert h4 { |
|---|
| 4618 | + margin-top: 0; |
|---|
| 4619 | + color: inherit; |
|---|
| 4620 | +} |
|---|
| 4621 | +.alert .alert-link { |
|---|
| 4622 | + font-weight: bold; |
|---|
| 4623 | +} |
|---|
| 4624 | +.alert > p, |
|---|
| 4625 | +.alert > ul { |
|---|
| 4626 | + margin-bottom: 0; |
|---|
| 4627 | +} |
|---|
| 4628 | +.alert > p + p { |
|---|
| 4629 | + margin-top: 5px; |
|---|
| 4630 | +} |
|---|
| 4631 | +.alert-dismissable, |
|---|
| 4632 | +.alert-dismissible { |
|---|
| 4633 | + padding-right: 35px; |
|---|
| 4634 | +} |
|---|
| 4635 | +.alert-dismissable .close, |
|---|
| 4636 | +.alert-dismissible .close { |
|---|
| 4637 | + position: relative; |
|---|
| 4638 | + top: -2px; |
|---|
| 4639 | + right: -21px; |
|---|
| 4640 | + color: inherit; |
|---|
| 4641 | +} |
|---|
| 4642 | +.alert-success { |
|---|
| 4643 | + color: #3c763d; |
|---|
| 4644 | + background-color: #dff0d8; |
|---|
| 4645 | + border-color: #d6e9c6; |
|---|
| 4646 | +} |
|---|
| 4647 | +.alert-success hr { |
|---|
| 4648 | + border-top-color: #c9e2b3; |
|---|
| 4649 | +} |
|---|
| 4650 | +.alert-success .alert-link { |
|---|
| 4651 | + color: #2b542c; |
|---|
| 4652 | +} |
|---|
| 4653 | +.alert-info { |
|---|
| 4654 | + color: #31708f; |
|---|
| 4655 | + background-color: #d9edf7; |
|---|
| 4656 | + border-color: #bce8f1; |
|---|
| 4657 | +} |
|---|
| 4658 | +.alert-info hr { |
|---|
| 4659 | + border-top-color: #a6e1ec; |
|---|
| 4660 | +} |
|---|
| 4661 | +.alert-info .alert-link { |
|---|
| 4662 | + color: #245269; |
|---|
| 4663 | +} |
|---|
| 4664 | +.alert-warning { |
|---|
| 4665 | + color: #8a6d3b; |
|---|
| 4666 | + background-color: #fcf8e3; |
|---|
| 4667 | + border-color: #faebcc; |
|---|
| 4668 | +} |
|---|
| 4669 | +.alert-warning hr { |
|---|
| 4670 | + border-top-color: #f7e1b5; |
|---|
| 4671 | +} |
|---|
| 4672 | +.alert-warning .alert-link { |
|---|
| 4673 | + color: #66512c; |
|---|
| 4674 | +} |
|---|
| 4675 | +.alert-danger { |
|---|
| 4676 | + color: #a94442; |
|---|
| 4677 | + background-color: #f2dede; |
|---|
| 4678 | + border-color: #ebccd1; |
|---|
| 4679 | +} |
|---|
| 4680 | +.alert-danger hr { |
|---|
| 4681 | + border-top-color: #e4b9c0; |
|---|
| 4682 | +} |
|---|
| 4683 | +.alert-danger .alert-link { |
|---|
| 4684 | + color: #843534; |
|---|
| 4685 | +} |
|---|
| 4686 | +@-webkit-keyframes progress-bar-stripes { |
|---|
| 4687 | + from { |
|---|
| 4688 | + background-position: 40px 0; |
|---|
| 4689 | + } |
|---|
| 4690 | + to { |
|---|
| 4691 | + background-position: 0 0; |
|---|
| 4692 | + } |
|---|
| 4693 | +} |
|---|
| 4694 | +@-o-keyframes progress-bar-stripes { |
|---|
| 4695 | + from { |
|---|
| 4696 | + background-position: 40px 0; |
|---|
| 4697 | + } |
|---|
| 4698 | + to { |
|---|
| 4699 | + background-position: 0 0; |
|---|
| 4700 | + } |
|---|
| 4701 | +} |
|---|
| 4702 | +@keyframes progress-bar-stripes { |
|---|
| 4703 | + from { |
|---|
| 4704 | + background-position: 40px 0; |
|---|
| 4705 | + } |
|---|
| 4706 | + to { |
|---|
| 4707 | + background-position: 0 0; |
|---|
| 4708 | + } |
|---|
| 4709 | +} |
|---|
| 4710 | +.progress { |
|---|
| 4711 | + height: 20px; |
|---|
| 4712 | + margin-bottom: 20px; |
|---|
| 4713 | + overflow: hidden; |
|---|
| 4714 | + background-color: #f5f5f5; |
|---|
| 4715 | + border-radius: 4px; |
|---|
| 4716 | + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); |
|---|
| 4717 | + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); |
|---|
| 4718 | +} |
|---|
| 4719 | +.progress-bar { |
|---|
| 4720 | + float: left; |
|---|
| 4721 | + width: 0; |
|---|
| 4722 | + height: 100%; |
|---|
| 4723 | + font-size: 12px; |
|---|
| 4724 | + line-height: 20px; |
|---|
| 4725 | + color: #fff; |
|---|
| 4726 | + text-align: center; |
|---|
| 4727 | + background-color: #428bca; |
|---|
| 4728 | + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); |
|---|
| 4729 | + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); |
|---|
| 4730 | + -webkit-transition: width .6s ease; |
|---|
| 4731 | + -o-transition: width .6s ease; |
|---|
| 4732 | + transition: width .6s ease; |
|---|
| 4733 | +} |
|---|
| 4734 | +.progress-striped .progress-bar, |
|---|
| 4735 | +.progress-bar-striped { |
|---|
| 4736 | + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); |
|---|
| 4737 | + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); |
|---|
| 4738 | + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); |
|---|
| 4739 | + -webkit-background-size: 40px 40px; |
|---|
| 4740 | + background-size: 40px 40px; |
|---|
| 4741 | +} |
|---|
| 4742 | +.progress.active .progress-bar, |
|---|
| 4743 | +.progress-bar.active { |
|---|
| 4744 | + -webkit-animation: progress-bar-stripes 2s linear infinite; |
|---|
| 4745 | + -o-animation: progress-bar-stripes 2s linear infinite; |
|---|
| 4746 | + animation: progress-bar-stripes 2s linear infinite; |
|---|
| 4747 | +} |
|---|
| 4748 | +.progress-bar[aria-valuenow="1"], |
|---|
| 4749 | +.progress-bar[aria-valuenow="2"] { |
|---|
| 4750 | + min-width: 30px; |
|---|
| 4751 | +} |
|---|
| 4752 | +.progress-bar[aria-valuenow="0"] { |
|---|
| 4753 | + min-width: 30px; |
|---|
| 4754 | + color: #777; |
|---|
| 4755 | + background-color: transparent; |
|---|
| 4756 | + background-image: none; |
|---|
| 4757 | + -webkit-box-shadow: none; |
|---|
| 4758 | + box-shadow: none; |
|---|
| 4759 | +} |
|---|
| 4760 | +.progress-bar-success { |
|---|
| 4761 | + background-color: #5cb85c; |
|---|
| 4762 | +} |
|---|
| 4763 | +.progress-striped .progress-bar-success { |
|---|
| 4764 | + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); |
|---|
| 4765 | + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); |
|---|
| 4766 | + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); |
|---|
| 4767 | +} |
|---|
| 4768 | +.progress-bar-info { |
|---|
| 4769 | + background-color: #5bc0de; |
|---|
| 4770 | +} |
|---|
| 4771 | +.progress-striped .progress-bar-info { |
|---|
| 4772 | + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); |
|---|
| 4773 | + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); |
|---|
| 4774 | + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); |
|---|
| 4775 | +} |
|---|
| 4776 | +.progress-bar-warning { |
|---|
| 4777 | + background-color: #f0ad4e; |
|---|
| 4778 | +} |
|---|
| 4779 | +.progress-striped .progress-bar-warning { |
|---|
| 4780 | + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); |
|---|
| 4781 | + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); |
|---|
| 4782 | + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); |
|---|
| 4783 | +} |
|---|
| 4784 | +.progress-bar-danger { |
|---|
| 4785 | + background-color: #d9534f; |
|---|
| 4786 | +} |
|---|
| 4787 | +.progress-striped .progress-bar-danger { |
|---|
| 4788 | + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); |
|---|
| 4789 | + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); |
|---|
| 4790 | + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); |
|---|
| 4791 | +} |
|---|
| 4792 | +.media, |
|---|
| 4793 | +.media-body { |
|---|
| 4794 | + overflow: hidden; |
|---|
| 4795 | + zoom: 1; |
|---|
| 4796 | +} |
|---|
| 4797 | +.media, |
|---|
| 4798 | +.media .media { |
|---|
| 4799 | + margin-top: 15px; |
|---|
| 4800 | +} |
|---|
| 4801 | +.media:first-child { |
|---|
| 4802 | + margin-top: 0; |
|---|
| 4803 | +} |
|---|
| 4804 | +.media-object { |
|---|
| 4805 | + display: block; |
|---|
| 4806 | +} |
|---|
| 4807 | +.media-heading { |
|---|
| 4808 | + margin: 0 0 5px; |
|---|
| 4809 | +} |
|---|
| 4810 | +.media > .pull-left { |
|---|
| 4811 | + margin-right: 10px; |
|---|
| 4812 | +} |
|---|
| 4813 | +.media > .pull-right { |
|---|
| 4814 | + margin-left: 10px; |
|---|
| 4815 | +} |
|---|
| 4816 | +.media-list { |
|---|
| 4817 | + padding-left: 0; |
|---|
| 4818 | + list-style: none; |
|---|
| 4819 | +} |
|---|
| 4820 | +.list-group { |
|---|
| 4821 | + padding-left: 0; |
|---|
| 4822 | + margin-bottom: 20px; |
|---|
| 4823 | +} |
|---|
| 4824 | +.list-group-item { |
|---|
| 4825 | + position: relative; |
|---|
| 4826 | + display: block; |
|---|
| 4827 | + padding: 10px 15px; |
|---|
| 4828 | + margin-bottom: -1px; |
|---|
| 4829 | + background-color: #fff; |
|---|
| 4830 | + border: 1px solid #ddd; |
|---|
| 4831 | +} |
|---|
| 4832 | +.list-group-item:first-child { |
|---|
| 4833 | + border-top-left-radius: 4px; |
|---|
| 4834 | + border-top-right-radius: 4px; |
|---|
| 4835 | +} |
|---|
| 4836 | +.list-group-item:last-child { |
|---|
| 4837 | + margin-bottom: 0; |
|---|
| 4838 | + border-bottom-right-radius: 4px; |
|---|
| 4839 | + border-bottom-left-radius: 4px; |
|---|
| 4840 | +} |
|---|
| 4841 | +.list-group-item > .badge { |
|---|
| 4842 | + float: right; |
|---|
| 4843 | +} |
|---|
| 4844 | +.list-group-item > .badge + .badge { |
|---|
| 4845 | + margin-right: 5px; |
|---|
| 4846 | +} |
|---|
| 4847 | +a.list-group-item { |
|---|
| 4848 | + color: #555; |
|---|
| 4849 | +} |
|---|
| 4850 | +a.list-group-item .list-group-item-heading { |
|---|
| 4851 | + color: #333; |
|---|
| 4852 | +} |
|---|
| 4853 | +a.list-group-item:hover, |
|---|
| 4854 | +a.list-group-item:focus { |
|---|
| 4855 | + color: #555; |
|---|
| 4856 | + text-decoration: none; |
|---|
| 4857 | + background-color: #f5f5f5; |
|---|
| 4858 | +} |
|---|
| 4859 | +.list-group-item.disabled, |
|---|
| 4860 | +.list-group-item.disabled:hover, |
|---|
| 4861 | +.list-group-item.disabled:focus { |
|---|
| 4862 | + color: #777; |
|---|
| 4863 | + background-color: #eee; |
|---|
| 4864 | +} |
|---|
| 4865 | +.list-group-item.disabled .list-group-item-heading, |
|---|
| 4866 | +.list-group-item.disabled:hover .list-group-item-heading, |
|---|
| 4867 | +.list-group-item.disabled:focus .list-group-item-heading { |
|---|
| 4868 | + color: inherit; |
|---|
| 4869 | +} |
|---|
| 4870 | +.list-group-item.disabled .list-group-item-text, |
|---|
| 4871 | +.list-group-item.disabled:hover .list-group-item-text, |
|---|
| 4872 | +.list-group-item.disabled:focus .list-group-item-text { |
|---|
| 4873 | + color: #777; |
|---|
| 4874 | +} |
|---|
| 4875 | +.list-group-item.active, |
|---|
| 4876 | +.list-group-item.active:hover, |
|---|
| 4877 | +.list-group-item.active:focus { |
|---|
| 4878 | + z-index: 2; |
|---|
| 4879 | + color: #fff; |
|---|
| 4880 | + background-color: #428bca; |
|---|
| 4881 | + border-color: #428bca; |
|---|
| 4882 | +} |
|---|
| 4883 | +.list-group-item.active .list-group-item-heading, |
|---|
| 4884 | +.list-group-item.active:hover .list-group-item-heading, |
|---|
| 4885 | +.list-group-item.active:focus .list-group-item-heading, |
|---|
| 4886 | +.list-group-item.active .list-group-item-heading > small, |
|---|
| 4887 | +.list-group-item.active:hover .list-group-item-heading > small, |
|---|
| 4888 | +.list-group-item.active:focus .list-group-item-heading > small, |
|---|
| 4889 | +.list-group-item.active .list-group-item-heading > .small, |
|---|
| 4890 | +.list-group-item.active:hover .list-group-item-heading > .small, |
|---|
| 4891 | +.list-group-item.active:focus .list-group-item-heading > .small { |
|---|
| 4892 | + color: inherit; |
|---|
| 4893 | +} |
|---|
| 4894 | +.list-group-item.active .list-group-item-text, |
|---|
| 4895 | +.list-group-item.active:hover .list-group-item-text, |
|---|
| 4896 | +.list-group-item.active:focus .list-group-item-text { |
|---|
| 4897 | + color: #e1edf7; |
|---|
| 4898 | +} |
|---|
| 4899 | +.list-group-item-success { |
|---|
| 4900 | + color: #3c763d; |
|---|
| 4901 | + background-color: #dff0d8; |
|---|
| 4902 | +} |
|---|
| 4903 | +a.list-group-item-success { |
|---|
| 4904 | + color: #3c763d; |
|---|
| 4905 | +} |
|---|
| 4906 | +a.list-group-item-success .list-group-item-heading { |
|---|
| 4907 | + color: inherit; |
|---|
| 4908 | +} |
|---|
| 4909 | +a.list-group-item-success:hover, |
|---|
| 4910 | +a.list-group-item-success:focus { |
|---|
| 4911 | + color: #3c763d; |
|---|
| 4912 | + background-color: #d0e9c6; |
|---|
| 4913 | +} |
|---|
| 4914 | +a.list-group-item-success.active, |
|---|
| 4915 | +a.list-group-item-success.active:hover, |
|---|
| 4916 | +a.list-group-item-success.active:focus { |
|---|
| 4917 | + color: #fff; |
|---|
| 4918 | + background-color: #3c763d; |
|---|
| 4919 | + border-color: #3c763d; |
|---|
| 4920 | +} |
|---|
| 4921 | +.list-group-item-info { |
|---|
| 4922 | + color: #31708f; |
|---|
| 4923 | + background-color: #d9edf7; |
|---|
| 4924 | +} |
|---|
| 4925 | +a.list-group-item-info { |
|---|
| 4926 | + color: #31708f; |
|---|
| 4927 | +} |
|---|
| 4928 | +a.list-group-item-info .list-group-item-heading { |
|---|
| 4929 | + color: inherit; |
|---|
| 4930 | +} |
|---|
| 4931 | +a.list-group-item-info:hover, |
|---|
| 4932 | +a.list-group-item-info:focus { |
|---|
| 4933 | + color: #31708f; |
|---|
| 4934 | + background-color: #c4e3f3; |
|---|
| 4935 | +} |
|---|
| 4936 | +a.list-group-item-info.active, |
|---|
| 4937 | +a.list-group-item-info.active:hover, |
|---|
| 4938 | +a.list-group-item-info.active:focus { |
|---|
| 4939 | + color: #fff; |
|---|
| 4940 | + background-color: #31708f; |
|---|
| 4941 | + border-color: #31708f; |
|---|
| 4942 | +} |
|---|
| 4943 | +.list-group-item-warning { |
|---|
| 4944 | + color: #8a6d3b; |
|---|
| 4945 | + background-color: #fcf8e3; |
|---|
| 4946 | +} |
|---|
| 4947 | +a.list-group-item-warning { |
|---|
| 4948 | + color: #8a6d3b; |
|---|
| 4949 | +} |
|---|
| 4950 | +a.list-group-item-warning .list-group-item-heading { |
|---|
| 4951 | + color: inherit; |
|---|
| 4952 | +} |
|---|
| 4953 | +a.list-group-item-warning:hover, |
|---|
| 4954 | +a.list-group-item-warning:focus { |
|---|
| 4955 | + color: #8a6d3b; |
|---|
| 4956 | + background-color: #faf2cc; |
|---|
| 4957 | +} |
|---|
| 4958 | +a.list-group-item-warning.active, |
|---|
| 4959 | +a.list-group-item-warning.active:hover, |
|---|
| 4960 | +a.list-group-item-warning.active:focus { |
|---|
| 4961 | + color: #fff; |
|---|
| 4962 | + background-color: #8a6d3b; |
|---|
| 4963 | + border-color: #8a6d3b; |
|---|
| 4964 | +} |
|---|
| 4965 | +.list-group-item-danger { |
|---|
| 4966 | + color: #a94442; |
|---|
| 4967 | + background-color: #f2dede; |
|---|
| 4968 | +} |
|---|
| 4969 | +a.list-group-item-danger { |
|---|
| 4970 | + color: #a94442; |
|---|
| 4971 | +} |
|---|
| 4972 | +a.list-group-item-danger .list-group-item-heading { |
|---|
| 4973 | + color: inherit; |
|---|
| 4974 | +} |
|---|
| 4975 | +a.list-group-item-danger:hover, |
|---|
| 4976 | +a.list-group-item-danger:focus { |
|---|
| 4977 | + color: #a94442; |
|---|
| 4978 | + background-color: #ebcccc; |
|---|
| 4979 | +} |
|---|
| 4980 | +a.list-group-item-danger.active, |
|---|
| 4981 | +a.list-group-item-danger.active:hover, |
|---|
| 4982 | +a.list-group-item-danger.active:focus { |
|---|
| 4983 | + color: #fff; |
|---|
| 4984 | + background-color: #a94442; |
|---|
| 4985 | + border-color: #a94442; |
|---|
| 4986 | +} |
|---|
| 4987 | +.list-group-item-heading { |
|---|
| 4988 | + margin-top: 0; |
|---|
| 4989 | + margin-bottom: 5px; |
|---|
| 4990 | +} |
|---|
| 4991 | +.list-group-item-text { |
|---|
| 4992 | + margin-bottom: 0; |
|---|
| 4993 | + line-height: 1.3; |
|---|
| 4994 | +} |
|---|
| 4995 | +.panel { |
|---|
| 4996 | + margin-bottom: 20px; |
|---|
| 4997 | + background-color: #fff; |
|---|
| 4998 | + border: 1px solid transparent; |
|---|
| 4999 | + border-radius: 4px; |
|---|
| 5000 | + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); |
|---|
| 5001 | + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); |
|---|
| 5002 | +} |
|---|
| 5003 | +.panel-body { |
|---|
| 5004 | + padding: 15px; |
|---|
| 5005 | +} |
|---|
| 5006 | +.panel-heading { |
|---|
| 5007 | + padding: 10px 15px; |
|---|
| 5008 | + border-bottom: 1px solid transparent; |
|---|
| 5009 | + border-top-left-radius: 3px; |
|---|
| 5010 | + border-top-right-radius: 3px; |
|---|
| 5011 | +} |
|---|
| 5012 | +.panel-heading > .dropdown .dropdown-toggle { |
|---|
| 5013 | + color: inherit; |
|---|
| 5014 | +} |
|---|
| 5015 | +.panel-title { |
|---|
| 5016 | + margin-top: 0; |
|---|
| 5017 | + margin-bottom: 0; |
|---|
| 5018 | + font-size: 16px; |
|---|
| 5019 | + color: inherit; |
|---|
| 5020 | +} |
|---|
| 5021 | +.panel-title > a { |
|---|
| 5022 | + color: inherit; |
|---|
| 5023 | +} |
|---|
| 5024 | +.panel-footer { |
|---|
| 5025 | + padding: 10px 15px; |
|---|
| 5026 | + background-color: #f5f5f5; |
|---|
| 5027 | + border-top: 1px solid #ddd; |
|---|
| 5028 | + border-bottom-right-radius: 3px; |
|---|
| 5029 | + border-bottom-left-radius: 3px; |
|---|
| 5030 | +} |
|---|
| 5031 | +.panel > .list-group { |
|---|
| 5032 | + margin-bottom: 0; |
|---|
| 5033 | +} |
|---|
| 5034 | +.panel > .list-group .list-group-item { |
|---|
| 5035 | + border-width: 1px 0; |
|---|
| 5036 | + border-radius: 0; |
|---|
| 5037 | +} |
|---|
| 5038 | +.panel > .list-group:first-child .list-group-item:first-child { |
|---|
| 5039 | + border-top: 0; |
|---|
| 5040 | + border-top-left-radius: 3px; |
|---|
| 5041 | + border-top-right-radius: 3px; |
|---|
| 5042 | +} |
|---|
| 5043 | +.panel > .list-group:last-child .list-group-item:last-child { |
|---|
| 5044 | + border-bottom: 0; |
|---|
| 5045 | + border-bottom-right-radius: 3px; |
|---|
| 5046 | + border-bottom-left-radius: 3px; |
|---|
| 5047 | +} |
|---|
| 5048 | +.panel-heading + .list-group .list-group-item:first-child { |
|---|
| 5049 | + border-top-width: 0; |
|---|
| 5050 | +} |
|---|
| 5051 | +.list-group + .panel-footer { |
|---|
| 5052 | + border-top-width: 0; |
|---|
| 5053 | +} |
|---|
| 5054 | +.panel > .table, |
|---|
| 5055 | +.panel > .table-responsive > .table, |
|---|
| 5056 | +.panel > .panel-collapse > .table { |
|---|
| 5057 | + margin-bottom: 0; |
|---|
| 5058 | +} |
|---|
| 5059 | +.panel > .table:first-child, |
|---|
| 5060 | +.panel > .table-responsive:first-child > .table:first-child { |
|---|
| 5061 | + border-top-left-radius: 3px; |
|---|
| 5062 | + border-top-right-radius: 3px; |
|---|
| 5063 | +} |
|---|
| 5064 | +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, |
|---|
| 5065 | +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, |
|---|
| 5066 | +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, |
|---|
| 5067 | +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, |
|---|
| 5068 | +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, |
|---|
| 5069 | +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, |
|---|
| 5070 | +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, |
|---|
| 5071 | +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { |
|---|
| 5072 | + border-top-left-radius: 3px; |
|---|
| 5073 | +} |
|---|
| 5074 | +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, |
|---|
| 5075 | +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, |
|---|
| 5076 | +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, |
|---|
| 5077 | +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, |
|---|
| 5078 | +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, |
|---|
| 5079 | +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, |
|---|
| 5080 | +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, |
|---|
| 5081 | +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { |
|---|
| 5082 | + border-top-right-radius: 3px; |
|---|
| 5083 | +} |
|---|
| 5084 | +.panel > .table:last-child, |
|---|
| 5085 | +.panel > .table-responsive:last-child > .table:last-child { |
|---|
| 5086 | + border-bottom-right-radius: 3px; |
|---|
| 5087 | + border-bottom-left-radius: 3px; |
|---|
| 5088 | +} |
|---|
| 5089 | +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, |
|---|
| 5090 | +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, |
|---|
| 5091 | +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, |
|---|
| 5092 | +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, |
|---|
| 5093 | +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, |
|---|
| 5094 | +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, |
|---|
| 5095 | +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, |
|---|
| 5096 | +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { |
|---|
| 5097 | + border-bottom-left-radius: 3px; |
|---|
| 5098 | +} |
|---|
| 5099 | +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, |
|---|
| 5100 | +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, |
|---|
| 5101 | +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, |
|---|
| 5102 | +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, |
|---|
| 5103 | +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, |
|---|
| 5104 | +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, |
|---|
| 5105 | +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, |
|---|
| 5106 | +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { |
|---|
| 5107 | + border-bottom-right-radius: 3px; |
|---|
| 5108 | +} |
|---|
| 5109 | +.panel > .panel-body + .table, |
|---|
| 5110 | +.panel > .panel-body + .table-responsive { |
|---|
| 5111 | + border-top: 1px solid #ddd; |
|---|
| 5112 | +} |
|---|
| 5113 | +.panel > .table > tbody:first-child > tr:first-child th, |
|---|
| 5114 | +.panel > .table > tbody:first-child > tr:first-child td { |
|---|
| 5115 | + border-top: 0; |
|---|
| 5116 | +} |
|---|
| 5117 | +.panel > .table-bordered, |
|---|
| 5118 | +.panel > .table-responsive > .table-bordered { |
|---|
| 5119 | + border: 0; |
|---|
| 5120 | +} |
|---|
| 5121 | +.panel > .table-bordered > thead > tr > th:first-child, |
|---|
| 5122 | +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, |
|---|
| 5123 | +.panel > .table-bordered > tbody > tr > th:first-child, |
|---|
| 5124 | +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, |
|---|
| 5125 | +.panel > .table-bordered > tfoot > tr > th:first-child, |
|---|
| 5126 | +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, |
|---|
| 5127 | +.panel > .table-bordered > thead > tr > td:first-child, |
|---|
| 5128 | +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, |
|---|
| 5129 | +.panel > .table-bordered > tbody > tr > td:first-child, |
|---|
| 5130 | +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, |
|---|
| 5131 | +.panel > .table-bordered > tfoot > tr > td:first-child, |
|---|
| 5132 | +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { |
|---|
| 5133 | + border-left: 0; |
|---|
| 5134 | +} |
|---|
| 5135 | +.panel > .table-bordered > thead > tr > th:last-child, |
|---|
| 5136 | +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, |
|---|
| 5137 | +.panel > .table-bordered > tbody > tr > th:last-child, |
|---|
| 5138 | +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, |
|---|
| 5139 | +.panel > .table-bordered > tfoot > tr > th:last-child, |
|---|
| 5140 | +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, |
|---|
| 5141 | +.panel > .table-bordered > thead > tr > td:last-child, |
|---|
| 5142 | +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, |
|---|
| 5143 | +.panel > .table-bordered > tbody > tr > td:last-child, |
|---|
| 5144 | +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, |
|---|
| 5145 | +.panel > .table-bordered > tfoot > tr > td:last-child, |
|---|
| 5146 | +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { |
|---|
| 5147 | + border-right: 0; |
|---|
| 5148 | +} |
|---|
| 5149 | +.panel > .table-bordered > thead > tr:first-child > td, |
|---|
| 5150 | +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, |
|---|
| 5151 | +.panel > .table-bordered > tbody > tr:first-child > td, |
|---|
| 5152 | +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, |
|---|
| 5153 | +.panel > .table-bordered > thead > tr:first-child > th, |
|---|
| 5154 | +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, |
|---|
| 5155 | +.panel > .table-bordered > tbody > tr:first-child > th, |
|---|
| 5156 | +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { |
|---|
| 5157 | + border-bottom: 0; |
|---|
| 5158 | +} |
|---|
| 5159 | +.panel > .table-bordered > tbody > tr:last-child > td, |
|---|
| 5160 | +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, |
|---|
| 5161 | +.panel > .table-bordered > tfoot > tr:last-child > td, |
|---|
| 5162 | +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, |
|---|
| 5163 | +.panel > .table-bordered > tbody > tr:last-child > th, |
|---|
| 5164 | +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, |
|---|
| 5165 | +.panel > .table-bordered > tfoot > tr:last-child > th, |
|---|
| 5166 | +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { |
|---|
| 5167 | + border-bottom: 0; |
|---|
| 5168 | +} |
|---|
| 5169 | +.panel > .table-responsive { |
|---|
| 5170 | + margin-bottom: 0; |
|---|
| 5171 | + border: 0; |
|---|
| 5172 | +} |
|---|
| 5173 | +.panel-group { |
|---|
| 5174 | + margin-bottom: 20px; |
|---|
| 5175 | +} |
|---|
| 5176 | +.panel-group .panel { |
|---|
| 5177 | + margin-bottom: 0; |
|---|
| 5178 | + border-radius: 4px; |
|---|
| 5179 | +} |
|---|
| 5180 | +.panel-group .panel + .panel { |
|---|
| 5181 | + margin-top: 5px; |
|---|
| 5182 | +} |
|---|
| 5183 | +.panel-group .panel-heading { |
|---|
| 5184 | + border-bottom: 0; |
|---|
| 5185 | +} |
|---|
| 5186 | +.panel-group .panel-heading + .panel-collapse > .panel-body { |
|---|
| 5187 | + border-top: 1px solid #ddd; |
|---|
| 5188 | +} |
|---|
| 5189 | +.panel-group .panel-footer { |
|---|
| 5190 | + border-top: 0; |
|---|
| 5191 | +} |
|---|
| 5192 | +.panel-group .panel-footer + .panel-collapse .panel-body { |
|---|
| 5193 | + border-bottom: 1px solid #ddd; |
|---|
| 5194 | +} |
|---|
| 5195 | +.panel-default { |
|---|
| 5196 | + border-color: #ddd; |
|---|
| 5197 | +} |
|---|
| 5198 | +.panel-default > .panel-heading { |
|---|
| 5199 | + color: #333; |
|---|
| 5200 | + background-color: #f5f5f5; |
|---|
| 5201 | + border-color: #ddd; |
|---|
| 5202 | +} |
|---|
| 5203 | +.panel-default > .panel-heading + .panel-collapse > .panel-body { |
|---|
| 5204 | + border-top-color: #ddd; |
|---|
| 5205 | +} |
|---|
| 5206 | +.panel-default > .panel-heading .badge { |
|---|
| 5207 | + color: #f5f5f5; |
|---|
| 5208 | + background-color: #333; |
|---|
| 5209 | +} |
|---|
| 5210 | +.panel-default > .panel-footer + .panel-collapse > .panel-body { |
|---|
| 5211 | + border-bottom-color: #ddd; |
|---|
| 5212 | +} |
|---|
| 5213 | +.panel-primary { |
|---|
| 5214 | + border-color: #428bca; |
|---|
| 5215 | +} |
|---|
| 5216 | +.panel-primary > .panel-heading { |
|---|
| 5217 | + color: #fff; |
|---|
| 5218 | + background-color: #428bca; |
|---|
| 5219 | + border-color: #428bca; |
|---|
| 5220 | +} |
|---|
| 5221 | +.panel-primary > .panel-heading + .panel-collapse > .panel-body { |
|---|
| 5222 | + border-top-color: #428bca; |
|---|
| 5223 | +} |
|---|
| 5224 | +.panel-primary > .panel-heading .badge { |
|---|
| 5225 | + color: #428bca; |
|---|
| 5226 | + background-color: #fff; |
|---|
| 5227 | +} |
|---|
| 5228 | +.panel-primary > .panel-footer + .panel-collapse > .panel-body { |
|---|
| 5229 | + border-bottom-color: #428bca; |
|---|
| 5230 | +} |
|---|
| 5231 | +.panel-success { |
|---|
| 5232 | + border-color: #d6e9c6; |
|---|
| 5233 | +} |
|---|
| 5234 | +.panel-success > .panel-heading { |
|---|
| 5235 | + color: #3c763d; |
|---|
| 5236 | + background-color: #dff0d8; |
|---|
| 5237 | + border-color: #d6e9c6; |
|---|
| 5238 | +} |
|---|
| 5239 | +.panel-success > .panel-heading + .panel-collapse > .panel-body { |
|---|
| 5240 | + border-top-color: #d6e9c6; |
|---|
| 5241 | +} |
|---|
| 5242 | +.panel-success > .panel-heading .badge { |
|---|
| 5243 | + color: #dff0d8; |
|---|
| 5244 | + background-color: #3c763d; |
|---|
| 5245 | +} |
|---|
| 5246 | +.panel-success > .panel-footer + .panel-collapse > .panel-body { |
|---|
| 5247 | + border-bottom-color: #d6e9c6; |
|---|
| 5248 | +} |
|---|
| 5249 | +.panel-info { |
|---|
| 5250 | + border-color: #bce8f1; |
|---|
| 5251 | +} |
|---|
| 5252 | +.panel-info > .panel-heading { |
|---|
| 5253 | + color: #31708f; |
|---|
| 5254 | + background-color: #d9edf7; |
|---|
| 5255 | + border-color: #bce8f1; |
|---|
| 5256 | +} |
|---|
| 5257 | +.panel-info > .panel-heading + .panel-collapse > .panel-body { |
|---|
| 5258 | + border-top-color: #bce8f1; |
|---|
| 5259 | +} |
|---|
| 5260 | +.panel-info > .panel-heading .badge { |
|---|
| 5261 | + color: #d9edf7; |
|---|
| 5262 | + background-color: #31708f; |
|---|
| 5263 | +} |
|---|
| 5264 | +.panel-info > .panel-footer + .panel-collapse > .panel-body { |
|---|
| 5265 | + border-bottom-color: #bce8f1; |
|---|
| 5266 | +} |
|---|
| 5267 | +.panel-warning { |
|---|
| 5268 | + border-color: #faebcc; |
|---|
| 5269 | +} |
|---|
| 5270 | +.panel-warning > .panel-heading { |
|---|
| 5271 | + color: #8a6d3b; |
|---|
| 5272 | + background-color: #fcf8e3; |
|---|
| 5273 | + border-color: #faebcc; |
|---|
| 5274 | +} |
|---|
| 5275 | +.panel-warning > .panel-heading + .panel-collapse > .panel-body { |
|---|
| 5276 | + border-top-color: #faebcc; |
|---|
| 5277 | +} |
|---|
| 5278 | +.panel-warning > .panel-heading .badge { |
|---|
| 5279 | + color: #fcf8e3; |
|---|
| 5280 | + background-color: #8a6d3b; |
|---|
| 5281 | +} |
|---|
| 5282 | +.panel-warning > .panel-footer + .panel-collapse > .panel-body { |
|---|
| 5283 | + border-bottom-color: #faebcc; |
|---|
| 5284 | +} |
|---|
| 5285 | +.panel-danger { |
|---|
| 5286 | + border-color: #ebccd1; |
|---|
| 5287 | +} |
|---|
| 5288 | +.panel-danger > .panel-heading { |
|---|
| 5289 | + color: #a94442; |
|---|
| 5290 | + background-color: #f2dede; |
|---|
| 5291 | + border-color: #ebccd1; |
|---|
| 5292 | +} |
|---|
| 5293 | +.panel-danger > .panel-heading + .panel-collapse > .panel-body { |
|---|
| 5294 | + border-top-color: #ebccd1; |
|---|
| 5295 | +} |
|---|
| 5296 | +.panel-danger > .panel-heading .badge { |
|---|
| 5297 | + color: #f2dede; |
|---|
| 5298 | + background-color: #a94442; |
|---|
| 5299 | +} |
|---|
| 5300 | +.panel-danger > .panel-footer + .panel-collapse > .panel-body { |
|---|
| 5301 | + border-bottom-color: #ebccd1; |
|---|
| 5302 | +} |
|---|
| 5303 | +.embed-responsive { |
|---|
| 5304 | + position: relative; |
|---|
| 5305 | + display: block; |
|---|
| 5306 | + height: 0; |
|---|
| 5307 | + padding: 0; |
|---|
| 5308 | + overflow: hidden; |
|---|
| 5309 | +} |
|---|
| 5310 | +.embed-responsive .embed-responsive-item, |
|---|
| 5311 | +.embed-responsive iframe, |
|---|
| 5312 | +.embed-responsive embed, |
|---|
| 5313 | +.embed-responsive object { |
|---|
| 5314 | + position: absolute; |
|---|
| 5315 | + top: 0; |
|---|
| 5316 | + bottom: 0; |
|---|
| 5317 | + left: 0; |
|---|
| 5318 | + width: 100%; |
|---|
| 5319 | + height: 100%; |
|---|
| 5320 | + border: 0; |
|---|
| 5321 | +} |
|---|
| 5322 | +.embed-responsive.embed-responsive-16by9 { |
|---|
| 5323 | + padding-bottom: 56.25%; |
|---|
| 5324 | +} |
|---|
| 5325 | +.embed-responsive.embed-responsive-4by3 { |
|---|
| 5326 | + padding-bottom: 75%; |
|---|
| 5327 | +} |
|---|
| 5328 | +.well { |
|---|
| 5329 | + min-height: 20px; |
|---|
| 5330 | + padding: 19px; |
|---|
| 5331 | + margin-bottom: 20px; |
|---|
| 5332 | + background-color: #f5f5f5; |
|---|
| 5333 | + border: 1px solid #e3e3e3; |
|---|
| 5334 | + border-radius: 4px; |
|---|
| 5335 | + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); |
|---|
| 5336 | + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); |
|---|
| 5337 | +} |
|---|
| 5338 | +.well blockquote { |
|---|
| 5339 | + border-color: #ddd; |
|---|
| 5340 | + border-color: rgba(0, 0, 0, .15); |
|---|
| 5341 | +} |
|---|
| 5342 | +.well-lg { |
|---|
| 5343 | + padding: 24px; |
|---|
| 5344 | + border-radius: 6px; |
|---|
| 5345 | +} |
|---|
| 5346 | +.well-sm { |
|---|
| 5347 | + padding: 9px; |
|---|
| 5348 | + border-radius: 3px; |
|---|
| 5349 | +} |
|---|
| 5350 | +.close { |
|---|
| 5351 | + float: right; |
|---|
| 5352 | + font-size: 21px; |
|---|
| 5353 | + font-weight: bold; |
|---|
| 5354 | + line-height: 1; |
|---|
| 5355 | + color: #000; |
|---|
| 5356 | + text-shadow: 0 1px 0 #fff; |
|---|
| 5357 | + filter: alpha(opacity=20); |
|---|
| 5358 | + opacity: .2; |
|---|
| 5359 | +} |
|---|
| 5360 | +.close:hover, |
|---|
| 5361 | +.close:focus { |
|---|
| 5362 | + color: #000; |
|---|
| 5363 | + text-decoration: none; |
|---|
| 5364 | + cursor: pointer; |
|---|
| 5365 | + filter: alpha(opacity=50); |
|---|
| 5366 | + opacity: .5; |
|---|
| 5367 | +} |
|---|
| 5368 | +button.close { |
|---|
| 5369 | + -webkit-appearance: none; |
|---|
| 5370 | + padding: 0; |
|---|
| 5371 | + cursor: pointer; |
|---|
| 5372 | + background: transparent; |
|---|
| 5373 | + border: 0; |
|---|
| 5374 | +} |
|---|
| 5375 | +.modal-open { |
|---|
| 5376 | + overflow: hidden; |
|---|
| 5377 | +} |
|---|
| 5378 | +.modal { |
|---|
| 5379 | + position: fixed; |
|---|
| 5380 | + top: 0; |
|---|
| 5381 | + right: 0; |
|---|
| 5382 | + bottom: 0; |
|---|
| 5383 | + left: 0; |
|---|
| 5384 | + z-index: 1050; |
|---|
| 5385 | + display: none; |
|---|
| 5386 | + overflow: hidden; |
|---|
| 5387 | + -webkit-overflow-scrolling: touch; |
|---|
| 5388 | + outline: 0; |
|---|
| 5389 | +} |
|---|
| 5390 | +.modal.fade .modal-dialog { |
|---|
| 5391 | + -webkit-transition: -webkit-transform .3s ease-out; |
|---|
| 5392 | + -o-transition: -o-transform .3s ease-out; |
|---|
| 5393 | + transition: transform .3s ease-out; |
|---|
| 5394 | + -webkit-transform: translate3d(0, -25%, 0); |
|---|
| 5395 | + -o-transform: translate3d(0, -25%, 0); |
|---|
| 5396 | + transform: translate3d(0, -25%, 0); |
|---|
| 5397 | +} |
|---|
| 5398 | +.modal.in .modal-dialog { |
|---|
| 5399 | + -webkit-transform: translate3d(0, 0, 0); |
|---|
| 5400 | + -o-transform: translate3d(0, 0, 0); |
|---|
| 5401 | + transform: translate3d(0, 0, 0); |
|---|
| 5402 | +} |
|---|
| 5403 | +.modal-open .modal { |
|---|
| 5404 | + overflow-x: hidden; |
|---|
| 5405 | + overflow-y: auto; |
|---|
| 5406 | +} |
|---|
| 5407 | +.modal-dialog { |
|---|
| 5408 | + position: relative; |
|---|
| 5409 | + width: auto; |
|---|
| 5410 | + margin: 10px; |
|---|
| 5411 | +} |
|---|
| 5412 | +.modal-content { |
|---|
| 5413 | + position: relative; |
|---|
| 5414 | + background-color: #fff; |
|---|
| 5415 | + -webkit-background-clip: padding-box; |
|---|
| 5416 | + background-clip: padding-box; |
|---|
| 5417 | + border: 1px solid #999; |
|---|
| 5418 | + border: 1px solid rgba(0, 0, 0, .2); |
|---|
| 5419 | + border-radius: 6px; |
|---|
| 5420 | + outline: 0; |
|---|
| 5421 | + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); |
|---|
| 5422 | + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); |
|---|
| 5423 | +} |
|---|
| 5424 | +.modal-backdrop { |
|---|
| 5425 | + position: fixed; |
|---|
| 5426 | + top: 0; |
|---|
| 5427 | + right: 0; |
|---|
| 5428 | + bottom: 0; |
|---|
| 5429 | + left: 0; |
|---|
| 5430 | + z-index: 1040; |
|---|
| 5431 | + background-color: #000; |
|---|
| 5432 | +} |
|---|
| 5433 | +.modal-backdrop.fade { |
|---|
| 5434 | + filter: alpha(opacity=0); |
|---|
| 5435 | + opacity: 0; |
|---|
| 5436 | +} |
|---|
| 5437 | +.modal-backdrop.in { |
|---|
| 5438 | + filter: alpha(opacity=50); |
|---|
| 5439 | + opacity: .5; |
|---|
| 5440 | +} |
|---|
| 5441 | +.modal-header { |
|---|
| 5442 | + min-height: 16.42857143px; |
|---|
| 5443 | + padding: 15px; |
|---|
| 5444 | + border-bottom: 1px solid #e5e5e5; |
|---|
| 5445 | +} |
|---|
| 5446 | +.modal-header .close { |
|---|
| 5447 | + margin-top: -2px; |
|---|
| 5448 | +} |
|---|
| 5449 | +.modal-title { |
|---|
| 5450 | + margin: 0; |
|---|
| 5451 | + line-height: 1.42857143; |
|---|
| 5452 | +} |
|---|
| 5453 | +.modal-body { |
|---|
| 5454 | + position: relative; |
|---|
| 5455 | + padding: 15px; |
|---|
| 5456 | +} |
|---|
| 5457 | +.modal-footer { |
|---|
| 5458 | + padding: 15px; |
|---|
| 5459 | + text-align: right; |
|---|
| 5460 | + border-top: 1px solid #e5e5e5; |
|---|
| 5461 | +} |
|---|
| 5462 | +.modal-footer .btn + .btn { |
|---|
| 5463 | + margin-bottom: 0; |
|---|
| 5464 | + margin-left: 5px; |
|---|
| 5465 | +} |
|---|
| 5466 | +.modal-footer .btn-group .btn + .btn { |
|---|
| 5467 | + margin-left: -1px; |
|---|
| 5468 | +} |
|---|
| 5469 | +.modal-footer .btn-block + .btn-block { |
|---|
| 5470 | + margin-left: 0; |
|---|
| 5471 | +} |
|---|
| 5472 | +.modal-scrollbar-measure { |
|---|
| 5473 | + position: absolute; |
|---|
| 5474 | + top: -9999px; |
|---|
| 5475 | + width: 50px; |
|---|
| 5476 | + height: 50px; |
|---|
| 5477 | + overflow: scroll; |
|---|
| 5478 | +} |
|---|
| 5479 | +@media (min-width: 768px) { |
|---|
| 5480 | + .modal-dialog { |
|---|
| 5481 | + width: 600px; |
|---|
| 5482 | + margin: 30px auto; |
|---|
| 5483 | + } |
|---|
| 5484 | + .modal-content { |
|---|
| 5485 | + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); |
|---|
| 5486 | + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); |
|---|
| 5487 | + } |
|---|
| 5488 | + .modal-sm { |
|---|
| 5489 | + width: 300px; |
|---|
| 5490 | + } |
|---|
| 5491 | +} |
|---|
| 5492 | +@media (min-width: 992px) { |
|---|
| 5493 | + .modal-lg { |
|---|
| 5494 | + width: 900px; |
|---|
| 5495 | + } |
|---|
| 5496 | +} |
|---|
| 5497 | +.tooltip { |
|---|
| 5498 | + position: absolute; |
|---|
| 5499 | + z-index: 1070; |
|---|
| 5500 | + display: block; |
|---|
| 5501 | + font-size: 12px; |
|---|
| 5502 | + line-height: 1.4; |
|---|
| 5503 | + visibility: visible; |
|---|
| 5504 | + filter: alpha(opacity=0); |
|---|
| 5505 | + opacity: 0; |
|---|
| 5506 | +} |
|---|
| 5507 | +.tooltip.in { |
|---|
| 5508 | + filter: alpha(opacity=90); |
|---|
| 5509 | + opacity: .9; |
|---|
| 5510 | +} |
|---|
| 5511 | +.tooltip.top { |
|---|
| 5512 | + padding: 5px 0; |
|---|
| 5513 | + margin-top: -3px; |
|---|
| 5514 | +} |
|---|
| 5515 | +.tooltip.right { |
|---|
| 5516 | + padding: 0 5px; |
|---|
| 5517 | + margin-left: 3px; |
|---|
| 5518 | +} |
|---|
| 5519 | +.tooltip.bottom { |
|---|
| 5520 | + padding: 5px 0; |
|---|
| 5521 | + margin-top: 3px; |
|---|
| 5522 | +} |
|---|
| 5523 | +.tooltip.left { |
|---|
| 5524 | + padding: 0 5px; |
|---|
| 5525 | + margin-left: -3px; |
|---|
| 5526 | +} |
|---|
| 5527 | +.tooltip-inner { |
|---|
| 5528 | + max-width: 200px; |
|---|
| 5529 | + padding: 3px 8px; |
|---|
| 5530 | + color: #fff; |
|---|
| 5531 | + text-align: center; |
|---|
| 5532 | + text-decoration: none; |
|---|
| 5533 | + background-color: #000; |
|---|
| 5534 | + border-radius: 4px; |
|---|
| 5535 | +} |
|---|
| 5536 | +.tooltip-arrow { |
|---|
| 5537 | + position: absolute; |
|---|
| 5538 | + width: 0; |
|---|
| 5539 | + height: 0; |
|---|
| 5540 | + border-color: transparent; |
|---|
| 5541 | + border-style: solid; |
|---|
| 5542 | +} |
|---|
| 5543 | +.tooltip.top .tooltip-arrow { |
|---|
| 5544 | + bottom: 0; |
|---|
| 5545 | + left: 50%; |
|---|
| 5546 | + margin-left: -5px; |
|---|
| 5547 | + border-width: 5px 5px 0; |
|---|
| 5548 | + border-top-color: #000; |
|---|
| 5549 | +} |
|---|
| 5550 | +.tooltip.top-left .tooltip-arrow { |
|---|
| 5551 | + bottom: 0; |
|---|
| 5552 | + left: 5px; |
|---|
| 5553 | + border-width: 5px 5px 0; |
|---|
| 5554 | + border-top-color: #000; |
|---|
| 5555 | +} |
|---|
| 5556 | +.tooltip.top-right .tooltip-arrow { |
|---|
| 5557 | + right: 5px; |
|---|
| 5558 | + bottom: 0; |
|---|
| 5559 | + border-width: 5px 5px 0; |
|---|
| 5560 | + border-top-color: #000; |
|---|
| 5561 | +} |
|---|
| 5562 | +.tooltip.right .tooltip-arrow { |
|---|
| 5563 | + top: 50%; |
|---|
| 5564 | + left: 0; |
|---|
| 5565 | + margin-top: -5px; |
|---|
| 5566 | + border-width: 5px 5px 5px 0; |
|---|
| 5567 | + border-right-color: #000; |
|---|
| 5568 | +} |
|---|
| 5569 | +.tooltip.left .tooltip-arrow { |
|---|
| 5570 | + top: 50%; |
|---|
| 5571 | + right: 0; |
|---|
| 5572 | + margin-top: -5px; |
|---|
| 5573 | + border-width: 5px 0 5px 5px; |
|---|
| 5574 | + border-left-color: #000; |
|---|
| 5575 | +} |
|---|
| 5576 | +.tooltip.bottom .tooltip-arrow { |
|---|
| 5577 | + top: 0; |
|---|
| 5578 | + left: 50%; |
|---|
| 5579 | + margin-left: -5px; |
|---|
| 5580 | + border-width: 0 5px 5px; |
|---|
| 5581 | + border-bottom-color: #000; |
|---|
| 5582 | +} |
|---|
| 5583 | +.tooltip.bottom-left .tooltip-arrow { |
|---|
| 5584 | + top: 0; |
|---|
| 5585 | + left: 5px; |
|---|
| 5586 | + border-width: 0 5px 5px; |
|---|
| 5587 | + border-bottom-color: #000; |
|---|
| 5588 | +} |
|---|
| 5589 | +.tooltip.bottom-right .tooltip-arrow { |
|---|
| 5590 | + top: 0; |
|---|
| 5591 | + right: 5px; |
|---|
| 5592 | + border-width: 0 5px 5px; |
|---|
| 5593 | + border-bottom-color: #000; |
|---|
| 5594 | +} |
|---|
| 5595 | +.popover { |
|---|
| 5596 | + position: absolute; |
|---|
| 5597 | + top: 0; |
|---|
| 5598 | + left: 0; |
|---|
| 5599 | + z-index: 1060; |
|---|
| 5600 | + display: none; |
|---|
| 5601 | + max-width: 276px; |
|---|
| 5602 | + padding: 1px; |
|---|
| 5603 | + text-align: left; |
|---|
| 5604 | + white-space: normal; |
|---|
| 5605 | + background-color: #fff; |
|---|
| 5606 | + -webkit-background-clip: padding-box; |
|---|
| 5607 | + background-clip: padding-box; |
|---|
| 5608 | + border: 1px solid #ccc; |
|---|
| 5609 | + border: 1px solid rgba(0, 0, 0, .2); |
|---|
| 5610 | + border-radius: 6px; |
|---|
| 5611 | + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); |
|---|
| 5612 | + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); |
|---|
| 5613 | +} |
|---|
| 5614 | +.popover.top { |
|---|
| 5615 | + margin-top: -10px; |
|---|
| 5616 | +} |
|---|
| 5617 | +.popover.right { |
|---|
| 5618 | + margin-left: 10px; |
|---|
| 5619 | +} |
|---|
| 5620 | +.popover.bottom { |
|---|
| 5621 | + margin-top: 10px; |
|---|
| 5622 | +} |
|---|
| 5623 | +.popover.left { |
|---|
| 5624 | + margin-left: -10px; |
|---|
| 5625 | +} |
|---|
| 5626 | +.popover-title { |
|---|
| 5627 | + padding: 8px 14px; |
|---|
| 5628 | + margin: 0; |
|---|
| 5629 | + font-size: 14px; |
|---|
| 5630 | + font-weight: normal; |
|---|
| 5631 | + line-height: 18px; |
|---|
| 5632 | + background-color: #f7f7f7; |
|---|
| 5633 | + border-bottom: 1px solid #ebebeb; |
|---|
| 5634 | + border-radius: 5px 5px 0 0; |
|---|
| 5635 | +} |
|---|
| 5636 | +.popover-content { |
|---|
| 5637 | + padding: 9px 14px; |
|---|
| 5638 | +} |
|---|
| 5639 | +.popover > .arrow, |
|---|
| 5640 | +.popover > .arrow:after { |
|---|
| 5641 | + position: absolute; |
|---|
| 5642 | + display: block; |
|---|
| 5643 | + width: 0; |
|---|
| 5644 | + height: 0; |
|---|
| 5645 | + border-color: transparent; |
|---|
| 5646 | + border-style: solid; |
|---|
| 5647 | +} |
|---|
| 5648 | +.popover > .arrow { |
|---|
| 5649 | + border-width: 11px; |
|---|
| 5650 | +} |
|---|
| 5651 | +.popover > .arrow:after { |
|---|
| 5652 | + content: ""; |
|---|
| 5653 | + border-width: 10px; |
|---|
| 5654 | +} |
|---|
| 5655 | +.popover.top > .arrow { |
|---|
| 5656 | + bottom: -11px; |
|---|
| 5657 | + left: 50%; |
|---|
| 5658 | + margin-left: -11px; |
|---|
| 5659 | + border-top-color: #999; |
|---|
| 5660 | + border-top-color: rgba(0, 0, 0, .25); |
|---|
| 5661 | + border-bottom-width: 0; |
|---|
| 5662 | +} |
|---|
| 5663 | +.popover.top > .arrow:after { |
|---|
| 5664 | + bottom: 1px; |
|---|
| 5665 | + margin-left: -10px; |
|---|
| 5666 | + content: " "; |
|---|
| 5667 | + border-top-color: #fff; |
|---|
| 5668 | + border-bottom-width: 0; |
|---|
| 5669 | +} |
|---|
| 5670 | +.popover.right > .arrow { |
|---|
| 5671 | + top: 50%; |
|---|
| 5672 | + left: -11px; |
|---|
| 5673 | + margin-top: -11px; |
|---|
| 5674 | + border-right-color: #999; |
|---|
| 5675 | + border-right-color: rgba(0, 0, 0, .25); |
|---|
| 5676 | + border-left-width: 0; |
|---|
| 5677 | +} |
|---|
| 5678 | +.popover.right > .arrow:after { |
|---|
| 5679 | + bottom: -10px; |
|---|
| 5680 | + left: 1px; |
|---|
| 5681 | + content: " "; |
|---|
| 5682 | + border-right-color: #fff; |
|---|
| 5683 | + border-left-width: 0; |
|---|
| 5684 | +} |
|---|
| 5685 | +.popover.bottom > .arrow { |
|---|
| 5686 | + top: -11px; |
|---|
| 5687 | + left: 50%; |
|---|
| 5688 | + margin-left: -11px; |
|---|
| 5689 | + border-top-width: 0; |
|---|
| 5690 | + border-bottom-color: #999; |
|---|
| 5691 | + border-bottom-color: rgba(0, 0, 0, .25); |
|---|
| 5692 | +} |
|---|
| 5693 | +.popover.bottom > .arrow:after { |
|---|
| 5694 | + top: 1px; |
|---|
| 5695 | + margin-left: -10px; |
|---|
| 5696 | + content: " "; |
|---|
| 5697 | + border-top-width: 0; |
|---|
| 5698 | + border-bottom-color: #fff; |
|---|
| 5699 | +} |
|---|
| 5700 | +.popover.left > .arrow { |
|---|
| 5701 | + top: 50%; |
|---|
| 5702 | + right: -11px; |
|---|
| 5703 | + margin-top: -11px; |
|---|
| 5704 | + border-right-width: 0; |
|---|
| 5705 | + border-left-color: #999; |
|---|
| 5706 | + border-left-color: rgba(0, 0, 0, .25); |
|---|
| 5707 | +} |
|---|
| 5708 | +.popover.left > .arrow:after { |
|---|
| 5709 | + right: 1px; |
|---|
| 5710 | + bottom: -10px; |
|---|
| 5711 | + content: " "; |
|---|
| 5712 | + border-right-width: 0; |
|---|
| 5713 | + border-left-color: #fff; |
|---|
| 5714 | +} |
|---|
| 5715 | +.carousel { |
|---|
| 5716 | + position: relative; |
|---|
| 5717 | +} |
|---|
| 5718 | +.carousel-inner { |
|---|
| 5719 | + position: relative; |
|---|
| 5720 | + width: 100%; |
|---|
| 5721 | + overflow: hidden; |
|---|
| 5722 | +} |
|---|
| 5723 | +.carousel-inner > .item { |
|---|
| 5724 | + position: relative; |
|---|
| 5725 | + display: none; |
|---|
| 5726 | + -webkit-transition: .6s ease-in-out left; |
|---|
| 5727 | + -o-transition: .6s ease-in-out left; |
|---|
| 5728 | + transition: .6s ease-in-out left; |
|---|
| 5729 | +} |
|---|
| 5730 | +.carousel-inner > .item > img, |
|---|
| 5731 | +.carousel-inner > .item > a > img { |
|---|
| 5732 | + line-height: 1; |
|---|
| 5733 | +} |
|---|
| 5734 | +.carousel-inner > .active, |
|---|
| 5735 | +.carousel-inner > .next, |
|---|
| 5736 | +.carousel-inner > .prev { |
|---|
| 5737 | + display: block; |
|---|
| 5738 | +} |
|---|
| 5739 | +.carousel-inner > .active { |
|---|
| 5740 | + left: 0; |
|---|
| 5741 | +} |
|---|
| 5742 | +.carousel-inner > .next, |
|---|
| 5743 | +.carousel-inner > .prev { |
|---|
| 5744 | + position: absolute; |
|---|
| 5745 | + top: 0; |
|---|
| 5746 | + width: 100%; |
|---|
| 5747 | +} |
|---|
| 5748 | +.carousel-inner > .next { |
|---|
| 5749 | + left: 100%; |
|---|
| 5750 | +} |
|---|
| 5751 | +.carousel-inner > .prev { |
|---|
| 5752 | + left: -100%; |
|---|
| 5753 | +} |
|---|
| 5754 | +.carousel-inner > .next.left, |
|---|
| 5755 | +.carousel-inner > .prev.right { |
|---|
| 5756 | + left: 0; |
|---|
| 5757 | +} |
|---|
| 5758 | +.carousel-inner > .active.left { |
|---|
| 5759 | + left: -100%; |
|---|
| 5760 | +} |
|---|
| 5761 | +.carousel-inner > .active.right { |
|---|
| 5762 | + left: 100%; |
|---|
| 5763 | +} |
|---|
| 5764 | +.carousel-control { |
|---|
| 5765 | + position: absolute; |
|---|
| 5766 | + top: 0; |
|---|
| 5767 | + bottom: 0; |
|---|
| 5768 | + left: 0; |
|---|
| 5769 | + width: 15%; |
|---|
| 5770 | + font-size: 20px; |
|---|
| 5771 | + color: #fff; |
|---|
| 5772 | + text-align: center; |
|---|
| 5773 | + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); |
|---|
| 5774 | + filter: alpha(opacity=50); |
|---|
| 5775 | + opacity: .5; |
|---|
| 5776 | +} |
|---|
| 5777 | +.carousel-control.left { |
|---|
| 5778 | + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); |
|---|
| 5779 | + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); |
|---|
| 5780 | + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); |
|---|
| 5781 | + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); |
|---|
| 5782 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); |
|---|
| 5783 | + background-repeat: repeat-x; |
|---|
| 5784 | +} |
|---|
| 5785 | +.carousel-control.right { |
|---|
| 5786 | + right: 0; |
|---|
| 5787 | + left: auto; |
|---|
| 5788 | + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); |
|---|
| 5789 | + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); |
|---|
| 5790 | + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); |
|---|
| 5791 | + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); |
|---|
| 5792 | + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); |
|---|
| 5793 | + background-repeat: repeat-x; |
|---|
| 5794 | +} |
|---|
| 5795 | +.carousel-control:hover, |
|---|
| 5796 | +.carousel-control:focus { |
|---|
| 5797 | + color: #fff; |
|---|
| 5798 | + text-decoration: none; |
|---|
| 5799 | + filter: alpha(opacity=90); |
|---|
| 5800 | + outline: 0; |
|---|
| 5801 | + opacity: .9; |
|---|
| 5802 | +} |
|---|
| 5803 | +.carousel-control .icon-prev, |
|---|
| 5804 | +.carousel-control .icon-next, |
|---|
| 5805 | +.carousel-control .glyphicon-chevron-left, |
|---|
| 5806 | +.carousel-control .glyphicon-chevron-right { |
|---|
| 5807 | + position: absolute; |
|---|
| 5808 | + top: 50%; |
|---|
| 5809 | + z-index: 5; |
|---|
| 5810 | + display: inline-block; |
|---|
| 5811 | +} |
|---|
| 5812 | +.carousel-control .icon-prev, |
|---|
| 5813 | +.carousel-control .glyphicon-chevron-left { |
|---|
| 5814 | + left: 50%; |
|---|
| 5815 | + margin-left: -10px; |
|---|
| 5816 | +} |
|---|
| 5817 | +.carousel-control .icon-next, |
|---|
| 5818 | +.carousel-control .glyphicon-chevron-right { |
|---|
| 5819 | + right: 50%; |
|---|
| 5820 | + margin-right: -10px; |
|---|
| 5821 | +} |
|---|
| 5822 | +.carousel-control .icon-prev, |
|---|
| 5823 | +.carousel-control .icon-next { |
|---|
| 5824 | + width: 20px; |
|---|
| 5825 | + height: 20px; |
|---|
| 5826 | + margin-top: -10px; |
|---|
| 5827 | + font-family: serif; |
|---|
| 5828 | +} |
|---|
| 5829 | +.carousel-control .icon-prev:before { |
|---|
| 5830 | + content: '\2039'; |
|---|
| 5831 | +} |
|---|
| 5832 | +.carousel-control .icon-next:before { |
|---|
| 5833 | + content: '\203a'; |
|---|
| 5834 | +} |
|---|
| 5835 | +.carousel-indicators { |
|---|
| 5836 | + position: absolute; |
|---|
| 5837 | + bottom: 10px; |
|---|
| 5838 | + left: 50%; |
|---|
| 5839 | + z-index: 15; |
|---|
| 5840 | + width: 60%; |
|---|
| 5841 | + padding-left: 0; |
|---|
| 5842 | + margin-left: -30%; |
|---|
| 5843 | + text-align: center; |
|---|
| 5844 | + list-style: none; |
|---|
| 5845 | +} |
|---|
| 5846 | +.carousel-indicators li { |
|---|
| 5847 | + display: inline-block; |
|---|
| 5848 | + width: 10px; |
|---|
| 5849 | + height: 10px; |
|---|
| 5850 | + margin: 1px; |
|---|
| 5851 | + text-indent: -999px; |
|---|
| 5852 | + cursor: pointer; |
|---|
| 5853 | + background-color: #000 \9; |
|---|
| 5854 | + background-color: rgba(0, 0, 0, 0); |
|---|
| 5855 | + border: 1px solid #fff; |
|---|
| 5856 | + border-radius: 10px; |
|---|
| 5857 | +} |
|---|
| 5858 | +.carousel-indicators .active { |
|---|
| 5859 | + width: 12px; |
|---|
| 5860 | + height: 12px; |
|---|
| 5861 | + margin: 0; |
|---|
| 5862 | + background-color: #fff; |
|---|
| 5863 | +} |
|---|
| 5864 | +.carousel-caption { |
|---|
| 5865 | + position: absolute; |
|---|
| 5866 | + right: 15%; |
|---|
| 5867 | + bottom: 20px; |
|---|
| 5868 | + left: 15%; |
|---|
| 5869 | + z-index: 10; |
|---|
| 5870 | + padding-top: 20px; |
|---|
| 5871 | + padding-bottom: 20px; |
|---|
| 5872 | + color: #fff; |
|---|
| 5873 | + text-align: center; |
|---|
| 5874 | + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); |
|---|
| 5875 | +} |
|---|
| 5876 | +.carousel-caption .btn { |
|---|
| 5877 | + text-shadow: none; |
|---|
| 5878 | +} |
|---|
| 5879 | +@media screen and (min-width: 768px) { |
|---|
| 5880 | + .carousel-control .glyphicon-chevron-left, |
|---|
| 5881 | + .carousel-control .glyphicon-chevron-right, |
|---|
| 5882 | + .carousel-control .icon-prev, |
|---|
| 5883 | + .carousel-control .icon-next { |
|---|
| 5884 | + width: 30px; |
|---|
| 5885 | + height: 30px; |
|---|
| 5886 | + margin-top: -15px; |
|---|
| 5887 | + font-size: 30px; |
|---|
| 5888 | + } |
|---|
| 5889 | + .carousel-control .glyphicon-chevron-left, |
|---|
| 5890 | + .carousel-control .icon-prev { |
|---|
| 5891 | + margin-left: -15px; |
|---|
| 5892 | + } |
|---|
| 5893 | + .carousel-control .glyphicon-chevron-right, |
|---|
| 5894 | + .carousel-control .icon-next { |
|---|
| 5895 | + margin-right: -15px; |
|---|
| 5896 | + } |
|---|
| 5897 | + .carousel-caption { |
|---|
| 5898 | + right: 20%; |
|---|
| 5899 | + left: 20%; |
|---|
| 5900 | + padding-bottom: 30px; |
|---|
| 5901 | + } |
|---|
| 5902 | + .carousel-indicators { |
|---|
| 5903 | + bottom: 20px; |
|---|
| 5904 | + } |
|---|
| 5905 | +} |
|---|
| 5906 | +.clearfix:before, |
|---|
| 5907 | +.clearfix:after, |
|---|
| 5908 | +.dl-horizontal dd:before, |
|---|
| 5909 | +.dl-horizontal dd:after, |
|---|
| 5910 | +.container:before, |
|---|
| 5911 | +.container:after, |
|---|
| 5912 | +.container-fluid:before, |
|---|
| 5913 | +.container-fluid:after, |
|---|
| 5914 | +.row:before, |
|---|
| 5915 | +.row:after, |
|---|
| 5916 | +.form-horizontal .form-group:before, |
|---|
| 5917 | +.form-horizontal .form-group:after, |
|---|
| 5918 | +.btn-toolbar:before, |
|---|
| 5919 | +.btn-toolbar:after, |
|---|
| 5920 | +.btn-group-vertical > .btn-group:before, |
|---|
| 5921 | +.btn-group-vertical > .btn-group:after, |
|---|
| 5922 | +.nav:before, |
|---|
| 5923 | +.nav:after, |
|---|
| 5924 | +.navbar:before, |
|---|
| 5925 | +.navbar:after, |
|---|
| 5926 | +.navbar-header:before, |
|---|
| 5927 | +.navbar-header:after, |
|---|
| 5928 | +.navbar-collapse:before, |
|---|
| 5929 | +.navbar-collapse:after, |
|---|
| 5930 | +.pager:before, |
|---|
| 5931 | +.pager:after, |
|---|
| 5932 | +.panel-body:before, |
|---|
| 5933 | +.panel-body:after, |
|---|
| 5934 | +.modal-footer:before, |
|---|
| 5935 | +.modal-footer:after { |
|---|
| 5936 | + display: table; |
|---|
| 5937 | + content: " "; |
|---|
| 5938 | +} |
|---|
| 5939 | +.clearfix:after, |
|---|
| 5940 | +.dl-horizontal dd:after, |
|---|
| 5941 | +.container:after, |
|---|
| 5942 | +.container-fluid:after, |
|---|
| 5943 | +.row:after, |
|---|
| 5944 | +.form-horizontal .form-group:after, |
|---|
| 5945 | +.btn-toolbar:after, |
|---|
| 5946 | +.btn-group-vertical > .btn-group:after, |
|---|
| 5947 | +.nav:after, |
|---|
| 5948 | +.navbar:after, |
|---|
| 5949 | +.navbar-header:after, |
|---|
| 5950 | +.navbar-collapse:after, |
|---|
| 5951 | +.pager:after, |
|---|
| 5952 | +.panel-body:after, |
|---|
| 5953 | +.modal-footer:after { |
|---|
| 5954 | + clear: both; |
|---|
| 5955 | +} |
|---|
| 5956 | +.center-block { |
|---|
| 5957 | + display: block; |
|---|
| 5958 | + margin-right: auto; |
|---|
| 5959 | + margin-left: auto; |
|---|
| 5960 | +} |
|---|
| 5961 | +.pull-right { |
|---|
| 5962 | + float: right !important; |
|---|
| 5963 | +} |
|---|
| 5964 | +.pull-left { |
|---|
| 5965 | + float: left !important; |
|---|
| 5966 | +} |
|---|
| 5967 | +.hide { |
|---|
| 5968 | + display: none !important; |
|---|
| 5969 | +} |
|---|
| 5970 | +.show { |
|---|
| 5971 | + display: block !important; |
|---|
| 5972 | +} |
|---|
| 5973 | +.invisible { |
|---|
| 5974 | + visibility: hidden; |
|---|
| 5975 | +} |
|---|
| 5976 | +.text-hide { |
|---|
| 5977 | + font: 0/0 a; |
|---|
| 5978 | + color: transparent; |
|---|
| 5979 | + text-shadow: none; |
|---|
| 5980 | + background-color: transparent; |
|---|
| 5981 | + border: 0; |
|---|
| 5982 | +} |
|---|
| 5983 | +.hidden { |
|---|
| 5984 | + display: none !important; |
|---|
| 5985 | + visibility: hidden !important; |
|---|
| 5986 | +} |
|---|
| 5987 | +.affix { |
|---|
| 5988 | + position: fixed; |
|---|
| 5989 | + -webkit-transform: translate3d(0, 0, 0); |
|---|
| 5990 | + -o-transform: translate3d(0, 0, 0); |
|---|
| 5991 | + transform: translate3d(0, 0, 0); |
|---|
| 5992 | +} |
|---|
| 5993 | +@-ms-viewport { |
|---|
| 5994 | + width: device-width; |
|---|
| 5995 | +} |
|---|
| 5996 | +.visible-xs, |
|---|
| 5997 | +.visible-sm, |
|---|
| 5998 | +.visible-md, |
|---|
| 5999 | +.visible-lg { |
|---|
| 6000 | + display: none !important; |
|---|
| 6001 | +} |
|---|
| 6002 | +.visible-xs-block, |
|---|
| 6003 | +.visible-xs-inline, |
|---|
| 6004 | +.visible-xs-inline-block, |
|---|
| 6005 | +.visible-sm-block, |
|---|
| 6006 | +.visible-sm-inline, |
|---|
| 6007 | +.visible-sm-inline-block, |
|---|
| 6008 | +.visible-md-block, |
|---|
| 6009 | +.visible-md-inline, |
|---|
| 6010 | +.visible-md-inline-block, |
|---|
| 6011 | +.visible-lg-block, |
|---|
| 6012 | +.visible-lg-inline, |
|---|
| 6013 | +.visible-lg-inline-block { |
|---|
| 6014 | + display: none !important; |
|---|
| 6015 | +} |
|---|
| 6016 | +@media (max-width: 767px) { |
|---|
| 6017 | + .visible-xs { |
|---|
| 6018 | + display: block !important; |
|---|
| 6019 | + } |
|---|
| 6020 | + table.visible-xs { |
|---|
| 6021 | + display: table; |
|---|
| 6022 | + } |
|---|
| 6023 | + tr.visible-xs { |
|---|
| 6024 | + display: table-row !important; |
|---|
| 6025 | + } |
|---|
| 6026 | + th.visible-xs, |
|---|
| 6027 | + td.visible-xs { |
|---|
| 6028 | + display: table-cell !important; |
|---|
| 6029 | + } |
|---|
| 6030 | +} |
|---|
| 6031 | +@media (max-width: 767px) { |
|---|
| 6032 | + .visible-xs-block { |
|---|
| 6033 | + display: block !important; |
|---|
| 6034 | + } |
|---|
| 6035 | +} |
|---|
| 6036 | +@media (max-width: 767px) { |
|---|
| 6037 | + .visible-xs-inline { |
|---|
| 6038 | + display: inline !important; |
|---|
| 6039 | + } |
|---|
| 6040 | +} |
|---|
| 6041 | +@media (max-width: 767px) { |
|---|
| 6042 | + .visible-xs-inline-block { |
|---|
| 6043 | + display: inline-block !important; |
|---|
| 6044 | + } |
|---|
| 6045 | +} |
|---|
| 6046 | +@media (min-width: 768px) and (max-width: 991px) { |
|---|
| 6047 | + .visible-sm { |
|---|
| 6048 | + display: block !important; |
|---|
| 6049 | + } |
|---|
| 6050 | + table.visible-sm { |
|---|
| 6051 | + display: table; |
|---|
| 6052 | + } |
|---|
| 6053 | + tr.visible-sm { |
|---|
| 6054 | + display: table-row !important; |
|---|
| 6055 | + } |
|---|
| 6056 | + th.visible-sm, |
|---|
| 6057 | + td.visible-sm { |
|---|
| 6058 | + display: table-cell !important; |
|---|
| 6059 | + } |
|---|
| 6060 | +} |
|---|
| 6061 | +@media (min-width: 768px) and (max-width: 991px) { |
|---|
| 6062 | + .visible-sm-block { |
|---|
| 6063 | + display: block !important; |
|---|
| 6064 | + } |
|---|
| 6065 | +} |
|---|
| 6066 | +@media (min-width: 768px) and (max-width: 991px) { |
|---|
| 6067 | + .visible-sm-inline { |
|---|
| 6068 | + display: inline !important; |
|---|
| 6069 | + } |
|---|
| 6070 | +} |
|---|
| 6071 | +@media (min-width: 768px) and (max-width: 991px) { |
|---|
| 6072 | + .visible-sm-inline-block { |
|---|
| 6073 | + display: inline-block !important; |
|---|
| 6074 | + } |
|---|
| 6075 | +} |
|---|
| 6076 | +@media (min-width: 992px) and (max-width: 1199px) { |
|---|
| 6077 | + .visible-md { |
|---|
| 6078 | + display: block !important; |
|---|
| 6079 | + } |
|---|
| 6080 | + table.visible-md { |
|---|
| 6081 | + display: table; |
|---|
| 6082 | + } |
|---|
| 6083 | + tr.visible-md { |
|---|
| 6084 | + display: table-row !important; |
|---|
| 6085 | + } |
|---|
| 6086 | + th.visible-md, |
|---|
| 6087 | + td.visible-md { |
|---|
| 6088 | + display: table-cell !important; |
|---|
| 6089 | + } |
|---|
| 6090 | +} |
|---|
| 6091 | +@media (min-width: 992px) and (max-width: 1199px) { |
|---|
| 6092 | + .visible-md-block { |
|---|
| 6093 | + display: block !important; |
|---|
| 6094 | + } |
|---|
| 6095 | +} |
|---|
| 6096 | +@media (min-width: 992px) and (max-width: 1199px) { |
|---|
| 6097 | + .visible-md-inline { |
|---|
| 6098 | + display: inline !important; |
|---|
| 6099 | + } |
|---|
| 6100 | +} |
|---|
| 6101 | +@media (min-width: 992px) and (max-width: 1199px) { |
|---|
| 6102 | + .visible-md-inline-block { |
|---|
| 6103 | + display: inline-block !important; |
|---|
| 6104 | + } |
|---|
| 6105 | +} |
|---|
| 6106 | +@media (min-width: 1200px) { |
|---|
| 6107 | + .visible-lg { |
|---|
| 6108 | + display: block !important; |
|---|
| 6109 | + } |
|---|
| 6110 | + table.visible-lg { |
|---|
| 6111 | + display: table; |
|---|
| 6112 | + } |
|---|
| 6113 | + tr.visible-lg { |
|---|
| 6114 | + display: table-row !important; |
|---|
| 6115 | + } |
|---|
| 6116 | + th.visible-lg, |
|---|
| 6117 | + td.visible-lg { |
|---|
| 6118 | + display: table-cell !important; |
|---|
| 6119 | + } |
|---|
| 6120 | +} |
|---|
| 6121 | +@media (min-width: 1200px) { |
|---|
| 6122 | + .visible-lg-block { |
|---|
| 6123 | + display: block !important; |
|---|
| 6124 | + } |
|---|
| 6125 | +} |
|---|
| 6126 | +@media (min-width: 1200px) { |
|---|
| 6127 | + .visible-lg-inline { |
|---|
| 6128 | + display: inline !important; |
|---|
| 6129 | + } |
|---|
| 6130 | +} |
|---|
| 6131 | +@media (min-width: 1200px) { |
|---|
| 6132 | + .visible-lg-inline-block { |
|---|
| 6133 | + display: inline-block !important; |
|---|
| 6134 | + } |
|---|
| 6135 | +} |
|---|
| 6136 | +@media (max-width: 767px) { |
|---|
| 6137 | + .hidden-xs { |
|---|
| 6138 | + display: none !important; |
|---|
| 6139 | + } |
|---|
| 6140 | +} |
|---|
| 6141 | +@media (min-width: 768px) and (max-width: 991px) { |
|---|
| 6142 | + .hidden-sm { |
|---|
| 6143 | + display: none !important; |
|---|
| 6144 | + } |
|---|
| 6145 | +} |
|---|
| 6146 | +@media (min-width: 992px) and (max-width: 1199px) { |
|---|
| 6147 | + .hidden-md { |
|---|
| 6148 | + display: none !important; |
|---|
| 6149 | + } |
|---|
| 6150 | +} |
|---|
| 6151 | +@media (min-width: 1200px) { |
|---|
| 6152 | + .hidden-lg { |
|---|
| 6153 | + display: none !important; |
|---|
| 6154 | + } |
|---|
| 6155 | +} |
|---|
| 6156 | +.visible-print { |
|---|
| 6157 | + display: none !important; |
|---|
| 6158 | +} |
|---|
| 6159 | +@media print { |
|---|
| 6160 | + .visible-print { |
|---|
| 6161 | + display: block !important; |
|---|
| 6162 | + } |
|---|
| 6163 | + table.visible-print { |
|---|
| 6164 | + display: table; |
|---|
| 6165 | + } |
|---|
| 6166 | + tr.visible-print { |
|---|
| 6167 | + display: table-row !important; |
|---|
| 6168 | + } |
|---|
| 6169 | + th.visible-print, |
|---|
| 6170 | + td.visible-print { |
|---|
| 6171 | + display: table-cell !important; |
|---|
| 6172 | + } |
|---|
| 6173 | +} |
|---|
| 6174 | +.visible-print-block { |
|---|
| 6175 | + display: none !important; |
|---|
| 6176 | +} |
|---|
| 6177 | +@media print { |
|---|
| 6178 | + .visible-print-block { |
|---|
| 6179 | + display: block !important; |
|---|
| 6180 | + } |
|---|
| 6181 | +} |
|---|
| 6182 | +.visible-print-inline { |
|---|
| 6183 | + display: none !important; |
|---|
| 6184 | +} |
|---|
| 6185 | +@media print { |
|---|
| 6186 | + .visible-print-inline { |
|---|
| 6187 | + display: inline !important; |
|---|
| 6188 | + } |
|---|
| 6189 | +} |
|---|
| 6190 | +.visible-print-inline-block { |
|---|
| 6191 | + display: none !important; |
|---|
| 6192 | +} |
|---|
| 6193 | +@media print { |
|---|
| 6194 | + .visible-print-inline-block { |
|---|
| 6195 | + display: inline-block !important; |
|---|
| 6196 | + } |
|---|
| 6197 | +} |
|---|
| 6198 | +@media print { |
|---|
| 6199 | + .hidden-print { |
|---|
| 6200 | + display: none !important; |
|---|
| 6201 | + } |
|---|
| 6202 | +} |
|---|
| 6203 | +/*# sourceMappingURL=bootstrap.css.map */ |
|---|
| .. | .. |
|---|
| 1 | +{"version":3,"file":"bootstrap.css","sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"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;EAAW,kBAAA;EHoR9C;AGnRmC;EAAW,kBAAA;EHsR9C;AGrRmC;EAAW,kBAAA;EHwR9C;AGvRmC;EAAW,kBAAA;EH0R9C;AGzRmC;EAAW,kBAAA;EH4R9C;AG3RmC;EAAW,kBAAA;EH8R9C;AG7RmC;EAAW,kBAAA;EHgS9C;AG/RmC;EAAW,kBAAA;EHkS9C;AGjSmC;EAAW,kBAAA;EHoS9C;AGnSmC;EAAW,kBAAA;EHsS9C;AGrSmC;EAAW,kBAAA;EHwS9C;AGvSmC;EAAW,kBAAA;EH0S9C;AGzSmC;EAAW,kBAAA;EH4S9C;AG3SmC;EAAW,kBAAA;EH8S9C;AG7SmC;EAAW,kBAAA;EHgT9C;AG/SmC;EAAW,kBAAA;EHkT9C;AGjTmC;EAAW,kBAAA;EHoT9C;AGnTmC;EAAW,kBAAA;EHsT9C;AGrTmC;EAAW,kBAAA;EHwT9C;AGvTmC;EAAW,kBAAA;EH0T9C;AGzTmC;EAAW,kBAAA;EH4T9C;AG3TmC;EAAW,kBAAA;EH8T9C;AG7TmC;EAAW,kBAAA;EHgU9C;AG/TmC;EAAW,kBAAA;EHkU9C;AGjUmC;EAAW,kBAAA;EHoU9C;AGnUmC;EAAW,kBAAA;EHsU9C;AGrUmC;EAAW,kBAAA;EHwU9C;AGvUmC;EAAW,kBAAA;EH0U9C;AGzUmC;EAAW,kBAAA;EH4U9C;AG3UmC;EAAW,kBAAA;EH8U9C;AG7UmC;EAAW,kBAAA;EHgV9C;AG/UmC;EAAW,kBAAA;EHkV9C;AGjVmC;EAAW,kBAAA;EHoV9C;AGnVmC;EAAW,kBAAA;EHsV9C;AGrVmC;EAAW,kBAAA;EHwV9C;AGvVmC;EAAW,kBAAA;EH0V9C;AGzVmC;EAAW,kBAAA;EH4V9C;AG3VmC;EAAW,kBAAA;EH8V9C;AG7VmC;EAAW,kBAAA;EHgW9C;AG/VmC;EAAW,kBAAA;EHkW9C;AGjWmC;EAAW,kBAAA;EHoW9C;AGnWmC;EAAW,kBAAA;EHsW9C;AGrWmC;EAAW,kBAAA;EHwW9C;AGvWmC;EAAW,kBAAA;EH0W9C;AGzWmC;EAAW,kBAAA;EH4W9C;AG3WmC;EAAW,kBAAA;EH8W9C;AG7WmC;EAAW,kBAAA;EHgX9C;AG/WmC;EAAW,kBAAA;EHkX9C;AGjXmC;EAAW,kBAAA;EHoX9C;AGnXmC;EAAW,kBAAA;EHsX9C;AGrXmC;EAAW,kBAAA;EHwX9C;AGvXmC;EAAW,kBAAA;EH0X9C;AGzXmC;EAAW,kBAAA;EH4X9C;AG3XmC;EAAW,kBAAA;EH8X9C;AG7XmC;EAAW,kBAAA;EHgY9C;AG/XmC;EAAW,kBAAA;EHkY9C;AGjYmC;EAAW,kBAAA;EHoY9C;AGnYmC;EAAW,kBAAA;EHsY9C;AGrYmC;EAAW,kBAAA;EHwY9C;AGvYmC;EAAW,kBAAA;EH0Y9C;AGzYmC;EAAW,kBAAA;EH4Y9C;AG3YmC;EAAW,kBAAA;EH8Y9C;AG7YmC;EAAW,kBAAA;EHgZ9C;AG/YmC;EAAW,kBAAA;EHkZ9C;AGjZmC;EAAW,kBAAA;EHoZ9C;AGnZmC;EAAW,kBAAA;EHsZ9C;AGrZmC;EAAW,kBAAA;EHwZ9C;AGvZmC;EAAW,kBAAA;EH0Z9C;AGzZmC;EAAW,kBAAA;EH4Z9C;AG3ZmC;EAAW,kBAAA;EH8Z9C;AG7ZmC;EAAW,kBAAA;EHga9C;AG/ZmC;EAAW,kBAAA;EHka9C;AGjamC;EAAW,kBAAA;EHoa9C;AGnamC;EAAW,kBAAA;EHsa9C;AGramC;EAAW,kBAAA;EHwa9C;AGvamC;EAAW,kBAAA;EH0a9C;AGzamC;EAAW,kBAAA;EH4a9C;AG3amC;EAAW,kBAAA;EH8a9C;AG7amC;EAAW,kBAAA;EHgb9C;AG/amC;EAAW,kBAAA;EHkb9C;AGjbmC;EAAW,kBAAA;EHob9C;AGnbmC;EAAW,kBAAA;EHsb9C;AGrbmC;EAAW,kBAAA;EHwb9C;AGvbmC;EAAW,kBAAA;EH0b9C;AGzbmC;EAAW,kBAAA;EH4b9C;AG3bmC;EAAW,kBAAA;EH8b9C;AG7bmC;EAAW,kBAAA;EHgc9C;AG/bmC;EAAW,kBAAA;EHkc9C;AGjcmC;EAAW,kBAAA;EHoc9C;AGncmC;EAAW,kBAAA;EHsc9C;AGrcmC;EAAW,kBAAA;EHwc9C;AGvcmC;EAAW,kBAAA;EH0c9C;AGzcmC;EAAW,kBAAA;EH4c9C;AG3cmC;EAAW,kBAAA;EH8c9C;AG7cmC;EAAW,kBAAA;EHgd9C;AG/cmC;EAAW,kBAAA;EHkd9C;AGjdmC;EAAW,kBAAA;EHod9C;AGndmC;EAAW,kBAAA;EHsd9C;AGrdmC;EAAW,kBAAA;EHwd9C;AGvdmC;EAAW,kBAAA;EH0d9C;AGzdmC;EAAW,kBAAA;EH4d9C;AG3dmC;EAAW,kBAAA;EH8d9C;AG7dmC;EAAW,kBAAA;EHge9C;AG/dmC;EAAW,kBAAA;EHke9C;AGjemC;EAAW,kBAAA;EHoe9C;AGnemC;EAAW,kBAAA;EHse9C;AGremC;EAAW,kBAAA;EHwe9C;AGvemC;EAAW,kBAAA;EH0e9C;AGzemC;EAAW,kBAAA;EH4e9C;AG3emC;EAAW,kBAAA;EH8e9C;AG7emC;EAAW,kBAAA;EHgf9C;AG/emC;EAAW,kBAAA;EHkf9C;AGjfmC;EAAW,kBAAA;EHof9C;AGnfmC;EAAW,kBAAA;EHsf9C;AGrfmC;EAAW,kBAAA;EHwf9C;AGvfmC;EAAW,kBAAA;EH0f9C;AGzfmC;EAAW,kBAAA;EH4f9C;AG3fmC;EAAW,kBAAA;EH8f9C;AG7fmC;EAAW,kBAAA;EHggB9C;AG/fmC;EAAW,kBAAA;EHkgB9C;AGjgBmC;EAAW,kBAAA;EHogB9C;AGngBmC;EAAW,kBAAA;EHsgB9C;AGrgBmC;EAAW,kBAAA;EHwgB9C;AGvgBmC;EAAW,kBAAA;EH0gB9C;AGzgBmC;EAAW,kBAAA;EH4gB9C;AG3gBmC;EAAW,kBAAA;EH8gB9C;AG7gBmC;EAAW,kBAAA;EHghB9C;AG/gBmC;EAAW,kBAAA;EHkhB9C;AGjhBmC;EAAW,kBAAA;EHohB9C;AGnhBmC;EAAW,kBAAA;EHshB9C;AGrhBmC;EAAW,kBAAA;EHwhB9C;AGvhBmC;EAAW,kBAAA;EH0hB9C;AGzhBmC;EAAW,kBAAA;EH4hB9C;AG3hBmC;EAAW,kBAAA;EH8hB9C;AG7hBmC;EAAW,kBAAA;EHgiB9C;AG/hBmC;EAAW,kBAAA;EHkiB9C;AGjiBmC;EAAW,kBAAA;EHoiB9C;AGniBmC;EAAW,kBAAA;EHsiB9C;AGriBmC;EAAW,kBAAA;EHwiB9C;AGviBmC;EAAW,kBAAA;EH0iB9C;AGziBmC;EAAW,kBAAA;EH4iB9C;AG3iBmC;EAAW,kBAAA;EH8iB9C;AG7iBmC;EA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A;Efk8CH;Ae97CC;EACE,YAAA;Efg8CH;Ael7CC;EACE,mBAAA;Efo7CH;Aer7CC;EACE,2BAAA;Efu7CH;Aex7CC;EACE,2BAAA;Ef07CH;Ae37CC;EACE,kBAAA;Ef67CH;Ae97CC;EACE,2BAAA;Efg8CH;Aej8CC;EACE,2BAAA;Efm8CH;Aep8CC;EACE,kBAAA;Efs8CH;Aev8CC;EACE,2BAAA;Efy8CH;Ae18CC;EACE,2BAAA;Ef48CH;Ae78CC;EACE,kBAAA;Ef+8CH;Aeh9CC;EACE,2BAAA;Efk9CH;Aen9CC;EACE,0BAAA;Efq9CH;Aet9CC;EACE,iBAAA;Efw9CH;Aa59CD;EE9BI;IACE,aAAA;If6/CH;Eet/CD;IACE,aAAA;Ifw/CD;Eez/CD;IACE,qBAAA;If2/CD;Ee5/CD;IACE,qBAAA;If8/CD;Ee//CD;IACE,YAAA;IfigDD;EelgDD;IACE,qBAAA;IfogDD;EergDD;IACE,qBAAA;IfugDD;EexgDD;IACE,YAAA;If0gDD;Ee3gDD;IACE,qBAAA;If6gDD;Ee9gDD;IACE,qBAAA;IfghDD;EejhDD;IACE,YAAA;IfmhDD;EephDD;IACE,qBAAA;IfshDD;EevhDD;IACE,oBAAA;IfyhDD;Ee3gDD;IACE,aAAA;If6gDD;Ee9gDD;IACE,qBAAA;IfghDD;EejhDD;IACE,qBAAA;IfmhDD;EephDD;IACE,YAAA;IfshDD;EevhDD;IACE,qBAAA;IfyhDD;Ee1hDD;IACE,qBAAA;If4hDD;Ee7hDD;IACE,YAAA;If+hDD;EehiDD;IACE,qBAAA;IfkiDD;EeniDD;IACE,qBAAA;IfqiDD;EetiDD;IACE,YAAA;IfwiDD;EeziDD;IACE,qBAAA;If2iDD;Ee5iDD;IACE,oBAAA;If8iDD;Ee1iDD;IACE,aAAA;If4iDD;Ee5jDD;IACE,YAAA;If8jDD;Ee/jDD;IACE,oBAAA;IfikDD;EelkDD;IACE,oBAAA;IfokDD;EerkDD;IACE,WAAA;IfukDD;EexkDD;IACE,oBAAA;If0kDD;Ee3kDD;IACE,oBAAA;If6kDD;Ee9kDD;IACE,WAAA;IfglDD;EejlDD;IACE,oBAAA;IfmlDD;EeplDD;IACE,oBAAA;IfslDD;EevlDD;IACE,WAAA;IfylDD;Ee1lDD;IACE,oBAAA;If4lDD;Ee7lDD;IACE,mBAAA;If+lDD;Ee3lDD;IACE,YAAA;If6lDD;Ee/kDD;IACE,mBAAA;IfilDD;EellDD;IACE,2BAAA;IfolDD;EerlDD;IACE,2BAAA;IfulDD;EexlDD;IACE,kBAAA;If0lDD;Ee3lDD;IACE,2BAAA;If6lDD;Ee9lDD;IACE,2BAAA;IfgmDD;EejmDD;IACE,kBAAA;IfmmDD;EepmDD;IACE,2BAAA;IfsmDD;EevmDD;IACE,2BAAA;IfymDD;Ee1mDD;IACE,kBAAA;If4mDD;Ee7mDD;IACE,2BAAA;If+mDD;EehnDD;IACE,0BAAA;IfknDD;EennDD;IACE,iBAAA;IfqnDD;EACF;AajnDD;EEvCI;IACE,aAAA;If2pDH;EeppDD;IACE,aAAA;IfspDD;EevpDD;IACE,qBAAA;IfypDD;Ee1pDD;IACE,qBAAA;If4pDD;Ee7pDD;IACE,YAAA;If+pDD;EehqDD;IACE,qBAAA;IfkqDD;EenqDD;IACE,qBAAA;IfqqDD;EetqDD;IACE,YAAA;IfwqDD;EezqDD;IACE,qBAAA;If2qDD;Ee5qDD;IACE,qBAAA;If8qDD;Ee/qDD;IACE,YAAA;IfirDD;EelrDD;IACE,qBAAA;IforDD;EerrDD;IACE,oBAAA;IfurDD;EezqDD;IACE,aAAA;If2qDD;Ee5qDD;IACE,qBAAA;If8qDD;Ee/qDD;IACE,qBAAA;IfirDD;EelrDD;IACE,YAAA;IforDD;EerrDD;IACE,qBAAA;IfurDD;EexrDD;IACE,qBAAA;If0rDD;Ee3rDD;IACE,YAAA;If6rDD;Ee9rDD;IACE,qBAAA;IfgsDD;EejsDD;IACE,qBAAA;IfmsDD;EepsDD;IACE,YAAA;IfssDD;EevsDD;IACE,qBAAA;IfysDD;Ee1sDD;IACE,oBAAA;If4sDD;EexsDD;IACE,aAAA;If0sDD;Ee1tDD;IACE,YAAA;If4tDD;Ee7tDD;IACE,oBAAA;If+tDD;EehuDD;IACE,oBAAA;IfkuDD;EenuDD;IACE,WAAA;IfquDD;EetuDD;IACE,oBAAA;IfwuDD;EezuDD;IACE,oBAAA;If2uDD;Ee5uDD;IACE,WAAA;If8uDD;Ee/uDD;IACE,oBAAA;IfivDD;EelvDD;IACE,oBAAA;IfovDD;EervDD;IACE,WAAA;IfuvDD;EexvDD;IACE,oBAAA;If0vDD;Ee3vDD;IACE,mBAAA;If6vDD;EezvDD;IACE,YAAA;If2vDD;Ee7uDD;IACE,mBAAA;If+uDD;EehvDD;IACE,2BAAA;IfkvDD;EenvDD;IACE,2BAAA;IfqvDD;EetvDD;IACE,kBAAA;IfwvDD;EezvDD;IACE,2BAAA;If2vDD;Ee5vDD;IACE,2BAAA;If8vDD;Ee/vDD;IACE,kBAAA;IfiwDD;EelwDD;IACE,2BAAA;IfowDD;EerwDD;IACE,2BAAA;IfuwDD;EexwDD;IACE,kBAAA;If0wDD;Ee3wDD;IACE,2BAAA;If6wDD;Ee9wDD;IACE,0BAAA;IfgxDD;EejxDD;IACE,iBAAA;IfmxDD;EACF;AaxwDD;EE9CI;IACE,aAAA;IfyzDH;EelzDD;IACE,aAAA;IfozDD;EerzDD;IACE,qBAAA;IfuzDD;EexzDD;IACE,qBAAA;If0zDD;Ee3zDD;IACE,YAAA;If6zDD;Ee9zDD;IACE,qBAAA;Ifg0DD;Eej0DD;IACE,qBAAA;Ifm0DD;Eep0DD;IACE,YAAA;Ifs0DD;Eev0DD;IACE,qBAAA;Ify0DD;Ee10DD;IACE,qBAAA;If40DD;Ee70DD;IACE,YAAA;If+0DD;Eeh1DD;IACE,qBAAA;Ifk1DD;Een1DD;IACE,oBAAA;Ifq1DD;Eev0DD;IACE,aAAA;Ify0DD;Ee10DD;IACE,qBAAA;If40DD;Ee70DD;IACE,qBAAA;If+0DD;Eeh1DD;IACE,YAAA;Ifk1DD;Een1DD;IACE,qBAAA;Ifq1DD;Eet1DD;IACE,qBAAA;Ifw1DD;Eez1DD;IACE,YAAA;If21DD;Ee51DD;IACE,qBAAA;If81DD;Ee/1DD;IACE,qBAAA;Ifi2DD;Eel2DD;IACE,YAAA;Ifo2DD;Eer2DD;IACE,qBAAA;Ifu2DD;Eex2DD;IACE,oBAAA;If02DD;Eet2DD;IACE,aAAA;Ifw2DD;Eex3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AAA;EACI,uBAAA;ErBqsFT;AoB9qFD;EClBI,gBAAA;EACA,2BAAA;ErBmsFH;AoB/qFD;ECrDE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBuuFD;AqBruFC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBuuFP;AqBruFC;;;EAGE,wBAAA;ErBuuFH;AqBluFG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErB8uFT;AoBptFD;ECrBI,gBAAA;EACA,2BAAA;ErB4uFH;AoBptFD;ECzDE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBgxFD;AqB9wFC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBgxFP;AqB9wFC;;;EAGE,wBAAA;ErBgxFH;AqB3wFG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBuxFT;AoBzvFD;ECzBI,gBAAA;EACA,2BAAA;ErBqxFH;AoBzvFD;EC7DE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErByzFD;AqBvzFC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErByzFP;AqBvzFC;;;EAGE,wBAAA;ErByzFH;AqBpzFG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBg0FT;AoB9xFD;EC7BI,gBAAA;EACA,2BAAA;ErB8zFH;AoB9xFD;ECjEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBk2FD;AqBh2FC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBk2FP;AqBh2FC;;;EAGE,wBAAA;ErBk2FH;AqB71FG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBy2FT;AoBn0FD;ECjCI,gBAAA;EACA,2BAAA;ErBu2FH;AoBn0FD;ECrEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErB24FD;AqBz4FC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErB24FP;AqBz4FC;;;EAGE,wBAAA;ErB24FH;AqBt4FG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBk5FT;AoBx2FD;ECrCI,gBAAA;EACA,2BAAA;ErBg5FH;AoBn2FD;EACE,gBAAA;EACA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","sourcesContent":[null,"/*! normalize.css v3.0.1 | MIT License | git.io/normalize */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS text size adjust after orientation change, without disabling\n// user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11 and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background: transparent;\n}\n\n//\n// Improve readability when focused and also mouse hovered in all browsers.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n// (include `-moz` to future-proof).\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box; // 2\n box-sizing: content-box;\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","//\n// Basic print styles\n// --------------------------------------------------\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css\n\n@media print {\n\n * {\n text-shadow: none !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n background: transparent !important;\n box-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links for images, or javascript/internal links\n a[href^=\"javascript:\"]:after,\n a[href^=\"#\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245\n // Once fixed, we can just straight up remove this.\n select {\n background: #fff !important;\n }\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .table {\n td,\n th {\n background-color: #fff !important;\n }\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\2a\"; } }\n.glyphicon-plus { &:before { content: \"\\2b\"; } }\n.glyphicon-euro { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: underline;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n &::-moz-placeholder { color: @color; // Firefox\n opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n width: 100% \\9; // Force IE10 and below to size SVG images correctly\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\n// Undo browser default styling\ncite {\n font-style: normal;\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @grid-float-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Quotes\nblockquote:before,\nblockquote:after {\n content: \"\";\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: (@gutter / -2);\n margin-right: (@gutter / -2);\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-child(odd) {\n > td,\n > th {\n background-color: @table-bg-accent;\n }\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n > td,\n > th {\n background-color: @table-bg-hover;\n }\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n overflow-x: auto;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n -webkit-overflow-scrolling: touch;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n cursor: not-allowed;\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned.\n// As a workaround, we set a pixel line-height that matches the\n// given height of the input. Since this fucks up everything else, we have to\n// appropriately reset it for Internet Explorer and the size variations.\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n line-height: @input-height-base;\n // IE8+ misaligns the text within date inputs, so we reset\n line-height: @line-height-base ~\"\\0\";\n\n &.input-sm {\n line-height: @input-height-small;\n }\n &.input-lg {\n line-height: @input-height-large;\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: 15px;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n min-height: @line-height-computed; // clear the floating input if there is no label text\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n &[disabled],\n &.disabled,\n fieldset[disabled] & {\n cursor: not-allowed;\n }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n &.disabled,\n fieldset[disabled] & {\n cursor: not-allowed;\n }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n &.disabled,\n fieldset[disabled] & {\n label {\n cursor: not-allowed;\n }\n }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n // Size it appropriately next to real form controls\n padding-top: (@padding-base-vertical + 1);\n padding-bottom: (@padding-base-vertical + 1);\n // Remove default margin from `p`\n margin-bottom: 0;\n\n &.input-lg,\n &.input-sm {\n padding-left: 0;\n padding-right: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n\n.input-sm {\n .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n.input-lg {\n .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n // Enable absolute positioning\n position: relative;\n\n // Ensure icons don't overlap text\n .form-control {\n padding-right: (@input-height-base * 1.25);\n }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n position: absolute;\n top: (@line-height-computed + 5); // Height of the `label` and its margin\n right: 0;\n z-index: 2; // Ensure icon is above input groups\n display: block;\n width: @input-height-base;\n height: @input-height-base;\n line-height: @input-height-base;\n text-align: center;\n}\n.input-lg + .form-control-feedback {\n width: @input-height-large;\n height: @input-height-large;\n line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback {\n width: @input-height-small;\n height: @input-height-small;\n line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n\n// Reposition feedback icon if label is hidden with \"screenreader only\" state\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n display: block; // account for any element using help-block\n margin-top: 5px;\n margin-bottom: 10px;\n color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n // Kick in the inline\n @media (min-width: @screen-sm-min) {\n // Inline-block all the things for \"inline\"\n .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // In navbar-form, allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n .input-group {\n display: inline-table;\n vertical-align: middle;\n\n .input-group-addon,\n .input-group-btn,\n .form-control {\n width: auto;\n }\n }\n\n // Input groups need that 100% width though\n .input-group > .form-control {\n width: 100%;\n }\n\n .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match (which also avoids\n // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).\n .radio,\n .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n\n label {\n padding-left: 0;\n }\n }\n .radio input[type=\"radio\"],\n .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n // Consistent vertical alignment of radios and checkboxes\n //\n // Labels also get some reset styles, but that is scoped to a media query below.\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n // Account for padding we're adding to ensure the alignment and of help text\n // and other content below items\n .radio,\n .checkbox {\n min-height: (@line-height-computed + (@padding-base-vertical + 1));\n }\n\n // Make form groups behave like rows\n .form-group {\n .make-row();\n }\n\n // Reset spacing and right align labels, but scope to media queries so that\n // labels on narrow viewports stack the same as a default form example.\n @media (min-width: @screen-sm-min) {\n .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n top: 0;\n right: (@grid-gutter-width / 2);\n }\n\n // Form group sizes\n //\n // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n // inputs and labels within a `.form-group`.\n .form-group-lg {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: ((@padding-large-vertical * @line-height-large) + 1);\n }\n }\n .form-control {\n &:extend(.input-lg);\n }\n }\n .form-group-sm {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-small-vertical + 1);\n }\n }\n .form-control {\n &:extend(.input-sm);\n }\n }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: not-allowed;\n pointer-events: none; // Future-proof disabling of clicks\n .opacity(.65);\n .box-shadow(none);\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n cursor: pointer;\n border-radius: 0;\n\n &,\n &:active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: underline;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:hover,\n &:focus,\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &:active,\n &.active {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition(height .35s ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base solid;\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n}\n// Nuke hover/focus effects\n.dropdown-menu > .disabled > a {\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: not-allowed;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base solid;\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 1px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n &:focus {\n // Remove focus outline when dropdown JS adds it after closing the menu\n outline: 0;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n border-top-right-radius: @border-radius-base;\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n border-bottom-left-radius: @border-radius-base;\n .border-top-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `opacity`. We cannot\n// use `display: none;` or `visibility: hidden;` as that also hides the popover.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 for more.\n\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n position: absolute;\n z-index: -1;\n .opacity(0);\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @border-radius-base;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n .translate3d(0, 0, 0);\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n\n &.navbar-right:last-child {\n margin-right: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right { .pull-right(); }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n\n // Outdent the form if last child to line up with content down the page\n &.navbar-right:last-child {\n margin-right: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n\n // Outdent the form if last child to line up with content down the page\n &.navbar-right:last-child {\n margin-right: 0;\n }\n }\n}\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n visibility: hidden !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n .translate3d(0, 0, 0);\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: not-allowed;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: not-allowed;\n }\n }\n\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n \n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: baseline;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n .btn-xs & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n a.list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: (@font-size-base * 4.5);\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n// Account for lower percentages\n.progress-bar {\n &[aria-valuenow=\"1\"],\n &[aria-valuenow=\"2\"] {\n min-width: 30px;\n }\n\n &[aria-valuenow=\"0\"] {\n color: @gray-light;\n min-width: 30px;\n background-color: transparent;\n background-image: none;\n box-shadow: none;\n }\n}\n\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n","// Media objects\n// Source: http://stubbornella.org/content/?p=497\n// --------------------------------------------------\n\n\n// Common styles\n// -------------------------\n\n// Clear the floats\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n\n// Proper spacing between instances of .media\n.media,\n.media .media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n\n// For images and videos, set to block\n.media-object {\n display: block;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin: 0 0 5px;\n}\n\n\n// Media image alignment\n// -------------------------\n\n.media {\n > .pull-left {\n margin-right: 10px;\n }\n > .pull-right {\n margin-left: 10px;\n }\n}\n\n\n// Media list variation\n// -------------------------\n\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n\n // Align badges within list items\n > .badge {\n float: right;\n }\n > .badge + .badge {\n margin-right: 5px;\n }\n}\n\n\n// Linked list items\n//\n// Use anchor elements instead of `li`s or `div`s to create linked list items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n + .panel-collapse > .panel-body {\n border-top: 1px solid @panel-inner-border;\n }\n }\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n\n // Modifier class for 16:9 aspect ratio\n &.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n }\n\n // Modifier class for 4:3 aspect ratio\n &.embed-responsive-4by3 {\n padding-bottom: 75%;\n }\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate3d(0, -25%, 0);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate3d(0, 0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n visibility: visible;\n font-size: @font-size-small;\n line-height: 1.4;\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n text-decoration: none;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n text-align: left; // Reset given new insertion method\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Overrides for proper insertion\n white-space: normal;\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 18px;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n margin-top: -10px;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: -15px;\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: -15px;\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]} |
|---|
| .. | .. |
|---|
| 1 | +/*! |
|---|
| 2 | + * Bootstrap v3.2.0 (http://getbootstrap.com) |
|---|
| 3 | + * Copyright 2011-2014 Twitter, Inc. |
|---|
| 4 | + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
|---|
| 5 | + *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;width:100% \9;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}mark,.mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px;line-height:1.42857143 \0}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-top:4px \9;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm,.form-horizontal .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg,.form-horizontal .form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{position:absolute;z-index:-1;filter:alpha(opacity=0);opacity:0}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#777}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#428bca;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar[aria-valuenow="1"],.progress-bar[aria-valuenow="2"]{min-width:30px}.progress-bar[aria-valuenow="0"]{min-width:30px;color:#777;background-color:transparent;background-image:none;-webkit-box-shadow:none;box-shadow:none}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{color:#777;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#428bca}.panel-primary>.panel-heading .badge{color:#428bca;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate3d(0,-25%,0);-o-transform:translate3d(0,-25%,0);transform:translate3d(0,-25%,0)}.modal.in .modal-dialog{-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-size:12px;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{display:table;content:" "}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} |
|---|
| .. | .. |
|---|
| 1 | +/* Additional styles to display a spinner image while options are loading */ |
|---|
| 2 | +.localytics-chosen.loading+.chosen-container-multi .chosen-choices { |
|---|
| 3 | + background-image: url('spinner.gif'); |
|---|
| 4 | + background-repeat: no-repeat; |
|---|
| 5 | + background-position: 95%; |
|---|
| 6 | +} |
|---|
| 7 | +.localytics-chosen.loading+.chosen-container-single .chosen-single span { |
|---|
| 8 | + background: url('spinner.gif') no-repeat right; |
|---|
| 9 | +} |
|---|
| 10 | +.localytics-chosen.loading+.chosen-container-single .chosen-single .search-choice-close { |
|---|
| 11 | + display: none; |
|---|
| 12 | +} |
|---|
| .. | .. |
|---|
| 1 | +/* @group Base */ |
|---|
| 2 | +.chosen-container { |
|---|
| 3 | + position: relative; |
|---|
| 4 | + display: inline-block; |
|---|
| 5 | + vertical-align: middle; |
|---|
| 6 | + font-size: 13px; |
|---|
| 7 | + zoom: 1; |
|---|
| 8 | + *display: inline; |
|---|
| 9 | + -webkit-user-select: none; |
|---|
| 10 | + -moz-user-select: none; |
|---|
| 11 | + user-select: none; |
|---|
| 12 | +} |
|---|
| 13 | +.chosen-container .chosen-drop { |
|---|
| 14 | + position: absolute; |
|---|
| 15 | + top: 100%; |
|---|
| 16 | + left: -9999px; |
|---|
| 17 | + z-index: 1010; |
|---|
| 18 | + -webkit-box-sizing: border-box; |
|---|
| 19 | + -moz-box-sizing: border-box; |
|---|
| 20 | + box-sizing: border-box; |
|---|
| 21 | + width: 100%; |
|---|
| 22 | + border: 1px solid #aaa; |
|---|
| 23 | + border-top: 0; |
|---|
| 24 | + background: #fff; |
|---|
| 25 | + box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15); |
|---|
| 26 | +} |
|---|
| 27 | +.chosen-container.chosen-with-drop .chosen-drop { |
|---|
| 28 | + left: 0; |
|---|
| 29 | +} |
|---|
| 30 | +.chosen-container a { |
|---|
| 31 | + cursor: pointer; |
|---|
| 32 | +} |
|---|
| 33 | + |
|---|
| 34 | +/* @end */ |
|---|
| 35 | +/* @group Single Chosen */ |
|---|
| 36 | +.chosen-container-single .chosen-single { |
|---|
| 37 | + position: relative; |
|---|
| 38 | + display: block; |
|---|
| 39 | + overflow: hidden; |
|---|
| 40 | + padding: 0 0 0 8px; |
|---|
| 41 | + height: 23px; |
|---|
| 42 | + border: 1px solid #aaa; |
|---|
| 43 | + border-radius: 5px; |
|---|
| 44 | + background-color: #fff; |
|---|
| 45 | + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4)); |
|---|
| 46 | + background: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); |
|---|
| 47 | + background: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); |
|---|
| 48 | + background: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); |
|---|
| 49 | + background: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); |
|---|
| 50 | + background-clip: padding-box; |
|---|
| 51 | + box-shadow: 0 0 3px white inset, 0 1px 1px rgba(0, 0, 0, 0.1); |
|---|
| 52 | + color: #444; |
|---|
| 53 | + text-decoration: none; |
|---|
| 54 | + white-space: nowrap; |
|---|
| 55 | + line-height: 24px; |
|---|
| 56 | +} |
|---|
| 57 | +.chosen-container-single .chosen-default { |
|---|
| 58 | + color: #999; |
|---|
| 59 | +} |
|---|
| 60 | +.chosen-container-single .chosen-single span { |
|---|
| 61 | + display: block; |
|---|
| 62 | + overflow: hidden; |
|---|
| 63 | + margin-right: 26px; |
|---|
| 64 | + text-overflow: ellipsis; |
|---|
| 65 | + white-space: nowrap; |
|---|
| 66 | +} |
|---|
| 67 | +.chosen-container-single .chosen-single-with-deselect span { |
|---|
| 68 | + margin-right: 38px; |
|---|
| 69 | +} |
|---|
| 70 | +.chosen-container-single .chosen-single abbr { |
|---|
| 71 | + position: absolute; |
|---|
| 72 | + top: 6px; |
|---|
| 73 | + right: 26px; |
|---|
| 74 | + display: block; |
|---|
| 75 | + width: 12px; |
|---|
| 76 | + height: 12px; |
|---|
| 77 | + background: url('chosen-sprite.png') -42px 1px no-repeat; |
|---|
| 78 | + font-size: 1px; |
|---|
| 79 | +} |
|---|
| 80 | +.chosen-container-single .chosen-single abbr:hover { |
|---|
| 81 | + background-position: -42px -10px; |
|---|
| 82 | +} |
|---|
| 83 | +.chosen-container-single.chosen-disabled .chosen-single abbr:hover { |
|---|
| 84 | + background-position: -42px -10px; |
|---|
| 85 | +} |
|---|
| 86 | +.chosen-container-single .chosen-single div { |
|---|
| 87 | + position: absolute; |
|---|
| 88 | + top: 0; |
|---|
| 89 | + right: 0; |
|---|
| 90 | + display: block; |
|---|
| 91 | + width: 18px; |
|---|
| 92 | + height: 100%; |
|---|
| 93 | +} |
|---|
| 94 | +.chosen-container-single .chosen-single div b { |
|---|
| 95 | + display: block; |
|---|
| 96 | + width: 100%; |
|---|
| 97 | + height: 100%; |
|---|
| 98 | + background: url('chosen-sprite.png') no-repeat 0px 2px; |
|---|
| 99 | +} |
|---|
| 100 | +.chosen-container-single .chosen-search { |
|---|
| 101 | + position: relative; |
|---|
| 102 | + z-index: 1010; |
|---|
| 103 | + margin: 0; |
|---|
| 104 | + padding: 3px 4px; |
|---|
| 105 | + white-space: nowrap; |
|---|
| 106 | +} |
|---|
| 107 | +.chosen-container-single .chosen-search input[type="text"] { |
|---|
| 108 | + -webkit-box-sizing: border-box; |
|---|
| 109 | + -moz-box-sizing: border-box; |
|---|
| 110 | + box-sizing: border-box; |
|---|
| 111 | + margin: 1px 0; |
|---|
| 112 | + padding: 4px 20px 4px 5px; |
|---|
| 113 | + width: 100%; |
|---|
| 114 | + height: auto; |
|---|
| 115 | + outline: 0; |
|---|
| 116 | + border: 1px solid #aaa; |
|---|
| 117 | + background: white url('chosen-sprite.png') no-repeat 100% -20px; |
|---|
| 118 | + background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); |
|---|
| 119 | + background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%); |
|---|
| 120 | + background: url('chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(#eeeeee 1%, #ffffff 15%); |
|---|
| 121 | + background: url('chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(#eeeeee 1%, #ffffff 15%); |
|---|
| 122 | + background: url('chosen-sprite.png') no-repeat 100% -20px, linear-gradient(#eeeeee 1%, #ffffff 15%); |
|---|
| 123 | + font-size: 1em; |
|---|
| 124 | + font-family: sans-serif; |
|---|
| 125 | + line-height: normal; |
|---|
| 126 | + border-radius: 0; |
|---|
| 127 | +} |
|---|
| 128 | +.chosen-container-single .chosen-drop { |
|---|
| 129 | + margin-top: -1px; |
|---|
| 130 | + border-radius: 0 0 4px 4px; |
|---|
| 131 | + background-clip: padding-box; |
|---|
| 132 | +} |
|---|
| 133 | +.chosen-container-single.chosen-container-single-nosearch .chosen-search { |
|---|
| 134 | + position: absolute; |
|---|
| 135 | + left: -9999px; |
|---|
| 136 | +} |
|---|
| 137 | + |
|---|
| 138 | +/* @end */ |
|---|
| 139 | +/* @group Results */ |
|---|
| 140 | +.chosen-container .chosen-results { |
|---|
| 141 | + position: relative; |
|---|
| 142 | + overflow-x: hidden; |
|---|
| 143 | + overflow-y: auto; |
|---|
| 144 | + margin: 0 4px 4px 0; |
|---|
| 145 | + padding: 0 0 0 4px; |
|---|
| 146 | + max-height: 240px; |
|---|
| 147 | + -webkit-overflow-scrolling: touch; |
|---|
| 148 | +} |
|---|
| 149 | +.chosen-container .chosen-results li { |
|---|
| 150 | + display: none; |
|---|
| 151 | + margin: 0; |
|---|
| 152 | + padding: 5px 6px; |
|---|
| 153 | + list-style: none; |
|---|
| 154 | + line-height: 15px; |
|---|
| 155 | +} |
|---|
| 156 | +.chosen-container .chosen-results li.active-result { |
|---|
| 157 | + display: list-item; |
|---|
| 158 | + cursor: pointer; |
|---|
| 159 | +} |
|---|
| 160 | +.chosen-container .chosen-results li.disabled-result { |
|---|
| 161 | + display: list-item; |
|---|
| 162 | + color: #ccc; |
|---|
| 163 | + cursor: default; |
|---|
| 164 | +} |
|---|
| 165 | +.chosen-container .chosen-results li.highlighted { |
|---|
| 166 | + background-color: #3875d7; |
|---|
| 167 | + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc)); |
|---|
| 168 | + background-image: -webkit-linear-gradient(#3875d7 20%, #2a62bc 90%); |
|---|
| 169 | + background-image: -moz-linear-gradient(#3875d7 20%, #2a62bc 90%); |
|---|
| 170 | + background-image: -o-linear-gradient(#3875d7 20%, #2a62bc 90%); |
|---|
| 171 | + background-image: linear-gradient(#3875d7 20%, #2a62bc 90%); |
|---|
| 172 | + color: #fff; |
|---|
| 173 | +} |
|---|
| 174 | +.chosen-container .chosen-results li.no-results { |
|---|
| 175 | + display: list-item; |
|---|
| 176 | + background: #f4f4f4; |
|---|
| 177 | +} |
|---|
| 178 | +.chosen-container .chosen-results li.group-result { |
|---|
| 179 | + display: list-item; |
|---|
| 180 | + font-weight: bold; |
|---|
| 181 | + cursor: default; |
|---|
| 182 | +} |
|---|
| 183 | +.chosen-container .chosen-results li.group-option { |
|---|
| 184 | + padding-left: 15px; |
|---|
| 185 | +} |
|---|
| 186 | +.chosen-container .chosen-results li em { |
|---|
| 187 | + font-style: normal; |
|---|
| 188 | + text-decoration: underline; |
|---|
| 189 | +} |
|---|
| 190 | + |
|---|
| 191 | +/* @end */ |
|---|
| 192 | +/* @group Multi Chosen */ |
|---|
| 193 | +.chosen-container-multi .chosen-choices { |
|---|
| 194 | + position: relative; |
|---|
| 195 | + overflow: hidden; |
|---|
| 196 | + -webkit-box-sizing: border-box; |
|---|
| 197 | + -moz-box-sizing: border-box; |
|---|
| 198 | + box-sizing: border-box; |
|---|
| 199 | + margin: 0; |
|---|
| 200 | + padding: 0; |
|---|
| 201 | + width: 100%; |
|---|
| 202 | + height: auto !important; |
|---|
| 203 | + height: 1%; |
|---|
| 204 | + border: 1px solid #aaa; |
|---|
| 205 | + background-color: #fff; |
|---|
| 206 | + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); |
|---|
| 207 | + background-image: -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%); |
|---|
| 208 | + background-image: -moz-linear-gradient(#eeeeee 1%, #ffffff 15%); |
|---|
| 209 | + background-image: -o-linear-gradient(#eeeeee 1%, #ffffff 15%); |
|---|
| 210 | + background-image: linear-gradient(#eeeeee 1%, #ffffff 15%); |
|---|
| 211 | + cursor: text; |
|---|
| 212 | +} |
|---|
| 213 | +.chosen-container-multi .chosen-choices li { |
|---|
| 214 | + float: left; |
|---|
| 215 | + list-style: none; |
|---|
| 216 | +} |
|---|
| 217 | +.chosen-container-multi .chosen-choices li.search-field { |
|---|
| 218 | + margin: 0; |
|---|
| 219 | + padding: 0; |
|---|
| 220 | + white-space: nowrap; |
|---|
| 221 | +} |
|---|
| 222 | +.chosen-container-multi .chosen-choices li.search-field input[type="text"] { |
|---|
| 223 | + margin: 1px 0; |
|---|
| 224 | + padding: 5px; |
|---|
| 225 | + height: 15px; |
|---|
| 226 | + outline: 0; |
|---|
| 227 | + border: 0 !important; |
|---|
| 228 | + background: transparent !important; |
|---|
| 229 | + box-shadow: none; |
|---|
| 230 | + color: #666; |
|---|
| 231 | + font-size: 100%; |
|---|
| 232 | + font-family: sans-serif; |
|---|
| 233 | + line-height: normal; |
|---|
| 234 | + border-radius: 0; |
|---|
| 235 | +} |
|---|
| 236 | +.chosen-container-multi .chosen-choices li.search-field .default { |
|---|
| 237 | + color: #999; |
|---|
| 238 | +} |
|---|
| 239 | +.chosen-container-multi .chosen-choices li.search-choice { |
|---|
| 240 | + position: relative; |
|---|
| 241 | + margin: 3px 0 3px 5px; |
|---|
| 242 | + padding: 3px 20px 3px 5px; |
|---|
| 243 | + border: 1px solid #aaa; |
|---|
| 244 | + border-radius: 3px; |
|---|
| 245 | + background-color: #e4e4e4; |
|---|
| 246 | + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); |
|---|
| 247 | + background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); |
|---|
| 248 | + background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); |
|---|
| 249 | + background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); |
|---|
| 250 | + background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); |
|---|
| 251 | + background-clip: padding-box; |
|---|
| 252 | + box-shadow: 0 0 2px white inset, 0 1px 0 rgba(0, 0, 0, 0.05); |
|---|
| 253 | + color: #333; |
|---|
| 254 | + line-height: 13px; |
|---|
| 255 | + cursor: default; |
|---|
| 256 | +} |
|---|
| 257 | +.chosen-container-multi .chosen-choices li.search-choice .search-choice-close { |
|---|
| 258 | + position: absolute; |
|---|
| 259 | + top: 4px; |
|---|
| 260 | + right: 3px; |
|---|
| 261 | + display: block; |
|---|
| 262 | + width: 12px; |
|---|
| 263 | + height: 12px; |
|---|
| 264 | + background: url('chosen-sprite.png') -42px 1px no-repeat; |
|---|
| 265 | + font-size: 1px; |
|---|
| 266 | +} |
|---|
| 267 | +.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover { |
|---|
| 268 | + background-position: -42px -10px; |
|---|
| 269 | +} |
|---|
| 270 | +.chosen-container-multi .chosen-choices li.search-choice-disabled { |
|---|
| 271 | + padding-right: 5px; |
|---|
| 272 | + border: 1px solid #ccc; |
|---|
| 273 | + background-color: #e4e4e4; |
|---|
| 274 | + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); |
|---|
| 275 | + background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); |
|---|
| 276 | + background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); |
|---|
| 277 | + background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); |
|---|
| 278 | + background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); |
|---|
| 279 | + color: #666; |
|---|
| 280 | +} |
|---|
| 281 | +.chosen-container-multi .chosen-choices li.search-choice-focus { |
|---|
| 282 | + background: #d4d4d4; |
|---|
| 283 | +} |
|---|
| 284 | +.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close { |
|---|
| 285 | + background-position: -42px -10px; |
|---|
| 286 | +} |
|---|
| 287 | +.chosen-container-multi .chosen-results { |
|---|
| 288 | + margin: 0; |
|---|
| 289 | + padding: 0; |
|---|
| 290 | +} |
|---|
| 291 | +.chosen-container-multi .chosen-drop .result-selected { |
|---|
| 292 | + display: list-item; |
|---|
| 293 | + color: #ccc; |
|---|
| 294 | + cursor: default; |
|---|
| 295 | +} |
|---|
| 296 | + |
|---|
| 297 | +/* @end */ |
|---|
| 298 | +/* @group Active */ |
|---|
| 299 | +.chosen-container-active .chosen-single { |
|---|
| 300 | + border: 1px solid #5897fb; |
|---|
| 301 | + box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); |
|---|
| 302 | +} |
|---|
| 303 | +.chosen-container-active.chosen-with-drop .chosen-single { |
|---|
| 304 | + border: 1px solid #aaa; |
|---|
| 305 | + -moz-border-radius-bottomright: 0; |
|---|
| 306 | + border-bottom-right-radius: 0; |
|---|
| 307 | + -moz-border-radius-bottomleft: 0; |
|---|
| 308 | + border-bottom-left-radius: 0; |
|---|
| 309 | + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff)); |
|---|
| 310 | + background-image: -webkit-linear-gradient(#eeeeee 20%, #ffffff 80%); |
|---|
| 311 | + background-image: -moz-linear-gradient(#eeeeee 20%, #ffffff 80%); |
|---|
| 312 | + background-image: -o-linear-gradient(#eeeeee 20%, #ffffff 80%); |
|---|
| 313 | + background-image: linear-gradient(#eeeeee 20%, #ffffff 80%); |
|---|
| 314 | + box-shadow: 0 1px 0 #fff inset; |
|---|
| 315 | +} |
|---|
| 316 | +.chosen-container-active.chosen-with-drop .chosen-single div { |
|---|
| 317 | + border-left: none; |
|---|
| 318 | + background: transparent; |
|---|
| 319 | +} |
|---|
| 320 | +.chosen-container-active.chosen-with-drop .chosen-single div b { |
|---|
| 321 | + background-position: -18px 2px; |
|---|
| 322 | +} |
|---|
| 323 | +.chosen-container-active .chosen-choices { |
|---|
| 324 | + border: 1px solid #5897fb; |
|---|
| 325 | + box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); |
|---|
| 326 | +} |
|---|
| 327 | +.chosen-container-active .chosen-choices li.search-field input[type="text"] { |
|---|
| 328 | + color: #111 !important; |
|---|
| 329 | +} |
|---|
| 330 | + |
|---|
| 331 | +/* @end */ |
|---|
| 332 | +/* @group Disabled Support */ |
|---|
| 333 | +.chosen-disabled { |
|---|
| 334 | + opacity: 0.5 !important; |
|---|
| 335 | + cursor: default; |
|---|
| 336 | +} |
|---|
| 337 | +.chosen-disabled .chosen-single { |
|---|
| 338 | + cursor: default; |
|---|
| 339 | +} |
|---|
| 340 | +.chosen-disabled .chosen-choices .search-choice .search-choice-close { |
|---|
| 341 | + cursor: default; |
|---|
| 342 | +} |
|---|
| 343 | + |
|---|
| 344 | +/* @end */ |
|---|
| 345 | +/* @group Right to Left */ |
|---|
| 346 | +.chosen-rtl { |
|---|
| 347 | + text-align: right; |
|---|
| 348 | +} |
|---|
| 349 | +.chosen-rtl .chosen-single { |
|---|
| 350 | + overflow: visible; |
|---|
| 351 | + padding: 0 8px 0 0; |
|---|
| 352 | +} |
|---|
| 353 | +.chosen-rtl .chosen-single span { |
|---|
| 354 | + margin-right: 0; |
|---|
| 355 | + margin-left: 26px; |
|---|
| 356 | + direction: rtl; |
|---|
| 357 | +} |
|---|
| 358 | +.chosen-rtl .chosen-single-with-deselect span { |
|---|
| 359 | + margin-left: 38px; |
|---|
| 360 | +} |
|---|
| 361 | +.chosen-rtl .chosen-single div { |
|---|
| 362 | + right: auto; |
|---|
| 363 | + left: 3px; |
|---|
| 364 | +} |
|---|
| 365 | +.chosen-rtl .chosen-single abbr { |
|---|
| 366 | + right: auto; |
|---|
| 367 | + left: 26px; |
|---|
| 368 | +} |
|---|
| 369 | +.chosen-rtl .chosen-choices li { |
|---|
| 370 | + float: right; |
|---|
| 371 | +} |
|---|
| 372 | +.chosen-rtl .chosen-choices li.search-field input[type="text"] { |
|---|
| 373 | + direction: rtl; |
|---|
| 374 | +} |
|---|
| 375 | +.chosen-rtl .chosen-choices li.search-choice { |
|---|
| 376 | + margin: 3px 5px 3px 0; |
|---|
| 377 | + padding: 3px 5px 3px 19px; |
|---|
| 378 | +} |
|---|
| 379 | +.chosen-rtl .chosen-choices li.search-choice .search-choice-close { |
|---|
| 380 | + right: auto; |
|---|
| 381 | + left: 4px; |
|---|
| 382 | +} |
|---|
| 383 | +.chosen-rtl.chosen-container-single-nosearch .chosen-search, |
|---|
| 384 | +.chosen-rtl .chosen-drop { |
|---|
| 385 | + left: 9999px; |
|---|
| 386 | +} |
|---|
| 387 | +.chosen-rtl.chosen-container-single .chosen-results { |
|---|
| 388 | + margin: 0 0 4px 4px; |
|---|
| 389 | + padding: 0 4px 0 0; |
|---|
| 390 | +} |
|---|
| 391 | +.chosen-rtl .chosen-results li.group-option { |
|---|
| 392 | + padding-right: 15px; |
|---|
| 393 | + padding-left: 0; |
|---|
| 394 | +} |
|---|
| 395 | +.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div { |
|---|
| 396 | + border-right: none; |
|---|
| 397 | +} |
|---|
| 398 | +.chosen-rtl .chosen-search input[type="text"] { |
|---|
| 399 | + padding: 4px 5px 4px 20px; |
|---|
| 400 | + background: white url('chosen-sprite.png') no-repeat -30px -20px; |
|---|
| 401 | + background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); |
|---|
| 402 | + background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%); |
|---|
| 403 | + background: url('chosen-sprite.png') no-repeat -30px -20px, -moz-linear-gradient(#eeeeee 1%, #ffffff 15%); |
|---|
| 404 | + background: url('chosen-sprite.png') no-repeat -30px -20px, -o-linear-gradient(#eeeeee 1%, #ffffff 15%); |
|---|
| 405 | + background: url('chosen-sprite.png') no-repeat -30px -20px, linear-gradient(#eeeeee 1%, #ffffff 15%); |
|---|
| 406 | + direction: rtl; |
|---|
| 407 | +} |
|---|
| 408 | +.chosen-rtl.chosen-container-single .chosen-single div b { |
|---|
| 409 | + background-position: 6px 2px; |
|---|
| 410 | +} |
|---|
| 411 | +.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b { |
|---|
| 412 | + background-position: -12px 2px; |
|---|
| 413 | +} |
|---|
| 414 | + |
|---|
| 415 | +/* @end */ |
|---|
| 416 | +/* @group Retina compatibility */ |
|---|
| 417 | +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) { |
|---|
| 418 | + .chosen-rtl .chosen-search input[type="text"], |
|---|
| 419 | + .chosen-container-single .chosen-single abbr, |
|---|
| 420 | + .chosen-container-single .chosen-single div b, |
|---|
| 421 | + .chosen-container-single .chosen-search input[type="text"], |
|---|
| 422 | + .chosen-container-multi .chosen-choices .search-choice .search-choice-close, |
|---|
| 423 | + .chosen-container .chosen-results-scroll-down span, |
|---|
| 424 | + .chosen-container .chosen-results-scroll-up span { |
|---|
| 425 | + background-image: url('chosen-sprite@2x.png') !important; |
|---|
| 426 | + background-size: 52px 37px !important; |
|---|
| 427 | + background-repeat: no-repeat !important; |
|---|
| 428 | + } |
|---|
| 429 | +} |
|---|
| 430 | +/* @end */ |
|---|
| .. | .. |
|---|
| 1 | +/*! |
|---|
| 2 | + * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome |
|---|
| 3 | + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) |
|---|
| 4 | + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.0.3');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.0.3') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.0.3') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857142858em;text-align:center}.fa-ul{padding-left:0;margin-left:2.142857142857143em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;top:.14285714285714285em;text-align:center}.fa-li.fa-lg{left:-1.8571428571428572em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0,mirror=1);-webkit-transform:scale(-1,1);-moz-transform:scale(-1,1);-ms-transform:scale(-1,1);-o-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2,mirror=1);-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-asc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-desc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-reply-all:before{content:"\f122"}.fa-mail-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"} |
|---|
| .. | .. |
|---|
| 1 | +body { |
|---|
| 2 | + padding-top: 50px; |
|---|
| 3 | + padding-bottom: 20px; |
|---|
| 4 | +} |
|---|
| 5 | + |
|---|
| 6 | +@media (min-width: 1400px) { |
|---|
| 7 | + .container { |
|---|
| 8 | + width: 1350px !important; |
|---|
| 9 | + } |
|---|
| 10 | +} |
|---|
| 11 | + |
|---|
| 12 | +@media (min-width: 1600px) { |
|---|
| 13 | + .container { |
|---|
| 14 | + width: 1550px !important; |
|---|
| 15 | + } |
|---|
| 16 | +} |
|---|
| 17 | + |
|---|
| 18 | + |
|---|
| 19 | +a { |
|---|
| 20 | + cursor: default !important; |
|---|
| 21 | +} |
|---|
| 22 | +.animate-show { |
|---|
| 23 | + -webkit-transition: all linear 0.5s; |
|---|
| 24 | + transition: all linear 0.5s; |
|---|
| 25 | + opacity:1; |
|---|
| 26 | +} |
|---|
| 27 | + |
|---|
| 28 | +.animate-show.ng-hide-add, |
|---|
| 29 | +.animate-show.ng-hide-remove { |
|---|
| 30 | + -webkit-transition: all linear 0.5s; |
|---|
| 31 | + transition: all linear 0.5s; |
|---|
| 32 | + display: block !important; |
|---|
| 33 | +} |
|---|
| 34 | + |
|---|
| 35 | +.animate-show.ng-hide { |
|---|
| 36 | + opacity: 0; |
|---|
| 37 | +} |
|---|
| 38 | + |
|---|
| 39 | +input.ng-invalid, textarea.ng-invalid { |
|---|
| 40 | + border: solid 1px red; |
|---|
| 41 | +} |
|---|
| 42 | + |
|---|
| 43 | +input.ng-dirty.ng-valid, textarea.ng-dirty.ng-valid { |
|---|
| 44 | + border: solid 1px green; |
|---|
| 45 | +} |
|---|
| 46 | + |
|---|
| 47 | +.alert.inline-alert { |
|---|
| 48 | + padding-top: 5px; |
|---|
| 49 | + padding-bottom: 5px; |
|---|
| 50 | + margin-bottom: 5px; |
|---|
| 51 | +} |
|---|
| 52 | + |
|---|
| 53 | +.chosen-choices { |
|---|
| 54 | + min-width: 100% !important; |
|---|
| 55 | + height: 34px !important; |
|---|
| 56 | + padding: 3px 6px; |
|---|
| 57 | + font-size: 14px; |
|---|
| 58 | + vertical-align: middle; |
|---|
| 59 | + border: 1px solid #ccc; |
|---|
| 60 | + border-radius: 4px; |
|---|
| 61 | +} |
|---|
| 62 | + |
|---|
| 63 | +.chosen-container { |
|---|
| 64 | + min-width: 100% !important; |
|---|
| 65 | + border: none; |
|---|
| 66 | + padding: 0px; |
|---|
| 67 | +} |
|---|
| 68 | +.chosen-container-multi li.search-field input[type="text"] { |
|---|
| 69 | + min-height: 25px !important; |
|---|
| 70 | + height: 25px !important; |
|---|
| 71 | +} |
|---|
| 72 | + |
|---|
| 73 | +.btn-file { |
|---|
| 74 | + position: relative; |
|---|
| 75 | + overflow: hidden; |
|---|
| 76 | +} |
|---|
| 77 | +.btn-file input[type=file] { |
|---|
| 78 | + position: absolute; |
|---|
| 79 | + top: 0; |
|---|
| 80 | + right: 0; |
|---|
| 81 | + min-width: 100%; |
|---|
| 82 | + min-height: 100%; |
|---|
| 83 | + font-size: 999px; |
|---|
| 84 | + text-align: right; |
|---|
| 85 | + filter: alpha(opacity=0); |
|---|
| 86 | + opacity: 0; |
|---|
| 87 | + background: red; |
|---|
| 88 | + cursor: inherit; |
|---|
| 89 | + display: block; |
|---|
| 90 | +} |
|---|
| .. | .. |
|---|
| 1 | +/* |
|---|
| 2 | + * Toastr |
|---|
| 3 | + * Version 2.0.1 |
|---|
| 4 | + * Copyright 2012 John Papa and Hans Fjällemark. |
|---|
| 5 | + * All Rights Reserved. |
|---|
| 6 | + * Use, reproduction, distribution, and modification of this code is subject to the terms and |
|---|
| 7 | + * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php |
|---|
| 8 | + * |
|---|
| 9 | + * Author: John Papa and Hans Fjällemark |
|---|
| 10 | + * Project: https://github.com/CodeSeven/toastr |
|---|
| 11 | + */ |
|---|
| 12 | +.toast-title { |
|---|
| 13 | + font-weight: bold; |
|---|
| 14 | +} |
|---|
| 15 | +.toast-message { |
|---|
| 16 | + -ms-word-wrap: break-word; |
|---|
| 17 | + word-wrap: break-word; |
|---|
| 18 | +} |
|---|
| 19 | +.toast-message a, |
|---|
| 20 | +.toast-message label { |
|---|
| 21 | + color: #ffffff; |
|---|
| 22 | +} |
|---|
| 23 | +.toast-message a:hover { |
|---|
| 24 | + color: #cccccc; |
|---|
| 25 | + text-decoration: none; |
|---|
| 26 | +} |
|---|
| 27 | + |
|---|
| 28 | +.toast-close-button { |
|---|
| 29 | + position: relative; |
|---|
| 30 | + right: -0.3em; |
|---|
| 31 | + top: -0.3em; |
|---|
| 32 | + float: right; |
|---|
| 33 | + font-size: 20px; |
|---|
| 34 | + font-weight: bold; |
|---|
| 35 | + color: #ffffff; |
|---|
| 36 | + -webkit-text-shadow: 0 1px 0 #ffffff; |
|---|
| 37 | + text-shadow: 0 1px 0 #ffffff; |
|---|
| 38 | + opacity: 0.8; |
|---|
| 39 | + -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80); |
|---|
| 40 | + filter: alpha(opacity=80); |
|---|
| 41 | +} |
|---|
| 42 | +.toast-close-button:hover, |
|---|
| 43 | +.toast-close-button:focus { |
|---|
| 44 | + color: #000000; |
|---|
| 45 | + text-decoration: none; |
|---|
| 46 | + cursor: pointer; |
|---|
| 47 | + opacity: 0.4; |
|---|
| 48 | + -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40); |
|---|
| 49 | + filter: alpha(opacity=40); |
|---|
| 50 | +} |
|---|
| 51 | + |
|---|
| 52 | +/*Additional properties for button version |
|---|
| 53 | + iOS requires the button element instead of an anchor tag. |
|---|
| 54 | + If you want the anchor version, it requires `href="#"`.*/ |
|---|
| 55 | +button.toast-close-button { |
|---|
| 56 | + padding: 0; |
|---|
| 57 | + cursor: pointer; |
|---|
| 58 | + background: transparent; |
|---|
| 59 | + border: 0; |
|---|
| 60 | + -webkit-appearance: none; |
|---|
| 61 | +} |
|---|
| 62 | +.toast-top-full-width { |
|---|
| 63 | + top: 0; |
|---|
| 64 | + right: 0; |
|---|
| 65 | + width: 100%; |
|---|
| 66 | +} |
|---|
| 67 | +.toast-bottom-full-width { |
|---|
| 68 | + bottom: 0; |
|---|
| 69 | + right: 0; |
|---|
| 70 | + width: 100%; |
|---|
| 71 | +} |
|---|
| 72 | +.toast-top-left { |
|---|
| 73 | + top: 12px; |
|---|
| 74 | + left: 12px; |
|---|
| 75 | +} |
|---|
| 76 | +.toast-top-right { |
|---|
| 77 | + top: 12px; |
|---|
| 78 | + right: 12px; |
|---|
| 79 | +} |
|---|
| 80 | +.toast-bottom-right { |
|---|
| 81 | + right: 12px; |
|---|
| 82 | + bottom: 12px; |
|---|
| 83 | +} |
|---|
| 84 | +.toast-bottom-left { |
|---|
| 85 | + bottom: 12px; |
|---|
| 86 | + left: 12px; |
|---|
| 87 | +} |
|---|
| 88 | +#toast-container { |
|---|
| 89 | + position: fixed; |
|---|
| 90 | + z-index: 999999; |
|---|
| 91 | + /*overrides*/ |
|---|
| 92 | + |
|---|
| 93 | +} |
|---|
| 94 | +#toast-container * { |
|---|
| 95 | + -moz-box-sizing: border-box; |
|---|
| 96 | + -webkit-box-sizing: border-box; |
|---|
| 97 | + box-sizing: border-box; |
|---|
| 98 | +} |
|---|
| 99 | +#toast-container > div { |
|---|
| 100 | + margin: 0 0 6px; |
|---|
| 101 | + padding: 15px 15px 15px 50px; |
|---|
| 102 | + width: 300px; |
|---|
| 103 | + -moz-border-radius: 3px 3px 3px 3px; |
|---|
| 104 | + -webkit-border-radius: 3px 3px 3px 3px; |
|---|
| 105 | + border-radius: 3px 3px 3px 3px; |
|---|
| 106 | + background-position: 15px center; |
|---|
| 107 | + background-repeat: no-repeat; |
|---|
| 108 | + -moz-box-shadow: 0 0 12px #999999; |
|---|
| 109 | + -webkit-box-shadow: 0 0 12px #999999; |
|---|
| 110 | + box-shadow: 0 0 12px #999999; |
|---|
| 111 | + color: #ffffff; |
|---|
| 112 | + opacity: 0.8; |
|---|
| 113 | + -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80); |
|---|
| 114 | + filter: alpha(opacity=80); |
|---|
| 115 | +} |
|---|
| 116 | +#toast-container > :hover { |
|---|
| 117 | + -moz-box-shadow: 0 0 12px #000000; |
|---|
| 118 | + -webkit-box-shadow: 0 0 12px #000000; |
|---|
| 119 | + box-shadow: 0 0 12px #000000; |
|---|
| 120 | + opacity: 1; |
|---|
| 121 | + -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); |
|---|
| 122 | + filter: alpha(opacity=100); |
|---|
| 123 | + cursor: pointer; |
|---|
| 124 | +} |
|---|
| 125 | +#toast-container > .toast-info { |
|---|
| 126 | + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=") !important; |
|---|
| 127 | +} |
|---|
| 128 | +#toast-container > .toast-error { |
|---|
| 129 | + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important; |
|---|
| 130 | +} |
|---|
| 131 | +#toast-container > .toast-success { |
|---|
| 132 | + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==") !important; |
|---|
| 133 | +} |
|---|
| 134 | +#toast-container > .toast-warning { |
|---|
| 135 | + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=") !important; |
|---|
| 136 | +} |
|---|
| 137 | +#toast-container.toast-top-full-width > div, |
|---|
| 138 | +#toast-container.toast-bottom-full-width > div { |
|---|
| 139 | + width: 96%; |
|---|
| 140 | + margin: auto; |
|---|
| 141 | +} |
|---|
| 142 | +.toast { |
|---|
| 143 | + background-color: #030303; |
|---|
| 144 | +} |
|---|
| 145 | +.toast-success { |
|---|
| 146 | + background-color: #51a351; |
|---|
| 147 | +} |
|---|
| 148 | +.toast-error { |
|---|
| 149 | + background-color: #bd362f; |
|---|
| 150 | +} |
|---|
| 151 | +.toast-info { |
|---|
| 152 | + background-color: #2f96b4; |
|---|
| 153 | +} |
|---|
| 154 | +.toast-warning { |
|---|
| 155 | + background-color: #f89406; |
|---|
| 156 | +} |
|---|
| 157 | +/*Responsive Design*/ |
|---|
| 158 | +@media all and (max-width: 240px) { |
|---|
| 159 | + #toast-container > div { |
|---|
| 160 | + padding: 8px 8px 8px 50px; |
|---|
| 161 | + width: 11em; |
|---|
| 162 | + } |
|---|
| 163 | + #toast-container .toast-close-button { |
|---|
| 164 | + right: -0.2em; |
|---|
| 165 | + top: -0.2em; |
|---|
| 166 | +} |
|---|
| 167 | + } |
|---|
| 168 | +@media all and (min-width: 241px) and (max-width: 480px) { |
|---|
| 169 | + #toast-container > div { |
|---|
| 170 | + padding: 8px 8px 8px 50px; |
|---|
| 171 | + width: 18em; |
|---|
| 172 | + } |
|---|
| 173 | + #toast-container .toast-close-button { |
|---|
| 174 | + right: -0.2em; |
|---|
| 175 | + top: -0.2em; |
|---|
| 176 | +} |
|---|
| 177 | +} |
|---|
| 178 | +@media all and (min-width: 481px) and (max-width: 768px) { |
|---|
| 179 | + #toast-container > div { |
|---|
| 180 | + padding: 15px 15px 15px 50px; |
|---|
| 181 | + width: 25em; |
|---|
| 182 | + } |
|---|
| 183 | +} |
|---|
| 184 | + |
|---|
| 185 | + /* |
|---|
| 186 | + * AngularJS-Toaster |
|---|
| 187 | + * Version 0.3 |
|---|
| 188 | + */ |
|---|
| 189 | +#toast-container > div.ng-enter, |
|---|
| 190 | +#toast-container > div.ng-leave |
|---|
| 191 | +{ |
|---|
| 192 | + -webkit-transition: 1000ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all; |
|---|
| 193 | + -moz-transition: 1000ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all; |
|---|
| 194 | + -ms-transition: 1000ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all; |
|---|
| 195 | + -o-transition: 1000ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all; |
|---|
| 196 | + transition: 1000ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all; |
|---|
| 197 | +} |
|---|
| 198 | + |
|---|
| 199 | +#toast-container > div.ng-enter.ng-enter-active, |
|---|
| 200 | +#toast-container > div.ng-leave { |
|---|
| 201 | + opacity: 0.8; |
|---|
| 202 | +} |
|---|
| 203 | + |
|---|
| 204 | +#toast-container > div.ng-leave.ng-leave-active, |
|---|
| 205 | +#toast-container > div.ng-enter { |
|---|
| 206 | + opacity: 0; |
|---|
| 207 | +} |
|---|
| .. | .. |
|---|
| 1 | +<?xml version="1.0" standalone="no"?> |
|---|
| 2 | +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > |
|---|
| 3 | +<svg xmlns="http://www.w3.org/2000/svg"> |
|---|
| 4 | +<metadata></metadata> |
|---|
| 5 | +<defs> |
|---|
| 6 | +<font id="glyphicons_halflingsregular" horiz-adv-x="1200" > |
|---|
| 7 | +<font-face units-per-em="1200" ascent="960" descent="-240" /> |
|---|
| 8 | +<missing-glyph horiz-adv-x="500" /> |
|---|
| 9 | +<glyph /> |
|---|
| 10 | +<glyph /> |
|---|
| 11 | +<glyph unicode="
" /> |
|---|
| 12 | +<glyph unicode=" " /> |
|---|
| 13 | +<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" /> |
|---|
| 14 | +<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" /> |
|---|
| 15 | +<glyph unicode=" " /> |
|---|
| 16 | +<glyph unicode=" " horiz-adv-x="652" /> |
|---|
| 17 | +<glyph unicode=" " horiz-adv-x="1304" /> |
|---|
| 18 | +<glyph unicode=" " horiz-adv-x="652" /> |
|---|
| 19 | +<glyph unicode=" " horiz-adv-x="1304" /> |
|---|
| 20 | +<glyph unicode=" " horiz-adv-x="434" /> |
|---|
| 21 | +<glyph unicode=" " horiz-adv-x="326" /> |
|---|
| 22 | +<glyph unicode=" " horiz-adv-x="217" /> |
|---|
| 23 | +<glyph unicode=" " horiz-adv-x="217" /> |
|---|
| 24 | +<glyph unicode=" " horiz-adv-x="163" /> |
|---|
| 25 | +<glyph unicode=" " horiz-adv-x="260" /> |
|---|
| 26 | +<glyph unicode=" " horiz-adv-x="72" /> |
|---|
| 27 | +<glyph unicode=" " horiz-adv-x="260" /> |
|---|
| 28 | +<glyph unicode=" " horiz-adv-x="326" /> |
|---|
| 29 | +<glyph unicode="€" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" /> |
|---|
| 30 | +<glyph unicode="−" d="M200 400h900v300h-900v-300z" /> |
|---|
| 31 | +<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" /> |
|---|
| 32 | +<glyph unicode="☁" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" /> |
|---|
| 33 | +<glyph unicode="✉" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" /> |
|---|
| 34 | +<glyph unicode="✏" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" /> |
|---|
| 35 | +<glyph unicode="" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" /> |
|---|
| 36 | +<glyph unicode="" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" /> |
|---|
| 37 | +<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" /> |
|---|
| 38 | +<glyph unicode="" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" /> |
|---|
| 39 | +<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" /> |
|---|
| 40 | +<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" /> |
|---|
| 41 | +<glyph unicode="" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" /> |
|---|
| 42 | +<glyph unicode="" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" /> |
|---|
| 43 | +<glyph unicode="" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" /> |
|---|
| 44 | +<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" /> |
|---|
| 45 | +<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" /> |
|---|
| 46 | +<glyph unicode="" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" /> |
|---|
| 47 | +<glyph unicode="" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" /> |
|---|
| 48 | +<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" /> |
|---|
| 49 | +<glyph unicode="" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" /> |
|---|
| 50 | +<glyph unicode="" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" /> |
|---|
| 51 | +<glyph unicode="" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" /> |
|---|
| 52 | +<glyph unicode="" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" /> |
|---|
| 53 | +<glyph unicode="" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" /> |
|---|
| 54 | +<glyph unicode="" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" /> |
|---|
| 55 | +<glyph unicode="" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" /> |
|---|
| 56 | +<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" /> |
|---|
| 57 | +<glyph unicode="" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" /> |
|---|
| 58 | +<glyph unicode="" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" /> |
|---|
| 59 | +<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" /> |
|---|
| 60 | +<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" /> |
|---|
| 61 | +<glyph unicode="" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" /> |
|---|
| 62 | +<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" /> |
|---|
| 63 | +<glyph unicode="" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" /> |
|---|
| 64 | +<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" /> |
|---|
| 65 | +<glyph unicode="" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" /> |
|---|
| 66 | +<glyph unicode="" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" /> |
|---|
| 67 | +<glyph unicode="" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" /> |
|---|
| 68 | +<glyph unicode="" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" /> |
|---|
| 69 | +<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" /> |
|---|
| 70 | +<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" /> |
|---|
| 71 | +<glyph unicode="" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" /> |
|---|
| 72 | +<glyph unicode="" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" /> |
|---|
| 73 | +<glyph unicode="" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" /> |
|---|
| 74 | +<glyph unicode="" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" /> |
|---|
| 75 | +<glyph unicode="" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" /> |
|---|
| 76 | +<glyph unicode="" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" /> |
|---|
| 77 | +<glyph unicode="" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" /> |
|---|
| 78 | +<glyph unicode="" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" /> |
|---|
| 79 | +<glyph unicode="" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" /> |
|---|
| 80 | +<glyph unicode="" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" /> |
|---|
| 81 | +<glyph unicode="" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" /> |
|---|
| 82 | +<glyph unicode="" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" /> |
|---|
| 83 | +<glyph unicode="" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " /> |
|---|
| 84 | +<glyph unicode="" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" /> |
|---|
| 85 | +<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" /> |
|---|
| 86 | +<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" /> |
|---|
| 87 | +<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" /> |
|---|
| 88 | +<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" /> |
|---|
| 89 | +<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" /> |
|---|
| 90 | +<glyph unicode="" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" /> |
|---|
| 91 | +<glyph unicode="" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" /> |
|---|
| 92 | +<glyph unicode="" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" /> |
|---|
| 93 | +<glyph unicode="" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " /> |
|---|
| 94 | +<glyph unicode="" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" /> |
|---|
| 95 | +<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" /> |
|---|
| 96 | +<glyph unicode="" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" /> |
|---|
| 97 | +<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" /> |
|---|
| 98 | +<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" /> |
|---|
| 99 | +<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" /> |
|---|
| 100 | +<glyph unicode="" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" /> |
|---|
| 101 | +<glyph unicode="" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" /> |
|---|
| 102 | +<glyph unicode="" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" /> |
|---|
| 103 | +<glyph unicode="" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" /> |
|---|
| 104 | +<glyph unicode="" d="M200 0l900 550l-900 550v-1100z" /> |
|---|
| 105 | +<glyph unicode="" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" /> |
|---|
| 106 | +<glyph unicode="" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" /> |
|---|
| 107 | +<glyph unicode="" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" /> |
|---|
| 108 | +<glyph unicode="" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" /> |
|---|
| 109 | +<glyph unicode="" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" /> |
|---|
| 110 | +<glyph unicode="" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" /> |
|---|
| 111 | +<glyph unicode="" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" /> |
|---|
| 112 | +<glyph unicode="" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" /> |
|---|
| 113 | +<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" /> |
|---|
| 114 | +<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" /> |
|---|
| 115 | +<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" /> |
|---|
| 116 | +<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" /> |
|---|
| 117 | +<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" /> |
|---|
| 118 | +<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" /> |
|---|
| 119 | +<glyph unicode="" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" /> |
|---|
| 120 | +<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" /> |
|---|
| 121 | +<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" /> |
|---|
| 122 | +<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" /> |
|---|
| 123 | +<glyph unicode="" d="M0 547l600 453v-300h600v-300h-600v-301z" /> |
|---|
| 124 | +<glyph unicode="" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" /> |
|---|
| 125 | +<glyph unicode="" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" /> |
|---|
| 126 | +<glyph unicode="" d="M104 600h296v600h300v-600h298l-449 -600z" /> |
|---|
| 127 | +<glyph unicode="" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" /> |
|---|
| 128 | +<glyph unicode="" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" /> |
|---|
| 129 | +<glyph unicode="" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" /> |
|---|
| 130 | +<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" /> |
|---|
| 131 | +<glyph unicode="" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" /> |
|---|
| 132 | +<glyph unicode="" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" /> |
|---|
| 133 | +<glyph unicode="" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" /> |
|---|
| 134 | +<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" /> |
|---|
| 135 | +<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" /> |
|---|
| 136 | +<glyph unicode="" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" /> |
|---|
| 137 | +<glyph unicode="" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" /> |
|---|
| 138 | +<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" /> |
|---|
| 139 | +<glyph unicode="" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" /> |
|---|
| 140 | +<glyph unicode="" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" /> |
|---|
| 141 | +<glyph unicode="" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" /> |
|---|
| 142 | +<glyph unicode="" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" /> |
|---|
| 143 | +<glyph unicode="" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" /> |
|---|
| 144 | +<glyph unicode="" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" /> |
|---|
| 145 | +<glyph unicode="" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" /> |
|---|
| 146 | +<glyph unicode="" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" /> |
|---|
| 147 | +<glyph unicode="" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" /> |
|---|
| 148 | +<glyph unicode="" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" /> |
|---|
| 149 | +<glyph unicode="" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" /> |
|---|
| 150 | +<glyph unicode="" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" /> |
|---|
| 151 | +<glyph unicode="" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" /> |
|---|
| 152 | +<glyph unicode="" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" /> |
|---|
| 153 | +<glyph unicode="" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" /> |
|---|
| 154 | +<glyph unicode="" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" /> |
|---|
| 155 | +<glyph unicode="" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" /> |
|---|
| 156 | +<glyph unicode="" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" /> |
|---|
| 157 | +<glyph unicode="" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" /> |
|---|
| 158 | +<glyph unicode="" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" /> |
|---|
| 159 | +<glyph unicode="" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" /> |
|---|
| 160 | +<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" /> |
|---|
| 161 | +<glyph unicode="" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" /> |
|---|
| 162 | +<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" /> |
|---|
| 163 | +<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" /> |
|---|
| 164 | +<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" /> |
|---|
| 165 | +<glyph unicode="" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" /> |
|---|
| 166 | +<glyph unicode="" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" /> |
|---|
| 167 | +<glyph unicode="" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" /> |
|---|
| 168 | +<glyph unicode="" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" /> |
|---|
| 169 | +<glyph unicode="" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" /> |
|---|
| 170 | +<glyph unicode="" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" /> |
|---|
| 171 | +<glyph unicode="" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" /> |
|---|
| 172 | +<glyph unicode="" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" /> |
|---|
| 173 | +<glyph unicode="" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" /> |
|---|
| 174 | +<glyph unicode="" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" /> |
|---|
| 175 | +<glyph unicode="" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" /> |
|---|
| 176 | +<glyph unicode="" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" /> |
|---|
| 177 | +<glyph unicode="" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" /> |
|---|
| 178 | +<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" /> |
|---|
| 179 | +<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" /> |
|---|
| 180 | +<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" /> |
|---|
| 181 | +<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" /> |
|---|
| 182 | +<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" /> |
|---|
| 183 | +<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" /> |
|---|
| 184 | +<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" /> |
|---|
| 185 | +<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" /> |
|---|
| 186 | +<glyph unicode="" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" /> |
|---|
| 187 | +<glyph unicode="" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" /> |
|---|
| 188 | +<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" /> |
|---|
| 189 | +<glyph unicode="" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" /> |
|---|
| 190 | +<glyph unicode="" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" /> |
|---|
| 191 | +<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " /> |
|---|
| 192 | +<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" /> |
|---|
| 193 | +<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" /> |
|---|
| 194 | +<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" /> |
|---|
| 195 | +<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" /> |
|---|
| 196 | +<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" /> |
|---|
| 197 | +<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" /> |
|---|
| 198 | +<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" /> |
|---|
| 199 | +<glyph unicode="" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" /> |
|---|
| 200 | +<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" /> |
|---|
| 201 | +<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" /> |
|---|
| 202 | +<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" /> |
|---|
| 203 | +<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" /> |
|---|
| 204 | +<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" /> |
|---|
| 205 | +<glyph unicode="" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" /> |
|---|
| 206 | +<glyph unicode="" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" /> |
|---|
| 207 | +<glyph unicode="" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" /> |
|---|
| 208 | +<glyph unicode="" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" /> |
|---|
| 209 | +<glyph unicode="" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" /> |
|---|
| 210 | +<glyph unicode="" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" /> |
|---|
| 211 | +<glyph unicode="" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" /> |
|---|
| 212 | +<glyph unicode="" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" /> |
|---|
| 213 | +<glyph unicode="" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" /> |
|---|
| 214 | +<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" /> |
|---|
| 215 | +<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" /> |
|---|
| 216 | +<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" /> |
|---|
| 217 | +<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" /> |
|---|
| 218 | +<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" /> |
|---|
| 219 | +<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" /> |
|---|
| 220 | +<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" /> |
|---|
| 221 | +<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" /> |
|---|
| 222 | +<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" /> |
|---|
| 223 | +<glyph unicode="" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" /> |
|---|
| 224 | +<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" /> |
|---|
| 225 | +<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" /> |
|---|
| 226 | +<glyph unicode="" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" /> |
|---|
| 227 | +<glyph unicode="" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" /> |
|---|
| 228 | +</font> |
|---|
| 229 | +</defs></svg> |
|---|
| .. | .. |
|---|
| 1 | + |
|---|
| 2 | + <div class="navbar navbar-inverse navbar-fixed-top"> |
|---|
| 3 | + <div class="container"> |
|---|
| 4 | + <div class="navbar-header"> |
|---|
| 5 | + <ul class="nav navbar-nav navbar-left"> |
|---|
| 6 | + <li i18n style="color: white; padding-top: 15px;">SeCuris</li> |
|---|
| 7 | + <li><a i18n href="/licenses">Licenses</a></li> |
|---|
| 8 | + <li><a i18n href="/admin">Admin</a></li> |
|---|
| 9 | + </ul> |
|---|
| 10 | + </div> |
|---|
| 11 | + <div class="navbar-collapse collapse"> |
|---|
| 12 | + <ul class="nav navbar-nav navbar-right"> |
|---|
| 13 | + <li><a i18n href="#about">About</a></li> |
|---|
| 14 | + <li><a i18n href="#contact">Contact</a></li> |
|---|
| 15 | + <li><a i18n ng-click="logout()">Logout</a></li> |
|---|
| 16 | + </ul> |
|---|
| 17 | + </div> |
|---|
| 18 | + </div> |
|---|
| 19 | + </div> |
|---|
| .. | .. |
|---|
| 1 | +# humanstxt.org/ |
|---|
| 2 | +# The humans responsible & technology colophon |
|---|
| 3 | + |
|---|
| 4 | +# TEAM |
|---|
| 5 | + |
|---|
| 6 | + <name> -- <role> -- <twitter> |
|---|
| 7 | + |
|---|
| 8 | +# THANKS |
|---|
| 9 | + |
|---|
| 10 | + <name> |
|---|
| 11 | + |
|---|
| 12 | +# TECHNOLOGY COLOPHON |
|---|
| 13 | + |
|---|
| 14 | + HTML5, CSS3 |
|---|
| 15 | + jQuery, Modernizr |
|---|
| .. | .. |
|---|
| 1 | +<html> |
|---|
| 2 | + <body> |
|---|
| 3 | + <h1>SeCuris Server</h1> |
|---|
| 4 | + </body> |
|---|
| 5 | +</html> |
|---|
| .. | .. |
|---|
| 1 | +(function() { |
|---|
| 2 | + 'use strict'; |
|---|
| 3 | + |
|---|
| 4 | + var app = angular.module('securis'); |
|---|
| 5 | + |
|---|
| 6 | + var HTTP_ERRORS = { |
|---|
| 7 | + 401: "Unathorized action", |
|---|
| 8 | + 403: "Forbidden action", |
|---|
| 9 | + 500: "Server error", |
|---|
| 10 | + 418: "Application error", |
|---|
| 11 | + 404: "Element not found" |
|---|
| 12 | + } |
|---|
| 13 | + |
|---|
| 14 | + app.directive( |
|---|
| 15 | + 'catalogField', |
|---|
| 16 | + function() { |
|---|
| 17 | + return { |
|---|
| 18 | + restrict : 'A', // only activate on element |
|---|
| 19 | + // attribute |
|---|
| 20 | + require : '?ngModel', // get a hold of |
|---|
| 21 | + // NgModelController |
|---|
| 22 | + link : function(scope, element, attrs, ngModel) { |
|---|
| 23 | + if (!ngModel) |
|---|
| 24 | + return; // do nothing if no ng-model |
|---|
| 25 | + // TODO: Replace the hard-coded form ID ('catalogForm') by the |
|---|
| 26 | + // appropiate dynamic field |
|---|
| 27 | + scope.catalogForm[attrs.name] = scope.catalogForm[scope.field.name]; |
|---|
| 28 | + scope.catalogForm[attrs.name].$name = attrs.name; |
|---|
| 29 | + } |
|---|
| 30 | + }; |
|---|
| 31 | + }); |
|---|
| 32 | + |
|---|
| 33 | + app.controller('AdminCtrl', [ |
|---|
| 34 | + '$scope', |
|---|
| 35 | + '$http', |
|---|
| 36 | + 'toaster', |
|---|
| 37 | + 'Catalogs', |
|---|
| 38 | + '$store', |
|---|
| 39 | + '$L', |
|---|
| 40 | + function($scope, $http, toaster, Catalogs, $store, $L) { |
|---|
| 41 | + $store.set('location', '/admin'); |
|---|
| 42 | + |
|---|
| 43 | + $scope.showForm = false; |
|---|
| 44 | + $scope.isNew = false; |
|---|
| 45 | + $scope.formu = {}; |
|---|
| 46 | + $scope.catalogIndex = 0; |
|---|
| 47 | + $scope.catalogMetadata = {}; |
|---|
| 48 | + $scope.catalogsList = null; |
|---|
| 49 | + $scope.list = null; |
|---|
| 50 | + |
|---|
| 51 | + |
|---|
| 52 | + var _changeCatalog = function(index) { |
|---|
| 53 | + $scope.showForm = false; |
|---|
| 54 | + $scope.formu = {}; |
|---|
| 55 | + if (!$scope.catalogsList) $scope.catalogsList = Catalogs.getList(); // catalog list is also in index.data |
|---|
| 56 | + if (typeof index === 'number') $scope.catalogIndex = index; |
|---|
| 57 | + Catalogs.setCurrent($scope.catalogIndex); |
|---|
| 58 | + $scope.catalogMetadata = Catalogs.getMetadata(); |
|---|
| 59 | + $scope.list = Catalogs.query(); |
|---|
| 60 | + $scope.refs = {} |
|---|
| 61 | + Catalogs.loadRefs(function(refs) { |
|---|
| 62 | + console.log('Updated refs in form'); |
|---|
| 63 | + console.log(refs); |
|---|
| 64 | + $scope.refs = refs; |
|---|
| 65 | + }); |
|---|
| 66 | + } |
|---|
| 67 | + |
|---|
| 68 | + Catalogs.init().then(_changeCatalog); |
|---|
| 69 | + |
|---|
| 70 | + $scope.selectCatalog = _changeCatalog; |
|---|
| 71 | + |
|---|
| 72 | + $scope.edit = function(data) { |
|---|
| 73 | + $scope.showForm = true; |
|---|
| 74 | + $scope.isNew = false; |
|---|
| 75 | + // Next line is a workaround due to some issues with values with ID == 0 |
|---|
| 76 | + $('select').val(null); |
|---|
| 77 | + $scope.formu = {} |
|---|
| 78 | + var fields = Catalogs.getMetadata().fields; |
|---|
| 79 | + console.log($scope); |
|---|
| 80 | + |
|---|
| 81 | + fields.forEach(function(field) { |
|---|
| 82 | + if (field.type === 'select') { |
|---|
| 83 | + // next lines are a workaround to avoid an issue where we try to show a form with "select" fields (if select field value doesn't change |
|---|
| 84 | + $scope.formu[field.name] = null; |
|---|
| 85 | + setTimeout(function() { |
|---|
| 86 | + $scope.formu[field.name] = data[field.name]; |
|---|
| 87 | + $scope.$apply(); |
|---|
| 88 | + }, 0); |
|---|
| 89 | + } else { |
|---|
| 90 | + if (!field.listingOnly) $scope.formu[field.name] = data[field.name] || null; |
|---|
| 91 | + } |
|---|
| 92 | + }) |
|---|
| 93 | + setTimeout(function() { |
|---|
| 94 | + $('#'+Catalogs.getFFF()).focus(); |
|---|
| 95 | + }, 0); |
|---|
| 96 | + } |
|---|
| 97 | + |
|---|
| 98 | + $scope.delete = function(data) { |
|---|
| 99 | + BootstrapDialog.confirm($L.get('The record will be deleted, are you sure?'), function(result){ |
|---|
| 100 | + if(result) { |
|---|
| 101 | + var promise = Catalogs.remove(data).$promise; |
|---|
| 102 | + promise.then(function(data) { |
|---|
| 103 | + $scope.list = Catalogs.query(); |
|---|
| 104 | + Catalogs.refreshRef($scope.refs, Catalogs.getMetadata().resource, $scope.list); |
|---|
| 105 | + toaster.pop('success', Catalogs.getName(), $L.get("Element deleted successfully")); |
|---|
| 106 | + },function(error) { |
|---|
| 107 | + console.log(error); |
|---|
| 108 | + toaster.pop('error', Catalogs.getName(), $L.get("Error deleting element, reason: {0}. Details: {1}", $L.get(HTTP_ERRORS[error.status]), error.headers('X-SECURIS-ERROR-MSG')), 10000); |
|---|
| 109 | + }); |
|---|
| 110 | + } |
|---|
| 111 | + }); |
|---|
| 112 | + $scope.showForm = false; |
|---|
| 113 | + $scope.isNew = false; |
|---|
| 114 | + } |
|---|
| 115 | + |
|---|
| 116 | + } ]); |
|---|
| 117 | + |
|---|
| 118 | + app.controller('CatalogFormCtrl', [ '$scope', '$http', 'toaster', 'Catalogs', '$L', |
|---|
| 119 | + function($scope, $http, toaster, Catalogs, $L) { |
|---|
| 120 | + $scope.scope = $scope; |
|---|
| 121 | + console.log('Form: currentCatalog:' + $scope.cataLogIndex); |
|---|
| 122 | + |
|---|
| 123 | + $scope.inputType = function(field) { |
|---|
| 124 | + |
|---|
| 125 | + if (field.readOnly && field.type === 'date') |
|---|
| 126 | + return 'readonly_date'; |
|---|
| 127 | + if (field.readOnly && (!field.pk || !$scope.isNew )) |
|---|
| 128 | + return 'readonly'; |
|---|
| 129 | + if (field.type === 'select') |
|---|
| 130 | + return 'select'; |
|---|
| 131 | + if (field.type === 'multiselect') |
|---|
| 132 | + return 'multiselect'; |
|---|
| 133 | + if (field.type === 'metadata') |
|---|
| 134 | + return 'metadata'; |
|---|
| 135 | + if (field.type === 'password') |
|---|
| 136 | + return 'password'; |
|---|
| 137 | + if (!field.multiline) |
|---|
| 138 | + return 'normal'; |
|---|
| 139 | + if (field.multiline) |
|---|
| 140 | + return 'textarea'; |
|---|
| 141 | + |
|---|
| 142 | + } |
|---|
| 143 | + |
|---|
| 144 | + $scope.editNew = function() { |
|---|
| 145 | + $scope.$parent.isNew = true; |
|---|
| 146 | + $scope.$parent.showForm = true; |
|---|
| 147 | + $('select').val(null); |
|---|
| 148 | + $scope.$parent.formu = {}; |
|---|
| 149 | + |
|---|
| 150 | + var fields = Catalogs.getMetadata().fields; |
|---|
| 151 | + fields.forEach(function(field) { |
|---|
| 152 | + if (!field.listingOnly) $scope.$parent.formu[field.name] = null; |
|---|
| 153 | + }) |
|---|
| 154 | + setTimeout(function() { |
|---|
| 155 | + $('#'+Catalogs.getFFF()).focus(); |
|---|
| 156 | + }, 0); |
|---|
| 157 | + |
|---|
| 158 | + } |
|---|
| 159 | + $scope.cancel = function() { |
|---|
| 160 | + $scope.$parent.showForm = false; |
|---|
| 161 | + $scope.catalogForm.$setPristine(); |
|---|
| 162 | + } |
|---|
| 163 | + |
|---|
| 164 | + $scope.saveCatalog = function() { |
|---|
| 165 | + if ($scope.catalogForm.$invalid) { |
|---|
| 166 | + toaster.pop('error', Catalogs.getName(), $L.get("There are wrong data in current form, please fix it before to save")); |
|---|
| 167 | + } else { |
|---|
| 168 | + var promise = Catalogs.save($scope.formu).$promise; |
|---|
| 169 | + promise.then(function(data, otro) { |
|---|
| 170 | + if ($scope.isNew) { |
|---|
| 171 | + $scope.catalogForm.$setPristine(); |
|---|
| 172 | + $scope.$parent.formu = {} |
|---|
| 173 | + $('#'+ Catalogs.getFFF()).focus(); |
|---|
| 174 | + } else { |
|---|
| 175 | + $scope.cancel(); |
|---|
| 176 | + } |
|---|
| 177 | + $scope.$parent.list = Catalogs.query(); |
|---|
| 178 | + Catalogs.refreshRef($scope.refs, Catalogs.getMetadata().resource, $scope.$parent.list); |
|---|
| 179 | + |
|---|
| 180 | + toaster.pop('success', Catalogs.getName(), $L.get("Element saved successfully")); |
|---|
| 181 | + }, function(error) { |
|---|
| 182 | + console.log(error); |
|---|
| 183 | + toaster.pop('error', Catalogs.getName(), $L.get("Error saving element, reason: {0}. Details: {1}", $L.get(HTTP_ERRORS[error.status]), error.headers('X-SECURIS-ERROR-MSG')), 10000); |
|---|
| 184 | + }); |
|---|
| 185 | + } |
|---|
| 186 | + } |
|---|
| 187 | + |
|---|
| 188 | + $scope.selectFieldChanged = function(onchangehandler) { |
|---|
| 189 | + if (onchangehandler) { |
|---|
| 190 | + $scope[onchangehandler](); |
|---|
| 191 | + } |
|---|
| 192 | + } |
|---|
| 193 | + // Metadata management |
|---|
| 194 | + |
|---|
| 195 | + $scope.createMetadataRow = function() { |
|---|
| 196 | + if (!$scope.formu.metadata) { |
|---|
| 197 | + $scope.formu.metadata = []; |
|---|
| 198 | + } |
|---|
| 199 | + $scope.formu.metadata.push({key: '', value: '', mandatory: true}); |
|---|
| 200 | + } |
|---|
| 201 | + $scope.removeMetadataKey = function(row_md) { |
|---|
| 202 | + $scope.formu.metadata.splice( $scope.formu.metadata.indexOf(row_md), 1 ); |
|---|
| 203 | + } |
|---|
| 204 | + $scope.updateMetadata = function() { |
|---|
| 205 | + // Called when Application ID change in current field |
|---|
| 206 | + var newAppId = $scope.formu['application_id']; |
|---|
| 207 | + if (newAppId) { |
|---|
| 208 | + // Only if there is a "valid" value selected we should update the metadata |
|---|
| 209 | + Catalogs.getResource('application').get({appId: newAppId}).$promise.then(function(app) { |
|---|
| 210 | + $scope.formu.metadata = []; |
|---|
| 211 | + app.metadata.forEach(function(md) { |
|---|
| 212 | + $scope.formu.metadata.push({ |
|---|
| 213 | + key: md.key, |
|---|
| 214 | + value: md.value, |
|---|
| 215 | + mandatory: md.mandatory |
|---|
| 216 | + }); |
|---|
| 217 | + }); |
|---|
| 218 | + }); |
|---|
| 219 | + } |
|---|
| 220 | + } |
|---|
| 221 | + |
|---|
| 222 | + } ]); |
|---|
| 223 | + |
|---|
| 224 | + app.controller('CatalogListCtrl', [ '$scope', '$http', '$filter', 'Catalogs', |
|---|
| 225 | + function($scope, $http, $filter, Catalogs) { |
|---|
| 226 | + |
|---|
| 227 | + $scope.print = function(name, row) { |
|---|
| 228 | + var value = row[name]; |
|---|
| 229 | + var type = Catalogs.getField(name).type; |
|---|
| 230 | + var printedValue = type === 'date' ? $filter('date')(value, 'yyyy-MM-dd') : value; |
|---|
| 231 | + if (printedValue !== value) // this line is a work around to allow search in formatted fields |
|---|
| 232 | + row['_display_'+name] = printedValue; |
|---|
| 233 | + return printedValue; |
|---|
| 234 | + } |
|---|
| 235 | + |
|---|
| 236 | + $scope.display = function(name) { |
|---|
| 237 | + return Catalogs.getField(name).display; |
|---|
| 238 | + } |
|---|
| 239 | + |
|---|
| 240 | + } ]); |
|---|
| 241 | + |
|---|
| 242 | +})(); |
|---|
| .. | .. |
|---|
| 1 | +/* |
|---|
| 2 | + AngularJS v1.3.0 |
|---|
| 3 | + (c) 2010-2014 Google, Inc. http://angularjs.org |
|---|
| 4 | + License: MIT |
|---|
| 5 | +*/ |
|---|
| 6 | +(function(M,f,S){'use strict';f.module("ngAnimate",["ng"]).directive("ngAnimateChildren",function(){return function(T,B,k){k=k.ngAnimateChildren;f.isString(k)&&0===k.length?B.data("$$ngAnimateChildren",!0):T.$watch(k,function(f){B.data("$$ngAnimateChildren",!!f)})}}).factory("$$animateReflow",["$$rAF","$document",function(f,B){return function(k){return f(function(){k()})}}]).config(["$provide","$animateProvider",function(T,B){function k(f){for(var g=0;g<f.length;g++){var k=f[g];if(1==k.nodeType)return k}} |
|---|
| 7 | +function N(f,g){return k(f)==k(g)}var s=f.noop,g=f.forEach,ba=B.$$selectors,$=f.isArray,ca=f.isString,da=f.isObject,t={running:!0};T.decorator("$animate",["$delegate","$$q","$injector","$sniffer","$rootElement","$$asyncCallback","$rootScope","$document","$templateRequest",function(O,M,I,U,x,C,P,S,V){function A(a,c){var b=a.data("$$ngAnimateState")||{};c&&(b.running=!0,b.structural=!0,a.data("$$ngAnimateState",b));return b.disabled||b.running&&b.structural}function z(a){var c,b=M.defer();b.promise.$$cancelFn= |
|---|
| 8 | +function(){c&&c()};P.$$postDigest(function(){c=a(function(){b.resolve()})});return b.promise}function J(a){if(da(a))return a.tempClasses&&ca(a.tempClasses)&&(a.tempClasses=a.tempClasses.split(/\s+/)),a}function W(a,c,b){b=b||{};var e={};g(b,function(a,d){g(d.split(" "),function(d){e[d]=a})});var m=Object.create(null);g((a.attr("class")||"").split(/\s+/),function(a){m[a]=!0});var f=[],k=[];g(c.classes,function(a,d){var b=m[d],c=e[d]||{};!1===a?(b||"addClass"==c.event)&&k.push(d):!0===a&&(b&&"removeClass"!= |
|---|
| 9 | +c.event||f.push(d))});return 0<f.length+k.length&&[f.join(" "),k.join(" ")]}function Q(a){if(a){var c=[],b={};a=a.substr(1).split(".");(U.transitions||U.animations)&&c.push(I.get(ba[""]));for(var e=0;e<a.length;e++){var f=a[e],k=ba[f];k&&!b[f]&&(c.push(I.get(k)),b[f]=!0)}return c}}function R(a,c,b,e){function m(a,d){var b=a[d],c=a["before"+d.charAt(0).toUpperCase()+d.substr(1)];if(b||c)return"leave"==d&&(c=b,b=null),l.push({event:d,fn:b}),H.push({event:d,fn:c}),!0}function k(c,h,G){var w=[];g(c,function(a){a.fn&& |
|---|
| 10 | +w.push(a)});var f=0;g(w,function(c,n){var u=function(){a:{if(h){(h[n]||s)();if(++f<w.length)break a;h=null}G()}};switch(c.event){case "setClass":h.push(c.fn(a,F,d,u,e));break;case "animate":h.push(c.fn(a,b,e.from,e.to,u));break;case "addClass":h.push(c.fn(a,F||b,u,e));break;case "removeClass":h.push(c.fn(a,d||b,u,e));break;default:h.push(c.fn(a,u,e))}});h&&0===h.length&&G()}var p=a[0];if(p){e&&(e.to=e.to||{},e.from=e.from||{});var F,d;$(b)&&(F=b[0],d=b[1],F?d?b=F+" "+d:(b=F,c="addClass"):(b=d,c="removeClass")); |
|---|
| 11 | +var h="setClass"==c,G=h||"addClass"==c||"removeClass"==c||"animate"==c,w=a.attr("class")+" "+b;if(X(w)){var u=s,n=[],H=[],q=s,r=[],l=[],w=(" "+w).replace(/\s+/g,".");g(Q(w),function(a){!m(a,c)&&h&&(m(a,"addClass"),m(a,"removeClass"))});return{node:p,event:c,className:b,isClassBased:G,isSetClassOperation:h,applyStyles:function(){e&&a.css(f.extend(e.from||{},e.to||{}))},before:function(a){u=a;k(H,n,function(){u=s;a()})},after:function(a){q=a;k(l,r,function(){q=s;a()})},cancel:function(){n&&(g(n,function(a){(a|| |
|---|
| 12 | +s)(!0)}),u(!0));r&&(g(r,function(a){(a||s)(!0)}),q(!0))}}}}}function y(a,c,b,e,m,k,p,F){function d(d){var h="$animate:"+d;H&&H[h]&&0<H[h].length&&C(function(){b.triggerHandler(h,{event:a,className:c})})}function h(){d("before")}function G(){d("after")}function w(){w.hasBeenRun||(w.hasBeenRun=!0,k())}function u(){if(!u.hasBeenRun){n&&n.applyStyles();u.hasBeenRun=!0;p&&p.tempClasses&&g(p.tempClasses,function(a){b.removeClass(a)});var h=b.data("$$ngAnimateState");h&&(n&&n.isClassBased?l(b,c):(C(function(){var d= |
|---|
| 13 | +b.data("$$ngAnimateState")||{};v==d.index&&l(b,c,a)}),b.data("$$ngAnimateState",h)));d("close");F()}}var n=R(b,a,c,p);if(!n)return w(),h(),G(),u(),s;a=n.event;c=n.className;var H=f.element._data(n.node),H=H&&H.events;e||(e=m?m.parent():b.parent());if(Y(b,e))return w(),h(),G(),u(),s;e=b.data("$$ngAnimateState")||{};var q=e.active||{},r=e.totalActive||0,t=e.last;m=!1;if(0<r){r=[];if(n.isClassBased)"setClass"==t.event?(r.push(t),l(b,c)):q[c]&&(aa=q[c],aa.event==a?m=!0:(r.push(aa),l(b,c)));else if("leave"== |
|---|
| 14 | +a&&q["ng-leave"])m=!0;else{for(var aa in q)r.push(q[aa]);e={};l(b,!0)}0<r.length&&g(r,function(a){a.cancel()})}!n.isClassBased||n.isSetClassOperation||"animate"==a||m||(m="addClass"==a==b.hasClass(c));if(m)return w(),h(),G(),d("close"),F(),s;q=e.active||{};r=e.totalActive||0;if("leave"==a)b.one("$destroy",function(a){a=f.element(this);var d=a.data("$$ngAnimateState");d&&(d=d.active["ng-leave"])&&(d.cancel(),l(a,"ng-leave"))});b.addClass("ng-animate");p&&p.tempClasses&&g(p.tempClasses,function(a){b.addClass(a)}); |
|---|
| 15 | +var v=Z++;r++;q[c]=n;b.data("$$ngAnimateState",{last:n,active:q,index:v,totalActive:r});h();n.before(function(d){var h=b.data("$$ngAnimateState");d=d||!h||!h.active[c]||n.isClassBased&&h.active[c].event!=a;w();!0===d?u():(G(),n.after(u))});return n.cancel}function K(a){if(a=k(a))a=f.isFunction(a.getElementsByClassName)?a.getElementsByClassName("ng-animate"):a.querySelectorAll(".ng-animate"),g(a,function(a){a=f.element(a);(a=a.data("$$ngAnimateState"))&&a.active&&g(a.active,function(a){a.cancel()})})} |
|---|
| 16 | +function l(a,c){if(N(a,x))t.disabled||(t.running=!1,t.structural=!1);else if(c){var b=a.data("$$ngAnimateState")||{},e=!0===c;!e&&b.active&&b.active[c]&&(b.totalActive--,delete b.active[c]);if(e||!b.totalActive)a.removeClass("ng-animate"),a.removeData("$$ngAnimateState")}}function Y(a,c){if(t.disabled)return!0;if(N(a,x))return t.running;var b,e,k;do{if(0===c.length)break;var g=N(c,x),p=g?t:c.data("$$ngAnimateState")||{};if(p.disabled)return!0;g&&(k=!0);!1!==b&&(g=c.data("$$ngAnimateChildren"),f.isDefined(g)&& |
|---|
| 17 | +(b=g));e=e||p.running||p.last&&!p.last.isClassBased}while(c=c.parent());return!k||!b&&e}x.data("$$ngAnimateState",t);var L=P.$watch(function(){return V.totalPendingRequests},function(a,c){0===a&&(L(),P.$$postDigest(function(){P.$$postDigest(function(){t.running=!1})}))}),Z=0,E=B.classNameFilter(),X=E?function(a){return E.test(a)}:function(){return!0};return{animate:function(a,c,b,e,g){e=e||"ng-inline-animate";g=J(g)||{};g.from=b?c:null;g.to=b?b:c;return z(function(b){return y("animate",e,f.element(k(a)), |
|---|
| 18 | +null,null,s,g,b)})},enter:function(a,c,b,e){e=J(e);a=f.element(a);c=c&&f.element(c);b=b&&f.element(b);A(a,!0);O.enter(a,c,b);return z(function(g){return y("enter","ng-enter",f.element(k(a)),c,b,s,e,g)})},leave:function(a,c){c=J(c);a=f.element(a);K(a);A(a,!0);return z(function(b){return y("leave","ng-leave",f.element(k(a)),null,null,function(){O.leave(a)},c,b)})},move:function(a,c,b,e){e=J(e);a=f.element(a);c=c&&f.element(c);b=b&&f.element(b);K(a);A(a,!0);O.move(a,c,b);return z(function(g){return y("move", |
|---|
| 19 | +"ng-move",f.element(k(a)),c,b,s,e,g)})},addClass:function(a,c,b){return this.setClass(a,c,[],b)},removeClass:function(a,c,b){return this.setClass(a,[],c,b)},setClass:function(a,c,b,e){e=J(e);a=f.element(a);a=f.element(k(a));if(A(a))return O.$$setClassImmediately(a,c,b,e);var m,l=a.data("$$animateClasses"),p=!!l;l||(l={classes:{}});m=l.classes;c=$(c)?c:c.split(" ");g(c,function(a){a&&a.length&&(m[a]=!0)});b=$(b)?b:b.split(" ");g(b,function(a){a&&a.length&&(m[a]=!1)});if(p)return e&&l.options&&(l.options= |
|---|
| 20 | +f.extend(l.options||{},e)),l.promise;a.data("$$animateClasses",l={classes:m,options:e});return l.promise=z(function(b){var d=a.parent(),h=k(a),c=h.parentNode;if(!c||c.$$NG_REMOVED||h.$$NG_REMOVED)b();else{h=a.data("$$animateClasses");a.removeData("$$animateClasses");var c=a.data("$$ngAnimateState")||{},e=W(a,h,c.active);return e?y("setClass",e,a,d,null,function(){e[0]&&O.$$addClassImmediately(a,e[0]);e[1]&&O.$$removeClassImmediately(a,e[1])},h.options,b):b()}})},cancel:function(a){a.$$cancelFn()}, |
|---|
| 21 | +enabled:function(a,c){switch(arguments.length){case 2:if(a)l(c);else{var b=c.data("$$ngAnimateState")||{};b.disabled=!0;c.data("$$ngAnimateState",b)}break;case 1:t.disabled=!a;break;default:a=!t.disabled}return!!a}}}]);B.register("",["$window","$sniffer","$timeout","$$animateReflow",function(t,B,I,U){function x(){e||(e=U(function(){b=[];e=null;a={}}))}function C(c,d){e&&e();b.push(d);e=U(function(){g(b,function(a){a()});b=[];e=null;a={}})}function P(a,d){var h=k(a);a=f.element(h);p.push(a);h=Date.now()+ |
|---|
| 22 | +d;h<=N||(I.cancel(m),N=h,m=I(function(){T(p);p=[]},d,!1))}function T(a){g(a,function(a){(a=a.data("$$ngAnimateCSS3Data"))&&g(a.closeAnimationFns,function(a){a()})})}function V(b,d){var h=d?a[d]:null;if(!h){var c=0,e=0,f=0,k=0;g(b,function(a){if(1==a.nodeType){a=t.getComputedStyle(a)||{};c=Math.max(A(a[L+"Duration"]),c);e=Math.max(A(a[L+"Delay"]),e);k=Math.max(A(a[E+"Delay"]),k);var d=A(a[E+"Duration"]);0<d&&(d*=parseInt(a[E+"IterationCount"],10)||1);f=Math.max(d,f)}});h={total:0,transitionDelay:e, |
|---|
| 23 | +transitionDuration:c,animationDelay:k,animationDuration:f};d&&(a[d]=h)}return h}function A(a){var d=0;a=ca(a)?a.split(/\s*,\s*/):[];g(a,function(a){d=Math.max(parseFloat(a)||0,d)});return d}function z(b,d,h,e){b=0<=["ng-enter","ng-leave","ng-move"].indexOf(h);var f,g=d.parent(),n=g.data("$$ngAnimateKey");n||(g.data("$$ngAnimateKey",++c),n=c);f=n+"-"+k(d).getAttribute("class");var g=f+" "+h,n=a[g]?++a[g].total:0,l={};if(0<n){var q=h+"-stagger",l=f+" "+q;(f=!a[l])&&d.addClass(q);l=V(d,l);f&&d.removeClass(q)}d.addClass(h); |
|---|
| 24 | +var q=d.data("$$ngAnimateCSS3Data")||{},r=V(d,g);f=r.transitionDuration;r=r.animationDuration;if(b&&0===f&&0===r)return d.removeClass(h),!1;h=e||b&&0<f;b=0<r&&0<l.animationDelay&&0===l.animationDuration;d.data("$$ngAnimateCSS3Data",{stagger:l,cacheKey:g,running:q.running||0,itemIndex:n,blockTransition:h,closeAnimationFns:q.closeAnimationFns||[]});g=k(d);h&&(W(g,!0),e&&d.css(e));b&&(g.style[E+"PlayState"]="paused");return!0}function J(a,d,b,c,e){function f(){d.off(C,l);d.removeClass(q);d.removeClass(r); |
|---|
| 25 | +z&&I.cancel(z);K(d,b);var a=k(d),c;for(c in p)a.style.removeProperty(p[c])}function l(a){a.stopPropagation();var d=a.originalEvent||a;a=d.$manualTimeStamp||d.timeStamp||Date.now();d=parseFloat(d.elapsedTime.toFixed(3));Math.max(a-B,0)>=A&&d>=x&&c()}var m=k(d);a=d.data("$$ngAnimateCSS3Data");if(-1!=m.getAttribute("class").indexOf(b)&&a){var q="",r="";g(b.split(" "),function(a,d){var b=(0<d?" ":"")+a;q+=b+"-active";r+=b+"-pending"});var p=[],t=a.itemIndex,v=a.stagger,s=0;if(0<t){s=0;0<v.transitionDelay&& |
|---|
| 26 | +0===v.transitionDuration&&(s=v.transitionDelay*t);var y=0;0<v.animationDelay&&0===v.animationDuration&&(y=v.animationDelay*t,p.push(Y+"animation-play-state"));s=Math.round(100*Math.max(s,y))/100}s||(d.addClass(q),a.blockTransition&&W(m,!1));var D=V(d,a.cacheKey+" "+q),x=Math.max(D.transitionDuration,D.animationDuration);if(0===x)d.removeClass(q),K(d,b),c();else{!s&&e&&(D.transitionDuration||(d.css("transition",D.animationDuration+"s linear all"),p.push("transition")),d.css(e));var t=Math.max(D.transitionDelay, |
|---|
| 27 | +D.animationDelay),A=1E3*t;0<p.length&&(v=m.getAttribute("style")||"",";"!==v.charAt(v.length-1)&&(v+=";"),m.setAttribute("style",v+" "));var B=Date.now(),C=X+" "+Z,t=1E3*(s+1.5*(t+x)),z;0<s&&(d.addClass(r),z=I(function(){z=null;0<D.transitionDuration&&W(m,!1);0<D.animationDuration&&(m.style[E+"PlayState"]="");d.addClass(q);d.removeClass(r);e&&(0===D.transitionDuration&&d.css("transition",D.animationDuration+"s linear all"),d.css(e),p.push("transition"))},1E3*s,!1));d.on(C,l);a.closeAnimationFns.push(function(){f(); |
|---|
| 28 | +c()});a.running++;P(d,t);return f}}else c()}function W(a,d){a.style[L+"Property"]=d?"none":""}function Q(a,d,b,c){if(z(a,d,b,c))return function(a){a&&K(d,b)}}function R(a,d,b,c,e){if(d.data("$$ngAnimateCSS3Data"))return J(a,d,b,c,e);K(d,b);c()}function y(a,d,b,c,e){var f=Q(a,d,b,e.from);if(f){var g=f;C(d,function(){g=R(a,d,b,c,e.to)});return function(a){(g||s)(a)}}x();c()}function K(a,d){a.removeClass(d);var b=a.data("$$ngAnimateCSS3Data");b&&(b.running&&b.running--,b.running&&0!==b.running||a.removeData("$$ngAnimateCSS3Data"))} |
|---|
| 29 | +function l(a,d){var b="";a=$(a)?a:a.split(/\s+/);g(a,function(a,c){a&&0<a.length&&(b+=(0<c?" ":"")+a+d)});return b}var Y="",L,Z,E,X;M.ontransitionend===S&&M.onwebkittransitionend!==S?(Y="-webkit-",L="WebkitTransition",Z="webkitTransitionEnd transitionend"):(L="transition",Z="transitionend");M.onanimationend===S&&M.onwebkitanimationend!==S?(Y="-webkit-",E="WebkitAnimation",X="webkitAnimationEnd animationend"):(E="animation",X="animationend");var a={},c=0,b=[],e,m=null,N=0,p=[];return{animate:function(a, |
|---|
| 30 | +d,b,c,e,f){f=f||{};f.from=b;f.to=c;return y("animate",a,d,e,f)},enter:function(a,b,c){c=c||{};return y("enter",a,"ng-enter",b,c)},leave:function(a,b,c){c=c||{};return y("leave",a,"ng-leave",b,c)},move:function(a,b,c){c=c||{};return y("move",a,"ng-move",b,c)},beforeSetClass:function(a,b,c,e,f){f=f||{};b=l(c,"-remove")+" "+l(b,"-add");if(f=Q("setClass",a,b,f.from))return C(a,e),f;x();e()},beforeAddClass:function(a,b,c,e){e=e||{};if(b=Q("addClass",a,l(b,"-add"),e.from))return C(a,c),b;x();c()},beforeRemoveClass:function(a, |
|---|
| 31 | +b,c,e){e=e||{};if(b=Q("removeClass",a,l(b,"-remove"),e.from))return C(a,c),b;x();c()},setClass:function(a,b,c,e,f){f=f||{};c=l(c,"-remove");b=l(b,"-add");return R("setClass",a,c+" "+b,e,f.to)},addClass:function(a,b,c,e){e=e||{};return R("addClass",a,l(b,"-add"),c,e.to)},removeClass:function(a,b,c,e){e=e||{};return R("removeClass",a,l(b,"-remove"),c,e.to)}}}])}])})(window,window.angular); |
|---|
| 32 | +//# sourceMappingURL=angular-animate.min.js.map |
|---|
| .. | .. |
|---|
| 1 | +{ |
|---|
| 2 | +"version":3, |
|---|
| 3 | +"file":"angular-animate.min.js", |
|---|
| 4 | +"lineCount":31, |
|---|
| 5 | +"mappings":"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", |
|---|
| 6 | +"sources":["angular-animate.js"], |
|---|
| 7 | +"names":["window","angular","undefined","module","directive","scope","element","attrs","val","ngAnimateChildren","isString","length","data","NG_ANIMATE_CHILDREN","$watch","value","factory","$$rAF","$document","fn","config","$provide","$animateProvider","extractElementNode","i","elm","ELEMENT_NODE","nodeType","isMatchingElement","elm1","elm2","noop","forEach","selectors","$$selectors","isArray","isObject","rootAnimateState","running","decorator","$delegate","$$q","$injector","$sniffer","$rootElement","$$asyncCallback","$rootScope","$templateRequest","classBasedAnimationsBlocked","setter","NG_ANIMATE_STATE","structural","disabled","runAnimationPostDigest","cancelFn","defer","promise","$$cancelFn","defer.promise.$$cancelFn","$$postDigest","resolve","parseAnimateOptions","options","tempClasses","split","resolveElementClasses","cache","runningAnimations","lookup","selector","s","hasClasses","Object","create","attr","className","toAdd","toRemove","classes","status","hasClass","matchingAnimation","event","push","join","name","matches","flagMap","substr","transitions","animations","get","klass","selectorFactoryName","animationRunner","animationEvent","registerAnimation","animationFactory","afterFn","beforeFn","charAt","toUpperCase","after","before","run","fns","cancellations","allCompleteFn","animation","count","index","progress","classNameAdd","classNameRemove","from","to","node","isSetClassOperation","isClassBased","currentClassName","isAnimatableClassName","beforeComplete","beforeCancel","afterComplete","afterCancel","animationLookup","replace","created","applyStyles","css","extend","cancel","performAnimation","parentElement","afterElement","domOperation","doneCallback","fireDOMCallback","animationPhase","eventName","elementEvents","triggerHandler","fireBeforeCallbackAsync","fireAfterCallbackAsync","fireDOMOperation","hasBeenRun","closeAnimation","runner","removeClass","cleanup","localAnimationCount","_data","events","parent","animationsDisabled","ngAnimateState","active","totalActiveAnimations","totalActive","lastAnimation","last","skipAnimation","animationsToCancel","current","operation","one","e","state","activeLeaveAnimation","addClass","NG_ANIMATE_CLASS_NAME","globalAnimationCounter","cancelled","cancelChildAnimations","nodes","isFunction","getElementsByClassName","querySelectorAll","removeAnimations","removeData","allowChildAnimations","parentRunningAnimation","hasParent","isRoot","animateChildrenFlag","isDefined","deregisterWatch","totalPendingRequests","oldVal","classNameFilter","test","animate","done","enter","leave","move","setClass","add","remove","$$setClassImmediately","STORAGE_KEY","hasCache","c","elementNode","parentNode","$$addClassImmediately","$$removeClassImmediately","enabled","arguments","register","$window","$timeout","$$animateReflow","clearCacheAfterReflow","cancelAnimationReflow","animationReflowQueue","lookupCache","afterReflow","callback","animationCloseHandler","totalTime","animationElementQueue","futureTimestamp","Date","now","closingTimestamp","closingTimer","closeAllAnimations","elements","elementData","NG_ANIMATE_CSS_DATA_KEY","closeAnimationFns","getElementAnimationDetails","cacheKey","transitionDuration","transitionDelay","animationDuration","animationDelay","elementStyles","getComputedStyle","Math","max","parseMaxTime","transitionDurationStyle","TRANSITION_PROP","DURATION_KEY","transitionDelayStyle","DELAY_KEY","ANIMATION_PROP","aDuration","parseInt","ANIMATION_ITERATION_COUNT_KEY","total","str","maxValue","values","parseFloat","animateSetup","styles","indexOf","parentID","NG_ANIMATE_PARENT_KEY","parentCounter","getAttribute","eventCacheKey","itemIndex","stagger","staggerClassName","staggerCacheKey","applyClasses","formerData","timings","blockTransition","blockAnimation","blockTransitions","style","ANIMATION_PLAYSTATE_KEY","animateRun","activeAnimationComplete","onEnd","off","css3AnimationEvents","onAnimationProgress","activeClassName","pendingClassName","staggerTimeout","animateClose","appliedStyles","removeProperty","stopPropagation","ev","originalEvent","timeStamp","$manualTimeStamp","elapsedTime","toFixed","ELAPSED_TIME_MAX_DECIMAL_PLACES","startTime","maxDelayTime","maxDuration","prefix","staggerTime","transitionStaggerDelay","animationStaggerDelay","CSS_PREFIX","round","maxDelay","ONE_SECOND","oldStyle","setAttribute","ANIMATIONEND_EVENT","TRANSITIONEND_EVENT","CLOSING_TIME_BUFFER","on","bool","PROPERTY_KEY","animateBefore","animateAfter","afterAnimationComplete","animationComplete","preReflowCancellation","suffixClasses","suffix","ontransitionend","onwebkittransitionend","onanimationend","onwebkitanimationend","animationCompleted","beforeSetClass","cancellationMethod","beforeAddClass","beforeRemoveClass"] |
|---|
| 8 | +} |
|---|
| .. | .. |
|---|
| 1 | +/* |
|---|
| 2 | + AngularJS v1.3.0 |
|---|
| 3 | + (c) 2010-2014 Google, Inc. http://angularjs.org |
|---|
| 4 | + License: MIT |
|---|
| 5 | +*/ |
|---|
| 6 | +(function(I,d,B){'use strict';function D(f,q){q=q||{};d.forEach(q,function(d,h){delete q[h]});for(var h in f)!f.hasOwnProperty(h)||"$"===h.charAt(0)&&"$"===h.charAt(1)||(q[h]=f[h]);return q}var w=d.$$minErr("$resource"),C=/^(\.[a-zA-Z_$][0-9a-zA-Z_$]*)+$/;d.module("ngResource",["ng"]).provider("$resource",function(){var f=this;this.defaults={stripTrailingSlashes:!0,actions:{get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}}}; |
|---|
| 7 | +this.$get=["$http","$q",function(q,h){function t(d,g){this.template=d;this.defaults=s({},f.defaults,g);this.urlParams={}}function v(x,g,l,m){function c(b,k){var c={};k=s({},g,k);r(k,function(a,k){u(a)&&(a=a());var d;if(a&&a.charAt&&"@"==a.charAt(0)){d=b;var e=a.substr(1);if(null==e||""===e||"hasOwnProperty"===e||!C.test("."+e))throw w("badmember",e);for(var e=e.split("."),n=0,g=e.length;n<g&&d!==B;n++){var h=e[n];d=null!==d?d[h]:B}}else d=a;c[k]=d});return c}function F(b){return b.resource}function e(b){D(b|| |
|---|
| 8 | +{},this)}var G=new t(x,m);l=s({},f.defaults.actions,l);e.prototype.toJSON=function(){var b=s({},this);delete b.$promise;delete b.$resolved;return b};r(l,function(b,k){var g=/^(POST|PUT|PATCH)$/i.test(b.method);e[k]=function(a,y,m,x){var n={},f,l,z;switch(arguments.length){case 4:z=x,l=m;case 3:case 2:if(u(y)){if(u(a)){l=a;z=y;break}l=y;z=m}else{n=a;f=y;l=m;break}case 1:u(a)?l=a:g?f=a:n=a;break;case 0:break;default:throw w("badargs",arguments.length);}var t=this instanceof e,p=t?f:b.isArray?[]:new e(f), |
|---|
| 9 | +A={},v=b.interceptor&&b.interceptor.response||F,C=b.interceptor&&b.interceptor.responseError||B;r(b,function(b,a){"params"!=a&&"isArray"!=a&&"interceptor"!=a&&(A[a]=H(b))});g&&(A.data=f);G.setUrlParams(A,s({},c(f,b.params||{}),n),b.url);n=q(A).then(function(a){var c=a.data,g=p.$promise;if(c){if(d.isArray(c)!==!!b.isArray)throw w("badcfg",k,b.isArray?"array":"object",d.isArray(c)?"array":"object");b.isArray?(p.length=0,r(c,function(a){"object"===typeof a?p.push(new e(a)):p.push(a)})):(D(c,p),p.$promise= |
|---|
| 10 | +g)}p.$resolved=!0;a.resource=p;return a},function(a){p.$resolved=!0;(z||E)(a);return h.reject(a)});n=n.then(function(a){var b=v(a);(l||E)(b,a.headers);return b},C);return t?n:(p.$promise=n,p.$resolved=!1,p)};e.prototype["$"+k]=function(a,b,c){u(a)&&(c=b,b=a,a={});a=e[k].call(this,a,this,b,c);return a.$promise||a}});e.bind=function(b){return v(x,s({},g,b),l)};return e}var E=d.noop,r=d.forEach,s=d.extend,H=d.copy,u=d.isFunction;t.prototype={setUrlParams:function(f,g,l){var m=this,c=l||m.template,h, |
|---|
| 11 | +e,q=m.urlParams={};r(c.split(/\W/),function(b){if("hasOwnProperty"===b)throw w("badname");!/^\d+$/.test(b)&&b&&(new RegExp("(^|[^\\\\]):"+b+"(\\W|$)")).test(c)&&(q[b]=!0)});c=c.replace(/\\:/g,":");g=g||{};r(m.urlParams,function(b,k){h=g.hasOwnProperty(k)?g[k]:m.defaults[k];d.isDefined(h)&&null!==h?(e=encodeURIComponent(h).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"%20").replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+"),c=c.replace(new RegExp(":"+ |
|---|
| 12 | +k+"(\\W|$)","g"),function(b,a){return e+a})):c=c.replace(new RegExp("(/?):"+k+"(\\W|$)","g"),function(b,a,c){return"/"==c.charAt(0)?c:a+c})});m.defaults.stripTrailingSlashes&&(c=c.replace(/\/+$/,"")||"/");c=c.replace(/\/\.(?=\w+($|\?))/,".");f.url=c.replace(/\/\\\./,"/.");r(g,function(b,c){m.urlParams[c]||(f.params=f.params||{},f.params[c]=b)})}};return v}]})})(window,window.angular); |
|---|
| 13 | +//# sourceMappingURL=angular-resource.min.js.map |
|---|
| .. | .. |
|---|
| 1 | +{ |
|---|
| 2 | +"version":3, |
|---|
| 3 | +"file":"angular-resource.min.js", |
|---|
| 4 | +"lineCount":12, |
|---|
| 5 | +"mappings":"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", |
|---|
| 6 | +"sources":["angular-resource.js"], |
|---|
| 7 | +"names":["window","angular","undefined","shallowClearAndCopy","src","dst","forEach","value","key","hasOwnProperty","charAt","$resourceMinErr","$$minErr","MEMBER_NAME_REGEX","module","provider","defaults","stripTrailingSlashes","actions","method","isArray","$get","$http","$q","Route","template","extend","urlParams","resourceFactory","url","paramDefaults","options","extractParams","data","actionParams","ids","isFunction","path","test","keys","split","i","ii","length","obj","defaultResponseInterceptor","response","resource","Resource","route","prototype","toJSON","Resource.prototype.toJSON","$promise","$resolved","action","name","hasBody","a1","a2","a3","a4","params","success","error","arguments","isInstanceCall","httpConfig","responseInterceptor","interceptor","responseErrorInterceptor","responseError","copy","setUrlParams","promise","then","item","push","noop","reject","headers","result","call","bind","Resource.bind","additionalParamDefaults","config","actionUrl","self","val","encodedVal","param","RegExp","replace","_","urlParam","isDefined","encodeURIComponent","match","p1","leadingSlashes","tail"] |
|---|
| 8 | +} |
|---|
| .. | .. |
|---|
| 1 | +/* |
|---|
| 2 | + AngularJS v1.3.0 |
|---|
| 3 | + (c) 2010-2014 Google, Inc. http://angularjs.org |
|---|
| 4 | + License: MIT |
|---|
| 5 | +*/ |
|---|
| 6 | +(function(p,e,B){'use strict';function u(q,h,f){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(a,b,c,g,x){function y(){k&&(f.cancel(k),k=null);l&&(l.$destroy(),l=null);m&&(k=f.leave(m),k.then(function(){k=null}),m=null)}function w(){var c=q.current&&q.current.locals;if(e.isDefined(c&&c.$template)){var c=a.$new(),g=q.current;m=x(c,function(c){f.enter(c,null,m||b).then(function(){!e.isDefined(s)||s&&!a.$eval(s)||h()});y()});l=g.scope=c;l.$emit("$viewContentLoaded"); |
|---|
| 7 | +l.$eval(v)}else y()}var l,m,k,s=c.autoscroll,v=c.onload||"";a.$on("$routeChangeSuccess",w);w()}}}function z(e,h,f){return{restrict:"ECA",priority:-400,link:function(a,b){var c=f.current,g=c.locals;b.html(g.$template);var x=e(b.contents());c.controller&&(g.$scope=a,g=h(c.controller,g),c.controllerAs&&(a[c.controllerAs]=g),b.data("$ngControllerController",g),b.children().data("$ngControllerController",g));x(a)}}}p=e.module("ngRoute",["ng"]).provider("$route",function(){function q(a,b){return e.extend(new (e.extend(function(){}, |
|---|
| 8 | +{prototype:a})),b)}function h(a,e){var c=e.caseInsensitiveMatch,g={originalPath:a,regexp:a},f=g.keys=[];a=a.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?\*])?/g,function(a,e,c,b){a="?"===b?b:null;b="*"===b?b:null;f.push({name:c,optional:!!a});e=e||"";return""+(a?"":e)+"(?:"+(a?e:"")+(b&&"(.+?)"||"([^/]+)")+(a||"")+")"+(a||"")}).replace(/([\/$\*])/g,"\\$1");g.regexp=new RegExp("^"+a+"$",c?"i":"");return g}var f={};this.when=function(a,b){f[a]=e.extend({reloadOnSearch:!0},b,a&&h(a,b));if(a){var c= |
|---|
| 9 | +"/"==a[a.length-1]?a.substr(0,a.length-1):a+"/";f[c]=e.extend({redirectTo:a},h(c,b))}return this};this.otherwise=function(a){"string"===typeof a&&(a={redirectTo:a});this.when(null,a);return this};this.$get=["$rootScope","$location","$routeParams","$q","$injector","$templateRequest","$sce",function(a,b,c,g,h,p,w){function l(b){var d=r.current;(u=(n=k())&&d&&n.$$route===d.$$route&&e.equals(n.pathParams,d.pathParams)&&!n.reloadOnSearch&&!v)||!d&&!n||a.$broadcast("$routeChangeStart",n,d).defaultPrevented&& |
|---|
| 10 | +b&&b.preventDefault()}function m(){var t=r.current,d=n;if(u)t.params=d.params,e.copy(t.params,c),a.$broadcast("$routeUpdate",t);else if(d||t)v=!1,(r.current=d)&&d.redirectTo&&(e.isString(d.redirectTo)?b.path(s(d.redirectTo,d.params)).search(d.params).replace():b.url(d.redirectTo(d.pathParams,b.path(),b.search())).replace()),g.when(d).then(function(){if(d){var a=e.extend({},d.resolve),b,c;e.forEach(a,function(d,b){a[b]=e.isString(d)?h.get(d):h.invoke(d,null,null,b)});e.isDefined(b=d.template)?e.isFunction(b)&& |
|---|
| 11 | +(b=b(d.params)):e.isDefined(c=d.templateUrl)&&(e.isFunction(c)&&(c=c(d.params)),c=w.getTrustedResourceUrl(c),e.isDefined(c)&&(d.loadedTemplateUrl=c,b=p(c)));e.isDefined(b)&&(a.$template=b);return g.all(a)}}).then(function(b){d==r.current&&(d&&(d.locals=b,e.copy(d.params,c)),a.$broadcast("$routeChangeSuccess",d,t))},function(b){d==r.current&&a.$broadcast("$routeChangeError",d,t,b)})}function k(){var a,d;e.forEach(f,function(c,g){var f;if(f=!d){var h=b.path();f=c.keys;var l={};if(c.regexp)if(h=c.regexp.exec(h)){for(var k= |
|---|
| 12 | +1,m=h.length;k<m;++k){var n=f[k-1],p=h[k];n&&p&&(l[n.name]=p)}f=l}else f=null;else f=null;f=a=f}f&&(d=q(c,{params:e.extend({},b.search(),a),pathParams:a}),d.$$route=c)});return d||f[null]&&q(f[null],{params:{},pathParams:{}})}function s(a,b){var c=[];e.forEach((a||"").split(":"),function(a,e){if(0===e)c.push(a);else{var f=a.match(/(\w+)(.*)/),g=f[1];c.push(b[g]);c.push(f[2]||"");delete b[g]}});return c.join("")}var v=!1,n,u,r={routes:f,reload:function(){v=!0;a.$evalAsync(function(){l();m()})},updateParams:function(a){if(this.current&& |
|---|
| 13 | +this.current.$$route){var c={},f=this;e.forEach(Object.keys(a),function(b){f.current.pathParams[b]||(c[b]=a[b])});a=e.extend({},this.current.params,a);b.path(s(this.current.$$route.originalPath,a));b.search(e.extend({},b.search(),c))}else throw A("norout");}};a.$on("$locationChangeStart",l);a.$on("$locationChangeSuccess",m);return r}]});var A=e.$$minErr("ngRoute");p.provider("$routeParams",function(){this.$get=function(){return{}}});p.directive("ngView",u);p.directive("ngView",z);u.$inject=["$route", |
|---|
| 14 | +"$anchorScroll","$animate"];z.$inject=["$compile","$controller","$route"]})(window,window.angular); |
|---|
| 15 | +//# sourceMappingURL=angular-route.min.js.map |
|---|
| .. | .. |
|---|
| 1 | +{ |
|---|
| 2 | +"version":3, |
|---|
| 3 | +"file":"angular-route.min.js", |
|---|
| 4 | +"lineCount":14, |
|---|
| 5 | +"mappings":"A;;;;;aAKC,SAAQ,CAACA,CAAD,CAASC,CAAT,CAAkBC,CAAlB,CAA6B,CAm2BtCC,QAASA,EAAa,CAAIC,CAAJ,CAAcC,CAAd,CAA+BC,CAA/B,CAAyC,CAC7D,MAAO,CACLC,SAAU,KADL,CAELC,SAAU,CAAA,CAFL,CAGLC,SAAU,GAHL,CAILC,WAAY,SAJP,CAKLC,KAAMA,QAAQ,CAACC,CAAD,CAAQC,CAAR,CAAkBC,CAAlB,CAAwBC,CAAxB,CAA8BC,CAA9B,CAA2C,CAUrDC,QAASA,EAAe,EAAG,CACtBC,CAAH,GACEZ,CAAAa,OAAA,CAAgBD,CAAhB,CACA,CAAAA,CAAA,CAAyB,IAF3B,CAKGE,EAAH,GACEA,CAAAC,SAAA,EACA,CAAAD,CAAA,CAAe,IAFjB,CAIGE,EAAH,GACEJ,CAIA,CAJyBZ,CAAAiB,MAAA,CAAeD,CAAf,CAIzB,CAHAJ,CAAAM,KAAA,CAA4B,QAAQ,EAAG,CACrCN,CAAA,CAAyB,IADY,CAAvC,CAGA,CAAAI,CAAA,CAAiB,IALnB,CAVyB,CAmB3BG,QAASA,EAAM,EAAG,CAAA,IACZC,EAAStB,CAAAuB,QAATD,EAA2BtB,CAAAuB,QAAAD,OAG/B,IAAIzB,CAAA2B,UAAA,CAFWF,CAEX,EAFqBA,CAAAG,UAErB,CAAJ,CAAiC,CAC3BC,IAAAA,EAAWlB,CAAAmB,KAAA,EAAXD,CACAH,EAAUvB,CAAAuB,QAkBdL,EAAA,CAVYN,CAAAgB,CAAYF,CAAZE,CAAsB,QAAQ,CAACA,CAAD,CAAQ,CAChD1B,CAAA2B,MAAA,CAAeD,CAAf,CAAsB,IAAtB,CAA4BV,CAA5B,EAA8CT,CAA9C,CAAAW,KAAA,CAA6DU,QAAuB,EAAG,CACjF,CAAAjC,CAAA2B,UAAA,CAAkBO,CAAlB,CAAJ,EACOA,CADP,EACwB,CAAAvB,CAAAwB,MAAA,CAAYD,CAAZ,CADxB,EAEE9B,CAAA,EAHmF,CAAvF,CAMAY,EAAA,EAPgD,CAAtCe,CAWZZ,EAAA,CAAeO,CAAAf,MAAf,CAA+BkB,CAC/BV,EAAAiB,MAAA,CAAmB,oBAAnB,CACAjB;CAAAgB,MAAA,CAAmBE,CAAnB,CAvB+B,CAAjC,IAyBErB,EAAA,EA7Bc,CA7BmC,IACjDG,CADiD,CAEjDE,CAFiD,CAGjDJ,CAHiD,CAIjDiB,EAAgBrB,CAAAyB,WAJiC,CAKjDD,EAAYxB,CAAA0B,OAAZF,EAA2B,EAE/B1B,EAAA6B,IAAA,CAAU,qBAAV,CAAiChB,CAAjC,CACAA,EAAA,EARqD,CALpD,CADsD,CA6E/DiB,QAASA,EAAwB,CAACC,CAAD,CAAWC,CAAX,CAAwBxC,CAAxB,CAAgC,CAC/D,MAAO,CACLG,SAAU,KADL,CAELE,SAAW,IAFN,CAGLE,KAAMA,QAAQ,CAACC,CAAD,CAAQC,CAAR,CAAkB,CAAA,IAC1Bc,EAAUvB,CAAAuB,QADgB,CAE1BD,EAASC,CAAAD,OAEbb,EAAAgC,KAAA,CAAcnB,CAAAG,UAAd,CAEA,KAAIlB,EAAOgC,CAAA,CAAS9B,CAAAiC,SAAA,EAAT,CAEPnB,EAAAoB,WAAJ,GACErB,CAAAsB,OAMA,CANgBpC,CAMhB,CALImC,CAKJ,CALiBH,CAAA,CAAYjB,CAAAoB,WAAZ,CAAgCrB,CAAhC,CAKjB,CAJIC,CAAAsB,aAIJ,GAHErC,CAAA,CAAMe,CAAAsB,aAAN,CAGF,CAHgCF,CAGhC,EADAlC,CAAAqC,KAAA,CAAc,yBAAd,CAAyCH,CAAzC,CACA,CAAAlC,CAAAsC,SAAA,EAAAD,KAAA,CAAyB,yBAAzB,CAAoDH,CAApD,CAPF,CAUApC,EAAA,CAAKC,CAAL,CAlB8B,CAH3B,CADwD,CA95B7DwC,CAAAA,CAAgBnD,CAAAoD,OAAA,CAAe,SAAf,CAA0B,CAAC,IAAD,CAA1B,CAAAC,SAAA,CACa,QADb,CAkBpBC,QAAuB,EAAE,CACvBC,QAASA,EAAO,CAACC,CAAD,CAASC,CAAT,CAAgB,CAC9B,MAAOzD,EAAA0D,OAAA,CAAe,KAAK1D,CAAA0D,OAAA,CAAe,QAAQ,EAAG,EAA1B;AAA8B,CAACC,UAAUH,CAAX,CAA9B,CAAL,CAAf,CAA0EC,CAA1E,CADuB,CA0IhCG,QAASA,EAAU,CAACC,CAAD,CAAOC,CAAP,CAAa,CAAA,IAC1BC,EAAcD,CAAAE,qBADY,CAE1BC,EAAM,CACJC,aAAcL,CADV,CAEJM,OAAQN,CAFJ,CAFoB,CAM1BO,EAAOH,CAAAG,KAAPA,CAAkB,EAEtBP,EAAA,CAAOA,CAAAQ,QAAA,CACI,UADJ,CACgB,MADhB,CAAAA,QAAA,CAEI,uBAFJ,CAE6B,QAAQ,CAACC,CAAD,CAAIC,CAAJ,CAAWC,CAAX,CAAgBC,CAAhB,CAAuB,CAC3DC,CAAAA,CAAsB,GAAX,GAAAD,CAAA,CAAiBA,CAAjB,CAA0B,IACrCE,EAAAA,CAAkB,GAAX,GAAAF,CAAA,CAAiBA,CAAjB,CAA0B,IACrCL,EAAAQ,KAAA,CAAU,CAAEC,KAAML,CAAR,CAAaE,SAAU,CAAEA,CAAAA,CAAzB,CAAV,CACAH,EAAA,CAAQA,CAAR,EAAiB,EACjB,OAAO,EAAP,EACKG,CAAA,CAAW,EAAX,CAAgBH,CADrB,EAEI,KAFJ,EAGKG,CAAA,CAAWH,CAAX,CAAmB,EAHxB,GAIKI,CAJL,EAIa,OAJb,EAIwB,SAJxB,GAKKD,CALL,EAKiB,EALjB,EAMI,GANJ,EAOKA,CAPL,EAOiB,EAPjB,CAL+D,CAF5D,CAAAL,QAAA,CAgBI,YAhBJ,CAgBkB,MAhBlB,CAkBPJ,EAAAE,OAAA,CAAa,IAAIW,MAAJ,CAAW,GAAX,CAAiBjB,CAAjB,CAAwB,GAAxB,CAA6BE,CAAA,CAAc,GAAd,CAAoB,EAAjD,CACb,OAAOE,EA3BuB,CAtIhC,IAAIc,EAAS,EAqGb,KAAAC,KAAA,CAAYC,QAAQ,CAACpB,CAAD,CAAOqB,CAAP,CAAc,CAChCH,CAAA,CAAOlB,CAAP,CAAA,CAAe7D,CAAA0D,OAAA,CACb,CAACyB,eAAgB,CAAA,CAAjB,CADa,CAEbD,CAFa,CAGbrB,CAHa,EAGLD,CAAA,CAAWC,CAAX,CAAiBqB,CAAjB,CAHK,CAOf,IAAIrB,CAAJ,CAAU,CACR,IAAIuB;AAAuC,GAAxB,EAACvB,CAAA,CAAKA,CAAAwB,OAAL,CAAiB,CAAjB,CAAD,CACXxB,CAAAyB,OAAA,CAAY,CAAZ,CAAezB,CAAAwB,OAAf,CAA2B,CAA3B,CADW,CAEXxB,CAFW,CAEL,GAEdkB,EAAA,CAAOK,CAAP,CAAA,CAAuBpF,CAAA0D,OAAA,CACrB,CAAC6B,WAAY1B,CAAb,CADqB,CAErBD,CAAA,CAAWwB,CAAX,CAAyBF,CAAzB,CAFqB,CALf,CAWV,MAAO,KAnByB,CA2ElC,KAAAM,UAAA,CAAiBC,QAAQ,CAACC,CAAD,CAAS,CACV,QAAtB,GAAI,MAAOA,EAAX,GACEA,CADF,CACW,CAACH,WAAYG,CAAb,CADX,CAGA,KAAAV,KAAA,CAAU,IAAV,CAAgBU,CAAhB,CACA,OAAO,KALyB,CASlC,KAAAC,KAAA,CAAY,CAAC,YAAD,CACC,WADD,CAEC,cAFD,CAGC,IAHD,CAIC,WAJD,CAKC,kBALD,CAMC,MAND,CAOR,QAAQ,CAACC,CAAD,CAAaC,CAAb,CAAwBC,CAAxB,CAAsCC,CAAtC,CAA0CC,CAA1C,CAAqDC,CAArD,CAAuEC,CAAvE,CAA6E,CA+RvFC,QAASA,EAAY,CAACC,CAAD,CAAiB,CACpC,IAAIC,EAAYlG,CAAAuB,QAOhB,EAJA4E,CAIA,EALAC,CAKA,CALgBC,CAAA,EAKhB,GAJ6CH,CAI7C,EAJ0DE,CAAAE,QAI1D,GAJoFJ,CAAAI,QAIpF,EAHOzG,CAAA0G,OAAA,CAAeH,CAAAI,WAAf,CAAyCN,CAAAM,WAAzC,CAGP,EAFO,CAACJ,CAAApB,eAER,EAFwC,CAACyB,CAEzC,GAAmCP,CAAAA,CAAnC,EAAgDE,CAAAA,CAAhD,EACMX,CAAAiB,WAAA,CAAsB,mBAAtB,CAA2CN,CAA3C,CAA0DF,CAA1D,CAAAS,iBADN;AAEQV,CAFR,EAGMA,CAAAW,eAAA,EAX8B,CAiBtCC,QAASA,EAAW,EAAG,CACrB,IAAIX,EAAYlG,CAAAuB,QAAhB,CACIuF,EAAYV,CAEhB,IAAID,CAAJ,CACED,CAAAX,OAEA,CAFmBuB,CAAAvB,OAEnB,CADA1F,CAAAkH,KAAA,CAAab,CAAAX,OAAb,CAA+BI,CAA/B,CACA,CAAAF,CAAAiB,WAAA,CAAsB,cAAtB,CAAsCR,CAAtC,CAHF,KAIO,IAAIY,CAAJ,EAAiBZ,CAAjB,CACLO,CAcA,CAdc,CAAA,CAcd,EAbAzG,CAAAuB,QAaA,CAbiBuF,CAajB,GAXMA,CAAA1B,WAWN,GAVQvF,CAAAmH,SAAA,CAAiBF,CAAA1B,WAAjB,CAAJ,CACEM,CAAAhC,KAAA,CAAeuD,CAAA,CAAYH,CAAA1B,WAAZ,CAAkC0B,CAAAvB,OAAlC,CAAf,CAAA2B,OAAA,CAA2EJ,CAAAvB,OAA3E,CAAArB,QAAA,EADF,CAIEwB,CAAAyB,IAAA,CAAcL,CAAA1B,WAAA,CAAqB0B,CAAAN,WAArB,CAA2Cd,CAAAhC,KAAA,EAA3C,CAA6DgC,CAAAwB,OAAA,EAA7D,CAAd,CAAAhD,QAAA,EAMN,EAAA0B,CAAAf,KAAA,CAAQiC,CAAR,CAAA1F,KAAA,CACO,QAAQ,EAAG,CACd,GAAI0F,CAAJ,CAAe,CAAA,IACTxF,EAASzB,CAAA0D,OAAA,CAAe,EAAf,CAAmBuD,CAAAM,QAAnB,CADA,CAETC,CAFS,CAECC,CAEdzH,EAAA0H,QAAA,CAAgBjG,CAAhB,CAAwB,QAAQ,CAACkG,CAAD,CAAQnD,CAAR,CAAa,CAC3C/C,CAAA,CAAO+C,CAAP,CAAA,CAAcxE,CAAAmH,SAAA,CAAiBQ,CAAjB,CAAA,CACV3B,CAAA4B,IAAA,CAAcD,CAAd,CADU,CACa3B,CAAA6B,OAAA,CAAiBF,CAAjB,CAAwB,IAAxB,CAA8B,IAA9B,CAAoCnD,CAApC,CAFgB,CAA7C,CAKIxE,EAAA2B,UAAA,CAAkB6F,CAAlB,CAA6BP,CAAAO,SAA7B,CAAJ,CACMxH,CAAA8H,WAAA,CAAmBN,CAAnB,CADN;CAEIA,CAFJ,CAEeA,CAAA,CAASP,CAAAvB,OAAT,CAFf,EAIW1F,CAAA2B,UAAA,CAAkB8F,CAAlB,CAAgCR,CAAAQ,YAAhC,CAJX,GAKMzH,CAAA8H,WAAA,CAAmBL,CAAnB,CAIJ,GAHEA,CAGF,CAHgBA,CAAA,CAAYR,CAAAvB,OAAZ,CAGhB,EADA+B,CACA,CADcvB,CAAA6B,sBAAA,CAA2BN,CAA3B,CACd,CAAIzH,CAAA2B,UAAA,CAAkB8F,CAAlB,CAAJ,GACER,CAAAe,kBACA,CAD8BP,CAC9B,CAAAD,CAAA,CAAWvB,CAAA,CAAiBwB,CAAjB,CAFb,CATF,CAcIzH,EAAA2B,UAAA,CAAkB6F,CAAlB,CAAJ,GACE/F,CAAA,UADF,CACwB+F,CADxB,CAGA,OAAOzB,EAAAkC,IAAA,CAAOxG,CAAP,CA1BM,CADD,CADlB,CAAAF,KAAA,CAgCO,QAAQ,CAACE,CAAD,CAAS,CAChBwF,CAAJ,EAAiB9G,CAAAuB,QAAjB,GACMuF,CAIJ,GAHEA,CAAAxF,OACA,CADmBA,CACnB,CAAAzB,CAAAkH,KAAA,CAAaD,CAAAvB,OAAb,CAA+BI,CAA/B,CAEF,EAAAF,CAAAiB,WAAA,CAAsB,qBAAtB,CAA6CI,CAA7C,CAAwDZ,CAAxD,CALF,CADoB,CAhCxB,CAwCK,QAAQ,CAAC6B,CAAD,CAAQ,CACbjB,CAAJ,EAAiB9G,CAAAuB,QAAjB,EACEkE,CAAAiB,WAAA,CAAsB,mBAAtB,CAA2CI,CAA3C,CAAsDZ,CAAtD,CAAiE6B,CAAjE,CAFe,CAxCrB,CAvBmB,CA2EvB1B,QAASA,EAAU,EAAG,CAAA,IAEhBd,CAFgB,CAERyC,CACZnI,EAAA0H,QAAA,CAAgB3C,CAAhB,CAAwB,QAAQ,CAACG,CAAD,CAAQrB,CAAR,CAAc,CACxC,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,IAAA,EAAA,CAAA,KAAA,EApHbO,EAAAA,CAoHac,CApHNd,KAAX,KACIsB,EAAS,EAEb,IAiHiBR,CAjHZf,OAAL,CAGA,GADIiE,CACJ,CA8GiBlD,CA/GTf,OAAAkE,KAAA,CAAkBC,CAAlB,CACR,CAAA,CAEA,IATqC,IAS5BC;AAAI,CATwB,CASrBC,EAAMJ,CAAA/C,OAAtB,CAAgCkD,CAAhC,CAAoCC,CAApC,CAAyC,EAAED,CAA3C,CAA8C,CAC5C,IAAI/D,EAAMJ,CAAA,CAAKmE,CAAL,CAAS,CAAT,CAAV,CAEIE,EAAML,CAAA,CAAEG,CAAF,CAEN/D,EAAJ,EAAWiE,CAAX,GACE/C,CAAA,CAAOlB,CAAAK,KAAP,CADF,CACqB4D,CADrB,CAL4C,CAS9C,CAAA,CAAO/C,CAXP,CAAA,IAAQ,EAAA,CAAO,IAHf,KAAmB,EAAA,CAAO,IAiHT,EAAA,CAAA,CAAA,CAAA,CAAX,CAAA,CAAJ,GACEyC,CAGA,CAHQ5E,CAAA,CAAQ2B,CAAR,CAAe,CACrBQ,OAAQ1F,CAAA0D,OAAA,CAAe,EAAf,CAAmBmC,CAAAwB,OAAA,EAAnB,CAAuC3B,CAAvC,CADa,CAErBiB,WAAYjB,CAFS,CAAf,CAGR,CAAAyC,CAAA1B,QAAA,CAAgBvB,CAJlB,CAD4C,CAA9C,CASA,OAAOiD,EAAP,EAAgBpD,CAAA,CAAO,IAAP,CAAhB,EAAgCxB,CAAA,CAAQwB,CAAA,CAAO,IAAP,CAAR,CAAsB,CAACW,OAAQ,EAAT,CAAaiB,WAAW,EAAxB,CAAtB,CAZZ,CAkBtBS,QAASA,EAAW,CAACsB,CAAD,CAAShD,CAAT,CAAiB,CACnC,IAAIiD,EAAS,EACb3I,EAAA0H,QAAA,CAAgBkB,CAACF,CAADE,EAAS,EAATA,OAAA,CAAmB,GAAnB,CAAhB,CAAyC,QAAQ,CAACC,CAAD,CAAUN,CAAV,CAAa,CAC5D,GAAU,CAAV,GAAIA,CAAJ,CACEI,CAAA/D,KAAA,CAAYiE,CAAZ,CADF,KAEO,CACL,IAAIC,EAAeD,CAAAV,MAAA,CAAc,WAAd,CAAnB,CACI3D,EAAMsE,CAAA,CAAa,CAAb,CACVH,EAAA/D,KAAA,CAAYc,CAAA,CAAOlB,CAAP,CAAZ,CACAmE,EAAA/D,KAAA,CAAYkE,CAAA,CAAa,CAAb,CAAZ,EAA+B,EAA/B,CACA,QAAOpD,CAAA,CAAOlB,CAAP,CALF,CAHqD,CAA9D,CAWA,OAAOmE,EAAAI,KAAA,CAAY,EAAZ,CAb4B,CA7YkD,IA+LnFnC,EAAc,CAAA,CA/LqE,CAgMnFL,CAhMmF,CAiMnFD,CAjMmF,CAkMnFnG,EAAS,CACP4E,OAAQA,CADD,CAcPiE,OAAQA,QAAQ,EAAG,CACjBpC,CAAA,CAAc,CAAA,CACdhB,EAAAqD,WAAA,CAAsB,QAAQ,EAAG,CAE/B9C,CAAA,EACAa,EAAA,EAH+B,CAAjC,CAFiB,CAdZ,CAoCPkC,aAAcA,QAAQ,CAACC,CAAD,CAAY,CAChC,GAAI,IAAAzH,QAAJ;AAAoB,IAAAA,QAAA+E,QAApB,CAA0C,CAAA,IACpC2C,EAAe,EADqB,CACjBC,EAAK,IAE5BrJ,EAAA0H,QAAA,CAAgB4B,MAAAlF,KAAA,CAAY+E,CAAZ,CAAhB,CAAwC,QAAQ,CAAC3E,CAAD,CAAM,CAC/C6E,CAAA3H,QAAAiF,WAAA,CAAwBnC,CAAxB,CAAL,GAAmC4E,CAAA,CAAa5E,CAAb,CAAnC,CAAuD2E,CAAA,CAAU3E,CAAV,CAAvD,CADoD,CAAtD,CAIA2E,EAAA,CAAYnJ,CAAA0D,OAAA,CAAe,EAAf,CAAmB,IAAAhC,QAAAgE,OAAnB,CAAwCyD,CAAxC,CACZtD,EAAAhC,KAAA,CAAeuD,CAAA,CAAY,IAAA1F,QAAA+E,QAAAvC,aAAZ,CAA+CiF,CAA/C,CAAf,CACAtD,EAAAwB,OAAA,CAAiBrH,CAAA0D,OAAA,CAAe,EAAf,CAAmBmC,CAAAwB,OAAA,EAAnB,CAAuC+B,CAAvC,CAAjB,CATwC,CAA1C,IAYE,MAAMG,EAAA,CAAa,QAAb,CAAN,CAb8B,CApC3B,CAsDb3D,EAAApD,IAAA,CAAe,sBAAf,CAAuC2D,CAAvC,CACAP,EAAApD,IAAA,CAAe,wBAAf,CAAyCwE,CAAzC,CAEA,OAAO7G,EA3PgF,CAP7E,CA9LW,CAlBL,CAApB,KAEIoJ,EAAevJ,CAAAwJ,SAAA,CAAiB,SAAjB,CAonBnBrG,EAAAE,SAAA,CAAuB,cAAvB,CAoCAoG,QAA6B,EAAG,CAC9B,IAAA9D,KAAA,CAAY+D,QAAQ,EAAG,CAAE,MAAO,EAAT,CADO,CApChC,CAwCAvG,EAAAwG,UAAA,CAAwB,QAAxB,CAAkCzJ,CAAlC,CACAiD,EAAAwG,UAAA,CAAwB,QAAxB,CAAkClH,CAAlC,CAiLAvC,EAAA0J,QAAA,CAAwB,CAAC,QAAD;AAAW,eAAX,CAA4B,UAA5B,CA6ExBnH,EAAAmH,QAAA,CAAmC,CAAC,UAAD,CAAa,aAAb,CAA4B,QAA5B,CA/6BG,CAArC,CAAD,CA48BG7J,MA58BH,CA48BWA,MAAAC,QA58BX;", |
|---|
| 6 | +"sources":["angular-route.js"], |
|---|
| 7 | +"names":["window","angular","undefined","ngViewFactory","$route","$anchorScroll","$animate","restrict","terminal","priority","transclude","link","scope","$element","attr","ctrl","$transclude","cleanupLastView","previousLeaveAnimation","cancel","currentScope","$destroy","currentElement","leave","then","update","locals","current","isDefined","$template","newScope","$new","clone","enter","onNgViewEnter","autoScrollExp","$eval","$emit","onloadExp","autoscroll","onload","$on","ngViewFillContentFactory","$compile","$controller","html","contents","controller","$scope","controllerAs","data","children","ngRouteModule","module","provider","$RouteProvider","inherit","parent","extra","extend","prototype","pathRegExp","path","opts","insensitive","caseInsensitiveMatch","ret","originalPath","regexp","keys","replace","_","slash","key","option","optional","star","push","name","RegExp","routes","when","this.when","route","reloadOnSearch","redirectPath","length","substr","redirectTo","otherwise","this.otherwise","params","$get","$rootScope","$location","$routeParams","$q","$injector","$templateRequest","$sce","prepareRoute","$locationEvent","lastRoute","preparedRouteIsUpdateOnly","preparedRoute","parseRoute","$$route","equals","pathParams","forceReload","$broadcast","defaultPrevented","preventDefault","commitRoute","nextRoute","copy","isString","interpolate","search","url","resolve","template","templateUrl","forEach","value","get","invoke","isFunction","getTrustedResourceUrl","loadedTemplateUrl","all","error","match","m","exec","on","i","len","val","string","result","split","segment","segmentMatch","join","reload","$evalAsync","updateParams","newParams","searchParams","self","Object","$routeMinErr","$$minErr","$RouteParamsProvider","this.$get","directive","$inject"] |
|---|
| 8 | +} |
|---|
| .. | .. |
|---|
| 1 | +/** |
|---|
| 2 | + * @license AngularJS v1.3.0 |
|---|
| 3 | + * (c) 2010-2014 Google, Inc. http://angularjs.org |
|---|
| 4 | + * License: MIT |
|---|
| 5 | + */ |
|---|
| 6 | +(function(window, document, undefined) {'use strict'; |
|---|
| 7 | + |
|---|
| 8 | +/** |
|---|
| 9 | + * @description |
|---|
| 10 | + * |
|---|
| 11 | + * This object provides a utility for producing rich Error messages within |
|---|
| 12 | + * Angular. It can be called as follows: |
|---|
| 13 | + * |
|---|
| 14 | + * var exampleMinErr = minErr('example'); |
|---|
| 15 | + * throw exampleMinErr('one', 'This {0} is {1}', foo, bar); |
|---|
| 16 | + * |
|---|
| 17 | + * The above creates an instance of minErr in the example namespace. The |
|---|
| 18 | + * resulting error will have a namespaced error code of example.one. The |
|---|
| 19 | + * resulting error will replace {0} with the value of foo, and {1} with the |
|---|
| 20 | + * value of bar. The object is not restricted in the number of arguments it can |
|---|
| 21 | + * take. |
|---|
| 22 | + * |
|---|
| 23 | + * If fewer arguments are specified than necessary for interpolation, the extra |
|---|
| 24 | + * interpolation markers will be preserved in the final string. |
|---|
| 25 | + * |
|---|
| 26 | + * Since data will be parsed statically during a build step, some restrictions |
|---|
| 27 | + * are applied with respect to how minErr instances are created and called. |
|---|
| 28 | + * Instances should have names of the form namespaceMinErr for a minErr created |
|---|
| 29 | + * using minErr('namespace') . Error codes, namespaces and template strings |
|---|
| 30 | + * should all be static strings, not variables or general expressions. |
|---|
| 31 | + * |
|---|
| 32 | + * @param {string} module The namespace to use for the new minErr instance. |
|---|
| 33 | + * @param {function} ErrorConstructor Custom error constructor to be instantiated when returning |
|---|
| 34 | + * error from returned function, for cases when a particular type of error is useful. |
|---|
| 35 | + * @returns {function(code:string, template:string, ...templateArgs): Error} minErr instance |
|---|
| 36 | + */ |
|---|
| 37 | + |
|---|
| 38 | +function minErr(module, ErrorConstructor) { |
|---|
| 39 | + ErrorConstructor = ErrorConstructor || Error; |
|---|
| 40 | + return function () { |
|---|
| 41 | + var code = arguments[0], |
|---|
| 42 | + prefix = '[' + (module ? module + ':' : '') + code + '] ', |
|---|
| 43 | + template = arguments[1], |
|---|
| 44 | + templateArgs = arguments, |
|---|
| 45 | + stringify = function (obj) { |
|---|
| 46 | + if (typeof obj === 'function') { |
|---|
| 47 | + return obj.toString().replace(/ \{[\s\S]*$/, ''); |
|---|
| 48 | + } else if (typeof obj === 'undefined') { |
|---|
| 49 | + return 'undefined'; |
|---|
| 50 | + } else if (typeof obj !== 'string') { |
|---|
| 51 | + return JSON.stringify(obj); |
|---|
| 52 | + } |
|---|
| 53 | + return obj; |
|---|
| 54 | + }, |
|---|
| 55 | + message, i; |
|---|
| 56 | + |
|---|
| 57 | + message = prefix + template.replace(/\{\d+\}/g, function (match) { |
|---|
| 58 | + var index = +match.slice(1, -1), arg; |
|---|
| 59 | + |
|---|
| 60 | + if (index + 2 < templateArgs.length) { |
|---|
| 61 | + arg = templateArgs[index + 2]; |
|---|
| 62 | + if (typeof arg === 'function') { |
|---|
| 63 | + return arg.toString().replace(/ ?\{[\s\S]*$/, ''); |
|---|
| 64 | + } else if (typeof arg === 'undefined') { |
|---|
| 65 | + return 'undefined'; |
|---|
| 66 | + } else if (typeof arg !== 'string') { |
|---|
| 67 | + return toJson(arg); |
|---|
| 68 | + } |
|---|
| 69 | + return arg; |
|---|
| 70 | + } |
|---|
| 71 | + return match; |
|---|
| 72 | + }); |
|---|
| 73 | + |
|---|
| 74 | + message = message + '\nhttp://errors.angularjs.org/1.3.0/' + |
|---|
| 75 | + (module ? module + '/' : '') + code; |
|---|
| 76 | + for (i = 2; i < arguments.length; i++) { |
|---|
| 77 | + message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' + |
|---|
| 78 | + encodeURIComponent(stringify(arguments[i])); |
|---|
| 79 | + } |
|---|
| 80 | + return new ErrorConstructor(message); |
|---|
| 81 | + }; |
|---|
| 82 | +} |
|---|
| 83 | + |
|---|
| 84 | +/* We need to tell jshint what variables are being exported */ |
|---|
| 85 | +/* global angular: true, |
|---|
| 86 | + msie: true, |
|---|
| 87 | + jqLite: true, |
|---|
| 88 | + jQuery: true, |
|---|
| 89 | + slice: true, |
|---|
| 90 | + splice: true, |
|---|
| 91 | + push: true, |
|---|
| 92 | + toString: true, |
|---|
| 93 | + ngMinErr: true, |
|---|
| 94 | + angularModule: true, |
|---|
| 95 | + uid: true, |
|---|
| 96 | + REGEX_STRING_REGEXP: true, |
|---|
| 97 | + VALIDITY_STATE_PROPERTY: true, |
|---|
| 98 | + |
|---|
| 99 | + lowercase: true, |
|---|
| 100 | + uppercase: true, |
|---|
| 101 | + manualLowercase: true, |
|---|
| 102 | + manualUppercase: true, |
|---|
| 103 | + nodeName_: true, |
|---|
| 104 | + isArrayLike: true, |
|---|
| 105 | + forEach: true, |
|---|
| 106 | + sortedKeys: true, |
|---|
| 107 | + forEachSorted: true, |
|---|
| 108 | + reverseParams: true, |
|---|
| 109 | + nextUid: true, |
|---|
| 110 | + setHashKey: true, |
|---|
| 111 | + extend: true, |
|---|
| 112 | + int: true, |
|---|
| 113 | + inherit: true, |
|---|
| 114 | + noop: true, |
|---|
| 115 | + identity: true, |
|---|
| 116 | + valueFn: true, |
|---|
| 117 | + isUndefined: true, |
|---|
| 118 | + isDefined: true, |
|---|
| 119 | + isObject: true, |
|---|
| 120 | + isString: true, |
|---|
| 121 | + isNumber: true, |
|---|
| 122 | + isDate: true, |
|---|
| 123 | + isArray: true, |
|---|
| 124 | + isFunction: true, |
|---|
| 125 | + isRegExp: true, |
|---|
| 126 | + isWindow: true, |
|---|
| 127 | + isScope: true, |
|---|
| 128 | + isFile: true, |
|---|
| 129 | + isBlob: true, |
|---|
| 130 | + isBoolean: true, |
|---|
| 131 | + isPromiseLike: true, |
|---|
| 132 | + trim: true, |
|---|
| 133 | + isElement: true, |
|---|
| 134 | + makeMap: true, |
|---|
| 135 | + size: true, |
|---|
| 136 | + includes: true, |
|---|
| 137 | + arrayRemove: true, |
|---|
| 138 | + isLeafNode: true, |
|---|
| 139 | + copy: true, |
|---|
| 140 | + shallowCopy: true, |
|---|
| 141 | + equals: true, |
|---|
| 142 | + csp: true, |
|---|
| 143 | + concat: true, |
|---|
| 144 | + sliceArgs: true, |
|---|
| 145 | + bind: true, |
|---|
| 146 | + toJsonReplacer: true, |
|---|
| 147 | + toJson: true, |
|---|
| 148 | + fromJson: true, |
|---|
| 149 | + startingTag: true, |
|---|
| 150 | + tryDecodeURIComponent: true, |
|---|
| 151 | + parseKeyValue: true, |
|---|
| 152 | + toKeyValue: true, |
|---|
| 153 | + encodeUriSegment: true, |
|---|
| 154 | + encodeUriQuery: true, |
|---|
| 155 | + angularInit: true, |
|---|
| 156 | + bootstrap: true, |
|---|
| 157 | + getTestability: true, |
|---|
| 158 | + snake_case: true, |
|---|
| 159 | + bindJQuery: true, |
|---|
| 160 | + assertArg: true, |
|---|
| 161 | + assertArgFn: true, |
|---|
| 162 | + assertNotHasOwnProperty: true, |
|---|
| 163 | + getter: true, |
|---|
| 164 | + getBlockNodes: true, |
|---|
| 165 | + hasOwnProperty: true, |
|---|
| 166 | + createMap: true, |
|---|
| 167 | + |
|---|
| 168 | + NODE_TYPE_ELEMENT: true, |
|---|
| 169 | + NODE_TYPE_TEXT: true, |
|---|
| 170 | + NODE_TYPE_COMMENT: true, |
|---|
| 171 | + NODE_TYPE_DOCUMENT: true, |
|---|
| 172 | + NODE_TYPE_DOCUMENT_FRAGMENT: true, |
|---|
| 173 | +*/ |
|---|
| 174 | + |
|---|
| 175 | +//////////////////////////////////// |
|---|
| 176 | + |
|---|
| 177 | +/** |
|---|
| 178 | + * @ngdoc module |
|---|
| 179 | + * @name ng |
|---|
| 180 | + * @module ng |
|---|
| 181 | + * @description |
|---|
| 182 | + * |
|---|
| 183 | + * # ng (core module) |
|---|
| 184 | + * The ng module is loaded by default when an AngularJS application is started. The module itself |
|---|
| 185 | + * contains the essential components for an AngularJS application to function. The table below |
|---|
| 186 | + * lists a high level breakdown of each of the services/factories, filters, directives and testing |
|---|
| 187 | + * components available within this core module. |
|---|
| 188 | + * |
|---|
| 189 | + * <div doc-module-components="ng"></div> |
|---|
| 190 | + */ |
|---|
| 191 | + |
|---|
| 192 | +var REGEX_STRING_REGEXP = /^\/(.+)\/([a-z]*)$/; |
|---|
| 193 | + |
|---|
| 194 | +// The name of a form control's ValidityState property. |
|---|
| 195 | +// This is used so that it's possible for internal tests to create mock ValidityStates. |
|---|
| 196 | +var VALIDITY_STATE_PROPERTY = 'validity'; |
|---|
| 197 | + |
|---|
| 198 | +/** |
|---|
| 199 | + * @ngdoc function |
|---|
| 200 | + * @name angular.lowercase |
|---|
| 201 | + * @module ng |
|---|
| 202 | + * @kind function |
|---|
| 203 | + * |
|---|
| 204 | + * @description Converts the specified string to lowercase. |
|---|
| 205 | + * @param {string} string String to be converted to lowercase. |
|---|
| 206 | + * @returns {string} Lowercased string. |
|---|
| 207 | + */ |
|---|
| 208 | +var lowercase = function(string){return isString(string) ? string.toLowerCase() : string;}; |
|---|
| 209 | +var hasOwnProperty = Object.prototype.hasOwnProperty; |
|---|
| 210 | + |
|---|
| 211 | +/** |
|---|
| 212 | + * @ngdoc function |
|---|
| 213 | + * @name angular.uppercase |
|---|
| 214 | + * @module ng |
|---|
| 215 | + * @kind function |
|---|
| 216 | + * |
|---|
| 217 | + * @description Converts the specified string to uppercase. |
|---|
| 218 | + * @param {string} string String to be converted to uppercase. |
|---|
| 219 | + * @returns {string} Uppercased string. |
|---|
| 220 | + */ |
|---|
| 221 | +var uppercase = function(string){return isString(string) ? string.toUpperCase() : string;}; |
|---|
| 222 | + |
|---|
| 223 | + |
|---|
| 224 | +var manualLowercase = function(s) { |
|---|
| 225 | + /* jshint bitwise: false */ |
|---|
| 226 | + return isString(s) |
|---|
| 227 | + ? s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);}) |
|---|
| 228 | + : s; |
|---|
| 229 | +}; |
|---|
| 230 | +var manualUppercase = function(s) { |
|---|
| 231 | + /* jshint bitwise: false */ |
|---|
| 232 | + return isString(s) |
|---|
| 233 | + ? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);}) |
|---|
| 234 | + : s; |
|---|
| 235 | +}; |
|---|
| 236 | + |
|---|
| 237 | + |
|---|
| 238 | +// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish |
|---|
| 239 | +// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods |
|---|
| 240 | +// with correct but slower alternatives. |
|---|
| 241 | +if ('i' !== 'I'.toLowerCase()) { |
|---|
| 242 | + lowercase = manualLowercase; |
|---|
| 243 | + uppercase = manualUppercase; |
|---|
| 244 | +} |
|---|
| 245 | + |
|---|
| 246 | + |
|---|
| 247 | +var /** holds major version number for IE or NaN for real browsers */ |
|---|
| 248 | + msie, |
|---|
| 249 | + jqLite, // delay binding since jQuery could be loaded after us. |
|---|
| 250 | + jQuery, // delay binding |
|---|
| 251 | + slice = [].slice, |
|---|
| 252 | + splice = [].splice, |
|---|
| 253 | + push = [].push, |
|---|
| 254 | + toString = Object.prototype.toString, |
|---|
| 255 | + ngMinErr = minErr('ng'), |
|---|
| 256 | + |
|---|
| 257 | + /** @name angular */ |
|---|
| 258 | + angular = window.angular || (window.angular = {}), |
|---|
| 259 | + angularModule, |
|---|
| 260 | + uid = 0; |
|---|
| 261 | + |
|---|
| 262 | +/** |
|---|
| 263 | + * documentMode is an IE-only property |
|---|
| 264 | + * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx |
|---|
| 265 | + */ |
|---|
| 266 | +msie = document.documentMode; |
|---|
| 267 | + |
|---|
| 268 | + |
|---|
| 269 | +/** |
|---|
| 270 | + * @private |
|---|
| 271 | + * @param {*} obj |
|---|
| 272 | + * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments, |
|---|
| 273 | + * String ...) |
|---|
| 274 | + */ |
|---|
| 275 | +function isArrayLike(obj) { |
|---|
| 276 | + if (obj == null || isWindow(obj)) { |
|---|
| 277 | + return false; |
|---|
| 278 | + } |
|---|
| 279 | + |
|---|
| 280 | + var length = obj.length; |
|---|
| 281 | + |
|---|
| 282 | + if (obj.nodeType === NODE_TYPE_ELEMENT && length) { |
|---|
| 283 | + return true; |
|---|
| 284 | + } |
|---|
| 285 | + |
|---|
| 286 | + return isString(obj) || isArray(obj) || length === 0 || |
|---|
| 287 | + typeof length === 'number' && length > 0 && (length - 1) in obj; |
|---|
| 288 | +} |
|---|
| 289 | + |
|---|
| 290 | +/** |
|---|
| 291 | + * @ngdoc function |
|---|
| 292 | + * @name angular.forEach |
|---|
| 293 | + * @module ng |
|---|
| 294 | + * @kind function |
|---|
| 295 | + * |
|---|
| 296 | + * @description |
|---|
| 297 | + * Invokes the `iterator` function once for each item in `obj` collection, which can be either an |
|---|
| 298 | + * object or an array. The `iterator` function is invoked with `iterator(value, key, obj)`, where `value` |
|---|
| 299 | + * is the value of an object property or an array element, `key` is the object property key or |
|---|
| 300 | + * array element index and obj is the `obj` itself. Specifying a `context` for the function is optional. |
|---|
| 301 | + * |
|---|
| 302 | + * It is worth noting that `.forEach` does not iterate over inherited properties because it filters |
|---|
| 303 | + * using the `hasOwnProperty` method. |
|---|
| 304 | + * |
|---|
| 305 | + ```js |
|---|
| 306 | + var values = {name: 'misko', gender: 'male'}; |
|---|
| 307 | + var log = []; |
|---|
| 308 | + angular.forEach(values, function(value, key) { |
|---|
| 309 | + this.push(key + ': ' + value); |
|---|
| 310 | + }, log); |
|---|
| 311 | + expect(log).toEqual(['name: misko', 'gender: male']); |
|---|
| 312 | + ``` |
|---|
| 313 | + * |
|---|
| 314 | + * @param {Object|Array} obj Object to iterate over. |
|---|
| 315 | + * @param {Function} iterator Iterator function. |
|---|
| 316 | + * @param {Object=} context Object to become context (`this`) for the iterator function. |
|---|
| 317 | + * @returns {Object|Array} Reference to `obj`. |
|---|
| 318 | + */ |
|---|
| 319 | + |
|---|
| 320 | +function forEach(obj, iterator, context) { |
|---|
| 321 | + var key, length; |
|---|
| 322 | + if (obj) { |
|---|
| 323 | + if (isFunction(obj)) { |
|---|
| 324 | + for (key in obj) { |
|---|
| 325 | + // Need to check if hasOwnProperty exists, |
|---|
| 326 | + // as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function |
|---|
| 327 | + if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) { |
|---|
| 328 | + iterator.call(context, obj[key], key, obj); |
|---|
| 329 | + } |
|---|
| 330 | + } |
|---|
| 331 | + } else if (isArray(obj) || isArrayLike(obj)) { |
|---|
| 332 | + var isPrimitive = typeof obj !== 'object'; |
|---|
| 333 | + for (key = 0, length = obj.length; key < length; key++) { |
|---|
| 334 | + if (isPrimitive || key in obj) { |
|---|
| 335 | + iterator.call(context, obj[key], key, obj); |
|---|
| 336 | + } |
|---|
| 337 | + } |
|---|
| 338 | + } else if (obj.forEach && obj.forEach !== forEach) { |
|---|
| 339 | + obj.forEach(iterator, context, obj); |
|---|
| 340 | + } else { |
|---|
| 341 | + for (key in obj) { |
|---|
| 342 | + if (obj.hasOwnProperty(key)) { |
|---|
| 343 | + iterator.call(context, obj[key], key, obj); |
|---|
| 344 | + } |
|---|
| 345 | + } |
|---|
| 346 | + } |
|---|
| 347 | + } |
|---|
| 348 | + return obj; |
|---|
| 349 | +} |
|---|
| 350 | + |
|---|
| 351 | +function sortedKeys(obj) { |
|---|
| 352 | + var keys = []; |
|---|
| 353 | + for (var key in obj) { |
|---|
| 354 | + if (obj.hasOwnProperty(key)) { |
|---|
| 355 | + keys.push(key); |
|---|
| 356 | + } |
|---|
| 357 | + } |
|---|
| 358 | + return keys.sort(); |
|---|
| 359 | +} |
|---|
| 360 | + |
|---|
| 361 | +function forEachSorted(obj, iterator, context) { |
|---|
| 362 | + var keys = sortedKeys(obj); |
|---|
| 363 | + for ( var i = 0; i < keys.length; i++) { |
|---|
| 364 | + iterator.call(context, obj[keys[i]], keys[i]); |
|---|
| 365 | + } |
|---|
| 366 | + return keys; |
|---|
| 367 | +} |
|---|
| 368 | + |
|---|
| 369 | + |
|---|
| 370 | +/** |
|---|
| 371 | + * when using forEach the params are value, key, but it is often useful to have key, value. |
|---|
| 372 | + * @param {function(string, *)} iteratorFn |
|---|
| 373 | + * @returns {function(*, string)} |
|---|
| 374 | + */ |
|---|
| 375 | +function reverseParams(iteratorFn) { |
|---|
| 376 | + return function(value, key) { iteratorFn(key, value); }; |
|---|
| 377 | +} |
|---|
| 378 | + |
|---|
| 379 | +/** |
|---|
| 380 | + * A consistent way of creating unique IDs in angular. |
|---|
| 381 | + * |
|---|
| 382 | + * Using simple numbers allows us to generate 28.6 million unique ids per second for 10 years before |
|---|
| 383 | + * we hit number precision issues in JavaScript. |
|---|
| 384 | + * |
|---|
| 385 | + * Math.pow(2,53) / 60 / 60 / 24 / 365 / 10 = 28.6M |
|---|
| 386 | + * |
|---|
| 387 | + * @returns {number} an unique alpha-numeric string |
|---|
| 388 | + */ |
|---|
| 389 | +function nextUid() { |
|---|
| 390 | + return ++uid; |
|---|
| 391 | +} |
|---|
| 392 | + |
|---|
| 393 | + |
|---|
| 394 | +/** |
|---|
| 395 | + * Set or clear the hashkey for an object. |
|---|
| 396 | + * @param obj object |
|---|
| 397 | + * @param h the hashkey (!truthy to delete the hashkey) |
|---|
| 398 | + */ |
|---|
| 399 | +function setHashKey(obj, h) { |
|---|
| 400 | + if (h) { |
|---|
| 401 | + obj.$$hashKey = h; |
|---|
| 402 | + } |
|---|
| 403 | + else { |
|---|
| 404 | + delete obj.$$hashKey; |
|---|
| 405 | + } |
|---|
| 406 | +} |
|---|
| 407 | + |
|---|
| 408 | +/** |
|---|
| 409 | + * @ngdoc function |
|---|
| 410 | + * @name angular.extend |
|---|
| 411 | + * @module ng |
|---|
| 412 | + * @kind function |
|---|
| 413 | + * |
|---|
| 414 | + * @description |
|---|
| 415 | + * Extends the destination object `dst` by copying own enumerable properties from the `src` object(s) |
|---|
| 416 | + * to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so |
|---|
| 417 | + * by passing an empty object as the target: `var object = angular.extend({}, object1, object2)`. |
|---|
| 418 | + * |
|---|
| 419 | + * @param {Object} dst Destination object. |
|---|
| 420 | + * @param {...Object} src Source object(s). |
|---|
| 421 | + * @returns {Object} Reference to `dst`. |
|---|
| 422 | + */ |
|---|
| 423 | +function extend(dst) { |
|---|
| 424 | + var h = dst.$$hashKey; |
|---|
| 425 | + |
|---|
| 426 | + for (var i = 1, ii = arguments.length; i < ii; i++) { |
|---|
| 427 | + var obj = arguments[i]; |
|---|
| 428 | + if (obj) { |
|---|
| 429 | + var keys = Object.keys(obj); |
|---|
| 430 | + for (var j = 0, jj = keys.length; j < jj; j++) { |
|---|
| 431 | + var key = keys[j]; |
|---|
| 432 | + dst[key] = obj[key]; |
|---|
| 433 | + } |
|---|
| 434 | + } |
|---|
| 435 | + } |
|---|
| 436 | + |
|---|
| 437 | + setHashKey(dst, h); |
|---|
| 438 | + return dst; |
|---|
| 439 | +} |
|---|
| 440 | + |
|---|
| 441 | +function int(str) { |
|---|
| 442 | + return parseInt(str, 10); |
|---|
| 443 | +} |
|---|
| 444 | + |
|---|
| 445 | + |
|---|
| 446 | +function inherit(parent, extra) { |
|---|
| 447 | + return extend(new (extend(function() {}, {prototype:parent}))(), extra); |
|---|
| 448 | +} |
|---|
| 449 | + |
|---|
| 450 | +/** |
|---|
| 451 | + * @ngdoc function |
|---|
| 452 | + * @name angular.noop |
|---|
| 453 | + * @module ng |
|---|
| 454 | + * @kind function |
|---|
| 455 | + * |
|---|
| 456 | + * @description |
|---|
| 457 | + * A function that performs no operations. This function can be useful when writing code in the |
|---|
| 458 | + * functional style. |
|---|
| 459 | + ```js |
|---|
| 460 | + function foo(callback) { |
|---|
| 461 | + var result = calculateResult(); |
|---|
| 462 | + (callback || angular.noop)(result); |
|---|
| 463 | + } |
|---|
| 464 | + ``` |
|---|
| 465 | + */ |
|---|
| 466 | +function noop() {} |
|---|
| 467 | +noop.$inject = []; |
|---|
| 468 | + |
|---|
| 469 | + |
|---|
| 470 | +/** |
|---|
| 471 | + * @ngdoc function |
|---|
| 472 | + * @name angular.identity |
|---|
| 473 | + * @module ng |
|---|
| 474 | + * @kind function |
|---|
| 475 | + * |
|---|
| 476 | + * @description |
|---|
| 477 | + * A function that returns its first argument. This function is useful when writing code in the |
|---|
| 478 | + * functional style. |
|---|
| 479 | + * |
|---|
| 480 | + ```js |
|---|
| 481 | + function transformer(transformationFn, value) { |
|---|
| 482 | + return (transformationFn || angular.identity)(value); |
|---|
| 483 | + }; |
|---|
| 484 | + ``` |
|---|
| 485 | + */ |
|---|
| 486 | +function identity($) {return $;} |
|---|
| 487 | +identity.$inject = []; |
|---|
| 488 | + |
|---|
| 489 | + |
|---|
| 490 | +function valueFn(value) {return function() {return value;};} |
|---|
| 491 | + |
|---|
| 492 | +/** |
|---|
| 493 | + * @ngdoc function |
|---|
| 494 | + * @name angular.isUndefined |
|---|
| 495 | + * @module ng |
|---|
| 496 | + * @kind function |
|---|
| 497 | + * |
|---|
| 498 | + * @description |
|---|
| 499 | + * Determines if a reference is undefined. |
|---|
| 500 | + * |
|---|
| 501 | + * @param {*} value Reference to check. |
|---|
| 502 | + * @returns {boolean} True if `value` is undefined. |
|---|
| 503 | + */ |
|---|
| 504 | +function isUndefined(value){return typeof value === 'undefined';} |
|---|
| 505 | + |
|---|
| 506 | + |
|---|
| 507 | +/** |
|---|
| 508 | + * @ngdoc function |
|---|
| 509 | + * @name angular.isDefined |
|---|
| 510 | + * @module ng |
|---|
| 511 | + * @kind function |
|---|
| 512 | + * |
|---|
| 513 | + * @description |
|---|
| 514 | + * Determines if a reference is defined. |
|---|
| 515 | + * |
|---|
| 516 | + * @param {*} value Reference to check. |
|---|
| 517 | + * @returns {boolean} True if `value` is defined. |
|---|
| 518 | + */ |
|---|
| 519 | +function isDefined(value){return typeof value !== 'undefined';} |
|---|
| 520 | + |
|---|
| 521 | + |
|---|
| 522 | +/** |
|---|
| 523 | + * @ngdoc function |
|---|
| 524 | + * @name angular.isObject |
|---|
| 525 | + * @module ng |
|---|
| 526 | + * @kind function |
|---|
| 527 | + * |
|---|
| 528 | + * @description |
|---|
| 529 | + * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not |
|---|
| 530 | + * considered to be objects. Note that JavaScript arrays are objects. |
|---|
| 531 | + * |
|---|
| 532 | + * @param {*} value Reference to check. |
|---|
| 533 | + * @returns {boolean} True if `value` is an `Object` but not `null`. |
|---|
| 534 | + */ |
|---|
| 535 | +function isObject(value){ |
|---|
| 536 | + // http://jsperf.com/isobject4 |
|---|
| 537 | + return value !== null && typeof value === 'object'; |
|---|
| 538 | +} |
|---|
| 539 | + |
|---|
| 540 | + |
|---|
| 541 | +/** |
|---|
| 542 | + * @ngdoc function |
|---|
| 543 | + * @name angular.isString |
|---|
| 544 | + * @module ng |
|---|
| 545 | + * @kind function |
|---|
| 546 | + * |
|---|
| 547 | + * @description |
|---|
| 548 | + * Determines if a reference is a `String`. |
|---|
| 549 | + * |
|---|
| 550 | + * @param {*} value Reference to check. |
|---|
| 551 | + * @returns {boolean} True if `value` is a `String`. |
|---|
| 552 | + */ |
|---|
| 553 | +function isString(value){return typeof value === 'string';} |
|---|
| 554 | + |
|---|
| 555 | + |
|---|
| 556 | +/** |
|---|
| 557 | + * @ngdoc function |
|---|
| 558 | + * @name angular.isNumber |
|---|
| 559 | + * @module ng |
|---|
| 560 | + * @kind function |
|---|
| 561 | + * |
|---|
| 562 | + * @description |
|---|
| 563 | + * Determines if a reference is a `Number`. |
|---|
| 564 | + * |
|---|
| 565 | + * @param {*} value Reference to check. |
|---|
| 566 | + * @returns {boolean} True if `value` is a `Number`. |
|---|
| 567 | + */ |
|---|
| 568 | +function isNumber(value){return typeof value === 'number';} |
|---|
| 569 | + |
|---|
| 570 | + |
|---|
| 571 | +/** |
|---|
| 572 | + * @ngdoc function |
|---|
| 573 | + * @name angular.isDate |
|---|
| 574 | + * @module ng |
|---|
| 575 | + * @kind function |
|---|
| 576 | + * |
|---|
| 577 | + * @description |
|---|
| 578 | + * Determines if a value is a date. |
|---|
| 579 | + * |
|---|
| 580 | + * @param {*} value Reference to check. |
|---|
| 581 | + * @returns {boolean} True if `value` is a `Date`. |
|---|
| 582 | + */ |
|---|
| 583 | +function isDate(value) { |
|---|
| 584 | + return toString.call(value) === '[object Date]'; |
|---|
| 585 | +} |
|---|
| 586 | + |
|---|
| 587 | + |
|---|
| 588 | +/** |
|---|
| 589 | + * @ngdoc function |
|---|
| 590 | + * @name angular.isArray |
|---|
| 591 | + * @module ng |
|---|
| 592 | + * @kind function |
|---|
| 593 | + * |
|---|
| 594 | + * @description |
|---|
| 595 | + * Determines if a reference is an `Array`. |
|---|
| 596 | + * |
|---|
| 597 | + * @param {*} value Reference to check. |
|---|
| 598 | + * @returns {boolean} True if `value` is an `Array`. |
|---|
| 599 | + */ |
|---|
| 600 | +var isArray = Array.isArray; |
|---|
| 601 | + |
|---|
| 602 | +/** |
|---|
| 603 | + * @ngdoc function |
|---|
| 604 | + * @name angular.isFunction |
|---|
| 605 | + * @module ng |
|---|
| 606 | + * @kind function |
|---|
| 607 | + * |
|---|
| 608 | + * @description |
|---|
| 609 | + * Determines if a reference is a `Function`. |
|---|
| 610 | + * |
|---|
| 611 | + * @param {*} value Reference to check. |
|---|
| 612 | + * @returns {boolean} True if `value` is a `Function`. |
|---|
| 613 | + */ |
|---|
| 614 | +function isFunction(value){return typeof value === 'function';} |
|---|
| 615 | + |
|---|
| 616 | + |
|---|
| 617 | +/** |
|---|
| 618 | + * Determines if a value is a regular expression object. |
|---|
| 619 | + * |
|---|
| 620 | + * @private |
|---|
| 621 | + * @param {*} value Reference to check. |
|---|
| 622 | + * @returns {boolean} True if `value` is a `RegExp`. |
|---|
| 623 | + */ |
|---|
| 624 | +function isRegExp(value) { |
|---|
| 625 | + return toString.call(value) === '[object RegExp]'; |
|---|
| 626 | +} |
|---|
| 627 | + |
|---|
| 628 | + |
|---|
| 629 | +/** |
|---|
| 630 | + * Checks if `obj` is a window object. |
|---|
| 631 | + * |
|---|
| 632 | + * @private |
|---|
| 633 | + * @param {*} obj Object to check |
|---|
| 634 | + * @returns {boolean} True if `obj` is a window obj. |
|---|
| 635 | + */ |
|---|
| 636 | +function isWindow(obj) { |
|---|
| 637 | + return obj && obj.window === obj; |
|---|
| 638 | +} |
|---|
| 639 | + |
|---|
| 640 | + |
|---|
| 641 | +function isScope(obj) { |
|---|
| 642 | + return obj && obj.$evalAsync && obj.$watch; |
|---|
| 643 | +} |
|---|
| 644 | + |
|---|
| 645 | + |
|---|
| 646 | +function isFile(obj) { |
|---|
| 647 | + return toString.call(obj) === '[object File]'; |
|---|
| 648 | +} |
|---|
| 649 | + |
|---|
| 650 | + |
|---|
| 651 | +function isBlob(obj) { |
|---|
| 652 | + return toString.call(obj) === '[object Blob]'; |
|---|
| 653 | +} |
|---|
| 654 | + |
|---|
| 655 | + |
|---|
| 656 | +function isBoolean(value) { |
|---|
| 657 | + return typeof value === 'boolean'; |
|---|
| 658 | +} |
|---|
| 659 | + |
|---|
| 660 | + |
|---|
| 661 | +function isPromiseLike(obj) { |
|---|
| 662 | + return obj && isFunction(obj.then); |
|---|
| 663 | +} |
|---|
| 664 | + |
|---|
| 665 | + |
|---|
| 666 | +var trim = function(value) { |
|---|
| 667 | + return isString(value) ? value.trim() : value; |
|---|
| 668 | +}; |
|---|
| 669 | + |
|---|
| 670 | + |
|---|
| 671 | +/** |
|---|
| 672 | + * @ngdoc function |
|---|
| 673 | + * @name angular.isElement |
|---|
| 674 | + * @module ng |
|---|
| 675 | + * @kind function |
|---|
| 676 | + * |
|---|
| 677 | + * @description |
|---|
| 678 | + * Determines if a reference is a DOM element (or wrapped jQuery element). |
|---|
| 679 | + * |
|---|
| 680 | + * @param {*} value Reference to check. |
|---|
| 681 | + * @returns {boolean} True if `value` is a DOM element (or wrapped jQuery element). |
|---|
| 682 | + */ |
|---|
| 683 | +function isElement(node) { |
|---|
| 684 | + return !!(node && |
|---|
| 685 | + (node.nodeName // we are a direct element |
|---|
| 686 | + || (node.prop && node.attr && node.find))); // we have an on and find method part of jQuery API |
|---|
| 687 | +} |
|---|
| 688 | + |
|---|
| 689 | +/** |
|---|
| 690 | + * @param str 'key1,key2,...' |
|---|
| 691 | + * @returns {object} in the form of {key1:true, key2:true, ...} |
|---|
| 692 | + */ |
|---|
| 693 | +function makeMap(str) { |
|---|
| 694 | + var obj = {}, items = str.split(","), i; |
|---|
| 695 | + for ( i = 0; i < items.length; i++ ) |
|---|
| 696 | + obj[ items[i] ] = true; |
|---|
| 697 | + return obj; |
|---|
| 698 | +} |
|---|
| 699 | + |
|---|
| 700 | + |
|---|
| 701 | +function nodeName_(element) { |
|---|
| 702 | + return lowercase(element.nodeName || element[0].nodeName); |
|---|
| 703 | +} |
|---|
| 704 | + |
|---|
| 705 | + |
|---|
| 706 | +/** |
|---|
| 707 | + * @description |
|---|
| 708 | + * Determines the number of elements in an array, the number of properties an object has, or |
|---|
| 709 | + * the length of a string. |
|---|
| 710 | + * |
|---|
| 711 | + * Note: This function is used to augment the Object type in Angular expressions. See |
|---|
| 712 | + * {@link angular.Object} for more information about Angular arrays. |
|---|
| 713 | + * |
|---|
| 714 | + * @param {Object|Array|string} obj Object, array, or string to inspect. |
|---|
| 715 | + * @param {boolean} [ownPropsOnly=false] Count only "own" properties in an object |
|---|
| 716 | + * @returns {number} The size of `obj` or `0` if `obj` is neither an object nor an array. |
|---|
| 717 | + */ |
|---|
| 718 | +function size(obj, ownPropsOnly) { |
|---|
| 719 | + var count = 0, key; |
|---|
| 720 | + |
|---|
| 721 | + if (isArray(obj) || isString(obj)) { |
|---|
| 722 | + return obj.length; |
|---|
| 723 | + } else if (isObject(obj)) { |
|---|
| 724 | + for (key in obj) |
|---|
| 725 | + if (!ownPropsOnly || obj.hasOwnProperty(key)) |
|---|
| 726 | + count++; |
|---|
| 727 | + } |
|---|
| 728 | + |
|---|
| 729 | + return count; |
|---|
| 730 | +} |
|---|
| 731 | + |
|---|
| 732 | + |
|---|
| 733 | +function includes(array, obj) { |
|---|
| 734 | + return Array.prototype.indexOf.call(array, obj) != -1; |
|---|
| 735 | +} |
|---|
| 736 | + |
|---|
| 737 | +function arrayRemove(array, value) { |
|---|
| 738 | + var index = array.indexOf(value); |
|---|
| 739 | + if (index >=0) |
|---|
| 740 | + array.splice(index, 1); |
|---|
| 741 | + return value; |
|---|
| 742 | +} |
|---|
| 743 | + |
|---|
| 744 | +function isLeafNode (node) { |
|---|
| 745 | + if (node) { |
|---|
| 746 | + switch (nodeName_(node)) { |
|---|
| 747 | + case "option": |
|---|
| 748 | + case "pre": |
|---|
| 749 | + case "title": |
|---|
| 750 | + return true; |
|---|
| 751 | + } |
|---|
| 752 | + } |
|---|
| 753 | + return false; |
|---|
| 754 | +} |
|---|
| 755 | + |
|---|
| 756 | +/** |
|---|
| 757 | + * @ngdoc function |
|---|
| 758 | + * @name angular.copy |
|---|
| 759 | + * @module ng |
|---|
| 760 | + * @kind function |
|---|
| 761 | + * |
|---|
| 762 | + * @description |
|---|
| 763 | + * Creates a deep copy of `source`, which should be an object or an array. |
|---|
| 764 | + * |
|---|
| 765 | + * * If no destination is supplied, a copy of the object or array is created. |
|---|
| 766 | + * * If a destination is provided, all of its elements (for array) or properties (for objects) |
|---|
| 767 | + * are deleted and then all elements/properties from the source are copied to it. |
|---|
| 768 | + * * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned. |
|---|
| 769 | + * * If `source` is identical to 'destination' an exception will be thrown. |
|---|
| 770 | + * |
|---|
| 771 | + * @param {*} source The source that will be used to make a copy. |
|---|
| 772 | + * Can be any type, including primitives, `null`, and `undefined`. |
|---|
| 773 | + * @param {(Object|Array)=} destination Destination into which the source is copied. If |
|---|
| 774 | + * provided, must be of the same type as `source`. |
|---|
| 775 | + * @returns {*} The copy or updated `destination`, if `destination` was specified. |
|---|
| 776 | + * |
|---|
| 777 | + * @example |
|---|
| 778 | + <example module="copyExample"> |
|---|
| 779 | + <file name="index.html"> |
|---|
| 780 | + <div ng-controller="ExampleController"> |
|---|
| 781 | + <form novalidate class="simple-form"> |
|---|
| 782 | + Name: <input type="text" ng-model="user.name" /><br /> |
|---|
| 783 | + E-mail: <input type="email" ng-model="user.email" /><br /> |
|---|
| 784 | + Gender: <input type="radio" ng-model="user.gender" value="male" />male |
|---|
| 785 | + <input type="radio" ng-model="user.gender" value="female" />female<br /> |
|---|
| 786 | + <button ng-click="reset()">RESET</button> |
|---|
| 787 | + <button ng-click="update(user)">SAVE</button> |
|---|
| 788 | + </form> |
|---|
| 789 | + <pre>form = {{user | json}}</pre> |
|---|
| 790 | + <pre>master = {{master | json}}</pre> |
|---|
| 791 | + </div> |
|---|
| 792 | + |
|---|
| 793 | + <script> |
|---|
| 794 | + angular.module('copyExample', []) |
|---|
| 795 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 796 | + $scope.master= {}; |
|---|
| 797 | + |
|---|
| 798 | + $scope.update = function(user) { |
|---|
| 799 | + // Example with 1 argument |
|---|
| 800 | + $scope.master= angular.copy(user); |
|---|
| 801 | + }; |
|---|
| 802 | + |
|---|
| 803 | + $scope.reset = function() { |
|---|
| 804 | + // Example with 2 arguments |
|---|
| 805 | + angular.copy($scope.master, $scope.user); |
|---|
| 806 | + }; |
|---|
| 807 | + |
|---|
| 808 | + $scope.reset(); |
|---|
| 809 | + }]); |
|---|
| 810 | + </script> |
|---|
| 811 | + </file> |
|---|
| 812 | + </example> |
|---|
| 813 | + */ |
|---|
| 814 | +function copy(source, destination, stackSource, stackDest) { |
|---|
| 815 | + if (isWindow(source) || isScope(source)) { |
|---|
| 816 | + throw ngMinErr('cpws', |
|---|
| 817 | + "Can't copy! Making copies of Window or Scope instances is not supported."); |
|---|
| 818 | + } |
|---|
| 819 | + |
|---|
| 820 | + if (!destination) { |
|---|
| 821 | + destination = source; |
|---|
| 822 | + if (source) { |
|---|
| 823 | + if (isArray(source)) { |
|---|
| 824 | + destination = copy(source, [], stackSource, stackDest); |
|---|
| 825 | + } else if (isDate(source)) { |
|---|
| 826 | + destination = new Date(source.getTime()); |
|---|
| 827 | + } else if (isRegExp(source)) { |
|---|
| 828 | + destination = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]); |
|---|
| 829 | + destination.lastIndex = source.lastIndex; |
|---|
| 830 | + } else if (isObject(source)) { |
|---|
| 831 | + var emptyObject = Object.create(Object.getPrototypeOf(source)); |
|---|
| 832 | + destination = copy(source, emptyObject, stackSource, stackDest); |
|---|
| 833 | + } |
|---|
| 834 | + } |
|---|
| 835 | + } else { |
|---|
| 836 | + if (source === destination) throw ngMinErr('cpi', |
|---|
| 837 | + "Can't copy! Source and destination are identical."); |
|---|
| 838 | + |
|---|
| 839 | + stackSource = stackSource || []; |
|---|
| 840 | + stackDest = stackDest || []; |
|---|
| 841 | + |
|---|
| 842 | + if (isObject(source)) { |
|---|
| 843 | + var index = stackSource.indexOf(source); |
|---|
| 844 | + if (index !== -1) return stackDest[index]; |
|---|
| 845 | + |
|---|
| 846 | + stackSource.push(source); |
|---|
| 847 | + stackDest.push(destination); |
|---|
| 848 | + } |
|---|
| 849 | + |
|---|
| 850 | + var result; |
|---|
| 851 | + if (isArray(source)) { |
|---|
| 852 | + destination.length = 0; |
|---|
| 853 | + for ( var i = 0; i < source.length; i++) { |
|---|
| 854 | + result = copy(source[i], null, stackSource, stackDest); |
|---|
| 855 | + if (isObject(source[i])) { |
|---|
| 856 | + stackSource.push(source[i]); |
|---|
| 857 | + stackDest.push(result); |
|---|
| 858 | + } |
|---|
| 859 | + destination.push(result); |
|---|
| 860 | + } |
|---|
| 861 | + } else { |
|---|
| 862 | + var h = destination.$$hashKey; |
|---|
| 863 | + if (isArray(destination)) { |
|---|
| 864 | + destination.length = 0; |
|---|
| 865 | + } else { |
|---|
| 866 | + forEach(destination, function(value, key) { |
|---|
| 867 | + delete destination[key]; |
|---|
| 868 | + }); |
|---|
| 869 | + } |
|---|
| 870 | + for ( var key in source) { |
|---|
| 871 | + if(source.hasOwnProperty(key)) { |
|---|
| 872 | + result = copy(source[key], null, stackSource, stackDest); |
|---|
| 873 | + if (isObject(source[key])) { |
|---|
| 874 | + stackSource.push(source[key]); |
|---|
| 875 | + stackDest.push(result); |
|---|
| 876 | + } |
|---|
| 877 | + destination[key] = result; |
|---|
| 878 | + } |
|---|
| 879 | + } |
|---|
| 880 | + setHashKey(destination,h); |
|---|
| 881 | + } |
|---|
| 882 | + |
|---|
| 883 | + } |
|---|
| 884 | + return destination; |
|---|
| 885 | +} |
|---|
| 886 | + |
|---|
| 887 | +/** |
|---|
| 888 | + * Creates a shallow copy of an object, an array or a primitive. |
|---|
| 889 | + * |
|---|
| 890 | + * Assumes that there are no proto properties for objects. |
|---|
| 891 | + */ |
|---|
| 892 | +function shallowCopy(src, dst) { |
|---|
| 893 | + if (isArray(src)) { |
|---|
| 894 | + dst = dst || []; |
|---|
| 895 | + |
|---|
| 896 | + for (var i = 0, ii = src.length; i < ii; i++) { |
|---|
| 897 | + dst[i] = src[i]; |
|---|
| 898 | + } |
|---|
| 899 | + } else if (isObject(src)) { |
|---|
| 900 | + dst = dst || {}; |
|---|
| 901 | + |
|---|
| 902 | + for (var key in src) { |
|---|
| 903 | + if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) { |
|---|
| 904 | + dst[key] = src[key]; |
|---|
| 905 | + } |
|---|
| 906 | + } |
|---|
| 907 | + } |
|---|
| 908 | + |
|---|
| 909 | + return dst || src; |
|---|
| 910 | +} |
|---|
| 911 | + |
|---|
| 912 | + |
|---|
| 913 | +/** |
|---|
| 914 | + * @ngdoc function |
|---|
| 915 | + * @name angular.equals |
|---|
| 916 | + * @module ng |
|---|
| 917 | + * @kind function |
|---|
| 918 | + * |
|---|
| 919 | + * @description |
|---|
| 920 | + * Determines if two objects or two values are equivalent. Supports value types, regular |
|---|
| 921 | + * expressions, arrays and objects. |
|---|
| 922 | + * |
|---|
| 923 | + * Two objects or values are considered equivalent if at least one of the following is true: |
|---|
| 924 | + * |
|---|
| 925 | + * * Both objects or values pass `===` comparison. |
|---|
| 926 | + * * Both objects or values are of the same type and all of their properties are equal by |
|---|
| 927 | + * comparing them with `angular.equals`. |
|---|
| 928 | + * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal) |
|---|
| 929 | + * * Both values represent the same regular expression (In JavaScript, |
|---|
| 930 | + * /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual |
|---|
| 931 | + * representation matches). |
|---|
| 932 | + * |
|---|
| 933 | + * During a property comparison, properties of `function` type and properties with names |
|---|
| 934 | + * that begin with `$` are ignored. |
|---|
| 935 | + * |
|---|
| 936 | + * Scope and DOMWindow objects are being compared only by identify (`===`). |
|---|
| 937 | + * |
|---|
| 938 | + * @param {*} o1 Object or value to compare. |
|---|
| 939 | + * @param {*} o2 Object or value to compare. |
|---|
| 940 | + * @returns {boolean} True if arguments are equal. |
|---|
| 941 | + */ |
|---|
| 942 | +function equals(o1, o2) { |
|---|
| 943 | + if (o1 === o2) return true; |
|---|
| 944 | + if (o1 === null || o2 === null) return false; |
|---|
| 945 | + if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN |
|---|
| 946 | + var t1 = typeof o1, t2 = typeof o2, length, key, keySet; |
|---|
| 947 | + if (t1 == t2) { |
|---|
| 948 | + if (t1 == 'object') { |
|---|
| 949 | + if (isArray(o1)) { |
|---|
| 950 | + if (!isArray(o2)) return false; |
|---|
| 951 | + if ((length = o1.length) == o2.length) { |
|---|
| 952 | + for(key=0; key<length; key++) { |
|---|
| 953 | + if (!equals(o1[key], o2[key])) return false; |
|---|
| 954 | + } |
|---|
| 955 | + return true; |
|---|
| 956 | + } |
|---|
| 957 | + } else if (isDate(o1)) { |
|---|
| 958 | + if (!isDate(o2)) return false; |
|---|
| 959 | + return equals(o1.getTime(), o2.getTime()); |
|---|
| 960 | + } else if (isRegExp(o1) && isRegExp(o2)) { |
|---|
| 961 | + return o1.toString() == o2.toString(); |
|---|
| 962 | + } else { |
|---|
| 963 | + if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) || isArray(o2)) return false; |
|---|
| 964 | + keySet = {}; |
|---|
| 965 | + for(key in o1) { |
|---|
| 966 | + if (key.charAt(0) === '$' || isFunction(o1[key])) continue; |
|---|
| 967 | + if (!equals(o1[key], o2[key])) return false; |
|---|
| 968 | + keySet[key] = true; |
|---|
| 969 | + } |
|---|
| 970 | + for(key in o2) { |
|---|
| 971 | + if (!keySet.hasOwnProperty(key) && |
|---|
| 972 | + key.charAt(0) !== '$' && |
|---|
| 973 | + o2[key] !== undefined && |
|---|
| 974 | + !isFunction(o2[key])) return false; |
|---|
| 975 | + } |
|---|
| 976 | + return true; |
|---|
| 977 | + } |
|---|
| 978 | + } |
|---|
| 979 | + } |
|---|
| 980 | + return false; |
|---|
| 981 | +} |
|---|
| 982 | + |
|---|
| 983 | +var csp = function() { |
|---|
| 984 | + if (isDefined(csp.isActive_)) return csp.isActive_; |
|---|
| 985 | + |
|---|
| 986 | + var active = !!(document.querySelector('[ng-csp]') || |
|---|
| 987 | + document.querySelector('[data-ng-csp]')); |
|---|
| 988 | + |
|---|
| 989 | + if (!active) { |
|---|
| 990 | + try { |
|---|
| 991 | + /* jshint -W031, -W054 */ |
|---|
| 992 | + new Function(''); |
|---|
| 993 | + /* jshint +W031, +W054 */ |
|---|
| 994 | + } catch (e) { |
|---|
| 995 | + active = true; |
|---|
| 996 | + } |
|---|
| 997 | + } |
|---|
| 998 | + |
|---|
| 999 | + return (csp.isActive_ = active); |
|---|
| 1000 | +}; |
|---|
| 1001 | + |
|---|
| 1002 | + |
|---|
| 1003 | + |
|---|
| 1004 | +function concat(array1, array2, index) { |
|---|
| 1005 | + return array1.concat(slice.call(array2, index)); |
|---|
| 1006 | +} |
|---|
| 1007 | + |
|---|
| 1008 | +function sliceArgs(args, startIndex) { |
|---|
| 1009 | + return slice.call(args, startIndex || 0); |
|---|
| 1010 | +} |
|---|
| 1011 | + |
|---|
| 1012 | + |
|---|
| 1013 | +/* jshint -W101 */ |
|---|
| 1014 | +/** |
|---|
| 1015 | + * @ngdoc function |
|---|
| 1016 | + * @name angular.bind |
|---|
| 1017 | + * @module ng |
|---|
| 1018 | + * @kind function |
|---|
| 1019 | + * |
|---|
| 1020 | + * @description |
|---|
| 1021 | + * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for |
|---|
| 1022 | + * `fn`). You can supply optional `args` that are prebound to the function. This feature is also |
|---|
| 1023 | + * known as [partial application](http://en.wikipedia.org/wiki/Partial_application), as |
|---|
| 1024 | + * distinguished from [function currying](http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application). |
|---|
| 1025 | + * |
|---|
| 1026 | + * @param {Object} self Context which `fn` should be evaluated in. |
|---|
| 1027 | + * @param {function()} fn Function to be bound. |
|---|
| 1028 | + * @param {...*} args Optional arguments to be prebound to the `fn` function call. |
|---|
| 1029 | + * @returns {function()} Function that wraps the `fn` with all the specified bindings. |
|---|
| 1030 | + */ |
|---|
| 1031 | +/* jshint +W101 */ |
|---|
| 1032 | +function bind(self, fn) { |
|---|
| 1033 | + var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : []; |
|---|
| 1034 | + if (isFunction(fn) && !(fn instanceof RegExp)) { |
|---|
| 1035 | + return curryArgs.length |
|---|
| 1036 | + ? function() { |
|---|
| 1037 | + return arguments.length |
|---|
| 1038 | + ? fn.apply(self, curryArgs.concat(slice.call(arguments, 0))) |
|---|
| 1039 | + : fn.apply(self, curryArgs); |
|---|
| 1040 | + } |
|---|
| 1041 | + : function() { |
|---|
| 1042 | + return arguments.length |
|---|
| 1043 | + ? fn.apply(self, arguments) |
|---|
| 1044 | + : fn.call(self); |
|---|
| 1045 | + }; |
|---|
| 1046 | + } else { |
|---|
| 1047 | + // in IE, native methods are not functions so they cannot be bound (note: they don't need to be) |
|---|
| 1048 | + return fn; |
|---|
| 1049 | + } |
|---|
| 1050 | +} |
|---|
| 1051 | + |
|---|
| 1052 | + |
|---|
| 1053 | +function toJsonReplacer(key, value) { |
|---|
| 1054 | + var val = value; |
|---|
| 1055 | + |
|---|
| 1056 | + if (typeof key === 'string' && key.charAt(0) === '$' && key.charAt(1) === '$') { |
|---|
| 1057 | + val = undefined; |
|---|
| 1058 | + } else if (isWindow(value)) { |
|---|
| 1059 | + val = '$WINDOW'; |
|---|
| 1060 | + } else if (value && document === value) { |
|---|
| 1061 | + val = '$DOCUMENT'; |
|---|
| 1062 | + } else if (isScope(value)) { |
|---|
| 1063 | + val = '$SCOPE'; |
|---|
| 1064 | + } |
|---|
| 1065 | + |
|---|
| 1066 | + return val; |
|---|
| 1067 | +} |
|---|
| 1068 | + |
|---|
| 1069 | + |
|---|
| 1070 | +/** |
|---|
| 1071 | + * @ngdoc function |
|---|
| 1072 | + * @name angular.toJson |
|---|
| 1073 | + * @module ng |
|---|
| 1074 | + * @kind function |
|---|
| 1075 | + * |
|---|
| 1076 | + * @description |
|---|
| 1077 | + * Serializes input into a JSON-formatted string. Properties with leading $$ characters will be |
|---|
| 1078 | + * stripped since angular uses this notation internally. |
|---|
| 1079 | + * |
|---|
| 1080 | + * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON. |
|---|
| 1081 | + * @param {boolean=} pretty If set to true, the JSON output will contain newlines and whitespace. |
|---|
| 1082 | + * @returns {string|undefined} JSON-ified string representing `obj`. |
|---|
| 1083 | + */ |
|---|
| 1084 | +function toJson(obj, pretty) { |
|---|
| 1085 | + if (typeof obj === 'undefined') return undefined; |
|---|
| 1086 | + return JSON.stringify(obj, toJsonReplacer, pretty ? ' ' : null); |
|---|
| 1087 | +} |
|---|
| 1088 | + |
|---|
| 1089 | + |
|---|
| 1090 | +/** |
|---|
| 1091 | + * @ngdoc function |
|---|
| 1092 | + * @name angular.fromJson |
|---|
| 1093 | + * @module ng |
|---|
| 1094 | + * @kind function |
|---|
| 1095 | + * |
|---|
| 1096 | + * @description |
|---|
| 1097 | + * Deserializes a JSON string. |
|---|
| 1098 | + * |
|---|
| 1099 | + * @param {string} json JSON string to deserialize. |
|---|
| 1100 | + * @returns {Object|Array|string|number} Deserialized thingy. |
|---|
| 1101 | + */ |
|---|
| 1102 | +function fromJson(json) { |
|---|
| 1103 | + return isString(json) |
|---|
| 1104 | + ? JSON.parse(json) |
|---|
| 1105 | + : json; |
|---|
| 1106 | +} |
|---|
| 1107 | + |
|---|
| 1108 | + |
|---|
| 1109 | +/** |
|---|
| 1110 | + * @returns {string} Returns the string representation of the element. |
|---|
| 1111 | + */ |
|---|
| 1112 | +function startingTag(element) { |
|---|
| 1113 | + element = jqLite(element).clone(); |
|---|
| 1114 | + try { |
|---|
| 1115 | + // turns out IE does not let you set .html() on elements which |
|---|
| 1116 | + // are not allowed to have children. So we just ignore it. |
|---|
| 1117 | + element.empty(); |
|---|
| 1118 | + } catch(e) {} |
|---|
| 1119 | + var elemHtml = jqLite('<div>').append(element).html(); |
|---|
| 1120 | + try { |
|---|
| 1121 | + return element[0].nodeType === NODE_TYPE_TEXT ? lowercase(elemHtml) : |
|---|
| 1122 | + elemHtml. |
|---|
| 1123 | + match(/^(<[^>]+>)/)[1]. |
|---|
| 1124 | + replace(/^<([\w\-]+)/, function(match, nodeName) { return '<' + lowercase(nodeName); }); |
|---|
| 1125 | + } catch(e) { |
|---|
| 1126 | + return lowercase(elemHtml); |
|---|
| 1127 | + } |
|---|
| 1128 | + |
|---|
| 1129 | +} |
|---|
| 1130 | + |
|---|
| 1131 | + |
|---|
| 1132 | +///////////////////////////////////////////////// |
|---|
| 1133 | + |
|---|
| 1134 | +/** |
|---|
| 1135 | + * Tries to decode the URI component without throwing an exception. |
|---|
| 1136 | + * |
|---|
| 1137 | + * @private |
|---|
| 1138 | + * @param str value potential URI component to check. |
|---|
| 1139 | + * @returns {boolean} True if `value` can be decoded |
|---|
| 1140 | + * with the decodeURIComponent function. |
|---|
| 1141 | + */ |
|---|
| 1142 | +function tryDecodeURIComponent(value) { |
|---|
| 1143 | + try { |
|---|
| 1144 | + return decodeURIComponent(value); |
|---|
| 1145 | + } catch(e) { |
|---|
| 1146 | + // Ignore any invalid uri component |
|---|
| 1147 | + } |
|---|
| 1148 | +} |
|---|
| 1149 | + |
|---|
| 1150 | + |
|---|
| 1151 | +/** |
|---|
| 1152 | + * Parses an escaped url query string into key-value pairs. |
|---|
| 1153 | + * @returns {Object.<string,boolean|Array>} |
|---|
| 1154 | + */ |
|---|
| 1155 | +function parseKeyValue(/**string*/keyValue) { |
|---|
| 1156 | + var obj = {}, key_value, key; |
|---|
| 1157 | + forEach((keyValue || "").split('&'), function(keyValue) { |
|---|
| 1158 | + if ( keyValue ) { |
|---|
| 1159 | + key_value = keyValue.replace(/\+/g,'%20').split('='); |
|---|
| 1160 | + key = tryDecodeURIComponent(key_value[0]); |
|---|
| 1161 | + if ( isDefined(key) ) { |
|---|
| 1162 | + var val = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true; |
|---|
| 1163 | + if (!hasOwnProperty.call(obj, key)) { |
|---|
| 1164 | + obj[key] = val; |
|---|
| 1165 | + } else if(isArray(obj[key])) { |
|---|
| 1166 | + obj[key].push(val); |
|---|
| 1167 | + } else { |
|---|
| 1168 | + obj[key] = [obj[key],val]; |
|---|
| 1169 | + } |
|---|
| 1170 | + } |
|---|
| 1171 | + } |
|---|
| 1172 | + }); |
|---|
| 1173 | + return obj; |
|---|
| 1174 | +} |
|---|
| 1175 | + |
|---|
| 1176 | +function toKeyValue(obj) { |
|---|
| 1177 | + var parts = []; |
|---|
| 1178 | + forEach(obj, function(value, key) { |
|---|
| 1179 | + if (isArray(value)) { |
|---|
| 1180 | + forEach(value, function(arrayValue) { |
|---|
| 1181 | + parts.push(encodeUriQuery(key, true) + |
|---|
| 1182 | + (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true))); |
|---|
| 1183 | + }); |
|---|
| 1184 | + } else { |
|---|
| 1185 | + parts.push(encodeUriQuery(key, true) + |
|---|
| 1186 | + (value === true ? '' : '=' + encodeUriQuery(value, true))); |
|---|
| 1187 | + } |
|---|
| 1188 | + }); |
|---|
| 1189 | + return parts.length ? parts.join('&') : ''; |
|---|
| 1190 | +} |
|---|
| 1191 | + |
|---|
| 1192 | + |
|---|
| 1193 | +/** |
|---|
| 1194 | + * We need our custom method because encodeURIComponent is too aggressive and doesn't follow |
|---|
| 1195 | + * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path |
|---|
| 1196 | + * segments: |
|---|
| 1197 | + * segment = *pchar |
|---|
| 1198 | + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" |
|---|
| 1199 | + * pct-encoded = "%" HEXDIG HEXDIG |
|---|
| 1200 | + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" |
|---|
| 1201 | + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" |
|---|
| 1202 | + * / "*" / "+" / "," / ";" / "=" |
|---|
| 1203 | + */ |
|---|
| 1204 | +function encodeUriSegment(val) { |
|---|
| 1205 | + return encodeUriQuery(val, true). |
|---|
| 1206 | + replace(/%26/gi, '&'). |
|---|
| 1207 | + replace(/%3D/gi, '='). |
|---|
| 1208 | + replace(/%2B/gi, '+'); |
|---|
| 1209 | +} |
|---|
| 1210 | + |
|---|
| 1211 | + |
|---|
| 1212 | +/** |
|---|
| 1213 | + * This method is intended for encoding *key* or *value* parts of query component. We need a custom |
|---|
| 1214 | + * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be |
|---|
| 1215 | + * encoded per http://tools.ietf.org/html/rfc3986: |
|---|
| 1216 | + * query = *( pchar / "/" / "?" ) |
|---|
| 1217 | + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" |
|---|
| 1218 | + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" |
|---|
| 1219 | + * pct-encoded = "%" HEXDIG HEXDIG |
|---|
| 1220 | + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" |
|---|
| 1221 | + * / "*" / "+" / "," / ";" / "=" |
|---|
| 1222 | + */ |
|---|
| 1223 | +function encodeUriQuery(val, pctEncodeSpaces) { |
|---|
| 1224 | + return encodeURIComponent(val). |
|---|
| 1225 | + replace(/%40/gi, '@'). |
|---|
| 1226 | + replace(/%3A/gi, ':'). |
|---|
| 1227 | + replace(/%24/g, '$'). |
|---|
| 1228 | + replace(/%2C/gi, ','). |
|---|
| 1229 | + replace(/%3B/gi, ';'). |
|---|
| 1230 | + replace(/%20/g, (pctEncodeSpaces ? '%20' : '+')); |
|---|
| 1231 | +} |
|---|
| 1232 | + |
|---|
| 1233 | +var ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-']; |
|---|
| 1234 | + |
|---|
| 1235 | +function getNgAttribute(element, ngAttr) { |
|---|
| 1236 | + var attr, i, ii = ngAttrPrefixes.length; |
|---|
| 1237 | + element = jqLite(element); |
|---|
| 1238 | + for (i=0; i<ii; ++i) { |
|---|
| 1239 | + attr = ngAttrPrefixes[i] + ngAttr; |
|---|
| 1240 | + if (isString(attr = element.attr(attr))) { |
|---|
| 1241 | + return attr; |
|---|
| 1242 | + } |
|---|
| 1243 | + } |
|---|
| 1244 | + return null; |
|---|
| 1245 | +} |
|---|
| 1246 | + |
|---|
| 1247 | +/** |
|---|
| 1248 | + * @ngdoc directive |
|---|
| 1249 | + * @name ngApp |
|---|
| 1250 | + * @module ng |
|---|
| 1251 | + * |
|---|
| 1252 | + * @element ANY |
|---|
| 1253 | + * @param {angular.Module} ngApp an optional application |
|---|
| 1254 | + * {@link angular.module module} name to load. |
|---|
| 1255 | + * @param {boolean=} ngStrictDi if this attribute is present on the app element, the injector will be |
|---|
| 1256 | + * created in "strict-di" mode. This means that the application will fail to invoke functions which |
|---|
| 1257 | + * do not use explicit function annotation (and are thus unsuitable for minification), as described |
|---|
| 1258 | + * in {@link guide/di the Dependency Injection guide}, and useful debugging info will assist in |
|---|
| 1259 | + * tracking down the root of these bugs. |
|---|
| 1260 | + * |
|---|
| 1261 | + * @description |
|---|
| 1262 | + * |
|---|
| 1263 | + * Use this directive to **auto-bootstrap** an AngularJS application. The `ngApp` directive |
|---|
| 1264 | + * designates the **root element** of the application and is typically placed near the root element |
|---|
| 1265 | + * of the page - e.g. on the `<body>` or `<html>` tags. |
|---|
| 1266 | + * |
|---|
| 1267 | + * Only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp` |
|---|
| 1268 | + * found in the document will be used to define the root element to auto-bootstrap as an |
|---|
| 1269 | + * application. To run multiple applications in an HTML document you must manually bootstrap them using |
|---|
| 1270 | + * {@link angular.bootstrap} instead. AngularJS applications cannot be nested within each other. |
|---|
| 1271 | + * |
|---|
| 1272 | + * You can specify an **AngularJS module** to be used as the root module for the application. This |
|---|
| 1273 | + * module will be loaded into the {@link auto.$injector} when the application is bootstrapped and |
|---|
| 1274 | + * should contain the application code needed or have dependencies on other modules that will |
|---|
| 1275 | + * contain the code. See {@link angular.module} for more information. |
|---|
| 1276 | + * |
|---|
| 1277 | + * In the example below if the `ngApp` directive were not placed on the `html` element then the |
|---|
| 1278 | + * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}` |
|---|
| 1279 | + * would not be resolved to `3`. |
|---|
| 1280 | + * |
|---|
| 1281 | + * `ngApp` is the easiest, and most common, way to bootstrap an application. |
|---|
| 1282 | + * |
|---|
| 1283 | + <example module="ngAppDemo"> |
|---|
| 1284 | + <file name="index.html"> |
|---|
| 1285 | + <div ng-controller="ngAppDemoController"> |
|---|
| 1286 | + I can add: {{a}} + {{b}} = {{ a+b }} |
|---|
| 1287 | + </div> |
|---|
| 1288 | + </file> |
|---|
| 1289 | + <file name="script.js"> |
|---|
| 1290 | + angular.module('ngAppDemo', []).controller('ngAppDemoController', function($scope) { |
|---|
| 1291 | + $scope.a = 1; |
|---|
| 1292 | + $scope.b = 2; |
|---|
| 1293 | + }); |
|---|
| 1294 | + </file> |
|---|
| 1295 | + </example> |
|---|
| 1296 | + * |
|---|
| 1297 | + * Using `ngStrictDi`, you would see something like this: |
|---|
| 1298 | + * |
|---|
| 1299 | + <example ng-app-included="true"> |
|---|
| 1300 | + <file name="index.html"> |
|---|
| 1301 | + <div ng-app="ngAppStrictDemo" ng-strict-di> |
|---|
| 1302 | + <div ng-controller="GoodController1"> |
|---|
| 1303 | + I can add: {{a}} + {{b}} = {{ a+b }} |
|---|
| 1304 | + |
|---|
| 1305 | + <p>This renders because the controller does not fail to |
|---|
| 1306 | + instantiate, by using explicit annotation style (see |
|---|
| 1307 | + script.js for details) |
|---|
| 1308 | + </p> |
|---|
| 1309 | + </div> |
|---|
| 1310 | + |
|---|
| 1311 | + <div ng-controller="GoodController2"> |
|---|
| 1312 | + Name: <input ng-model="name"><br /> |
|---|
| 1313 | + Hello, {{name}}! |
|---|
| 1314 | + |
|---|
| 1315 | + <p>This renders because the controller does not fail to |
|---|
| 1316 | + instantiate, by using explicit annotation style |
|---|
| 1317 | + (see script.js for details) |
|---|
| 1318 | + </p> |
|---|
| 1319 | + </div> |
|---|
| 1320 | + |
|---|
| 1321 | + <div ng-controller="BadController"> |
|---|
| 1322 | + I can add: {{a}} + {{b}} = {{ a+b }} |
|---|
| 1323 | + |
|---|
| 1324 | + <p>The controller could not be instantiated, due to relying |
|---|
| 1325 | + on automatic function annotations (which are disabled in |
|---|
| 1326 | + strict mode). As such, the content of this section is not |
|---|
| 1327 | + interpolated, and there should be an error in your web console. |
|---|
| 1328 | + </p> |
|---|
| 1329 | + </div> |
|---|
| 1330 | + </div> |
|---|
| 1331 | + </file> |
|---|
| 1332 | + <file name="script.js"> |
|---|
| 1333 | + angular.module('ngAppStrictDemo', []) |
|---|
| 1334 | + // BadController will fail to instantiate, due to relying on automatic function annotation, |
|---|
| 1335 | + // rather than an explicit annotation |
|---|
| 1336 | + .controller('BadController', function($scope) { |
|---|
| 1337 | + $scope.a = 1; |
|---|
| 1338 | + $scope.b = 2; |
|---|
| 1339 | + }) |
|---|
| 1340 | + // Unlike BadController, GoodController1 and GoodController2 will not fail to be instantiated, |
|---|
| 1341 | + // due to using explicit annotations using the array style and $inject property, respectively. |
|---|
| 1342 | + .controller('GoodController1', ['$scope', function($scope) { |
|---|
| 1343 | + $scope.a = 1; |
|---|
| 1344 | + $scope.b = 2; |
|---|
| 1345 | + }]) |
|---|
| 1346 | + .controller('GoodController2', GoodController2); |
|---|
| 1347 | + function GoodController2($scope) { |
|---|
| 1348 | + $scope.name = "World"; |
|---|
| 1349 | + } |
|---|
| 1350 | + GoodController2.$inject = ['$scope']; |
|---|
| 1351 | + </file> |
|---|
| 1352 | + <file name="style.css"> |
|---|
| 1353 | + div[ng-controller] { |
|---|
| 1354 | + margin-bottom: 1em; |
|---|
| 1355 | + -webkit-border-radius: 4px; |
|---|
| 1356 | + border-radius: 4px; |
|---|
| 1357 | + border: 1px solid; |
|---|
| 1358 | + padding: .5em; |
|---|
| 1359 | + } |
|---|
| 1360 | + div[ng-controller^=Good] { |
|---|
| 1361 | + border-color: #d6e9c6; |
|---|
| 1362 | + background-color: #dff0d8; |
|---|
| 1363 | + color: #3c763d; |
|---|
| 1364 | + } |
|---|
| 1365 | + div[ng-controller^=Bad] { |
|---|
| 1366 | + border-color: #ebccd1; |
|---|
| 1367 | + background-color: #f2dede; |
|---|
| 1368 | + color: #a94442; |
|---|
| 1369 | + margin-bottom: 0; |
|---|
| 1370 | + } |
|---|
| 1371 | + </file> |
|---|
| 1372 | + </example> |
|---|
| 1373 | + */ |
|---|
| 1374 | +function angularInit(element, bootstrap) { |
|---|
| 1375 | + var appElement, |
|---|
| 1376 | + module, |
|---|
| 1377 | + config = {}; |
|---|
| 1378 | + |
|---|
| 1379 | + // The element `element` has priority over any other element |
|---|
| 1380 | + forEach(ngAttrPrefixes, function(prefix) { |
|---|
| 1381 | + var name = prefix + 'app'; |
|---|
| 1382 | + |
|---|
| 1383 | + if (!appElement && element.hasAttribute && element.hasAttribute(name)) { |
|---|
| 1384 | + appElement = element; |
|---|
| 1385 | + module = element.getAttribute(name); |
|---|
| 1386 | + } |
|---|
| 1387 | + }); |
|---|
| 1388 | + forEach(ngAttrPrefixes, function(prefix) { |
|---|
| 1389 | + var name = prefix + 'app'; |
|---|
| 1390 | + var candidate; |
|---|
| 1391 | + |
|---|
| 1392 | + if (!appElement && (candidate = element.querySelector('[' + name.replace(':', '\\:') + ']'))) { |
|---|
| 1393 | + appElement = candidate; |
|---|
| 1394 | + module = candidate.getAttribute(name); |
|---|
| 1395 | + } |
|---|
| 1396 | + }); |
|---|
| 1397 | + if (appElement) { |
|---|
| 1398 | + config.strictDi = getNgAttribute(appElement, "strict-di") !== null; |
|---|
| 1399 | + bootstrap(appElement, module ? [module] : [], config); |
|---|
| 1400 | + } |
|---|
| 1401 | +} |
|---|
| 1402 | + |
|---|
| 1403 | +/** |
|---|
| 1404 | + * @ngdoc function |
|---|
| 1405 | + * @name angular.bootstrap |
|---|
| 1406 | + * @module ng |
|---|
| 1407 | + * @description |
|---|
| 1408 | + * Use this function to manually start up angular application. |
|---|
| 1409 | + * |
|---|
| 1410 | + * See: {@link guide/bootstrap Bootstrap} |
|---|
| 1411 | + * |
|---|
| 1412 | + * Note that Protractor based end-to-end tests cannot use this function to bootstrap manually. |
|---|
| 1413 | + * They must use {@link ng.directive:ngApp ngApp}. |
|---|
| 1414 | + * |
|---|
| 1415 | + * Angular will detect if it has been loaded into the browser more than once and only allow the |
|---|
| 1416 | + * first loaded script to be bootstrapped and will report a warning to the browser console for |
|---|
| 1417 | + * each of the subsequent scripts. This prevents strange results in applications, where otherwise |
|---|
| 1418 | + * multiple instances of Angular try to work on the DOM. |
|---|
| 1419 | + * |
|---|
| 1420 | + * ```html |
|---|
| 1421 | + * <!doctype html> |
|---|
| 1422 | + * <html> |
|---|
| 1423 | + * <body> |
|---|
| 1424 | + * <div ng-controller="WelcomeController"> |
|---|
| 1425 | + * {{greeting}} |
|---|
| 1426 | + * </div> |
|---|
| 1427 | + * |
|---|
| 1428 | + * <script src="angular.js"></script> |
|---|
| 1429 | + * <script> |
|---|
| 1430 | + * var app = angular.module('demo', []) |
|---|
| 1431 | + * .controller('WelcomeController', function($scope) { |
|---|
| 1432 | + * $scope.greeting = 'Welcome!'; |
|---|
| 1433 | + * }); |
|---|
| 1434 | + * angular.bootstrap(document, ['demo']); |
|---|
| 1435 | + * </script> |
|---|
| 1436 | + * </body> |
|---|
| 1437 | + * </html> |
|---|
| 1438 | + * ``` |
|---|
| 1439 | + * |
|---|
| 1440 | + * @param {DOMElement} element DOM element which is the root of angular application. |
|---|
| 1441 | + * @param {Array<String|Function|Array>=} modules an array of modules to load into the application. |
|---|
| 1442 | + * Each item in the array should be the name of a predefined module or a (DI annotated) |
|---|
| 1443 | + * function that will be invoked by the injector as a run block. |
|---|
| 1444 | + * See: {@link angular.module modules} |
|---|
| 1445 | + * @param {Object=} config an object for defining configuration options for the application. The |
|---|
| 1446 | + * following keys are supported: |
|---|
| 1447 | + * |
|---|
| 1448 | + * - `strictDi`: disable automatic function annotation for the application. This is meant to |
|---|
| 1449 | + * assist in finding bugs which break minified code. |
|---|
| 1450 | + * |
|---|
| 1451 | + * @returns {auto.$injector} Returns the newly created injector for this app. |
|---|
| 1452 | + */ |
|---|
| 1453 | +function bootstrap(element, modules, config) { |
|---|
| 1454 | + if (!isObject(config)) config = {}; |
|---|
| 1455 | + var defaultConfig = { |
|---|
| 1456 | + strictDi: false |
|---|
| 1457 | + }; |
|---|
| 1458 | + config = extend(defaultConfig, config); |
|---|
| 1459 | + var doBootstrap = function() { |
|---|
| 1460 | + element = jqLite(element); |
|---|
| 1461 | + |
|---|
| 1462 | + if (element.injector()) { |
|---|
| 1463 | + var tag = (element[0] === document) ? 'document' : startingTag(element); |
|---|
| 1464 | + //Encode angle brackets to prevent input from being sanitized to empty string #8683 |
|---|
| 1465 | + throw ngMinErr( |
|---|
| 1466 | + 'btstrpd', |
|---|
| 1467 | + "App Already Bootstrapped with this Element '{0}'", |
|---|
| 1468 | + tag.replace(/</,'<').replace(/>/,'>')); |
|---|
| 1469 | + } |
|---|
| 1470 | + |
|---|
| 1471 | + modules = modules || []; |
|---|
| 1472 | + modules.unshift(['$provide', function($provide) { |
|---|
| 1473 | + $provide.value('$rootElement', element); |
|---|
| 1474 | + }]); |
|---|
| 1475 | + |
|---|
| 1476 | + if (config.debugInfoEnabled) { |
|---|
| 1477 | + // Pushing so that this overrides `debugInfoEnabled` setting defined in user's `modules`. |
|---|
| 1478 | + modules.push(['$compileProvider', function($compileProvider) { |
|---|
| 1479 | + $compileProvider.debugInfoEnabled(true); |
|---|
| 1480 | + }]); |
|---|
| 1481 | + } |
|---|
| 1482 | + |
|---|
| 1483 | + modules.unshift('ng'); |
|---|
| 1484 | + var injector = createInjector(modules, config.strictDi); |
|---|
| 1485 | + injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector', |
|---|
| 1486 | + function bootstrapApply(scope, element, compile, injector) { |
|---|
| 1487 | + scope.$apply(function() { |
|---|
| 1488 | + element.data('$injector', injector); |
|---|
| 1489 | + compile(element)(scope); |
|---|
| 1490 | + }); |
|---|
| 1491 | + }] |
|---|
| 1492 | + ); |
|---|
| 1493 | + return injector; |
|---|
| 1494 | + }; |
|---|
| 1495 | + |
|---|
| 1496 | + var NG_ENABLE_DEBUG_INFO = /^NG_ENABLE_DEBUG_INFO!/; |
|---|
| 1497 | + var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/; |
|---|
| 1498 | + |
|---|
| 1499 | + if (window && NG_ENABLE_DEBUG_INFO.test(window.name)) { |
|---|
| 1500 | + config.debugInfoEnabled = true; |
|---|
| 1501 | + window.name = window.name.replace(NG_ENABLE_DEBUG_INFO, ''); |
|---|
| 1502 | + } |
|---|
| 1503 | + |
|---|
| 1504 | + if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) { |
|---|
| 1505 | + return doBootstrap(); |
|---|
| 1506 | + } |
|---|
| 1507 | + |
|---|
| 1508 | + window.name = window.name.replace(NG_DEFER_BOOTSTRAP, ''); |
|---|
| 1509 | + angular.resumeBootstrap = function(extraModules) { |
|---|
| 1510 | + forEach(extraModules, function(module) { |
|---|
| 1511 | + modules.push(module); |
|---|
| 1512 | + }); |
|---|
| 1513 | + doBootstrap(); |
|---|
| 1514 | + }; |
|---|
| 1515 | +} |
|---|
| 1516 | + |
|---|
| 1517 | +/** |
|---|
| 1518 | + * @ngdoc function |
|---|
| 1519 | + * @name angular.reloadWithDebugInfo |
|---|
| 1520 | + * @module ng |
|---|
| 1521 | + * @description |
|---|
| 1522 | + * Use this function to reload the current application with debug information turned on. |
|---|
| 1523 | + * This takes precedence over a call to `$compileProvider.debugInfoEnabled(false)`. |
|---|
| 1524 | + * |
|---|
| 1525 | + * See {@link ng.$compileProvider#debugInfoEnabled} for more. |
|---|
| 1526 | + */ |
|---|
| 1527 | +function reloadWithDebugInfo() { |
|---|
| 1528 | + window.name = 'NG_ENABLE_DEBUG_INFO!' + window.name; |
|---|
| 1529 | + window.location.reload(); |
|---|
| 1530 | +} |
|---|
| 1531 | + |
|---|
| 1532 | +/** |
|---|
| 1533 | + * @name angular.getTestability |
|---|
| 1534 | + * @module ng |
|---|
| 1535 | + * @description |
|---|
| 1536 | + * Get the testability service for the instance of Angular on the given |
|---|
| 1537 | + * element. |
|---|
| 1538 | + * @param {DOMElement} element DOM element which is the root of angular application. |
|---|
| 1539 | + */ |
|---|
| 1540 | +function getTestability(rootElement) { |
|---|
| 1541 | + return angular.element(rootElement).injector().get('$$testability'); |
|---|
| 1542 | +} |
|---|
| 1543 | + |
|---|
| 1544 | +var SNAKE_CASE_REGEXP = /[A-Z]/g; |
|---|
| 1545 | +function snake_case(name, separator) { |
|---|
| 1546 | + separator = separator || '_'; |
|---|
| 1547 | + return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) { |
|---|
| 1548 | + return (pos ? separator : '') + letter.toLowerCase(); |
|---|
| 1549 | + }); |
|---|
| 1550 | +} |
|---|
| 1551 | + |
|---|
| 1552 | +var bindJQueryFired = false; |
|---|
| 1553 | +var skipDestroyOnNextJQueryCleanData; |
|---|
| 1554 | +function bindJQuery() { |
|---|
| 1555 | + var originalCleanData; |
|---|
| 1556 | + |
|---|
| 1557 | + if (bindJQueryFired) { |
|---|
| 1558 | + return; |
|---|
| 1559 | + } |
|---|
| 1560 | + |
|---|
| 1561 | + // bind to jQuery if present; |
|---|
| 1562 | + jQuery = window.jQuery; |
|---|
| 1563 | + // Use jQuery if it exists with proper functionality, otherwise default to us. |
|---|
| 1564 | + // Angular 1.2+ requires jQuery 1.7+ for on()/off() support. |
|---|
| 1565 | + // Angular 1.3+ technically requires at least jQuery 2.1+ but it may work with older |
|---|
| 1566 | + // versions. It will not work for sure with jQuery <1.7, though. |
|---|
| 1567 | + if (jQuery && jQuery.fn.on) { |
|---|
| 1568 | + jqLite = jQuery; |
|---|
| 1569 | + extend(jQuery.fn, { |
|---|
| 1570 | + scope: JQLitePrototype.scope, |
|---|
| 1571 | + isolateScope: JQLitePrototype.isolateScope, |
|---|
| 1572 | + controller: JQLitePrototype.controller, |
|---|
| 1573 | + injector: JQLitePrototype.injector, |
|---|
| 1574 | + inheritedData: JQLitePrototype.inheritedData |
|---|
| 1575 | + }); |
|---|
| 1576 | + |
|---|
| 1577 | + // All nodes removed from the DOM via various jQuery APIs like .remove() |
|---|
| 1578 | + // are passed through jQuery.cleanData. Monkey-patch this method to fire |
|---|
| 1579 | + // the $destroy event on all removed nodes. |
|---|
| 1580 | + originalCleanData = jQuery.cleanData; |
|---|
| 1581 | + jQuery.cleanData = function(elems) { |
|---|
| 1582 | + var events; |
|---|
| 1583 | + if (!skipDestroyOnNextJQueryCleanData) { |
|---|
| 1584 | + for (var i = 0, elem; (elem = elems[i]) != null; i++) { |
|---|
| 1585 | + events = jQuery._data(elem, "events"); |
|---|
| 1586 | + if (events && events.$destroy) { |
|---|
| 1587 | + jQuery(elem).triggerHandler('$destroy'); |
|---|
| 1588 | + } |
|---|
| 1589 | + } |
|---|
| 1590 | + } else { |
|---|
| 1591 | + skipDestroyOnNextJQueryCleanData = false; |
|---|
| 1592 | + } |
|---|
| 1593 | + originalCleanData(elems); |
|---|
| 1594 | + }; |
|---|
| 1595 | + } else { |
|---|
| 1596 | + jqLite = JQLite; |
|---|
| 1597 | + } |
|---|
| 1598 | + |
|---|
| 1599 | + angular.element = jqLite; |
|---|
| 1600 | + |
|---|
| 1601 | + // Prevent double-proxying. |
|---|
| 1602 | + bindJQueryFired = true; |
|---|
| 1603 | +} |
|---|
| 1604 | + |
|---|
| 1605 | +/** |
|---|
| 1606 | + * throw error if the argument is falsy. |
|---|
| 1607 | + */ |
|---|
| 1608 | +function assertArg(arg, name, reason) { |
|---|
| 1609 | + if (!arg) { |
|---|
| 1610 | + throw ngMinErr('areq', "Argument '{0}' is {1}", (name || '?'), (reason || "required")); |
|---|
| 1611 | + } |
|---|
| 1612 | + return arg; |
|---|
| 1613 | +} |
|---|
| 1614 | + |
|---|
| 1615 | +function assertArgFn(arg, name, acceptArrayAnnotation) { |
|---|
| 1616 | + if (acceptArrayAnnotation && isArray(arg)) { |
|---|
| 1617 | + arg = arg[arg.length - 1]; |
|---|
| 1618 | + } |
|---|
| 1619 | + |
|---|
| 1620 | + assertArg(isFunction(arg), name, 'not a function, got ' + |
|---|
| 1621 | + (arg && typeof arg === 'object' ? arg.constructor.name || 'Object' : typeof arg)); |
|---|
| 1622 | + return arg; |
|---|
| 1623 | +} |
|---|
| 1624 | + |
|---|
| 1625 | +/** |
|---|
| 1626 | + * throw error if the name given is hasOwnProperty |
|---|
| 1627 | + * @param {String} name the name to test |
|---|
| 1628 | + * @param {String} context the context in which the name is used, such as module or directive |
|---|
| 1629 | + */ |
|---|
| 1630 | +function assertNotHasOwnProperty(name, context) { |
|---|
| 1631 | + if (name === 'hasOwnProperty') { |
|---|
| 1632 | + throw ngMinErr('badname', "hasOwnProperty is not a valid {0} name", context); |
|---|
| 1633 | + } |
|---|
| 1634 | +} |
|---|
| 1635 | + |
|---|
| 1636 | +/** |
|---|
| 1637 | + * Return the value accessible from the object by path. Any undefined traversals are ignored |
|---|
| 1638 | + * @param {Object} obj starting object |
|---|
| 1639 | + * @param {String} path path to traverse |
|---|
| 1640 | + * @param {boolean} [bindFnToScope=true] |
|---|
| 1641 | + * @returns {Object} value as accessible by path |
|---|
| 1642 | + */ |
|---|
| 1643 | +//TODO(misko): this function needs to be removed |
|---|
| 1644 | +function getter(obj, path, bindFnToScope) { |
|---|
| 1645 | + if (!path) return obj; |
|---|
| 1646 | + var keys = path.split('.'); |
|---|
| 1647 | + var key; |
|---|
| 1648 | + var lastInstance = obj; |
|---|
| 1649 | + var len = keys.length; |
|---|
| 1650 | + |
|---|
| 1651 | + for (var i = 0; i < len; i++) { |
|---|
| 1652 | + key = keys[i]; |
|---|
| 1653 | + if (obj) { |
|---|
| 1654 | + obj = (lastInstance = obj)[key]; |
|---|
| 1655 | + } |
|---|
| 1656 | + } |
|---|
| 1657 | + if (!bindFnToScope && isFunction(obj)) { |
|---|
| 1658 | + return bind(lastInstance, obj); |
|---|
| 1659 | + } |
|---|
| 1660 | + return obj; |
|---|
| 1661 | +} |
|---|
| 1662 | + |
|---|
| 1663 | +/** |
|---|
| 1664 | + * Return the DOM siblings between the first and last node in the given array. |
|---|
| 1665 | + * @param {Array} array like object |
|---|
| 1666 | + * @returns {jqLite} jqLite collection containing the nodes |
|---|
| 1667 | + */ |
|---|
| 1668 | +function getBlockNodes(nodes) { |
|---|
| 1669 | + // TODO(perf): just check if all items in `nodes` are siblings and if they are return the original |
|---|
| 1670 | + // collection, otherwise update the original collection. |
|---|
| 1671 | + var node = nodes[0]; |
|---|
| 1672 | + var endNode = nodes[nodes.length - 1]; |
|---|
| 1673 | + var blockNodes = [node]; |
|---|
| 1674 | + |
|---|
| 1675 | + do { |
|---|
| 1676 | + node = node.nextSibling; |
|---|
| 1677 | + if (!node) break; |
|---|
| 1678 | + blockNodes.push(node); |
|---|
| 1679 | + } while (node !== endNode); |
|---|
| 1680 | + |
|---|
| 1681 | + return jqLite(blockNodes); |
|---|
| 1682 | +} |
|---|
| 1683 | + |
|---|
| 1684 | + |
|---|
| 1685 | +/** |
|---|
| 1686 | + * Creates a new object without a prototype. This object is useful for lookup without having to |
|---|
| 1687 | + * guard against prototypically inherited properties via hasOwnProperty. |
|---|
| 1688 | + * |
|---|
| 1689 | + * Related micro-benchmarks: |
|---|
| 1690 | + * - http://jsperf.com/object-create2 |
|---|
| 1691 | + * - http://jsperf.com/proto-map-lookup/2 |
|---|
| 1692 | + * - http://jsperf.com/for-in-vs-object-keys2 |
|---|
| 1693 | + * |
|---|
| 1694 | + * @returns {Object} |
|---|
| 1695 | + */ |
|---|
| 1696 | +function createMap() { |
|---|
| 1697 | + return Object.create(null); |
|---|
| 1698 | +} |
|---|
| 1699 | + |
|---|
| 1700 | +var NODE_TYPE_ELEMENT = 1; |
|---|
| 1701 | +var NODE_TYPE_TEXT = 3; |
|---|
| 1702 | +var NODE_TYPE_COMMENT = 8; |
|---|
| 1703 | +var NODE_TYPE_DOCUMENT = 9; |
|---|
| 1704 | +var NODE_TYPE_DOCUMENT_FRAGMENT = 11; |
|---|
| 1705 | + |
|---|
| 1706 | +/** |
|---|
| 1707 | + * @ngdoc type |
|---|
| 1708 | + * @name angular.Module |
|---|
| 1709 | + * @module ng |
|---|
| 1710 | + * @description |
|---|
| 1711 | + * |
|---|
| 1712 | + * Interface for configuring angular {@link angular.module modules}. |
|---|
| 1713 | + */ |
|---|
| 1714 | + |
|---|
| 1715 | +function setupModuleLoader(window) { |
|---|
| 1716 | + |
|---|
| 1717 | + var $injectorMinErr = minErr('$injector'); |
|---|
| 1718 | + var ngMinErr = minErr('ng'); |
|---|
| 1719 | + |
|---|
| 1720 | + function ensure(obj, name, factory) { |
|---|
| 1721 | + return obj[name] || (obj[name] = factory()); |
|---|
| 1722 | + } |
|---|
| 1723 | + |
|---|
| 1724 | + var angular = ensure(window, 'angular', Object); |
|---|
| 1725 | + |
|---|
| 1726 | + // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap |
|---|
| 1727 | + angular.$$minErr = angular.$$minErr || minErr; |
|---|
| 1728 | + |
|---|
| 1729 | + return ensure(angular, 'module', function() { |
|---|
| 1730 | + /** @type {Object.<string, angular.Module>} */ |
|---|
| 1731 | + var modules = {}; |
|---|
| 1732 | + |
|---|
| 1733 | + /** |
|---|
| 1734 | + * @ngdoc function |
|---|
| 1735 | + * @name angular.module |
|---|
| 1736 | + * @module ng |
|---|
| 1737 | + * @description |
|---|
| 1738 | + * |
|---|
| 1739 | + * The `angular.module` is a global place for creating, registering and retrieving Angular |
|---|
| 1740 | + * modules. |
|---|
| 1741 | + * All modules (angular core or 3rd party) that should be available to an application must be |
|---|
| 1742 | + * registered using this mechanism. |
|---|
| 1743 | + * |
|---|
| 1744 | + * When passed two or more arguments, a new module is created. If passed only one argument, an |
|---|
| 1745 | + * existing module (the name passed as the first argument to `module`) is retrieved. |
|---|
| 1746 | + * |
|---|
| 1747 | + * |
|---|
| 1748 | + * # Module |
|---|
| 1749 | + * |
|---|
| 1750 | + * A module is a collection of services, directives, controllers, filters, and configuration information. |
|---|
| 1751 | + * `angular.module` is used to configure the {@link auto.$injector $injector}. |
|---|
| 1752 | + * |
|---|
| 1753 | + * ```js |
|---|
| 1754 | + * // Create a new module |
|---|
| 1755 | + * var myModule = angular.module('myModule', []); |
|---|
| 1756 | + * |
|---|
| 1757 | + * // register a new service |
|---|
| 1758 | + * myModule.value('appName', 'MyCoolApp'); |
|---|
| 1759 | + * |
|---|
| 1760 | + * // configure existing services inside initialization blocks. |
|---|
| 1761 | + * myModule.config(['$locationProvider', function($locationProvider) { |
|---|
| 1762 | + * // Configure existing providers |
|---|
| 1763 | + * $locationProvider.hashPrefix('!'); |
|---|
| 1764 | + * }]); |
|---|
| 1765 | + * ``` |
|---|
| 1766 | + * |
|---|
| 1767 | + * Then you can create an injector and load your modules like this: |
|---|
| 1768 | + * |
|---|
| 1769 | + * ```js |
|---|
| 1770 | + * var injector = angular.injector(['ng', 'myModule']) |
|---|
| 1771 | + * ``` |
|---|
| 1772 | + * |
|---|
| 1773 | + * However it's more likely that you'll just use |
|---|
| 1774 | + * {@link ng.directive:ngApp ngApp} or |
|---|
| 1775 | + * {@link angular.bootstrap} to simplify this process for you. |
|---|
| 1776 | + * |
|---|
| 1777 | + * @param {!string} name The name of the module to create or retrieve. |
|---|
| 1778 | + * @param {!Array.<string>=} requires If specified then new module is being created. If |
|---|
| 1779 | + * unspecified then the module is being retrieved for further configuration. |
|---|
| 1780 | + * @param {Function=} configFn Optional configuration function for the module. Same as |
|---|
| 1781 | + * {@link angular.Module#config Module#config()}. |
|---|
| 1782 | + * @returns {module} new module with the {@link angular.Module} api. |
|---|
| 1783 | + */ |
|---|
| 1784 | + return function module(name, requires, configFn) { |
|---|
| 1785 | + var assertNotHasOwnProperty = function(name, context) { |
|---|
| 1786 | + if (name === 'hasOwnProperty') { |
|---|
| 1787 | + throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context); |
|---|
| 1788 | + } |
|---|
| 1789 | + }; |
|---|
| 1790 | + |
|---|
| 1791 | + assertNotHasOwnProperty(name, 'module'); |
|---|
| 1792 | + if (requires && modules.hasOwnProperty(name)) { |
|---|
| 1793 | + modules[name] = null; |
|---|
| 1794 | + } |
|---|
| 1795 | + return ensure(modules, name, function() { |
|---|
| 1796 | + if (!requires) { |
|---|
| 1797 | + throw $injectorMinErr('nomod', "Module '{0}' is not available! You either misspelled " + |
|---|
| 1798 | + "the module name or forgot to load it. If registering a module ensure that you " + |
|---|
| 1799 | + "specify the dependencies as the second argument.", name); |
|---|
| 1800 | + } |
|---|
| 1801 | + |
|---|
| 1802 | + /** @type {!Array.<Array.<*>>} */ |
|---|
| 1803 | + var invokeQueue = []; |
|---|
| 1804 | + |
|---|
| 1805 | + /** @type {!Array.<Function>} */ |
|---|
| 1806 | + var configBlocks = []; |
|---|
| 1807 | + |
|---|
| 1808 | + /** @type {!Array.<Function>} */ |
|---|
| 1809 | + var runBlocks = []; |
|---|
| 1810 | + |
|---|
| 1811 | + var config = invokeLater('$injector', 'invoke', 'push', configBlocks); |
|---|
| 1812 | + |
|---|
| 1813 | + /** @type {angular.Module} */ |
|---|
| 1814 | + var moduleInstance = { |
|---|
| 1815 | + // Private state |
|---|
| 1816 | + _invokeQueue: invokeQueue, |
|---|
| 1817 | + _configBlocks: configBlocks, |
|---|
| 1818 | + _runBlocks: runBlocks, |
|---|
| 1819 | + |
|---|
| 1820 | + /** |
|---|
| 1821 | + * @ngdoc property |
|---|
| 1822 | + * @name angular.Module#requires |
|---|
| 1823 | + * @module ng |
|---|
| 1824 | + * |
|---|
| 1825 | + * @description |
|---|
| 1826 | + * Holds the list of modules which the injector will load before the current module is |
|---|
| 1827 | + * loaded. |
|---|
| 1828 | + */ |
|---|
| 1829 | + requires: requires, |
|---|
| 1830 | + |
|---|
| 1831 | + /** |
|---|
| 1832 | + * @ngdoc property |
|---|
| 1833 | + * @name angular.Module#name |
|---|
| 1834 | + * @module ng |
|---|
| 1835 | + * |
|---|
| 1836 | + * @description |
|---|
| 1837 | + * Name of the module. |
|---|
| 1838 | + */ |
|---|
| 1839 | + name: name, |
|---|
| 1840 | + |
|---|
| 1841 | + |
|---|
| 1842 | + /** |
|---|
| 1843 | + * @ngdoc method |
|---|
| 1844 | + * @name angular.Module#provider |
|---|
| 1845 | + * @module ng |
|---|
| 1846 | + * @param {string} name service name |
|---|
| 1847 | + * @param {Function} providerType Construction function for creating new instance of the |
|---|
| 1848 | + * service. |
|---|
| 1849 | + * @description |
|---|
| 1850 | + * See {@link auto.$provide#provider $provide.provider()}. |
|---|
| 1851 | + */ |
|---|
| 1852 | + provider: invokeLater('$provide', 'provider'), |
|---|
| 1853 | + |
|---|
| 1854 | + /** |
|---|
| 1855 | + * @ngdoc method |
|---|
| 1856 | + * @name angular.Module#factory |
|---|
| 1857 | + * @module ng |
|---|
| 1858 | + * @param {string} name service name |
|---|
| 1859 | + * @param {Function} providerFunction Function for creating new instance of the service. |
|---|
| 1860 | + * @description |
|---|
| 1861 | + * See {@link auto.$provide#factory $provide.factory()}. |
|---|
| 1862 | + */ |
|---|
| 1863 | + factory: invokeLater('$provide', 'factory'), |
|---|
| 1864 | + |
|---|
| 1865 | + /** |
|---|
| 1866 | + * @ngdoc method |
|---|
| 1867 | + * @name angular.Module#service |
|---|
| 1868 | + * @module ng |
|---|
| 1869 | + * @param {string} name service name |
|---|
| 1870 | + * @param {Function} constructor A constructor function that will be instantiated. |
|---|
| 1871 | + * @description |
|---|
| 1872 | + * See {@link auto.$provide#service $provide.service()}. |
|---|
| 1873 | + */ |
|---|
| 1874 | + service: invokeLater('$provide', 'service'), |
|---|
| 1875 | + |
|---|
| 1876 | + /** |
|---|
| 1877 | + * @ngdoc method |
|---|
| 1878 | + * @name angular.Module#value |
|---|
| 1879 | + * @module ng |
|---|
| 1880 | + * @param {string} name service name |
|---|
| 1881 | + * @param {*} object Service instance object. |
|---|
| 1882 | + * @description |
|---|
| 1883 | + * See {@link auto.$provide#value $provide.value()}. |
|---|
| 1884 | + */ |
|---|
| 1885 | + value: invokeLater('$provide', 'value'), |
|---|
| 1886 | + |
|---|
| 1887 | + /** |
|---|
| 1888 | + * @ngdoc method |
|---|
| 1889 | + * @name angular.Module#constant |
|---|
| 1890 | + * @module ng |
|---|
| 1891 | + * @param {string} name constant name |
|---|
| 1892 | + * @param {*} object Constant value. |
|---|
| 1893 | + * @description |
|---|
| 1894 | + * Because the constant are fixed, they get applied before other provide methods. |
|---|
| 1895 | + * See {@link auto.$provide#constant $provide.constant()}. |
|---|
| 1896 | + */ |
|---|
| 1897 | + constant: invokeLater('$provide', 'constant', 'unshift'), |
|---|
| 1898 | + |
|---|
| 1899 | + /** |
|---|
| 1900 | + * @ngdoc method |
|---|
| 1901 | + * @name angular.Module#animation |
|---|
| 1902 | + * @module ng |
|---|
| 1903 | + * @param {string} name animation name |
|---|
| 1904 | + * @param {Function} animationFactory Factory function for creating new instance of an |
|---|
| 1905 | + * animation. |
|---|
| 1906 | + * @description |
|---|
| 1907 | + * |
|---|
| 1908 | + * **NOTE**: animations take effect only if the **ngAnimate** module is loaded. |
|---|
| 1909 | + * |
|---|
| 1910 | + * |
|---|
| 1911 | + * Defines an animation hook that can be later used with |
|---|
| 1912 | + * {@link ngAnimate.$animate $animate} service and directives that use this service. |
|---|
| 1913 | + * |
|---|
| 1914 | + * ```js |
|---|
| 1915 | + * module.animation('.animation-name', function($inject1, $inject2) { |
|---|
| 1916 | + * return { |
|---|
| 1917 | + * eventName : function(element, done) { |
|---|
| 1918 | + * //code to run the animation |
|---|
| 1919 | + * //once complete, then run done() |
|---|
| 1920 | + * return function cancellationFunction(element) { |
|---|
| 1921 | + * //code to cancel the animation |
|---|
| 1922 | + * } |
|---|
| 1923 | + * } |
|---|
| 1924 | + * } |
|---|
| 1925 | + * }) |
|---|
| 1926 | + * ``` |
|---|
| 1927 | + * |
|---|
| 1928 | + * See {@link ng.$animateProvider#register $animateProvider.register()} and |
|---|
| 1929 | + * {@link ngAnimate ngAnimate module} for more information. |
|---|
| 1930 | + */ |
|---|
| 1931 | + animation: invokeLater('$animateProvider', 'register'), |
|---|
| 1932 | + |
|---|
| 1933 | + /** |
|---|
| 1934 | + * @ngdoc method |
|---|
| 1935 | + * @name angular.Module#filter |
|---|
| 1936 | + * @module ng |
|---|
| 1937 | + * @param {string} name Filter name. |
|---|
| 1938 | + * @param {Function} filterFactory Factory function for creating new instance of filter. |
|---|
| 1939 | + * @description |
|---|
| 1940 | + * See {@link ng.$filterProvider#register $filterProvider.register()}. |
|---|
| 1941 | + */ |
|---|
| 1942 | + filter: invokeLater('$filterProvider', 'register'), |
|---|
| 1943 | + |
|---|
| 1944 | + /** |
|---|
| 1945 | + * @ngdoc method |
|---|
| 1946 | + * @name angular.Module#controller |
|---|
| 1947 | + * @module ng |
|---|
| 1948 | + * @param {string|Object} name Controller name, or an object map of controllers where the |
|---|
| 1949 | + * keys are the names and the values are the constructors. |
|---|
| 1950 | + * @param {Function} constructor Controller constructor function. |
|---|
| 1951 | + * @description |
|---|
| 1952 | + * See {@link ng.$controllerProvider#register $controllerProvider.register()}. |
|---|
| 1953 | + */ |
|---|
| 1954 | + controller: invokeLater('$controllerProvider', 'register'), |
|---|
| 1955 | + |
|---|
| 1956 | + /** |
|---|
| 1957 | + * @ngdoc method |
|---|
| 1958 | + * @name angular.Module#directive |
|---|
| 1959 | + * @module ng |
|---|
| 1960 | + * @param {string|Object} name Directive name, or an object map of directives where the |
|---|
| 1961 | + * keys are the names and the values are the factories. |
|---|
| 1962 | + * @param {Function} directiveFactory Factory function for creating new instance of |
|---|
| 1963 | + * directives. |
|---|
| 1964 | + * @description |
|---|
| 1965 | + * See {@link ng.$compileProvider#directive $compileProvider.directive()}. |
|---|
| 1966 | + */ |
|---|
| 1967 | + directive: invokeLater('$compileProvider', 'directive'), |
|---|
| 1968 | + |
|---|
| 1969 | + /** |
|---|
| 1970 | + * @ngdoc method |
|---|
| 1971 | + * @name angular.Module#config |
|---|
| 1972 | + * @module ng |
|---|
| 1973 | + * @param {Function} configFn Execute this function on module load. Useful for service |
|---|
| 1974 | + * configuration. |
|---|
| 1975 | + * @description |
|---|
| 1976 | + * Use this method to register work which needs to be performed on module loading. |
|---|
| 1977 | + * For more about how to configure services, see |
|---|
| 1978 | + * {@link providers#provider-recipe Provider Recipe}. |
|---|
| 1979 | + */ |
|---|
| 1980 | + config: config, |
|---|
| 1981 | + |
|---|
| 1982 | + /** |
|---|
| 1983 | + * @ngdoc method |
|---|
| 1984 | + * @name angular.Module#run |
|---|
| 1985 | + * @module ng |
|---|
| 1986 | + * @param {Function} initializationFn Execute this function after injector creation. |
|---|
| 1987 | + * Useful for application initialization. |
|---|
| 1988 | + * @description |
|---|
| 1989 | + * Use this method to register work which should be performed when the injector is done |
|---|
| 1990 | + * loading all modules. |
|---|
| 1991 | + */ |
|---|
| 1992 | + run: function(block) { |
|---|
| 1993 | + runBlocks.push(block); |
|---|
| 1994 | + return this; |
|---|
| 1995 | + } |
|---|
| 1996 | + }; |
|---|
| 1997 | + |
|---|
| 1998 | + if (configFn) { |
|---|
| 1999 | + config(configFn); |
|---|
| 2000 | + } |
|---|
| 2001 | + |
|---|
| 2002 | + return moduleInstance; |
|---|
| 2003 | + |
|---|
| 2004 | + /** |
|---|
| 2005 | + * @param {string} provider |
|---|
| 2006 | + * @param {string} method |
|---|
| 2007 | + * @param {String=} insertMethod |
|---|
| 2008 | + * @returns {angular.Module} |
|---|
| 2009 | + */ |
|---|
| 2010 | + function invokeLater(provider, method, insertMethod, queue) { |
|---|
| 2011 | + if (!queue) queue = invokeQueue; |
|---|
| 2012 | + return function() { |
|---|
| 2013 | + queue[insertMethod || 'push']([provider, method, arguments]); |
|---|
| 2014 | + return moduleInstance; |
|---|
| 2015 | + }; |
|---|
| 2016 | + } |
|---|
| 2017 | + }); |
|---|
| 2018 | + }; |
|---|
| 2019 | + }); |
|---|
| 2020 | + |
|---|
| 2021 | +} |
|---|
| 2022 | + |
|---|
| 2023 | +/* global angularModule: true, |
|---|
| 2024 | + version: true, |
|---|
| 2025 | + |
|---|
| 2026 | + $LocaleProvider, |
|---|
| 2027 | + $CompileProvider, |
|---|
| 2028 | + |
|---|
| 2029 | + htmlAnchorDirective, |
|---|
| 2030 | + inputDirective, |
|---|
| 2031 | + inputDirective, |
|---|
| 2032 | + formDirective, |
|---|
| 2033 | + scriptDirective, |
|---|
| 2034 | + selectDirective, |
|---|
| 2035 | + styleDirective, |
|---|
| 2036 | + optionDirective, |
|---|
| 2037 | + ngBindDirective, |
|---|
| 2038 | + ngBindHtmlDirective, |
|---|
| 2039 | + ngBindTemplateDirective, |
|---|
| 2040 | + ngClassDirective, |
|---|
| 2041 | + ngClassEvenDirective, |
|---|
| 2042 | + ngClassOddDirective, |
|---|
| 2043 | + ngCspDirective, |
|---|
| 2044 | + ngCloakDirective, |
|---|
| 2045 | + ngControllerDirective, |
|---|
| 2046 | + ngFormDirective, |
|---|
| 2047 | + ngHideDirective, |
|---|
| 2048 | + ngIfDirective, |
|---|
| 2049 | + ngIncludeDirective, |
|---|
| 2050 | + ngIncludeFillContentDirective, |
|---|
| 2051 | + ngInitDirective, |
|---|
| 2052 | + ngNonBindableDirective, |
|---|
| 2053 | + ngPluralizeDirective, |
|---|
| 2054 | + ngRepeatDirective, |
|---|
| 2055 | + ngShowDirective, |
|---|
| 2056 | + ngStyleDirective, |
|---|
| 2057 | + ngSwitchDirective, |
|---|
| 2058 | + ngSwitchWhenDirective, |
|---|
| 2059 | + ngSwitchDefaultDirective, |
|---|
| 2060 | + ngOptionsDirective, |
|---|
| 2061 | + ngTranscludeDirective, |
|---|
| 2062 | + ngModelDirective, |
|---|
| 2063 | + ngListDirective, |
|---|
| 2064 | + ngChangeDirective, |
|---|
| 2065 | + patternDirective, |
|---|
| 2066 | + patternDirective, |
|---|
| 2067 | + requiredDirective, |
|---|
| 2068 | + requiredDirective, |
|---|
| 2069 | + minlengthDirective, |
|---|
| 2070 | + minlengthDirective, |
|---|
| 2071 | + maxlengthDirective, |
|---|
| 2072 | + maxlengthDirective, |
|---|
| 2073 | + ngValueDirective, |
|---|
| 2074 | + ngModelOptionsDirective, |
|---|
| 2075 | + ngAttributeAliasDirectives, |
|---|
| 2076 | + ngEventDirectives, |
|---|
| 2077 | + |
|---|
| 2078 | + $AnchorScrollProvider, |
|---|
| 2079 | + $AnimateProvider, |
|---|
| 2080 | + $BrowserProvider, |
|---|
| 2081 | + $CacheFactoryProvider, |
|---|
| 2082 | + $ControllerProvider, |
|---|
| 2083 | + $DocumentProvider, |
|---|
| 2084 | + $ExceptionHandlerProvider, |
|---|
| 2085 | + $FilterProvider, |
|---|
| 2086 | + $InterpolateProvider, |
|---|
| 2087 | + $IntervalProvider, |
|---|
| 2088 | + $HttpProvider, |
|---|
| 2089 | + $HttpBackendProvider, |
|---|
| 2090 | + $LocationProvider, |
|---|
| 2091 | + $LogProvider, |
|---|
| 2092 | + $ParseProvider, |
|---|
| 2093 | + $RootScopeProvider, |
|---|
| 2094 | + $QProvider, |
|---|
| 2095 | + $$QProvider, |
|---|
| 2096 | + $$SanitizeUriProvider, |
|---|
| 2097 | + $SceProvider, |
|---|
| 2098 | + $SceDelegateProvider, |
|---|
| 2099 | + $SnifferProvider, |
|---|
| 2100 | + $TemplateCacheProvider, |
|---|
| 2101 | + $TemplateRequestProvider, |
|---|
| 2102 | + $$TestabilityProvider, |
|---|
| 2103 | + $TimeoutProvider, |
|---|
| 2104 | + $$RAFProvider, |
|---|
| 2105 | + $$AsyncCallbackProvider, |
|---|
| 2106 | + $WindowProvider |
|---|
| 2107 | +*/ |
|---|
| 2108 | + |
|---|
| 2109 | + |
|---|
| 2110 | +/** |
|---|
| 2111 | + * @ngdoc object |
|---|
| 2112 | + * @name angular.version |
|---|
| 2113 | + * @module ng |
|---|
| 2114 | + * @description |
|---|
| 2115 | + * An object that contains information about the current AngularJS version. This object has the |
|---|
| 2116 | + * following properties: |
|---|
| 2117 | + * |
|---|
| 2118 | + * - `full` – `{string}` – Full version string, such as "0.9.18". |
|---|
| 2119 | + * - `major` – `{number}` – Major version number, such as "0". |
|---|
| 2120 | + * - `minor` – `{number}` – Minor version number, such as "9". |
|---|
| 2121 | + * - `dot` – `{number}` – Dot version number, such as "18". |
|---|
| 2122 | + * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat". |
|---|
| 2123 | + */ |
|---|
| 2124 | +var version = { |
|---|
| 2125 | + full: '1.3.0', // all of these placeholder strings will be replaced by grunt's |
|---|
| 2126 | + major: 1, // package task |
|---|
| 2127 | + minor: 3, |
|---|
| 2128 | + dot: 0, |
|---|
| 2129 | + codeName: 'superluminal-nudge' |
|---|
| 2130 | +}; |
|---|
| 2131 | + |
|---|
| 2132 | + |
|---|
| 2133 | +function publishExternalAPI(angular){ |
|---|
| 2134 | + extend(angular, { |
|---|
| 2135 | + 'bootstrap': bootstrap, |
|---|
| 2136 | + 'copy': copy, |
|---|
| 2137 | + 'extend': extend, |
|---|
| 2138 | + 'equals': equals, |
|---|
| 2139 | + 'element': jqLite, |
|---|
| 2140 | + 'forEach': forEach, |
|---|
| 2141 | + 'injector': createInjector, |
|---|
| 2142 | + 'noop': noop, |
|---|
| 2143 | + 'bind': bind, |
|---|
| 2144 | + 'toJson': toJson, |
|---|
| 2145 | + 'fromJson': fromJson, |
|---|
| 2146 | + 'identity': identity, |
|---|
| 2147 | + 'isUndefined': isUndefined, |
|---|
| 2148 | + 'isDefined': isDefined, |
|---|
| 2149 | + 'isString': isString, |
|---|
| 2150 | + 'isFunction': isFunction, |
|---|
| 2151 | + 'isObject': isObject, |
|---|
| 2152 | + 'isNumber': isNumber, |
|---|
| 2153 | + 'isElement': isElement, |
|---|
| 2154 | + 'isArray': isArray, |
|---|
| 2155 | + 'version': version, |
|---|
| 2156 | + 'isDate': isDate, |
|---|
| 2157 | + 'lowercase': lowercase, |
|---|
| 2158 | + 'uppercase': uppercase, |
|---|
| 2159 | + 'callbacks': {counter: 0}, |
|---|
| 2160 | + 'getTestability': getTestability, |
|---|
| 2161 | + '$$minErr': minErr, |
|---|
| 2162 | + '$$csp': csp, |
|---|
| 2163 | + 'reloadWithDebugInfo': reloadWithDebugInfo |
|---|
| 2164 | + }); |
|---|
| 2165 | + |
|---|
| 2166 | + angularModule = setupModuleLoader(window); |
|---|
| 2167 | + try { |
|---|
| 2168 | + angularModule('ngLocale'); |
|---|
| 2169 | + } catch (e) { |
|---|
| 2170 | + angularModule('ngLocale', []).provider('$locale', $LocaleProvider); |
|---|
| 2171 | + } |
|---|
| 2172 | + |
|---|
| 2173 | + angularModule('ng', ['ngLocale'], ['$provide', |
|---|
| 2174 | + function ngModule($provide) { |
|---|
| 2175 | + // $$sanitizeUriProvider needs to be before $compileProvider as it is used by it. |
|---|
| 2176 | + $provide.provider({ |
|---|
| 2177 | + $$sanitizeUri: $$SanitizeUriProvider |
|---|
| 2178 | + }); |
|---|
| 2179 | + $provide.provider('$compile', $CompileProvider). |
|---|
| 2180 | + directive({ |
|---|
| 2181 | + a: htmlAnchorDirective, |
|---|
| 2182 | + input: inputDirective, |
|---|
| 2183 | + textarea: inputDirective, |
|---|
| 2184 | + form: formDirective, |
|---|
| 2185 | + script: scriptDirective, |
|---|
| 2186 | + select: selectDirective, |
|---|
| 2187 | + style: styleDirective, |
|---|
| 2188 | + option: optionDirective, |
|---|
| 2189 | + ngBind: ngBindDirective, |
|---|
| 2190 | + ngBindHtml: ngBindHtmlDirective, |
|---|
| 2191 | + ngBindTemplate: ngBindTemplateDirective, |
|---|
| 2192 | + ngClass: ngClassDirective, |
|---|
| 2193 | + ngClassEven: ngClassEvenDirective, |
|---|
| 2194 | + ngClassOdd: ngClassOddDirective, |
|---|
| 2195 | + ngCloak: ngCloakDirective, |
|---|
| 2196 | + ngController: ngControllerDirective, |
|---|
| 2197 | + ngForm: ngFormDirective, |
|---|
| 2198 | + ngHide: ngHideDirective, |
|---|
| 2199 | + ngIf: ngIfDirective, |
|---|
| 2200 | + ngInclude: ngIncludeDirective, |
|---|
| 2201 | + ngInit: ngInitDirective, |
|---|
| 2202 | + ngNonBindable: ngNonBindableDirective, |
|---|
| 2203 | + ngPluralize: ngPluralizeDirective, |
|---|
| 2204 | + ngRepeat: ngRepeatDirective, |
|---|
| 2205 | + ngShow: ngShowDirective, |
|---|
| 2206 | + ngStyle: ngStyleDirective, |
|---|
| 2207 | + ngSwitch: ngSwitchDirective, |
|---|
| 2208 | + ngSwitchWhen: ngSwitchWhenDirective, |
|---|
| 2209 | + ngSwitchDefault: ngSwitchDefaultDirective, |
|---|
| 2210 | + ngOptions: ngOptionsDirective, |
|---|
| 2211 | + ngTransclude: ngTranscludeDirective, |
|---|
| 2212 | + ngModel: ngModelDirective, |
|---|
| 2213 | + ngList: ngListDirective, |
|---|
| 2214 | + ngChange: ngChangeDirective, |
|---|
| 2215 | + pattern: patternDirective, |
|---|
| 2216 | + ngPattern: patternDirective, |
|---|
| 2217 | + required: requiredDirective, |
|---|
| 2218 | + ngRequired: requiredDirective, |
|---|
| 2219 | + minlength: minlengthDirective, |
|---|
| 2220 | + ngMinlength: minlengthDirective, |
|---|
| 2221 | + maxlength: maxlengthDirective, |
|---|
| 2222 | + ngMaxlength: maxlengthDirective, |
|---|
| 2223 | + ngValue: ngValueDirective, |
|---|
| 2224 | + ngModelOptions: ngModelOptionsDirective |
|---|
| 2225 | + }). |
|---|
| 2226 | + directive({ |
|---|
| 2227 | + ngInclude: ngIncludeFillContentDirective |
|---|
| 2228 | + }). |
|---|
| 2229 | + directive(ngAttributeAliasDirectives). |
|---|
| 2230 | + directive(ngEventDirectives); |
|---|
| 2231 | + $provide.provider({ |
|---|
| 2232 | + $anchorScroll: $AnchorScrollProvider, |
|---|
| 2233 | + $animate: $AnimateProvider, |
|---|
| 2234 | + $browser: $BrowserProvider, |
|---|
| 2235 | + $cacheFactory: $CacheFactoryProvider, |
|---|
| 2236 | + $controller: $ControllerProvider, |
|---|
| 2237 | + $document: $DocumentProvider, |
|---|
| 2238 | + $exceptionHandler: $ExceptionHandlerProvider, |
|---|
| 2239 | + $filter: $FilterProvider, |
|---|
| 2240 | + $interpolate: $InterpolateProvider, |
|---|
| 2241 | + $interval: $IntervalProvider, |
|---|
| 2242 | + $http: $HttpProvider, |
|---|
| 2243 | + $httpBackend: $HttpBackendProvider, |
|---|
| 2244 | + $location: $LocationProvider, |
|---|
| 2245 | + $log: $LogProvider, |
|---|
| 2246 | + $parse: $ParseProvider, |
|---|
| 2247 | + $rootScope: $RootScopeProvider, |
|---|
| 2248 | + $q: $QProvider, |
|---|
| 2249 | + $$q: $$QProvider, |
|---|
| 2250 | + $sce: $SceProvider, |
|---|
| 2251 | + $sceDelegate: $SceDelegateProvider, |
|---|
| 2252 | + $sniffer: $SnifferProvider, |
|---|
| 2253 | + $templateCache: $TemplateCacheProvider, |
|---|
| 2254 | + $templateRequest: $TemplateRequestProvider, |
|---|
| 2255 | + $$testability: $$TestabilityProvider, |
|---|
| 2256 | + $timeout: $TimeoutProvider, |
|---|
| 2257 | + $window: $WindowProvider, |
|---|
| 2258 | + $$rAF: $$RAFProvider, |
|---|
| 2259 | + $$asyncCallback : $$AsyncCallbackProvider |
|---|
| 2260 | + }); |
|---|
| 2261 | + } |
|---|
| 2262 | + ]); |
|---|
| 2263 | +} |
|---|
| 2264 | + |
|---|
| 2265 | +/* global JQLitePrototype: true, |
|---|
| 2266 | + addEventListenerFn: true, |
|---|
| 2267 | + removeEventListenerFn: true, |
|---|
| 2268 | + BOOLEAN_ATTR: true, |
|---|
| 2269 | + ALIASED_ATTR: true, |
|---|
| 2270 | +*/ |
|---|
| 2271 | + |
|---|
| 2272 | +////////////////////////////////// |
|---|
| 2273 | +//JQLite |
|---|
| 2274 | +////////////////////////////////// |
|---|
| 2275 | + |
|---|
| 2276 | +/** |
|---|
| 2277 | + * @ngdoc function |
|---|
| 2278 | + * @name angular.element |
|---|
| 2279 | + * @module ng |
|---|
| 2280 | + * @kind function |
|---|
| 2281 | + * |
|---|
| 2282 | + * @description |
|---|
| 2283 | + * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element. |
|---|
| 2284 | + * |
|---|
| 2285 | + * If jQuery is available, `angular.element` is an alias for the |
|---|
| 2286 | + * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element` |
|---|
| 2287 | + * delegates to Angular's built-in subset of jQuery, called "jQuery lite" or "jqLite." |
|---|
| 2288 | + * |
|---|
| 2289 | + * <div class="alert alert-success">jqLite is a tiny, API-compatible subset of jQuery that allows |
|---|
| 2290 | + * Angular to manipulate the DOM in a cross-browser compatible way. **jqLite** implements only the most |
|---|
| 2291 | + * commonly needed functionality with the goal of having a very small footprint.</div> |
|---|
| 2292 | + * |
|---|
| 2293 | + * To use jQuery, simply load it before `DOMContentLoaded` event fired. |
|---|
| 2294 | + * |
|---|
| 2295 | + * <div class="alert">**Note:** all element references in Angular are always wrapped with jQuery or |
|---|
| 2296 | + * jqLite; they are never raw DOM references.</div> |
|---|
| 2297 | + * |
|---|
| 2298 | + * ## Angular's jqLite |
|---|
| 2299 | + * jqLite provides only the following jQuery methods: |
|---|
| 2300 | + * |
|---|
| 2301 | + * - [`addClass()`](http://api.jquery.com/addClass/) |
|---|
| 2302 | + * - [`after()`](http://api.jquery.com/after/) |
|---|
| 2303 | + * - [`append()`](http://api.jquery.com/append/) |
|---|
| 2304 | + * - [`attr()`](http://api.jquery.com/attr/) - Does not support functions as parameters |
|---|
| 2305 | + * - [`bind()`](http://api.jquery.com/bind/) - Does not support namespaces, selectors or eventData |
|---|
| 2306 | + * - [`children()`](http://api.jquery.com/children/) - Does not support selectors |
|---|
| 2307 | + * - [`clone()`](http://api.jquery.com/clone/) |
|---|
| 2308 | + * - [`contents()`](http://api.jquery.com/contents/) |
|---|
| 2309 | + * - [`css()`](http://api.jquery.com/css/) - Only retrieves inline-styles, does not call `getComputedStyles()` |
|---|
| 2310 | + * - [`data()`](http://api.jquery.com/data/) |
|---|
| 2311 | + * - [`detach()`](http://api.jquery.com/detach/) |
|---|
| 2312 | + * - [`empty()`](http://api.jquery.com/empty/) |
|---|
| 2313 | + * - [`eq()`](http://api.jquery.com/eq/) |
|---|
| 2314 | + * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name |
|---|
| 2315 | + * - [`hasClass()`](http://api.jquery.com/hasClass/) |
|---|
| 2316 | + * - [`html()`](http://api.jquery.com/html/) |
|---|
| 2317 | + * - [`next()`](http://api.jquery.com/next/) - Does not support selectors |
|---|
| 2318 | + * - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData |
|---|
| 2319 | + * - [`off()`](http://api.jquery.com/off/) - Does not support namespaces or selectors |
|---|
| 2320 | + * - [`one()`](http://api.jquery.com/one/) - Does not support namespaces or selectors |
|---|
| 2321 | + * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors |
|---|
| 2322 | + * - [`prepend()`](http://api.jquery.com/prepend/) |
|---|
| 2323 | + * - [`prop()`](http://api.jquery.com/prop/) |
|---|
| 2324 | + * - [`ready()`](http://api.jquery.com/ready/) |
|---|
| 2325 | + * - [`remove()`](http://api.jquery.com/remove/) |
|---|
| 2326 | + * - [`removeAttr()`](http://api.jquery.com/removeAttr/) |
|---|
| 2327 | + * - [`removeClass()`](http://api.jquery.com/removeClass/) |
|---|
| 2328 | + * - [`removeData()`](http://api.jquery.com/removeData/) |
|---|
| 2329 | + * - [`replaceWith()`](http://api.jquery.com/replaceWith/) |
|---|
| 2330 | + * - [`text()`](http://api.jquery.com/text/) |
|---|
| 2331 | + * - [`toggleClass()`](http://api.jquery.com/toggleClass/) |
|---|
| 2332 | + * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers. |
|---|
| 2333 | + * - [`unbind()`](http://api.jquery.com/unbind/) - Does not support namespaces |
|---|
| 2334 | + * - [`val()`](http://api.jquery.com/val/) |
|---|
| 2335 | + * - [`wrap()`](http://api.jquery.com/wrap/) |
|---|
| 2336 | + * |
|---|
| 2337 | + * ## jQuery/jqLite Extras |
|---|
| 2338 | + * Angular also provides the following additional methods and events to both jQuery and jqLite: |
|---|
| 2339 | + * |
|---|
| 2340 | + * ### Events |
|---|
| 2341 | + * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event |
|---|
| 2342 | + * on all DOM nodes being removed. This can be used to clean up any 3rd party bindings to the DOM |
|---|
| 2343 | + * element before it is removed. |
|---|
| 2344 | + * |
|---|
| 2345 | + * ### Methods |
|---|
| 2346 | + * - `controller(name)` - retrieves the controller of the current element or its parent. By default |
|---|
| 2347 | + * retrieves controller associated with the `ngController` directive. If `name` is provided as |
|---|
| 2348 | + * camelCase directive name, then the controller for this directive will be retrieved (e.g. |
|---|
| 2349 | + * `'ngModel'`). |
|---|
| 2350 | + * - `injector()` - retrieves the injector of the current element or its parent. |
|---|
| 2351 | + * - `scope()` - retrieves the {@link ng.$rootScope.Scope scope} of the current |
|---|
| 2352 | + * element or its parent. |
|---|
| 2353 | + * - `isolateScope()` - retrieves an isolate {@link ng.$rootScope.Scope scope} if one is attached directly to the |
|---|
| 2354 | + * current element. This getter should be used only on elements that contain a directive which starts a new isolate |
|---|
| 2355 | + * scope. Calling `scope()` on this element always returns the original non-isolate scope. |
|---|
| 2356 | + * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top |
|---|
| 2357 | + * parent element is reached. |
|---|
| 2358 | + * |
|---|
| 2359 | + * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery. |
|---|
| 2360 | + * @returns {Object} jQuery object. |
|---|
| 2361 | + */ |
|---|
| 2362 | + |
|---|
| 2363 | +JQLite.expando = 'ng339'; |
|---|
| 2364 | + |
|---|
| 2365 | +var jqCache = JQLite.cache = {}, |
|---|
| 2366 | + jqId = 1, |
|---|
| 2367 | + addEventListenerFn = function(element, type, fn) { |
|---|
| 2368 | + element.addEventListener(type, fn, false); |
|---|
| 2369 | + }, |
|---|
| 2370 | + removeEventListenerFn = function(element, type, fn) { |
|---|
| 2371 | + element.removeEventListener(type, fn, false); |
|---|
| 2372 | + }; |
|---|
| 2373 | + |
|---|
| 2374 | +/* |
|---|
| 2375 | + * !!! This is an undocumented "private" function !!! |
|---|
| 2376 | + */ |
|---|
| 2377 | +JQLite._data = function(node) { |
|---|
| 2378 | + //jQuery always returns an object on cache miss |
|---|
| 2379 | + return this.cache[node[this.expando]] || {}; |
|---|
| 2380 | +}; |
|---|
| 2381 | + |
|---|
| 2382 | +function jqNextId() { return ++jqId; } |
|---|
| 2383 | + |
|---|
| 2384 | + |
|---|
| 2385 | +var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g; |
|---|
| 2386 | +var MOZ_HACK_REGEXP = /^moz([A-Z])/; |
|---|
| 2387 | +var MOUSE_EVENT_MAP= { mouseleave : "mouseout", mouseenter : "mouseover"}; |
|---|
| 2388 | +var jqLiteMinErr = minErr('jqLite'); |
|---|
| 2389 | + |
|---|
| 2390 | +/** |
|---|
| 2391 | + * Converts snake_case to camelCase. |
|---|
| 2392 | + * Also there is special case for Moz prefix starting with upper case letter. |
|---|
| 2393 | + * @param name Name to normalize |
|---|
| 2394 | + */ |
|---|
| 2395 | +function camelCase(name) { |
|---|
| 2396 | + return name. |
|---|
| 2397 | + replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) { |
|---|
| 2398 | + return offset ? letter.toUpperCase() : letter; |
|---|
| 2399 | + }). |
|---|
| 2400 | + replace(MOZ_HACK_REGEXP, 'Moz$1'); |
|---|
| 2401 | +} |
|---|
| 2402 | + |
|---|
| 2403 | +var SINGLE_TAG_REGEXP = /^<(\w+)\s*\/?>(?:<\/\1>|)$/; |
|---|
| 2404 | +var HTML_REGEXP = /<|&#?\w+;/; |
|---|
| 2405 | +var TAG_NAME_REGEXP = /<([\w:]+)/; |
|---|
| 2406 | +var XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi; |
|---|
| 2407 | + |
|---|
| 2408 | +var wrapMap = { |
|---|
| 2409 | + 'option': [1, '<select multiple="multiple">', '</select>'], |
|---|
| 2410 | + |
|---|
| 2411 | + 'thead': [1, '<table>', '</table>'], |
|---|
| 2412 | + 'col': [2, '<table><colgroup>', '</colgroup></table>'], |
|---|
| 2413 | + 'tr': [2, '<table><tbody>', '</tbody></table>'], |
|---|
| 2414 | + 'td': [3, '<table><tbody><tr>', '</tr></tbody></table>'], |
|---|
| 2415 | + '_default': [0, "", ""] |
|---|
| 2416 | +}; |
|---|
| 2417 | + |
|---|
| 2418 | +wrapMap.optgroup = wrapMap.option; |
|---|
| 2419 | +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; |
|---|
| 2420 | +wrapMap.th = wrapMap.td; |
|---|
| 2421 | + |
|---|
| 2422 | + |
|---|
| 2423 | +function jqLiteIsTextNode(html) { |
|---|
| 2424 | + return !HTML_REGEXP.test(html); |
|---|
| 2425 | +} |
|---|
| 2426 | + |
|---|
| 2427 | +function jqLiteAcceptsData(node) { |
|---|
| 2428 | + // The window object can accept data but has no nodeType |
|---|
| 2429 | + // Otherwise we are only interested in elements (1) and documents (9) |
|---|
| 2430 | + var nodeType = node.nodeType; |
|---|
| 2431 | + return nodeType === NODE_TYPE_ELEMENT || !nodeType || nodeType === NODE_TYPE_DOCUMENT; |
|---|
| 2432 | +} |
|---|
| 2433 | + |
|---|
| 2434 | +function jqLiteBuildFragment(html, context) { |
|---|
| 2435 | + var tmp, tag, wrap, |
|---|
| 2436 | + fragment = context.createDocumentFragment(), |
|---|
| 2437 | + nodes = [], i; |
|---|
| 2438 | + |
|---|
| 2439 | + if (jqLiteIsTextNode(html)) { |
|---|
| 2440 | + // Convert non-html into a text node |
|---|
| 2441 | + nodes.push(context.createTextNode(html)); |
|---|
| 2442 | + } else { |
|---|
| 2443 | + // Convert html into DOM nodes |
|---|
| 2444 | + tmp = tmp || fragment.appendChild(context.createElement("div")); |
|---|
| 2445 | + tag = (TAG_NAME_REGEXP.exec(html) || ["", ""])[1].toLowerCase(); |
|---|
| 2446 | + wrap = wrapMap[tag] || wrapMap._default; |
|---|
| 2447 | + tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, "<$1></$2>") + wrap[2]; |
|---|
| 2448 | + |
|---|
| 2449 | + // Descend through wrappers to the right content |
|---|
| 2450 | + i = wrap[0]; |
|---|
| 2451 | + while (i--) { |
|---|
| 2452 | + tmp = tmp.lastChild; |
|---|
| 2453 | + } |
|---|
| 2454 | + |
|---|
| 2455 | + nodes = concat(nodes, tmp.childNodes); |
|---|
| 2456 | + |
|---|
| 2457 | + tmp = fragment.firstChild; |
|---|
| 2458 | + tmp.textContent = ""; |
|---|
| 2459 | + } |
|---|
| 2460 | + |
|---|
| 2461 | + // Remove wrapper from fragment |
|---|
| 2462 | + fragment.textContent = ""; |
|---|
| 2463 | + fragment.innerHTML = ""; // Clear inner HTML |
|---|
| 2464 | + forEach(nodes, function(node) { |
|---|
| 2465 | + fragment.appendChild(node); |
|---|
| 2466 | + }); |
|---|
| 2467 | + |
|---|
| 2468 | + return fragment; |
|---|
| 2469 | +} |
|---|
| 2470 | + |
|---|
| 2471 | +function jqLiteParseHTML(html, context) { |
|---|
| 2472 | + context = context || document; |
|---|
| 2473 | + var parsed; |
|---|
| 2474 | + |
|---|
| 2475 | + if ((parsed = SINGLE_TAG_REGEXP.exec(html))) { |
|---|
| 2476 | + return [context.createElement(parsed[1])]; |
|---|
| 2477 | + } |
|---|
| 2478 | + |
|---|
| 2479 | + if ((parsed = jqLiteBuildFragment(html, context))) { |
|---|
| 2480 | + return parsed.childNodes; |
|---|
| 2481 | + } |
|---|
| 2482 | + |
|---|
| 2483 | + return []; |
|---|
| 2484 | +} |
|---|
| 2485 | + |
|---|
| 2486 | +///////////////////////////////////////////// |
|---|
| 2487 | +function JQLite(element) { |
|---|
| 2488 | + if (element instanceof JQLite) { |
|---|
| 2489 | + return element; |
|---|
| 2490 | + } |
|---|
| 2491 | + |
|---|
| 2492 | + var argIsString; |
|---|
| 2493 | + |
|---|
| 2494 | + if (isString(element)) { |
|---|
| 2495 | + element = trim(element); |
|---|
| 2496 | + argIsString = true; |
|---|
| 2497 | + } |
|---|
| 2498 | + if (!(this instanceof JQLite)) { |
|---|
| 2499 | + if (argIsString && element.charAt(0) != '<') { |
|---|
| 2500 | + throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element'); |
|---|
| 2501 | + } |
|---|
| 2502 | + return new JQLite(element); |
|---|
| 2503 | + } |
|---|
| 2504 | + |
|---|
| 2505 | + if (argIsString) { |
|---|
| 2506 | + jqLiteAddNodes(this, jqLiteParseHTML(element)); |
|---|
| 2507 | + } else { |
|---|
| 2508 | + jqLiteAddNodes(this, element); |
|---|
| 2509 | + } |
|---|
| 2510 | +} |
|---|
| 2511 | + |
|---|
| 2512 | +function jqLiteClone(element) { |
|---|
| 2513 | + return element.cloneNode(true); |
|---|
| 2514 | +} |
|---|
| 2515 | + |
|---|
| 2516 | +function jqLiteDealoc(element, onlyDescendants){ |
|---|
| 2517 | + if (!onlyDescendants) jqLiteRemoveData(element); |
|---|
| 2518 | + |
|---|
| 2519 | + if (element.querySelectorAll) { |
|---|
| 2520 | + var descendants = element.querySelectorAll('*'); |
|---|
| 2521 | + for (var i = 0, l = descendants.length; i < l; i++) { |
|---|
| 2522 | + jqLiteRemoveData(descendants[i]); |
|---|
| 2523 | + } |
|---|
| 2524 | + } |
|---|
| 2525 | +} |
|---|
| 2526 | + |
|---|
| 2527 | +function jqLiteOff(element, type, fn, unsupported) { |
|---|
| 2528 | + if (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument'); |
|---|
| 2529 | + |
|---|
| 2530 | + var expandoStore = jqLiteExpandoStore(element); |
|---|
| 2531 | + var events = expandoStore && expandoStore.events; |
|---|
| 2532 | + var handle = expandoStore && expandoStore.handle; |
|---|
| 2533 | + |
|---|
| 2534 | + if (!handle) return; //no listeners registered |
|---|
| 2535 | + |
|---|
| 2536 | + if (!type) { |
|---|
| 2537 | + for (type in events) { |
|---|
| 2538 | + if (type !== '$destroy') { |
|---|
| 2539 | + removeEventListenerFn(element, type, handle); |
|---|
| 2540 | + } |
|---|
| 2541 | + delete events[type]; |
|---|
| 2542 | + } |
|---|
| 2543 | + } else { |
|---|
| 2544 | + forEach(type.split(' '), function(type) { |
|---|
| 2545 | + if (isDefined(fn)) { |
|---|
| 2546 | + var listenerFns = events[type]; |
|---|
| 2547 | + arrayRemove(listenerFns || [], fn); |
|---|
| 2548 | + if (listenerFns && listenerFns.length > 0) { |
|---|
| 2549 | + return; |
|---|
| 2550 | + } |
|---|
| 2551 | + } |
|---|
| 2552 | + |
|---|
| 2553 | + removeEventListenerFn(element, type, handle); |
|---|
| 2554 | + delete events[type]; |
|---|
| 2555 | + }); |
|---|
| 2556 | + } |
|---|
| 2557 | +} |
|---|
| 2558 | + |
|---|
| 2559 | +function jqLiteRemoveData(element, name) { |
|---|
| 2560 | + var expandoId = element.ng339; |
|---|
| 2561 | + var expandoStore = expandoId && jqCache[expandoId]; |
|---|
| 2562 | + |
|---|
| 2563 | + if (expandoStore) { |
|---|
| 2564 | + if (name) { |
|---|
| 2565 | + delete expandoStore.data[name]; |
|---|
| 2566 | + return; |
|---|
| 2567 | + } |
|---|
| 2568 | + |
|---|
| 2569 | + if (expandoStore.handle) { |
|---|
| 2570 | + if (expandoStore.events.$destroy) { |
|---|
| 2571 | + expandoStore.handle({}, '$destroy'); |
|---|
| 2572 | + } |
|---|
| 2573 | + jqLiteOff(element); |
|---|
| 2574 | + } |
|---|
| 2575 | + delete jqCache[expandoId]; |
|---|
| 2576 | + element.ng339 = undefined; // don't delete DOM expandos. IE and Chrome don't like it |
|---|
| 2577 | + } |
|---|
| 2578 | +} |
|---|
| 2579 | + |
|---|
| 2580 | + |
|---|
| 2581 | +function jqLiteExpandoStore(element, createIfNecessary) { |
|---|
| 2582 | + var expandoId = element.ng339, |
|---|
| 2583 | + expandoStore = expandoId && jqCache[expandoId]; |
|---|
| 2584 | + |
|---|
| 2585 | + if (createIfNecessary && !expandoStore) { |
|---|
| 2586 | + element.ng339 = expandoId = jqNextId(); |
|---|
| 2587 | + expandoStore = jqCache[expandoId] = {events: {}, data: {}, handle: undefined}; |
|---|
| 2588 | + } |
|---|
| 2589 | + |
|---|
| 2590 | + return expandoStore; |
|---|
| 2591 | +} |
|---|
| 2592 | + |
|---|
| 2593 | + |
|---|
| 2594 | +function jqLiteData(element, key, value) { |
|---|
| 2595 | + if (jqLiteAcceptsData(element)) { |
|---|
| 2596 | + |
|---|
| 2597 | + var isSimpleSetter = isDefined(value); |
|---|
| 2598 | + var isSimpleGetter = !isSimpleSetter && key && !isObject(key); |
|---|
| 2599 | + var massGetter = !key; |
|---|
| 2600 | + var expandoStore = jqLiteExpandoStore(element, !isSimpleGetter); |
|---|
| 2601 | + var data = expandoStore && expandoStore.data; |
|---|
| 2602 | + |
|---|
| 2603 | + if (isSimpleSetter) { // data('key', value) |
|---|
| 2604 | + data[key] = value; |
|---|
| 2605 | + } else { |
|---|
| 2606 | + if (massGetter) { // data() |
|---|
| 2607 | + return data; |
|---|
| 2608 | + } else { |
|---|
| 2609 | + if (isSimpleGetter) { // data('key') |
|---|
| 2610 | + // don't force creation of expandoStore if it doesn't exist yet |
|---|
| 2611 | + return data && data[key]; |
|---|
| 2612 | + } else { // mass-setter: data({key1: val1, key2: val2}) |
|---|
| 2613 | + extend(data, key); |
|---|
| 2614 | + } |
|---|
| 2615 | + } |
|---|
| 2616 | + } |
|---|
| 2617 | + } |
|---|
| 2618 | +} |
|---|
| 2619 | + |
|---|
| 2620 | +function jqLiteHasClass(element, selector) { |
|---|
| 2621 | + if (!element.getAttribute) return false; |
|---|
| 2622 | + return ((" " + (element.getAttribute('class') || '') + " ").replace(/[\n\t]/g, " "). |
|---|
| 2623 | + indexOf( " " + selector + " " ) > -1); |
|---|
| 2624 | +} |
|---|
| 2625 | + |
|---|
| 2626 | +function jqLiteRemoveClass(element, cssClasses) { |
|---|
| 2627 | + if (cssClasses && element.setAttribute) { |
|---|
| 2628 | + forEach(cssClasses.split(' '), function(cssClass) { |
|---|
| 2629 | + element.setAttribute('class', trim( |
|---|
| 2630 | + (" " + (element.getAttribute('class') || '') + " ") |
|---|
| 2631 | + .replace(/[\n\t]/g, " ") |
|---|
| 2632 | + .replace(" " + trim(cssClass) + " ", " ")) |
|---|
| 2633 | + ); |
|---|
| 2634 | + }); |
|---|
| 2635 | + } |
|---|
| 2636 | +} |
|---|
| 2637 | + |
|---|
| 2638 | +function jqLiteAddClass(element, cssClasses) { |
|---|
| 2639 | + if (cssClasses && element.setAttribute) { |
|---|
| 2640 | + var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ') |
|---|
| 2641 | + .replace(/[\n\t]/g, " "); |
|---|
| 2642 | + |
|---|
| 2643 | + forEach(cssClasses.split(' '), function(cssClass) { |
|---|
| 2644 | + cssClass = trim(cssClass); |
|---|
| 2645 | + if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) { |
|---|
| 2646 | + existingClasses += cssClass + ' '; |
|---|
| 2647 | + } |
|---|
| 2648 | + }); |
|---|
| 2649 | + |
|---|
| 2650 | + element.setAttribute('class', trim(existingClasses)); |
|---|
| 2651 | + } |
|---|
| 2652 | +} |
|---|
| 2653 | + |
|---|
| 2654 | + |
|---|
| 2655 | +function jqLiteAddNodes(root, elements) { |
|---|
| 2656 | + // THIS CODE IS VERY HOT. Don't make changes without benchmarking. |
|---|
| 2657 | + |
|---|
| 2658 | + if (elements) { |
|---|
| 2659 | + |
|---|
| 2660 | + // if a Node (the most common case) |
|---|
| 2661 | + if (elements.nodeType) { |
|---|
| 2662 | + root[root.length++] = elements; |
|---|
| 2663 | + } else { |
|---|
| 2664 | + var length = elements.length; |
|---|
| 2665 | + |
|---|
| 2666 | + // if an Array or NodeList and not a Window |
|---|
| 2667 | + if (typeof length === 'number' && elements.window !== elements) { |
|---|
| 2668 | + if (length) { |
|---|
| 2669 | + for (var i = 0; i < length; i++) { |
|---|
| 2670 | + root[root.length++] = elements[i]; |
|---|
| 2671 | + } |
|---|
| 2672 | + } |
|---|
| 2673 | + } else { |
|---|
| 2674 | + root[root.length++] = elements; |
|---|
| 2675 | + } |
|---|
| 2676 | + } |
|---|
| 2677 | + } |
|---|
| 2678 | +} |
|---|
| 2679 | + |
|---|
| 2680 | + |
|---|
| 2681 | +function jqLiteController(element, name) { |
|---|
| 2682 | + return jqLiteInheritedData(element, '$' + (name || 'ngController' ) + 'Controller'); |
|---|
| 2683 | +} |
|---|
| 2684 | + |
|---|
| 2685 | +function jqLiteInheritedData(element, name, value) { |
|---|
| 2686 | + // if element is the document object work with the html element instead |
|---|
| 2687 | + // this makes $(document).scope() possible |
|---|
| 2688 | + if(element.nodeType == NODE_TYPE_DOCUMENT) { |
|---|
| 2689 | + element = element.documentElement; |
|---|
| 2690 | + } |
|---|
| 2691 | + var names = isArray(name) ? name : [name]; |
|---|
| 2692 | + |
|---|
| 2693 | + while (element) { |
|---|
| 2694 | + for (var i = 0, ii = names.length; i < ii; i++) { |
|---|
| 2695 | + if ((value = jqLite.data(element, names[i])) !== undefined) return value; |
|---|
| 2696 | + } |
|---|
| 2697 | + |
|---|
| 2698 | + // If dealing with a document fragment node with a host element, and no parent, use the host |
|---|
| 2699 | + // element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM |
|---|
| 2700 | + // to lookup parent controllers. |
|---|
| 2701 | + element = element.parentNode || (element.nodeType === NODE_TYPE_DOCUMENT_FRAGMENT && element.host); |
|---|
| 2702 | + } |
|---|
| 2703 | +} |
|---|
| 2704 | + |
|---|
| 2705 | +function jqLiteEmpty(element) { |
|---|
| 2706 | + jqLiteDealoc(element, true); |
|---|
| 2707 | + while (element.firstChild) { |
|---|
| 2708 | + element.removeChild(element.firstChild); |
|---|
| 2709 | + } |
|---|
| 2710 | +} |
|---|
| 2711 | + |
|---|
| 2712 | +function jqLiteRemove(element, keepData) { |
|---|
| 2713 | + if (!keepData) jqLiteDealoc(element); |
|---|
| 2714 | + var parent = element.parentNode; |
|---|
| 2715 | + if (parent) parent.removeChild(element); |
|---|
| 2716 | +} |
|---|
| 2717 | + |
|---|
| 2718 | + |
|---|
| 2719 | +function jqLiteDocumentLoaded(action, win) { |
|---|
| 2720 | + win = win || window; |
|---|
| 2721 | + if (win.document.readyState === 'complete') { |
|---|
| 2722 | + // Force the action to be run async for consistent behaviour |
|---|
| 2723 | + // from the action's point of view |
|---|
| 2724 | + // i.e. it will definitely not be in a $apply |
|---|
| 2725 | + win.setTimeout(action); |
|---|
| 2726 | + } else { |
|---|
| 2727 | + // No need to unbind this handler as load is only ever called once |
|---|
| 2728 | + jqLite(win).on('load', action); |
|---|
| 2729 | + } |
|---|
| 2730 | +} |
|---|
| 2731 | + |
|---|
| 2732 | +////////////////////////////////////////// |
|---|
| 2733 | +// Functions which are declared directly. |
|---|
| 2734 | +////////////////////////////////////////// |
|---|
| 2735 | +var JQLitePrototype = JQLite.prototype = { |
|---|
| 2736 | + ready: function(fn) { |
|---|
| 2737 | + var fired = false; |
|---|
| 2738 | + |
|---|
| 2739 | + function trigger() { |
|---|
| 2740 | + if (fired) return; |
|---|
| 2741 | + fired = true; |
|---|
| 2742 | + fn(); |
|---|
| 2743 | + } |
|---|
| 2744 | + |
|---|
| 2745 | + // check if document is already loaded |
|---|
| 2746 | + if (document.readyState === 'complete'){ |
|---|
| 2747 | + setTimeout(trigger); |
|---|
| 2748 | + } else { |
|---|
| 2749 | + this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9 |
|---|
| 2750 | + // we can not use jqLite since we are not done loading and jQuery could be loaded later. |
|---|
| 2751 | + // jshint -W064 |
|---|
| 2752 | + JQLite(window).on('load', trigger); // fallback to window.onload for others |
|---|
| 2753 | + // jshint +W064 |
|---|
| 2754 | + this.on('DOMContentLoaded', trigger); |
|---|
| 2755 | + } |
|---|
| 2756 | + }, |
|---|
| 2757 | + toString: function() { |
|---|
| 2758 | + var value = []; |
|---|
| 2759 | + forEach(this, function(e){ value.push('' + e);}); |
|---|
| 2760 | + return '[' + value.join(', ') + ']'; |
|---|
| 2761 | + }, |
|---|
| 2762 | + |
|---|
| 2763 | + eq: function(index) { |
|---|
| 2764 | + return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]); |
|---|
| 2765 | + }, |
|---|
| 2766 | + |
|---|
| 2767 | + length: 0, |
|---|
| 2768 | + push: push, |
|---|
| 2769 | + sort: [].sort, |
|---|
| 2770 | + splice: [].splice |
|---|
| 2771 | +}; |
|---|
| 2772 | + |
|---|
| 2773 | +////////////////////////////////////////// |
|---|
| 2774 | +// Functions iterating getter/setters. |
|---|
| 2775 | +// these functions return self on setter and |
|---|
| 2776 | +// value on get. |
|---|
| 2777 | +////////////////////////////////////////// |
|---|
| 2778 | +var BOOLEAN_ATTR = {}; |
|---|
| 2779 | +forEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function(value) { |
|---|
| 2780 | + BOOLEAN_ATTR[lowercase(value)] = value; |
|---|
| 2781 | +}); |
|---|
| 2782 | +var BOOLEAN_ELEMENTS = {}; |
|---|
| 2783 | +forEach('input,select,option,textarea,button,form,details'.split(','), function(value) { |
|---|
| 2784 | + BOOLEAN_ELEMENTS[value] = true; |
|---|
| 2785 | +}); |
|---|
| 2786 | +var ALIASED_ATTR = { |
|---|
| 2787 | + 'ngMinlength' : 'minlength', |
|---|
| 2788 | + 'ngMaxlength' : 'maxlength', |
|---|
| 2789 | + 'ngMin' : 'min', |
|---|
| 2790 | + 'ngMax' : 'max', |
|---|
| 2791 | + 'ngPattern' : 'pattern' |
|---|
| 2792 | +}; |
|---|
| 2793 | + |
|---|
| 2794 | +function getBooleanAttrName(element, name) { |
|---|
| 2795 | + // check dom last since we will most likely fail on name |
|---|
| 2796 | + var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()]; |
|---|
| 2797 | + |
|---|
| 2798 | + // booleanAttr is here twice to minimize DOM access |
|---|
| 2799 | + return booleanAttr && BOOLEAN_ELEMENTS[nodeName_(element)] && booleanAttr; |
|---|
| 2800 | +} |
|---|
| 2801 | + |
|---|
| 2802 | +function getAliasedAttrName(element, name) { |
|---|
| 2803 | + var nodeName = element.nodeName; |
|---|
| 2804 | + return (nodeName === 'INPUT' || nodeName === 'TEXTAREA') && ALIASED_ATTR[name]; |
|---|
| 2805 | +} |
|---|
| 2806 | + |
|---|
| 2807 | +forEach({ |
|---|
| 2808 | + data: jqLiteData, |
|---|
| 2809 | + removeData: jqLiteRemoveData |
|---|
| 2810 | +}, function(fn, name) { |
|---|
| 2811 | + JQLite[name] = fn; |
|---|
| 2812 | +}); |
|---|
| 2813 | + |
|---|
| 2814 | +forEach({ |
|---|
| 2815 | + data: jqLiteData, |
|---|
| 2816 | + inheritedData: jqLiteInheritedData, |
|---|
| 2817 | + |
|---|
| 2818 | + scope: function(element) { |
|---|
| 2819 | + // Can't use jqLiteData here directly so we stay compatible with jQuery! |
|---|
| 2820 | + return jqLite.data(element, '$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']); |
|---|
| 2821 | + }, |
|---|
| 2822 | + |
|---|
| 2823 | + isolateScope: function(element) { |
|---|
| 2824 | + // Can't use jqLiteData here directly so we stay compatible with jQuery! |
|---|
| 2825 | + return jqLite.data(element, '$isolateScope') || jqLite.data(element, '$isolateScopeNoTemplate'); |
|---|
| 2826 | + }, |
|---|
| 2827 | + |
|---|
| 2828 | + controller: jqLiteController, |
|---|
| 2829 | + |
|---|
| 2830 | + injector: function(element) { |
|---|
| 2831 | + return jqLiteInheritedData(element, '$injector'); |
|---|
| 2832 | + }, |
|---|
| 2833 | + |
|---|
| 2834 | + removeAttr: function(element, name) { |
|---|
| 2835 | + element.removeAttribute(name); |
|---|
| 2836 | + }, |
|---|
| 2837 | + |
|---|
| 2838 | + hasClass: jqLiteHasClass, |
|---|
| 2839 | + |
|---|
| 2840 | + css: function(element, name, value) { |
|---|
| 2841 | + name = camelCase(name); |
|---|
| 2842 | + |
|---|
| 2843 | + if (isDefined(value)) { |
|---|
| 2844 | + element.style[name] = value; |
|---|
| 2845 | + } else { |
|---|
| 2846 | + return element.style[name]; |
|---|
| 2847 | + } |
|---|
| 2848 | + }, |
|---|
| 2849 | + |
|---|
| 2850 | + attr: function(element, name, value){ |
|---|
| 2851 | + var lowercasedName = lowercase(name); |
|---|
| 2852 | + if (BOOLEAN_ATTR[lowercasedName]) { |
|---|
| 2853 | + if (isDefined(value)) { |
|---|
| 2854 | + if (!!value) { |
|---|
| 2855 | + element[name] = true; |
|---|
| 2856 | + element.setAttribute(name, lowercasedName); |
|---|
| 2857 | + } else { |
|---|
| 2858 | + element[name] = false; |
|---|
| 2859 | + element.removeAttribute(lowercasedName); |
|---|
| 2860 | + } |
|---|
| 2861 | + } else { |
|---|
| 2862 | + return (element[name] || |
|---|
| 2863 | + (element.attributes.getNamedItem(name)|| noop).specified) |
|---|
| 2864 | + ? lowercasedName |
|---|
| 2865 | + : undefined; |
|---|
| 2866 | + } |
|---|
| 2867 | + } else if (isDefined(value)) { |
|---|
| 2868 | + element.setAttribute(name, value); |
|---|
| 2869 | + } else if (element.getAttribute) { |
|---|
| 2870 | + // the extra argument "2" is to get the right thing for a.href in IE, see jQuery code |
|---|
| 2871 | + // some elements (e.g. Document) don't have get attribute, so return undefined |
|---|
| 2872 | + var ret = element.getAttribute(name, 2); |
|---|
| 2873 | + // normalize non-existing attributes to undefined (as jQuery) |
|---|
| 2874 | + return ret === null ? undefined : ret; |
|---|
| 2875 | + } |
|---|
| 2876 | + }, |
|---|
| 2877 | + |
|---|
| 2878 | + prop: function(element, name, value) { |
|---|
| 2879 | + if (isDefined(value)) { |
|---|
| 2880 | + element[name] = value; |
|---|
| 2881 | + } else { |
|---|
| 2882 | + return element[name]; |
|---|
| 2883 | + } |
|---|
| 2884 | + }, |
|---|
| 2885 | + |
|---|
| 2886 | + text: (function() { |
|---|
| 2887 | + getText.$dv = ''; |
|---|
| 2888 | + return getText; |
|---|
| 2889 | + |
|---|
| 2890 | + function getText(element, value) { |
|---|
| 2891 | + if (isUndefined(value)) { |
|---|
| 2892 | + var nodeType = element.nodeType; |
|---|
| 2893 | + return (nodeType === NODE_TYPE_ELEMENT || nodeType === NODE_TYPE_TEXT) ? element.textContent : ''; |
|---|
| 2894 | + } |
|---|
| 2895 | + element.textContent = value; |
|---|
| 2896 | + } |
|---|
| 2897 | + })(), |
|---|
| 2898 | + |
|---|
| 2899 | + val: function(element, value) { |
|---|
| 2900 | + if (isUndefined(value)) { |
|---|
| 2901 | + if (element.multiple && nodeName_(element) === 'select') { |
|---|
| 2902 | + var result = []; |
|---|
| 2903 | + forEach(element.options, function (option) { |
|---|
| 2904 | + if (option.selected) { |
|---|
| 2905 | + result.push(option.value || option.text); |
|---|
| 2906 | + } |
|---|
| 2907 | + }); |
|---|
| 2908 | + return result.length === 0 ? null : result; |
|---|
| 2909 | + } |
|---|
| 2910 | + return element.value; |
|---|
| 2911 | + } |
|---|
| 2912 | + element.value = value; |
|---|
| 2913 | + }, |
|---|
| 2914 | + |
|---|
| 2915 | + html: function(element, value) { |
|---|
| 2916 | + if (isUndefined(value)) { |
|---|
| 2917 | + return element.innerHTML; |
|---|
| 2918 | + } |
|---|
| 2919 | + jqLiteDealoc(element, true); |
|---|
| 2920 | + element.innerHTML = value; |
|---|
| 2921 | + }, |
|---|
| 2922 | + |
|---|
| 2923 | + empty: jqLiteEmpty |
|---|
| 2924 | +}, function(fn, name){ |
|---|
| 2925 | + /** |
|---|
| 2926 | + * Properties: writes return selection, reads return first value |
|---|
| 2927 | + */ |
|---|
| 2928 | + JQLite.prototype[name] = function(arg1, arg2) { |
|---|
| 2929 | + var i, key; |
|---|
| 2930 | + var nodeCount = this.length; |
|---|
| 2931 | + |
|---|
| 2932 | + // jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it |
|---|
| 2933 | + // in a way that survives minification. |
|---|
| 2934 | + // jqLiteEmpty takes no arguments but is a setter. |
|---|
| 2935 | + if (fn !== jqLiteEmpty && |
|---|
| 2936 | + (((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2) === undefined)) { |
|---|
| 2937 | + if (isObject(arg1)) { |
|---|
| 2938 | + |
|---|
| 2939 | + // we are a write, but the object properties are the key/values |
|---|
| 2940 | + for (i = 0; i < nodeCount; i++) { |
|---|
| 2941 | + if (fn === jqLiteData) { |
|---|
| 2942 | + // data() takes the whole object in jQuery |
|---|
| 2943 | + fn(this[i], arg1); |
|---|
| 2944 | + } else { |
|---|
| 2945 | + for (key in arg1) { |
|---|
| 2946 | + fn(this[i], key, arg1[key]); |
|---|
| 2947 | + } |
|---|
| 2948 | + } |
|---|
| 2949 | + } |
|---|
| 2950 | + // return self for chaining |
|---|
| 2951 | + return this; |
|---|
| 2952 | + } else { |
|---|
| 2953 | + // we are a read, so read the first child. |
|---|
| 2954 | + // TODO: do we still need this? |
|---|
| 2955 | + var value = fn.$dv; |
|---|
| 2956 | + // Only if we have $dv do we iterate over all, otherwise it is just the first element. |
|---|
| 2957 | + var jj = (value === undefined) ? Math.min(nodeCount, 1) : nodeCount; |
|---|
| 2958 | + for (var j = 0; j < jj; j++) { |
|---|
| 2959 | + var nodeValue = fn(this[j], arg1, arg2); |
|---|
| 2960 | + value = value ? value + nodeValue : nodeValue; |
|---|
| 2961 | + } |
|---|
| 2962 | + return value; |
|---|
| 2963 | + } |
|---|
| 2964 | + } else { |
|---|
| 2965 | + // we are a write, so apply to all children |
|---|
| 2966 | + for (i = 0; i < nodeCount; i++) { |
|---|
| 2967 | + fn(this[i], arg1, arg2); |
|---|
| 2968 | + } |
|---|
| 2969 | + // return self for chaining |
|---|
| 2970 | + return this; |
|---|
| 2971 | + } |
|---|
| 2972 | + }; |
|---|
| 2973 | +}); |
|---|
| 2974 | + |
|---|
| 2975 | +function createEventHandler(element, events) { |
|---|
| 2976 | + var eventHandler = function (event, type) { |
|---|
| 2977 | + // jQuery specific api |
|---|
| 2978 | + event.isDefaultPrevented = function() { |
|---|
| 2979 | + return event.defaultPrevented; |
|---|
| 2980 | + }; |
|---|
| 2981 | + |
|---|
| 2982 | + var eventFns = events[type || event.type]; |
|---|
| 2983 | + var eventFnsLength = eventFns ? eventFns.length : 0; |
|---|
| 2984 | + |
|---|
| 2985 | + if (!eventFnsLength) return; |
|---|
| 2986 | + |
|---|
| 2987 | + if (isUndefined(event.immediatePropagationStopped)) { |
|---|
| 2988 | + var originalStopImmediatePropagation = event.stopImmediatePropagation; |
|---|
| 2989 | + event.stopImmediatePropagation = function() { |
|---|
| 2990 | + event.immediatePropagationStopped = true; |
|---|
| 2991 | + |
|---|
| 2992 | + if (event.stopPropagation) { |
|---|
| 2993 | + event.stopPropagation(); |
|---|
| 2994 | + } |
|---|
| 2995 | + |
|---|
| 2996 | + if (originalStopImmediatePropagation) { |
|---|
| 2997 | + originalStopImmediatePropagation.call(event); |
|---|
| 2998 | + } |
|---|
| 2999 | + }; |
|---|
| 3000 | + } |
|---|
| 3001 | + |
|---|
| 3002 | + event.isImmediatePropagationStopped = function() { |
|---|
| 3003 | + return event.immediatePropagationStopped === true; |
|---|
| 3004 | + }; |
|---|
| 3005 | + |
|---|
| 3006 | + // Copy event handlers in case event handlers array is modified during execution. |
|---|
| 3007 | + if ((eventFnsLength > 1)) { |
|---|
| 3008 | + eventFns = shallowCopy(eventFns); |
|---|
| 3009 | + } |
|---|
| 3010 | + |
|---|
| 3011 | + for (var i = 0; i < eventFnsLength; i++) { |
|---|
| 3012 | + if (!event.isImmediatePropagationStopped()) { |
|---|
| 3013 | + eventFns[i].call(element, event); |
|---|
| 3014 | + } |
|---|
| 3015 | + } |
|---|
| 3016 | + }; |
|---|
| 3017 | + |
|---|
| 3018 | + // TODO: this is a hack for angularMocks/clearDataCache that makes it possible to deregister all |
|---|
| 3019 | + // events on `element` |
|---|
| 3020 | + eventHandler.elem = element; |
|---|
| 3021 | + return eventHandler; |
|---|
| 3022 | +} |
|---|
| 3023 | + |
|---|
| 3024 | +////////////////////////////////////////// |
|---|
| 3025 | +// Functions iterating traversal. |
|---|
| 3026 | +// These functions chain results into a single |
|---|
| 3027 | +// selector. |
|---|
| 3028 | +////////////////////////////////////////// |
|---|
| 3029 | +forEach({ |
|---|
| 3030 | + removeData: jqLiteRemoveData, |
|---|
| 3031 | + |
|---|
| 3032 | + on: function jqLiteOn(element, type, fn, unsupported){ |
|---|
| 3033 | + if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters'); |
|---|
| 3034 | + |
|---|
| 3035 | + // Do not add event handlers to non-elements because they will not be cleaned up. |
|---|
| 3036 | + if (!jqLiteAcceptsData(element)) { |
|---|
| 3037 | + return; |
|---|
| 3038 | + } |
|---|
| 3039 | + |
|---|
| 3040 | + var expandoStore = jqLiteExpandoStore(element, true); |
|---|
| 3041 | + var events = expandoStore.events; |
|---|
| 3042 | + var handle = expandoStore.handle; |
|---|
| 3043 | + |
|---|
| 3044 | + if (!handle) { |
|---|
| 3045 | + handle = expandoStore.handle = createEventHandler(element, events); |
|---|
| 3046 | + } |
|---|
| 3047 | + |
|---|
| 3048 | + // http://jsperf.com/string-indexof-vs-split |
|---|
| 3049 | + var types = type.indexOf(' ') >= 0 ? type.split(' ') : [type]; |
|---|
| 3050 | + var i = types.length; |
|---|
| 3051 | + |
|---|
| 3052 | + while (i--) { |
|---|
| 3053 | + type = types[i]; |
|---|
| 3054 | + var eventFns = events[type]; |
|---|
| 3055 | + |
|---|
| 3056 | + if (!eventFns) { |
|---|
| 3057 | + events[type] = []; |
|---|
| 3058 | + |
|---|
| 3059 | + if (type === 'mouseenter' || type === 'mouseleave') { |
|---|
| 3060 | + // Refer to jQuery's implementation of mouseenter & mouseleave |
|---|
| 3061 | + // Read about mouseenter and mouseleave: |
|---|
| 3062 | + // http://www.quirksmode.org/js/events_mouse.html#link8 |
|---|
| 3063 | + |
|---|
| 3064 | + jqLiteOn(element, MOUSE_EVENT_MAP[type], function(event) { |
|---|
| 3065 | + var target = this, related = event.relatedTarget; |
|---|
| 3066 | + // For mousenter/leave call the handler if related is outside the target. |
|---|
| 3067 | + // NB: No relatedTarget if the mouse left/entered the browser window |
|---|
| 3068 | + if ( !related || (related !== target && !target.contains(related)) ){ |
|---|
| 3069 | + handle(event, type); |
|---|
| 3070 | + } |
|---|
| 3071 | + }); |
|---|
| 3072 | + |
|---|
| 3073 | + } else { |
|---|
| 3074 | + if (type !== '$destroy') { |
|---|
| 3075 | + addEventListenerFn(element, type, handle); |
|---|
| 3076 | + } |
|---|
| 3077 | + } |
|---|
| 3078 | + eventFns = events[type]; |
|---|
| 3079 | + } |
|---|
| 3080 | + eventFns.push(fn); |
|---|
| 3081 | + } |
|---|
| 3082 | + }, |
|---|
| 3083 | + |
|---|
| 3084 | + off: jqLiteOff, |
|---|
| 3085 | + |
|---|
| 3086 | + one: function(element, type, fn) { |
|---|
| 3087 | + element = jqLite(element); |
|---|
| 3088 | + |
|---|
| 3089 | + //add the listener twice so that when it is called |
|---|
| 3090 | + //you can remove the original function and still be |
|---|
| 3091 | + //able to call element.off(ev, fn) normally |
|---|
| 3092 | + element.on(type, function onFn() { |
|---|
| 3093 | + element.off(type, fn); |
|---|
| 3094 | + element.off(type, onFn); |
|---|
| 3095 | + }); |
|---|
| 3096 | + element.on(type, fn); |
|---|
| 3097 | + }, |
|---|
| 3098 | + |
|---|
| 3099 | + replaceWith: function(element, replaceNode) { |
|---|
| 3100 | + var index, parent = element.parentNode; |
|---|
| 3101 | + jqLiteDealoc(element); |
|---|
| 3102 | + forEach(new JQLite(replaceNode), function(node){ |
|---|
| 3103 | + if (index) { |
|---|
| 3104 | + parent.insertBefore(node, index.nextSibling); |
|---|
| 3105 | + } else { |
|---|
| 3106 | + parent.replaceChild(node, element); |
|---|
| 3107 | + } |
|---|
| 3108 | + index = node; |
|---|
| 3109 | + }); |
|---|
| 3110 | + }, |
|---|
| 3111 | + |
|---|
| 3112 | + children: function(element) { |
|---|
| 3113 | + var children = []; |
|---|
| 3114 | + forEach(element.childNodes, function(element){ |
|---|
| 3115 | + if (element.nodeType === NODE_TYPE_ELEMENT) |
|---|
| 3116 | + children.push(element); |
|---|
| 3117 | + }); |
|---|
| 3118 | + return children; |
|---|
| 3119 | + }, |
|---|
| 3120 | + |
|---|
| 3121 | + contents: function(element) { |
|---|
| 3122 | + return element.contentDocument || element.childNodes || []; |
|---|
| 3123 | + }, |
|---|
| 3124 | + |
|---|
| 3125 | + append: function(element, node) { |
|---|
| 3126 | + var nodeType = element.nodeType; |
|---|
| 3127 | + if (nodeType !== NODE_TYPE_ELEMENT && nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT) return; |
|---|
| 3128 | + |
|---|
| 3129 | + node = new JQLite(node); |
|---|
| 3130 | + |
|---|
| 3131 | + for (var i = 0, ii = node.length; i < ii; i++) { |
|---|
| 3132 | + var child = node[i]; |
|---|
| 3133 | + element.appendChild(child); |
|---|
| 3134 | + } |
|---|
| 3135 | + }, |
|---|
| 3136 | + |
|---|
| 3137 | + prepend: function(element, node) { |
|---|
| 3138 | + if (element.nodeType === NODE_TYPE_ELEMENT) { |
|---|
| 3139 | + var index = element.firstChild; |
|---|
| 3140 | + forEach(new JQLite(node), function(child){ |
|---|
| 3141 | + element.insertBefore(child, index); |
|---|
| 3142 | + }); |
|---|
| 3143 | + } |
|---|
| 3144 | + }, |
|---|
| 3145 | + |
|---|
| 3146 | + wrap: function(element, wrapNode) { |
|---|
| 3147 | + wrapNode = jqLite(wrapNode).eq(0).clone()[0]; |
|---|
| 3148 | + var parent = element.parentNode; |
|---|
| 3149 | + if (parent) { |
|---|
| 3150 | + parent.replaceChild(wrapNode, element); |
|---|
| 3151 | + } |
|---|
| 3152 | + wrapNode.appendChild(element); |
|---|
| 3153 | + }, |
|---|
| 3154 | + |
|---|
| 3155 | + remove: jqLiteRemove, |
|---|
| 3156 | + |
|---|
| 3157 | + detach: function(element) { |
|---|
| 3158 | + jqLiteRemove(element, true); |
|---|
| 3159 | + }, |
|---|
| 3160 | + |
|---|
| 3161 | + after: function(element, newElement) { |
|---|
| 3162 | + var index = element, parent = element.parentNode; |
|---|
| 3163 | + newElement = new JQLite(newElement); |
|---|
| 3164 | + |
|---|
| 3165 | + for (var i = 0, ii = newElement.length; i < ii; i++) { |
|---|
| 3166 | + var node = newElement[i]; |
|---|
| 3167 | + parent.insertBefore(node, index.nextSibling); |
|---|
| 3168 | + index = node; |
|---|
| 3169 | + } |
|---|
| 3170 | + }, |
|---|
| 3171 | + |
|---|
| 3172 | + addClass: jqLiteAddClass, |
|---|
| 3173 | + removeClass: jqLiteRemoveClass, |
|---|
| 3174 | + |
|---|
| 3175 | + toggleClass: function(element, selector, condition) { |
|---|
| 3176 | + if (selector) { |
|---|
| 3177 | + forEach(selector.split(' '), function(className){ |
|---|
| 3178 | + var classCondition = condition; |
|---|
| 3179 | + if (isUndefined(classCondition)) { |
|---|
| 3180 | + classCondition = !jqLiteHasClass(element, className); |
|---|
| 3181 | + } |
|---|
| 3182 | + (classCondition ? jqLiteAddClass : jqLiteRemoveClass)(element, className); |
|---|
| 3183 | + }); |
|---|
| 3184 | + } |
|---|
| 3185 | + }, |
|---|
| 3186 | + |
|---|
| 3187 | + parent: function(element) { |
|---|
| 3188 | + var parent = element.parentNode; |
|---|
| 3189 | + return parent && parent.nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT ? parent : null; |
|---|
| 3190 | + }, |
|---|
| 3191 | + |
|---|
| 3192 | + next: function(element) { |
|---|
| 3193 | + return element.nextElementSibling; |
|---|
| 3194 | + }, |
|---|
| 3195 | + |
|---|
| 3196 | + find: function(element, selector) { |
|---|
| 3197 | + if (element.getElementsByTagName) { |
|---|
| 3198 | + return element.getElementsByTagName(selector); |
|---|
| 3199 | + } else { |
|---|
| 3200 | + return []; |
|---|
| 3201 | + } |
|---|
| 3202 | + }, |
|---|
| 3203 | + |
|---|
| 3204 | + clone: jqLiteClone, |
|---|
| 3205 | + |
|---|
| 3206 | + triggerHandler: function(element, event, extraParameters) { |
|---|
| 3207 | + |
|---|
| 3208 | + var dummyEvent, eventFnsCopy, handlerArgs; |
|---|
| 3209 | + var eventName = event.type || event; |
|---|
| 3210 | + var expandoStore = jqLiteExpandoStore(element); |
|---|
| 3211 | + var events = expandoStore && expandoStore.events; |
|---|
| 3212 | + var eventFns = events && events[eventName]; |
|---|
| 3213 | + |
|---|
| 3214 | + if (eventFns) { |
|---|
| 3215 | + // Create a dummy event to pass to the handlers |
|---|
| 3216 | + dummyEvent = { |
|---|
| 3217 | + preventDefault: function() { this.defaultPrevented = true; }, |
|---|
| 3218 | + isDefaultPrevented: function() { return this.defaultPrevented === true; }, |
|---|
| 3219 | + stopImmediatePropagation: function() { this.immediatePropagationStopped = true; }, |
|---|
| 3220 | + isImmediatePropagationStopped: function() { return this.immediatePropagationStopped === true; }, |
|---|
| 3221 | + stopPropagation: noop, |
|---|
| 3222 | + type: eventName, |
|---|
| 3223 | + target: element |
|---|
| 3224 | + }; |
|---|
| 3225 | + |
|---|
| 3226 | + // If a custom event was provided then extend our dummy event with it |
|---|
| 3227 | + if (event.type) { |
|---|
| 3228 | + dummyEvent = extend(dummyEvent, event); |
|---|
| 3229 | + } |
|---|
| 3230 | + |
|---|
| 3231 | + // Copy event handlers in case event handlers array is modified during execution. |
|---|
| 3232 | + eventFnsCopy = shallowCopy(eventFns); |
|---|
| 3233 | + handlerArgs = extraParameters ? [dummyEvent].concat(extraParameters) : [dummyEvent]; |
|---|
| 3234 | + |
|---|
| 3235 | + forEach(eventFnsCopy, function(fn) { |
|---|
| 3236 | + if (!dummyEvent.isImmediatePropagationStopped()) { |
|---|
| 3237 | + fn.apply(element, handlerArgs); |
|---|
| 3238 | + } |
|---|
| 3239 | + }); |
|---|
| 3240 | + } |
|---|
| 3241 | + } |
|---|
| 3242 | +}, function(fn, name){ |
|---|
| 3243 | + /** |
|---|
| 3244 | + * chaining functions |
|---|
| 3245 | + */ |
|---|
| 3246 | + JQLite.prototype[name] = function(arg1, arg2, arg3) { |
|---|
| 3247 | + var value; |
|---|
| 3248 | + |
|---|
| 3249 | + for(var i = 0, ii = this.length; i < ii; i++) { |
|---|
| 3250 | + if (isUndefined(value)) { |
|---|
| 3251 | + value = fn(this[i], arg1, arg2, arg3); |
|---|
| 3252 | + if (isDefined(value)) { |
|---|
| 3253 | + // any function which returns a value needs to be wrapped |
|---|
| 3254 | + value = jqLite(value); |
|---|
| 3255 | + } |
|---|
| 3256 | + } else { |
|---|
| 3257 | + jqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3)); |
|---|
| 3258 | + } |
|---|
| 3259 | + } |
|---|
| 3260 | + return isDefined(value) ? value : this; |
|---|
| 3261 | + }; |
|---|
| 3262 | + |
|---|
| 3263 | + // bind legacy bind/unbind to on/off |
|---|
| 3264 | + JQLite.prototype.bind = JQLite.prototype.on; |
|---|
| 3265 | + JQLite.prototype.unbind = JQLite.prototype.off; |
|---|
| 3266 | +}); |
|---|
| 3267 | + |
|---|
| 3268 | +/** |
|---|
| 3269 | + * Computes a hash of an 'obj'. |
|---|
| 3270 | + * Hash of a: |
|---|
| 3271 | + * string is string |
|---|
| 3272 | + * number is number as string |
|---|
| 3273 | + * object is either result of calling $$hashKey function on the object or uniquely generated id, |
|---|
| 3274 | + * that is also assigned to the $$hashKey property of the object. |
|---|
| 3275 | + * |
|---|
| 3276 | + * @param obj |
|---|
| 3277 | + * @returns {string} hash string such that the same input will have the same hash string. |
|---|
| 3278 | + * The resulting string key is in 'type:hashKey' format. |
|---|
| 3279 | + */ |
|---|
| 3280 | +function hashKey(obj, nextUidFn) { |
|---|
| 3281 | + var key = obj && obj.$$hashKey; |
|---|
| 3282 | + |
|---|
| 3283 | + if (key) { |
|---|
| 3284 | + if (typeof key === 'function') { |
|---|
| 3285 | + key = obj.$$hashKey(); |
|---|
| 3286 | + } |
|---|
| 3287 | + return key; |
|---|
| 3288 | + } |
|---|
| 3289 | + |
|---|
| 3290 | + var objType = typeof obj; |
|---|
| 3291 | + if (objType == 'function' || (objType == 'object' && obj !== null)) { |
|---|
| 3292 | + key = obj.$$hashKey = objType + ':' + (nextUidFn || nextUid)(); |
|---|
| 3293 | + } else { |
|---|
| 3294 | + key = objType + ':' + obj; |
|---|
| 3295 | + } |
|---|
| 3296 | + |
|---|
| 3297 | + return key; |
|---|
| 3298 | +} |
|---|
| 3299 | + |
|---|
| 3300 | +/** |
|---|
| 3301 | + * HashMap which can use objects as keys |
|---|
| 3302 | + */ |
|---|
| 3303 | +function HashMap(array, isolatedUid) { |
|---|
| 3304 | + if (isolatedUid) { |
|---|
| 3305 | + var uid = 0; |
|---|
| 3306 | + this.nextUid = function() { |
|---|
| 3307 | + return ++uid; |
|---|
| 3308 | + }; |
|---|
| 3309 | + } |
|---|
| 3310 | + forEach(array, this.put, this); |
|---|
| 3311 | +} |
|---|
| 3312 | +HashMap.prototype = { |
|---|
| 3313 | + /** |
|---|
| 3314 | + * Store key value pair |
|---|
| 3315 | + * @param key key to store can be any type |
|---|
| 3316 | + * @param value value to store can be any type |
|---|
| 3317 | + */ |
|---|
| 3318 | + put: function(key, value) { |
|---|
| 3319 | + this[hashKey(key, this.nextUid)] = value; |
|---|
| 3320 | + }, |
|---|
| 3321 | + |
|---|
| 3322 | + /** |
|---|
| 3323 | + * @param key |
|---|
| 3324 | + * @returns {Object} the value for the key |
|---|
| 3325 | + */ |
|---|
| 3326 | + get: function(key) { |
|---|
| 3327 | + return this[hashKey(key, this.nextUid)]; |
|---|
| 3328 | + }, |
|---|
| 3329 | + |
|---|
| 3330 | + /** |
|---|
| 3331 | + * Remove the key/value pair |
|---|
| 3332 | + * @param key |
|---|
| 3333 | + */ |
|---|
| 3334 | + remove: function(key) { |
|---|
| 3335 | + var value = this[key = hashKey(key, this.nextUid)]; |
|---|
| 3336 | + delete this[key]; |
|---|
| 3337 | + return value; |
|---|
| 3338 | + } |
|---|
| 3339 | +}; |
|---|
| 3340 | + |
|---|
| 3341 | +/** |
|---|
| 3342 | + * @ngdoc function |
|---|
| 3343 | + * @module ng |
|---|
| 3344 | + * @name angular.injector |
|---|
| 3345 | + * @kind function |
|---|
| 3346 | + * |
|---|
| 3347 | + * @description |
|---|
| 3348 | + * Creates an injector object that can be used for retrieving services as well as for |
|---|
| 3349 | + * dependency injection (see {@link guide/di dependency injection}). |
|---|
| 3350 | + * |
|---|
| 3351 | + |
|---|
| 3352 | + * @param {Array.<string|Function>} modules A list of module functions or their aliases. See |
|---|
| 3353 | + * {@link angular.module}. The `ng` module must be explicitly added. |
|---|
| 3354 | + * @returns {injector} Injector object. See {@link auto.$injector $injector}. |
|---|
| 3355 | + * |
|---|
| 3356 | + * @example |
|---|
| 3357 | + * Typical usage |
|---|
| 3358 | + * ```js |
|---|
| 3359 | + * // create an injector |
|---|
| 3360 | + * var $injector = angular.injector(['ng']); |
|---|
| 3361 | + * |
|---|
| 3362 | + * // use the injector to kick off your application |
|---|
| 3363 | + * // use the type inference to auto inject arguments, or use implicit injection |
|---|
| 3364 | + * $injector.invoke(function($rootScope, $compile, $document) { |
|---|
| 3365 | + * $compile($document)($rootScope); |
|---|
| 3366 | + * $rootScope.$digest(); |
|---|
| 3367 | + * }); |
|---|
| 3368 | + * ``` |
|---|
| 3369 | + * |
|---|
| 3370 | + * Sometimes you want to get access to the injector of a currently running Angular app |
|---|
| 3371 | + * from outside Angular. Perhaps, you want to inject and compile some markup after the |
|---|
| 3372 | + * application has been bootstrapped. You can do this using the extra `injector()` added |
|---|
| 3373 | + * to JQuery/jqLite elements. See {@link angular.element}. |
|---|
| 3374 | + * |
|---|
| 3375 | + * *This is fairly rare but could be the case if a third party library is injecting the |
|---|
| 3376 | + * markup.* |
|---|
| 3377 | + * |
|---|
| 3378 | + * In the following example a new block of HTML containing a `ng-controller` |
|---|
| 3379 | + * directive is added to the end of the document body by JQuery. We then compile and link |
|---|
| 3380 | + * it into the current AngularJS scope. |
|---|
| 3381 | + * |
|---|
| 3382 | + * ```js |
|---|
| 3383 | + * var $div = $('<div ng-controller="MyCtrl">{{content.label}}</div>'); |
|---|
| 3384 | + * $(document.body).append($div); |
|---|
| 3385 | + * |
|---|
| 3386 | + * angular.element(document).injector().invoke(function($compile) { |
|---|
| 3387 | + * var scope = angular.element($div).scope(); |
|---|
| 3388 | + * $compile($div)(scope); |
|---|
| 3389 | + * }); |
|---|
| 3390 | + * ``` |
|---|
| 3391 | + */ |
|---|
| 3392 | + |
|---|
| 3393 | + |
|---|
| 3394 | +/** |
|---|
| 3395 | + * @ngdoc module |
|---|
| 3396 | + * @name auto |
|---|
| 3397 | + * @description |
|---|
| 3398 | + * |
|---|
| 3399 | + * Implicit module which gets automatically added to each {@link auto.$injector $injector}. |
|---|
| 3400 | + */ |
|---|
| 3401 | + |
|---|
| 3402 | +var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m; |
|---|
| 3403 | +var FN_ARG_SPLIT = /,/; |
|---|
| 3404 | +var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/; |
|---|
| 3405 | +var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; |
|---|
| 3406 | +var $injectorMinErr = minErr('$injector'); |
|---|
| 3407 | + |
|---|
| 3408 | +function anonFn(fn) { |
|---|
| 3409 | + // For anonymous functions, showing at the very least the function signature can help in |
|---|
| 3410 | + // debugging. |
|---|
| 3411 | + var fnText = fn.toString().replace(STRIP_COMMENTS, ''), |
|---|
| 3412 | + args = fnText.match(FN_ARGS); |
|---|
| 3413 | + if (args) { |
|---|
| 3414 | + return 'function(' + (args[1] || '').replace(/[\s\r\n]+/, ' ') + ')'; |
|---|
| 3415 | + } |
|---|
| 3416 | + return 'fn'; |
|---|
| 3417 | +} |
|---|
| 3418 | + |
|---|
| 3419 | +function annotate(fn, strictDi, name) { |
|---|
| 3420 | + var $inject, |
|---|
| 3421 | + fnText, |
|---|
| 3422 | + argDecl, |
|---|
| 3423 | + last; |
|---|
| 3424 | + |
|---|
| 3425 | + if (typeof fn === 'function') { |
|---|
| 3426 | + if (!($inject = fn.$inject)) { |
|---|
| 3427 | + $inject = []; |
|---|
| 3428 | + if (fn.length) { |
|---|
| 3429 | + if (strictDi) { |
|---|
| 3430 | + if (!isString(name) || !name) { |
|---|
| 3431 | + name = fn.name || anonFn(fn); |
|---|
| 3432 | + } |
|---|
| 3433 | + throw $injectorMinErr('strictdi', |
|---|
| 3434 | + '{0} is not using explicit annotation and cannot be invoked in strict mode', name); |
|---|
| 3435 | + } |
|---|
| 3436 | + fnText = fn.toString().replace(STRIP_COMMENTS, ''); |
|---|
| 3437 | + argDecl = fnText.match(FN_ARGS); |
|---|
| 3438 | + forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg) { |
|---|
| 3439 | + arg.replace(FN_ARG, function(all, underscore, name) { |
|---|
| 3440 | + $inject.push(name); |
|---|
| 3441 | + }); |
|---|
| 3442 | + }); |
|---|
| 3443 | + } |
|---|
| 3444 | + fn.$inject = $inject; |
|---|
| 3445 | + } |
|---|
| 3446 | + } else if (isArray(fn)) { |
|---|
| 3447 | + last = fn.length - 1; |
|---|
| 3448 | + assertArgFn(fn[last], 'fn'); |
|---|
| 3449 | + $inject = fn.slice(0, last); |
|---|
| 3450 | + } else { |
|---|
| 3451 | + assertArgFn(fn, 'fn', true); |
|---|
| 3452 | + } |
|---|
| 3453 | + return $inject; |
|---|
| 3454 | +} |
|---|
| 3455 | + |
|---|
| 3456 | +/////////////////////////////////////// |
|---|
| 3457 | + |
|---|
| 3458 | +/** |
|---|
| 3459 | + * @ngdoc service |
|---|
| 3460 | + * @name $injector |
|---|
| 3461 | + * |
|---|
| 3462 | + * @description |
|---|
| 3463 | + * |
|---|
| 3464 | + * `$injector` is used to retrieve object instances as defined by |
|---|
| 3465 | + * {@link auto.$provide provider}, instantiate types, invoke methods, |
|---|
| 3466 | + * and load modules. |
|---|
| 3467 | + * |
|---|
| 3468 | + * The following always holds true: |
|---|
| 3469 | + * |
|---|
| 3470 | + * ```js |
|---|
| 3471 | + * var $injector = angular.injector(); |
|---|
| 3472 | + * expect($injector.get('$injector')).toBe($injector); |
|---|
| 3473 | + * expect($injector.invoke(function($injector) { |
|---|
| 3474 | + * return $injector; |
|---|
| 3475 | + * })).toBe($injector); |
|---|
| 3476 | + * ``` |
|---|
| 3477 | + * |
|---|
| 3478 | + * # Injection Function Annotation |
|---|
| 3479 | + * |
|---|
| 3480 | + * JavaScript does not have annotations, and annotations are needed for dependency injection. The |
|---|
| 3481 | + * following are all valid ways of annotating function with injection arguments and are equivalent. |
|---|
| 3482 | + * |
|---|
| 3483 | + * ```js |
|---|
| 3484 | + * // inferred (only works if code not minified/obfuscated) |
|---|
| 3485 | + * $injector.invoke(function(serviceA){}); |
|---|
| 3486 | + * |
|---|
| 3487 | + * // annotated |
|---|
| 3488 | + * function explicit(serviceA) {}; |
|---|
| 3489 | + * explicit.$inject = ['serviceA']; |
|---|
| 3490 | + * $injector.invoke(explicit); |
|---|
| 3491 | + * |
|---|
| 3492 | + * // inline |
|---|
| 3493 | + * $injector.invoke(['serviceA', function(serviceA){}]); |
|---|
| 3494 | + * ``` |
|---|
| 3495 | + * |
|---|
| 3496 | + * ## Inference |
|---|
| 3497 | + * |
|---|
| 3498 | + * In JavaScript calling `toString()` on a function returns the function definition. The definition |
|---|
| 3499 | + * can then be parsed and the function arguments can be extracted. *NOTE:* This does not work with |
|---|
| 3500 | + * minification, and obfuscation tools since these tools change the argument names. |
|---|
| 3501 | + * |
|---|
| 3502 | + * ## `$inject` Annotation |
|---|
| 3503 | + * By adding an `$inject` property onto a function the injection parameters can be specified. |
|---|
| 3504 | + * |
|---|
| 3505 | + * ## Inline |
|---|
| 3506 | + * As an array of injection names, where the last item in the array is the function to call. |
|---|
| 3507 | + */ |
|---|
| 3508 | + |
|---|
| 3509 | +/** |
|---|
| 3510 | + * @ngdoc method |
|---|
| 3511 | + * @name $injector#get |
|---|
| 3512 | + * |
|---|
| 3513 | + * @description |
|---|
| 3514 | + * Return an instance of the service. |
|---|
| 3515 | + * |
|---|
| 3516 | + * @param {string} name The name of the instance to retrieve. |
|---|
| 3517 | + * @return {*} The instance. |
|---|
| 3518 | + */ |
|---|
| 3519 | + |
|---|
| 3520 | +/** |
|---|
| 3521 | + * @ngdoc method |
|---|
| 3522 | + * @name $injector#invoke |
|---|
| 3523 | + * |
|---|
| 3524 | + * @description |
|---|
| 3525 | + * Invoke the method and supply the method arguments from the `$injector`. |
|---|
| 3526 | + * |
|---|
| 3527 | + * @param {!Function} fn The function to invoke. Function parameters are injected according to the |
|---|
| 3528 | + * {@link guide/di $inject Annotation} rules. |
|---|
| 3529 | + * @param {Object=} self The `this` for the invoked method. |
|---|
| 3530 | + * @param {Object=} locals Optional object. If preset then any argument names are read from this |
|---|
| 3531 | + * object first, before the `$injector` is consulted. |
|---|
| 3532 | + * @returns {*} the value returned by the invoked `fn` function. |
|---|
| 3533 | + */ |
|---|
| 3534 | + |
|---|
| 3535 | +/** |
|---|
| 3536 | + * @ngdoc method |
|---|
| 3537 | + * @name $injector#has |
|---|
| 3538 | + * |
|---|
| 3539 | + * @description |
|---|
| 3540 | + * Allows the user to query if the particular service exists. |
|---|
| 3541 | + * |
|---|
| 3542 | + * @param {string} name Name of the service to query. |
|---|
| 3543 | + * @returns {boolean} `true` if injector has given service. |
|---|
| 3544 | + */ |
|---|
| 3545 | + |
|---|
| 3546 | +/** |
|---|
| 3547 | + * @ngdoc method |
|---|
| 3548 | + * @name $injector#instantiate |
|---|
| 3549 | + * @description |
|---|
| 3550 | + * Create a new instance of JS type. The method takes a constructor function, invokes the new |
|---|
| 3551 | + * operator, and supplies all of the arguments to the constructor function as specified by the |
|---|
| 3552 | + * constructor annotation. |
|---|
| 3553 | + * |
|---|
| 3554 | + * @param {Function} Type Annotated constructor function. |
|---|
| 3555 | + * @param {Object=} locals Optional object. If preset then any argument names are read from this |
|---|
| 3556 | + * object first, before the `$injector` is consulted. |
|---|
| 3557 | + * @returns {Object} new instance of `Type`. |
|---|
| 3558 | + */ |
|---|
| 3559 | + |
|---|
| 3560 | +/** |
|---|
| 3561 | + * @ngdoc method |
|---|
| 3562 | + * @name $injector#annotate |
|---|
| 3563 | + * |
|---|
| 3564 | + * @description |
|---|
| 3565 | + * Returns an array of service names which the function is requesting for injection. This API is |
|---|
| 3566 | + * used by the injector to determine which services need to be injected into the function when the |
|---|
| 3567 | + * function is invoked. There are three ways in which the function can be annotated with the needed |
|---|
| 3568 | + * dependencies. |
|---|
| 3569 | + * |
|---|
| 3570 | + * # Argument names |
|---|
| 3571 | + * |
|---|
| 3572 | + * The simplest form is to extract the dependencies from the arguments of the function. This is done |
|---|
| 3573 | + * by converting the function into a string using `toString()` method and extracting the argument |
|---|
| 3574 | + * names. |
|---|
| 3575 | + * ```js |
|---|
| 3576 | + * // Given |
|---|
| 3577 | + * function MyController($scope, $route) { |
|---|
| 3578 | + * // ... |
|---|
| 3579 | + * } |
|---|
| 3580 | + * |
|---|
| 3581 | + * // Then |
|---|
| 3582 | + * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']); |
|---|
| 3583 | + * ``` |
|---|
| 3584 | + * |
|---|
| 3585 | + * This method does not work with code minification / obfuscation. For this reason the following |
|---|
| 3586 | + * annotation strategies are supported. |
|---|
| 3587 | + * |
|---|
| 3588 | + * # The `$inject` property |
|---|
| 3589 | + * |
|---|
| 3590 | + * If a function has an `$inject` property and its value is an array of strings, then the strings |
|---|
| 3591 | + * represent names of services to be injected into the function. |
|---|
| 3592 | + * ```js |
|---|
| 3593 | + * // Given |
|---|
| 3594 | + * var MyController = function(obfuscatedScope, obfuscatedRoute) { |
|---|
| 3595 | + * // ... |
|---|
| 3596 | + * } |
|---|
| 3597 | + * // Define function dependencies |
|---|
| 3598 | + * MyController['$inject'] = ['$scope', '$route']; |
|---|
| 3599 | + * |
|---|
| 3600 | + * // Then |
|---|
| 3601 | + * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']); |
|---|
| 3602 | + * ``` |
|---|
| 3603 | + * |
|---|
| 3604 | + * # The array notation |
|---|
| 3605 | + * |
|---|
| 3606 | + * It is often desirable to inline Injected functions and that's when setting the `$inject` property |
|---|
| 3607 | + * is very inconvenient. In these situations using the array notation to specify the dependencies in |
|---|
| 3608 | + * a way that survives minification is a better choice: |
|---|
| 3609 | + * |
|---|
| 3610 | + * ```js |
|---|
| 3611 | + * // We wish to write this (not minification / obfuscation safe) |
|---|
| 3612 | + * injector.invoke(function($compile, $rootScope) { |
|---|
| 3613 | + * // ... |
|---|
| 3614 | + * }); |
|---|
| 3615 | + * |
|---|
| 3616 | + * // We are forced to write break inlining |
|---|
| 3617 | + * var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) { |
|---|
| 3618 | + * // ... |
|---|
| 3619 | + * }; |
|---|
| 3620 | + * tmpFn.$inject = ['$compile', '$rootScope']; |
|---|
| 3621 | + * injector.invoke(tmpFn); |
|---|
| 3622 | + * |
|---|
| 3623 | + * // To better support inline function the inline annotation is supported |
|---|
| 3624 | + * injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) { |
|---|
| 3625 | + * // ... |
|---|
| 3626 | + * }]); |
|---|
| 3627 | + * |
|---|
| 3628 | + * // Therefore |
|---|
| 3629 | + * expect(injector.annotate( |
|---|
| 3630 | + * ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}]) |
|---|
| 3631 | + * ).toEqual(['$compile', '$rootScope']); |
|---|
| 3632 | + * ``` |
|---|
| 3633 | + * |
|---|
| 3634 | + * @param {Function|Array.<string|Function>} fn Function for which dependent service names need to |
|---|
| 3635 | + * be retrieved as described above. |
|---|
| 3636 | + * |
|---|
| 3637 | + * @returns {Array.<string>} The names of the services which the function requires. |
|---|
| 3638 | + */ |
|---|
| 3639 | + |
|---|
| 3640 | + |
|---|
| 3641 | + |
|---|
| 3642 | + |
|---|
| 3643 | +/** |
|---|
| 3644 | + * @ngdoc service |
|---|
| 3645 | + * @name $provide |
|---|
| 3646 | + * |
|---|
| 3647 | + * @description |
|---|
| 3648 | + * |
|---|
| 3649 | + * The {@link auto.$provide $provide} service has a number of methods for registering components |
|---|
| 3650 | + * with the {@link auto.$injector $injector}. Many of these functions are also exposed on |
|---|
| 3651 | + * {@link angular.Module}. |
|---|
| 3652 | + * |
|---|
| 3653 | + * An Angular **service** is a singleton object created by a **service factory**. These **service |
|---|
| 3654 | + * factories** are functions which, in turn, are created by a **service provider**. |
|---|
| 3655 | + * The **service providers** are constructor functions. When instantiated they must contain a |
|---|
| 3656 | + * property called `$get`, which holds the **service factory** function. |
|---|
| 3657 | + * |
|---|
| 3658 | + * When you request a service, the {@link auto.$injector $injector} is responsible for finding the |
|---|
| 3659 | + * correct **service provider**, instantiating it and then calling its `$get` **service factory** |
|---|
| 3660 | + * function to get the instance of the **service**. |
|---|
| 3661 | + * |
|---|
| 3662 | + * Often services have no configuration options and there is no need to add methods to the service |
|---|
| 3663 | + * provider. The provider will be no more than a constructor function with a `$get` property. For |
|---|
| 3664 | + * these cases the {@link auto.$provide $provide} service has additional helper methods to register |
|---|
| 3665 | + * services without specifying a provider. |
|---|
| 3666 | + * |
|---|
| 3667 | + * * {@link auto.$provide#provider provider(provider)} - registers a **service provider** with the |
|---|
| 3668 | + * {@link auto.$injector $injector} |
|---|
| 3669 | + * * {@link auto.$provide#constant constant(obj)} - registers a value/object that can be accessed by |
|---|
| 3670 | + * providers and services. |
|---|
| 3671 | + * * {@link auto.$provide#value value(obj)} - registers a value/object that can only be accessed by |
|---|
| 3672 | + * services, not providers. |
|---|
| 3673 | + * * {@link auto.$provide#factory factory(fn)} - registers a service **factory function**, `fn`, |
|---|
| 3674 | + * that will be wrapped in a **service provider** object, whose `$get` property will contain the |
|---|
| 3675 | + * given factory function. |
|---|
| 3676 | + * * {@link auto.$provide#service service(class)} - registers a **constructor function**, `class` |
|---|
| 3677 | + * that will be wrapped in a **service provider** object, whose `$get` property will instantiate |
|---|
| 3678 | + * a new object using the given constructor function. |
|---|
| 3679 | + * |
|---|
| 3680 | + * See the individual methods for more information and examples. |
|---|
| 3681 | + */ |
|---|
| 3682 | + |
|---|
| 3683 | +/** |
|---|
| 3684 | + * @ngdoc method |
|---|
| 3685 | + * @name $provide#provider |
|---|
| 3686 | + * @description |
|---|
| 3687 | + * |
|---|
| 3688 | + * Register a **provider function** with the {@link auto.$injector $injector}. Provider functions |
|---|
| 3689 | + * are constructor functions, whose instances are responsible for "providing" a factory for a |
|---|
| 3690 | + * service. |
|---|
| 3691 | + * |
|---|
| 3692 | + * Service provider names start with the name of the service they provide followed by `Provider`. |
|---|
| 3693 | + * For example, the {@link ng.$log $log} service has a provider called |
|---|
| 3694 | + * {@link ng.$logProvider $logProvider}. |
|---|
| 3695 | + * |
|---|
| 3696 | + * Service provider objects can have additional methods which allow configuration of the provider |
|---|
| 3697 | + * and its service. Importantly, you can configure what kind of service is created by the `$get` |
|---|
| 3698 | + * method, or how that service will act. For example, the {@link ng.$logProvider $logProvider} has a |
|---|
| 3699 | + * method {@link ng.$logProvider#debugEnabled debugEnabled} |
|---|
| 3700 | + * which lets you specify whether the {@link ng.$log $log} service will log debug messages to the |
|---|
| 3701 | + * console or not. |
|---|
| 3702 | + * |
|---|
| 3703 | + * @param {string} name The name of the instance. NOTE: the provider will be available under `name + |
|---|
| 3704 | + 'Provider'` key. |
|---|
| 3705 | + * @param {(Object|function())} provider If the provider is: |
|---|
| 3706 | + * |
|---|
| 3707 | + * - `Object`: then it should have a `$get` method. The `$get` method will be invoked using |
|---|
| 3708 | + * {@link auto.$injector#invoke $injector.invoke()} when an instance needs to be created. |
|---|
| 3709 | + * - `Constructor`: a new instance of the provider will be created using |
|---|
| 3710 | + * {@link auto.$injector#instantiate $injector.instantiate()}, then treated as `object`. |
|---|
| 3711 | + * |
|---|
| 3712 | + * @returns {Object} registered provider instance |
|---|
| 3713 | + |
|---|
| 3714 | + * @example |
|---|
| 3715 | + * |
|---|
| 3716 | + * The following example shows how to create a simple event tracking service and register it using |
|---|
| 3717 | + * {@link auto.$provide#provider $provide.provider()}. |
|---|
| 3718 | + * |
|---|
| 3719 | + * ```js |
|---|
| 3720 | + * // Define the eventTracker provider |
|---|
| 3721 | + * function EventTrackerProvider() { |
|---|
| 3722 | + * var trackingUrl = '/track'; |
|---|
| 3723 | + * |
|---|
| 3724 | + * // A provider method for configuring where the tracked events should been saved |
|---|
| 3725 | + * this.setTrackingUrl = function(url) { |
|---|
| 3726 | + * trackingUrl = url; |
|---|
| 3727 | + * }; |
|---|
| 3728 | + * |
|---|
| 3729 | + * // The service factory function |
|---|
| 3730 | + * this.$get = ['$http', function($http) { |
|---|
| 3731 | + * var trackedEvents = {}; |
|---|
| 3732 | + * return { |
|---|
| 3733 | + * // Call this to track an event |
|---|
| 3734 | + * event: function(event) { |
|---|
| 3735 | + * var count = trackedEvents[event] || 0; |
|---|
| 3736 | + * count += 1; |
|---|
| 3737 | + * trackedEvents[event] = count; |
|---|
| 3738 | + * return count; |
|---|
| 3739 | + * }, |
|---|
| 3740 | + * // Call this to save the tracked events to the trackingUrl |
|---|
| 3741 | + * save: function() { |
|---|
| 3742 | + * $http.post(trackingUrl, trackedEvents); |
|---|
| 3743 | + * } |
|---|
| 3744 | + * }; |
|---|
| 3745 | + * }]; |
|---|
| 3746 | + * } |
|---|
| 3747 | + * |
|---|
| 3748 | + * describe('eventTracker', function() { |
|---|
| 3749 | + * var postSpy; |
|---|
| 3750 | + * |
|---|
| 3751 | + * beforeEach(module(function($provide) { |
|---|
| 3752 | + * // Register the eventTracker provider |
|---|
| 3753 | + * $provide.provider('eventTracker', EventTrackerProvider); |
|---|
| 3754 | + * })); |
|---|
| 3755 | + * |
|---|
| 3756 | + * beforeEach(module(function(eventTrackerProvider) { |
|---|
| 3757 | + * // Configure eventTracker provider |
|---|
| 3758 | + * eventTrackerProvider.setTrackingUrl('/custom-track'); |
|---|
| 3759 | + * })); |
|---|
| 3760 | + * |
|---|
| 3761 | + * it('tracks events', inject(function(eventTracker) { |
|---|
| 3762 | + * expect(eventTracker.event('login')).toEqual(1); |
|---|
| 3763 | + * expect(eventTracker.event('login')).toEqual(2); |
|---|
| 3764 | + * })); |
|---|
| 3765 | + * |
|---|
| 3766 | + * it('saves to the tracking url', inject(function(eventTracker, $http) { |
|---|
| 3767 | + * postSpy = spyOn($http, 'post'); |
|---|
| 3768 | + * eventTracker.event('login'); |
|---|
| 3769 | + * eventTracker.save(); |
|---|
| 3770 | + * expect(postSpy).toHaveBeenCalled(); |
|---|
| 3771 | + * expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track'); |
|---|
| 3772 | + * expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track'); |
|---|
| 3773 | + * expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 }); |
|---|
| 3774 | + * })); |
|---|
| 3775 | + * }); |
|---|
| 3776 | + * ``` |
|---|
| 3777 | + */ |
|---|
| 3778 | + |
|---|
| 3779 | +/** |
|---|
| 3780 | + * @ngdoc method |
|---|
| 3781 | + * @name $provide#factory |
|---|
| 3782 | + * @description |
|---|
| 3783 | + * |
|---|
| 3784 | + * Register a **service factory**, which will be called to return the service instance. |
|---|
| 3785 | + * This is short for registering a service where its provider consists of only a `$get` property, |
|---|
| 3786 | + * which is the given service factory function. |
|---|
| 3787 | + * You should use {@link auto.$provide#factory $provide.factory(getFn)} if you do not need to |
|---|
| 3788 | + * configure your service in a provider. |
|---|
| 3789 | + * |
|---|
| 3790 | + * @param {string} name The name of the instance. |
|---|
| 3791 | + * @param {function()} $getFn The $getFn for the instance creation. Internally this is a short hand |
|---|
| 3792 | + * for `$provide.provider(name, {$get: $getFn})`. |
|---|
| 3793 | + * @returns {Object} registered provider instance |
|---|
| 3794 | + * |
|---|
| 3795 | + * @example |
|---|
| 3796 | + * Here is an example of registering a service |
|---|
| 3797 | + * ```js |
|---|
| 3798 | + * $provide.factory('ping', ['$http', function($http) { |
|---|
| 3799 | + * return function ping() { |
|---|
| 3800 | + * return $http.send('/ping'); |
|---|
| 3801 | + * }; |
|---|
| 3802 | + * }]); |
|---|
| 3803 | + * ``` |
|---|
| 3804 | + * You would then inject and use this service like this: |
|---|
| 3805 | + * ```js |
|---|
| 3806 | + * someModule.controller('Ctrl', ['ping', function(ping) { |
|---|
| 3807 | + * ping(); |
|---|
| 3808 | + * }]); |
|---|
| 3809 | + * ``` |
|---|
| 3810 | + */ |
|---|
| 3811 | + |
|---|
| 3812 | + |
|---|
| 3813 | +/** |
|---|
| 3814 | + * @ngdoc method |
|---|
| 3815 | + * @name $provide#service |
|---|
| 3816 | + * @description |
|---|
| 3817 | + * |
|---|
| 3818 | + * Register a **service constructor**, which will be invoked with `new` to create the service |
|---|
| 3819 | + * instance. |
|---|
| 3820 | + * This is short for registering a service where its provider's `$get` property is the service |
|---|
| 3821 | + * constructor function that will be used to instantiate the service instance. |
|---|
| 3822 | + * |
|---|
| 3823 | + * You should use {@link auto.$provide#service $provide.service(class)} if you define your service |
|---|
| 3824 | + * as a type/class. |
|---|
| 3825 | + * |
|---|
| 3826 | + * @param {string} name The name of the instance. |
|---|
| 3827 | + * @param {Function} constructor A class (constructor function) that will be instantiated. |
|---|
| 3828 | + * @returns {Object} registered provider instance |
|---|
| 3829 | + * |
|---|
| 3830 | + * @example |
|---|
| 3831 | + * Here is an example of registering a service using |
|---|
| 3832 | + * {@link auto.$provide#service $provide.service(class)}. |
|---|
| 3833 | + * ```js |
|---|
| 3834 | + * var Ping = function($http) { |
|---|
| 3835 | + * this.$http = $http; |
|---|
| 3836 | + * }; |
|---|
| 3837 | + * |
|---|
| 3838 | + * Ping.$inject = ['$http']; |
|---|
| 3839 | + * |
|---|
| 3840 | + * Ping.prototype.send = function() { |
|---|
| 3841 | + * return this.$http.get('/ping'); |
|---|
| 3842 | + * }; |
|---|
| 3843 | + * $provide.service('ping', Ping); |
|---|
| 3844 | + * ``` |
|---|
| 3845 | + * You would then inject and use this service like this: |
|---|
| 3846 | + * ```js |
|---|
| 3847 | + * someModule.controller('Ctrl', ['ping', function(ping) { |
|---|
| 3848 | + * ping.send(); |
|---|
| 3849 | + * }]); |
|---|
| 3850 | + * ``` |
|---|
| 3851 | + */ |
|---|
| 3852 | + |
|---|
| 3853 | + |
|---|
| 3854 | +/** |
|---|
| 3855 | + * @ngdoc method |
|---|
| 3856 | + * @name $provide#value |
|---|
| 3857 | + * @description |
|---|
| 3858 | + * |
|---|
| 3859 | + * Register a **value service** with the {@link auto.$injector $injector}, such as a string, a |
|---|
| 3860 | + * number, an array, an object or a function. This is short for registering a service where its |
|---|
| 3861 | + * provider's `$get` property is a factory function that takes no arguments and returns the **value |
|---|
| 3862 | + * service**. |
|---|
| 3863 | + * |
|---|
| 3864 | + * Value services are similar to constant services, except that they cannot be injected into a |
|---|
| 3865 | + * module configuration function (see {@link angular.Module#config}) but they can be overridden by |
|---|
| 3866 | + * an Angular |
|---|
| 3867 | + * {@link auto.$provide#decorator decorator}. |
|---|
| 3868 | + * |
|---|
| 3869 | + * @param {string} name The name of the instance. |
|---|
| 3870 | + * @param {*} value The value. |
|---|
| 3871 | + * @returns {Object} registered provider instance |
|---|
| 3872 | + * |
|---|
| 3873 | + * @example |
|---|
| 3874 | + * Here are some examples of creating value services. |
|---|
| 3875 | + * ```js |
|---|
| 3876 | + * $provide.value('ADMIN_USER', 'admin'); |
|---|
| 3877 | + * |
|---|
| 3878 | + * $provide.value('RoleLookup', { admin: 0, writer: 1, reader: 2 }); |
|---|
| 3879 | + * |
|---|
| 3880 | + * $provide.value('halfOf', function(value) { |
|---|
| 3881 | + * return value / 2; |
|---|
| 3882 | + * }); |
|---|
| 3883 | + * ``` |
|---|
| 3884 | + */ |
|---|
| 3885 | + |
|---|
| 3886 | + |
|---|
| 3887 | +/** |
|---|
| 3888 | + * @ngdoc method |
|---|
| 3889 | + * @name $provide#constant |
|---|
| 3890 | + * @description |
|---|
| 3891 | + * |
|---|
| 3892 | + * Register a **constant service**, such as a string, a number, an array, an object or a function, |
|---|
| 3893 | + * with the {@link auto.$injector $injector}. Unlike {@link auto.$provide#value value} it can be |
|---|
| 3894 | + * injected into a module configuration function (see {@link angular.Module#config}) and it cannot |
|---|
| 3895 | + * be overridden by an Angular {@link auto.$provide#decorator decorator}. |
|---|
| 3896 | + * |
|---|
| 3897 | + * @param {string} name The name of the constant. |
|---|
| 3898 | + * @param {*} value The constant value. |
|---|
| 3899 | + * @returns {Object} registered instance |
|---|
| 3900 | + * |
|---|
| 3901 | + * @example |
|---|
| 3902 | + * Here a some examples of creating constants: |
|---|
| 3903 | + * ```js |
|---|
| 3904 | + * $provide.constant('SHARD_HEIGHT', 306); |
|---|
| 3905 | + * |
|---|
| 3906 | + * $provide.constant('MY_COLOURS', ['red', 'blue', 'grey']); |
|---|
| 3907 | + * |
|---|
| 3908 | + * $provide.constant('double', function(value) { |
|---|
| 3909 | + * return value * 2; |
|---|
| 3910 | + * }); |
|---|
| 3911 | + * ``` |
|---|
| 3912 | + */ |
|---|
| 3913 | + |
|---|
| 3914 | + |
|---|
| 3915 | +/** |
|---|
| 3916 | + * @ngdoc method |
|---|
| 3917 | + * @name $provide#decorator |
|---|
| 3918 | + * @description |
|---|
| 3919 | + * |
|---|
| 3920 | + * Register a **service decorator** with the {@link auto.$injector $injector}. A service decorator |
|---|
| 3921 | + * intercepts the creation of a service, allowing it to override or modify the behaviour of the |
|---|
| 3922 | + * service. The object returned by the decorator may be the original service, or a new service |
|---|
| 3923 | + * object which replaces or wraps and delegates to the original service. |
|---|
| 3924 | + * |
|---|
| 3925 | + * @param {string} name The name of the service to decorate. |
|---|
| 3926 | + * @param {function()} decorator This function will be invoked when the service needs to be |
|---|
| 3927 | + * instantiated and should return the decorated service instance. The function is called using |
|---|
| 3928 | + * the {@link auto.$injector#invoke injector.invoke} method and is therefore fully injectable. |
|---|
| 3929 | + * Local injection arguments: |
|---|
| 3930 | + * |
|---|
| 3931 | + * * `$delegate` - The original service instance, which can be monkey patched, configured, |
|---|
| 3932 | + * decorated or delegated to. |
|---|
| 3933 | + * |
|---|
| 3934 | + * @example |
|---|
| 3935 | + * Here we decorate the {@link ng.$log $log} service to convert warnings to errors by intercepting |
|---|
| 3936 | + * calls to {@link ng.$log#error $log.warn()}. |
|---|
| 3937 | + * ```js |
|---|
| 3938 | + * $provide.decorator('$log', ['$delegate', function($delegate) { |
|---|
| 3939 | + * $delegate.warn = $delegate.error; |
|---|
| 3940 | + * return $delegate; |
|---|
| 3941 | + * }]); |
|---|
| 3942 | + * ``` |
|---|
| 3943 | + */ |
|---|
| 3944 | + |
|---|
| 3945 | + |
|---|
| 3946 | +function createInjector(modulesToLoad, strictDi) { |
|---|
| 3947 | + strictDi = (strictDi === true); |
|---|
| 3948 | + var INSTANTIATING = {}, |
|---|
| 3949 | + providerSuffix = 'Provider', |
|---|
| 3950 | + path = [], |
|---|
| 3951 | + loadedModules = new HashMap([], true), |
|---|
| 3952 | + providerCache = { |
|---|
| 3953 | + $provide: { |
|---|
| 3954 | + provider: supportObject(provider), |
|---|
| 3955 | + factory: supportObject(factory), |
|---|
| 3956 | + service: supportObject(service), |
|---|
| 3957 | + value: supportObject(value), |
|---|
| 3958 | + constant: supportObject(constant), |
|---|
| 3959 | + decorator: decorator |
|---|
| 3960 | + } |
|---|
| 3961 | + }, |
|---|
| 3962 | + providerInjector = (providerCache.$injector = |
|---|
| 3963 | + createInternalInjector(providerCache, function() { |
|---|
| 3964 | + throw $injectorMinErr('unpr', "Unknown provider: {0}", path.join(' <- ')); |
|---|
| 3965 | + })), |
|---|
| 3966 | + instanceCache = {}, |
|---|
| 3967 | + instanceInjector = (instanceCache.$injector = |
|---|
| 3968 | + createInternalInjector(instanceCache, function(servicename) { |
|---|
| 3969 | + var provider = providerInjector.get(servicename + providerSuffix); |
|---|
| 3970 | + return instanceInjector.invoke(provider.$get, provider, undefined, servicename); |
|---|
| 3971 | + })); |
|---|
| 3972 | + |
|---|
| 3973 | + |
|---|
| 3974 | + forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop); }); |
|---|
| 3975 | + |
|---|
| 3976 | + return instanceInjector; |
|---|
| 3977 | + |
|---|
| 3978 | + //////////////////////////////////// |
|---|
| 3979 | + // $provider |
|---|
| 3980 | + //////////////////////////////////// |
|---|
| 3981 | + |
|---|
| 3982 | + function supportObject(delegate) { |
|---|
| 3983 | + return function(key, value) { |
|---|
| 3984 | + if (isObject(key)) { |
|---|
| 3985 | + forEach(key, reverseParams(delegate)); |
|---|
| 3986 | + } else { |
|---|
| 3987 | + return delegate(key, value); |
|---|
| 3988 | + } |
|---|
| 3989 | + }; |
|---|
| 3990 | + } |
|---|
| 3991 | + |
|---|
| 3992 | + function provider(name, provider_) { |
|---|
| 3993 | + assertNotHasOwnProperty(name, 'service'); |
|---|
| 3994 | + if (isFunction(provider_) || isArray(provider_)) { |
|---|
| 3995 | + provider_ = providerInjector.instantiate(provider_); |
|---|
| 3996 | + } |
|---|
| 3997 | + if (!provider_.$get) { |
|---|
| 3998 | + throw $injectorMinErr('pget', "Provider '{0}' must define $get factory method.", name); |
|---|
| 3999 | + } |
|---|
| 4000 | + return providerCache[name + providerSuffix] = provider_; |
|---|
| 4001 | + } |
|---|
| 4002 | + |
|---|
| 4003 | + function enforceReturnValue(name, factory) { |
|---|
| 4004 | + return function enforcedReturnValue() { |
|---|
| 4005 | + var result = instanceInjector.invoke(factory, this, undefined, name); |
|---|
| 4006 | + if (isUndefined(result)) { |
|---|
| 4007 | + throw $injectorMinErr('undef', "Provider '{0}' must return a value from $get factory method.", name); |
|---|
| 4008 | + } |
|---|
| 4009 | + return result; |
|---|
| 4010 | + }; |
|---|
| 4011 | + } |
|---|
| 4012 | + |
|---|
| 4013 | + function factory(name, factoryFn, enforce) { |
|---|
| 4014 | + return provider(name, { |
|---|
| 4015 | + $get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn |
|---|
| 4016 | + }); |
|---|
| 4017 | + } |
|---|
| 4018 | + |
|---|
| 4019 | + function service(name, constructor) { |
|---|
| 4020 | + return factory(name, ['$injector', function($injector) { |
|---|
| 4021 | + return $injector.instantiate(constructor); |
|---|
| 4022 | + }]); |
|---|
| 4023 | + } |
|---|
| 4024 | + |
|---|
| 4025 | + function value(name, val) { return factory(name, valueFn(val), false); } |
|---|
| 4026 | + |
|---|
| 4027 | + function constant(name, value) { |
|---|
| 4028 | + assertNotHasOwnProperty(name, 'constant'); |
|---|
| 4029 | + providerCache[name] = value; |
|---|
| 4030 | + instanceCache[name] = value; |
|---|
| 4031 | + } |
|---|
| 4032 | + |
|---|
| 4033 | + function decorator(serviceName, decorFn) { |
|---|
| 4034 | + var origProvider = providerInjector.get(serviceName + providerSuffix), |
|---|
| 4035 | + orig$get = origProvider.$get; |
|---|
| 4036 | + |
|---|
| 4037 | + origProvider.$get = function() { |
|---|
| 4038 | + var origInstance = instanceInjector.invoke(orig$get, origProvider); |
|---|
| 4039 | + return instanceInjector.invoke(decorFn, null, {$delegate: origInstance}); |
|---|
| 4040 | + }; |
|---|
| 4041 | + } |
|---|
| 4042 | + |
|---|
| 4043 | + //////////////////////////////////// |
|---|
| 4044 | + // Module Loading |
|---|
| 4045 | + //////////////////////////////////// |
|---|
| 4046 | + function loadModules(modulesToLoad){ |
|---|
| 4047 | + var runBlocks = [], moduleFn; |
|---|
| 4048 | + forEach(modulesToLoad, function(module) { |
|---|
| 4049 | + if (loadedModules.get(module)) return; |
|---|
| 4050 | + loadedModules.put(module, true); |
|---|
| 4051 | + |
|---|
| 4052 | + function runInvokeQueue(queue) { |
|---|
| 4053 | + var i, ii; |
|---|
| 4054 | + for(i = 0, ii = queue.length; i < ii; i++) { |
|---|
| 4055 | + var invokeArgs = queue[i], |
|---|
| 4056 | + provider = providerInjector.get(invokeArgs[0]); |
|---|
| 4057 | + |
|---|
| 4058 | + provider[invokeArgs[1]].apply(provider, invokeArgs[2]); |
|---|
| 4059 | + } |
|---|
| 4060 | + } |
|---|
| 4061 | + |
|---|
| 4062 | + try { |
|---|
| 4063 | + if (isString(module)) { |
|---|
| 4064 | + moduleFn = angularModule(module); |
|---|
| 4065 | + runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks); |
|---|
| 4066 | + runInvokeQueue(moduleFn._invokeQueue); |
|---|
| 4067 | + runInvokeQueue(moduleFn._configBlocks); |
|---|
| 4068 | + } else if (isFunction(module)) { |
|---|
| 4069 | + runBlocks.push(providerInjector.invoke(module)); |
|---|
| 4070 | + } else if (isArray(module)) { |
|---|
| 4071 | + runBlocks.push(providerInjector.invoke(module)); |
|---|
| 4072 | + } else { |
|---|
| 4073 | + assertArgFn(module, 'module'); |
|---|
| 4074 | + } |
|---|
| 4075 | + } catch (e) { |
|---|
| 4076 | + if (isArray(module)) { |
|---|
| 4077 | + module = module[module.length - 1]; |
|---|
| 4078 | + } |
|---|
| 4079 | + if (e.message && e.stack && e.stack.indexOf(e.message) == -1) { |
|---|
| 4080 | + // Safari & FF's stack traces don't contain error.message content |
|---|
| 4081 | + // unlike those of Chrome and IE |
|---|
| 4082 | + // So if stack doesn't contain message, we create a new string that contains both. |
|---|
| 4083 | + // Since error.stack is read-only in Safari, I'm overriding e and not e.stack here. |
|---|
| 4084 | + /* jshint -W022 */ |
|---|
| 4085 | + e = e.message + '\n' + e.stack; |
|---|
| 4086 | + } |
|---|
| 4087 | + throw $injectorMinErr('modulerr', "Failed to instantiate module {0} due to:\n{1}", |
|---|
| 4088 | + module, e.stack || e.message || e); |
|---|
| 4089 | + } |
|---|
| 4090 | + }); |
|---|
| 4091 | + return runBlocks; |
|---|
| 4092 | + } |
|---|
| 4093 | + |
|---|
| 4094 | + //////////////////////////////////// |
|---|
| 4095 | + // internal Injector |
|---|
| 4096 | + //////////////////////////////////// |
|---|
| 4097 | + |
|---|
| 4098 | + function createInternalInjector(cache, factory) { |
|---|
| 4099 | + |
|---|
| 4100 | + function getService(serviceName) { |
|---|
| 4101 | + if (cache.hasOwnProperty(serviceName)) { |
|---|
| 4102 | + if (cache[serviceName] === INSTANTIATING) { |
|---|
| 4103 | + throw $injectorMinErr('cdep', 'Circular dependency found: {0}', |
|---|
| 4104 | + serviceName + ' <- ' + path.join(' <- ')); |
|---|
| 4105 | + } |
|---|
| 4106 | + return cache[serviceName]; |
|---|
| 4107 | + } else { |
|---|
| 4108 | + try { |
|---|
| 4109 | + path.unshift(serviceName); |
|---|
| 4110 | + cache[serviceName] = INSTANTIATING; |
|---|
| 4111 | + return cache[serviceName] = factory(serviceName); |
|---|
| 4112 | + } catch (err) { |
|---|
| 4113 | + if (cache[serviceName] === INSTANTIATING) { |
|---|
| 4114 | + delete cache[serviceName]; |
|---|
| 4115 | + } |
|---|
| 4116 | + throw err; |
|---|
| 4117 | + } finally { |
|---|
| 4118 | + path.shift(); |
|---|
| 4119 | + } |
|---|
| 4120 | + } |
|---|
| 4121 | + } |
|---|
| 4122 | + |
|---|
| 4123 | + function invoke(fn, self, locals, serviceName) { |
|---|
| 4124 | + if (typeof locals === 'string') { |
|---|
| 4125 | + serviceName = locals; |
|---|
| 4126 | + locals = null; |
|---|
| 4127 | + } |
|---|
| 4128 | + |
|---|
| 4129 | + var args = [], |
|---|
| 4130 | + $inject = annotate(fn, strictDi, serviceName), |
|---|
| 4131 | + length, i, |
|---|
| 4132 | + key; |
|---|
| 4133 | + |
|---|
| 4134 | + for(i = 0, length = $inject.length; i < length; i++) { |
|---|
| 4135 | + key = $inject[i]; |
|---|
| 4136 | + if (typeof key !== 'string') { |
|---|
| 4137 | + throw $injectorMinErr('itkn', |
|---|
| 4138 | + 'Incorrect injection token! Expected service name as string, got {0}', key); |
|---|
| 4139 | + } |
|---|
| 4140 | + args.push( |
|---|
| 4141 | + locals && locals.hasOwnProperty(key) |
|---|
| 4142 | + ? locals[key] |
|---|
| 4143 | + : getService(key) |
|---|
| 4144 | + ); |
|---|
| 4145 | + } |
|---|
| 4146 | + if (isArray(fn)) { |
|---|
| 4147 | + fn = fn[length]; |
|---|
| 4148 | + } |
|---|
| 4149 | + |
|---|
| 4150 | + // http://jsperf.com/angularjs-invoke-apply-vs-switch |
|---|
| 4151 | + // #5388 |
|---|
| 4152 | + return fn.apply(self, args); |
|---|
| 4153 | + } |
|---|
| 4154 | + |
|---|
| 4155 | + function instantiate(Type, locals, serviceName) { |
|---|
| 4156 | + var Constructor = function() {}, |
|---|
| 4157 | + instance, returnedValue; |
|---|
| 4158 | + |
|---|
| 4159 | + // Check if Type is annotated and use just the given function at n-1 as parameter |
|---|
| 4160 | + // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]); |
|---|
| 4161 | + Constructor.prototype = (isArray(Type) ? Type[Type.length - 1] : Type).prototype; |
|---|
| 4162 | + instance = new Constructor(); |
|---|
| 4163 | + returnedValue = invoke(Type, instance, locals, serviceName); |
|---|
| 4164 | + |
|---|
| 4165 | + return isObject(returnedValue) || isFunction(returnedValue) ? returnedValue : instance; |
|---|
| 4166 | + } |
|---|
| 4167 | + |
|---|
| 4168 | + return { |
|---|
| 4169 | + invoke: invoke, |
|---|
| 4170 | + instantiate: instantiate, |
|---|
| 4171 | + get: getService, |
|---|
| 4172 | + annotate: annotate, |
|---|
| 4173 | + has: function(name) { |
|---|
| 4174 | + return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name); |
|---|
| 4175 | + } |
|---|
| 4176 | + }; |
|---|
| 4177 | + } |
|---|
| 4178 | +} |
|---|
| 4179 | + |
|---|
| 4180 | +createInjector.$$annotate = annotate; |
|---|
| 4181 | + |
|---|
| 4182 | +/** |
|---|
| 4183 | + * @ngdoc provider |
|---|
| 4184 | + * @name $anchorScrollProvider |
|---|
| 4185 | + * |
|---|
| 4186 | + * @description |
|---|
| 4187 | + * Use `$anchorScrollProvider` to disable automatic scrolling whenever |
|---|
| 4188 | + * {@link ng.$location#hash $location.hash()} changes. |
|---|
| 4189 | + */ |
|---|
| 4190 | +function $AnchorScrollProvider() { |
|---|
| 4191 | + |
|---|
| 4192 | + var autoScrollingEnabled = true; |
|---|
| 4193 | + |
|---|
| 4194 | + /** |
|---|
| 4195 | + * @ngdoc method |
|---|
| 4196 | + * @name $anchorScrollProvider#disableAutoScrolling |
|---|
| 4197 | + * |
|---|
| 4198 | + * @description |
|---|
| 4199 | + * By default, {@link ng.$anchorScroll $anchorScroll()} will automatically will detect changes to |
|---|
| 4200 | + * {@link ng.$location#hash $location.hash()} and scroll to the element matching the new hash.<br /> |
|---|
| 4201 | + * Use this method to disable automatic scrolling. |
|---|
| 4202 | + * |
|---|
| 4203 | + * If automatic scrolling is disabled, one must explicitly call |
|---|
| 4204 | + * {@link ng.$anchorScroll $anchorScroll()} in order to scroll to the element related to the |
|---|
| 4205 | + * current hash. |
|---|
| 4206 | + */ |
|---|
| 4207 | + this.disableAutoScrolling = function() { |
|---|
| 4208 | + autoScrollingEnabled = false; |
|---|
| 4209 | + }; |
|---|
| 4210 | + |
|---|
| 4211 | + /** |
|---|
| 4212 | + * @ngdoc service |
|---|
| 4213 | + * @name $anchorScroll |
|---|
| 4214 | + * @kind function |
|---|
| 4215 | + * @requires $window |
|---|
| 4216 | + * @requires $location |
|---|
| 4217 | + * @requires $rootScope |
|---|
| 4218 | + * |
|---|
| 4219 | + * @description |
|---|
| 4220 | + * When called, it checks the current value of {@link ng.$location#hash $location.hash()} and |
|---|
| 4221 | + * scrolls to the related element, according to the rules specified in the |
|---|
| 4222 | + * [Html5 spec](http://dev.w3.org/html5/spec/Overview.html#the-indicated-part-of-the-document). |
|---|
| 4223 | + * |
|---|
| 4224 | + * It also watches the {@link ng.$location#hash $location.hash()} and automatically scrolls to |
|---|
| 4225 | + * match any anchor whenever it changes. This can be disabled by calling |
|---|
| 4226 | + * {@link ng.$anchorScrollProvider#disableAutoScrolling $anchorScrollProvider.disableAutoScrolling()}. |
|---|
| 4227 | + * |
|---|
| 4228 | + * Additionally, you can use its {@link ng.$anchorScroll#yOffset yOffset} property to specify a |
|---|
| 4229 | + * vertical scroll-offset (either fixed or dynamic). |
|---|
| 4230 | + * |
|---|
| 4231 | + * @property {(number|function|jqLite)} yOffset |
|---|
| 4232 | + * If set, specifies a vertical scroll-offset. This is often useful when there are fixed |
|---|
| 4233 | + * positioned elements at the top of the page, such as navbars, headers etc. |
|---|
| 4234 | + * |
|---|
| 4235 | + * `yOffset` can be specified in various ways: |
|---|
| 4236 | + * - **number**: A fixed number of pixels to be used as offset.<br /><br /> |
|---|
| 4237 | + * - **function**: A getter function called everytime `$anchorScroll()` is executed. Must return |
|---|
| 4238 | + * a number representing the offset (in pixels).<br /><br /> |
|---|
| 4239 | + * - **jqLite**: A jqLite/jQuery element to be used for specifying the offset. The distance from |
|---|
| 4240 | + * the top of the page to the element's bottom will be used as offset.<br /> |
|---|
| 4241 | + * **Note**: The element will be taken into account only as long as its `position` is set to |
|---|
| 4242 | + * `fixed`. This option is useful, when dealing with responsive navbars/headers that adjust |
|---|
| 4243 | + * their height and/or positioning according to the viewport's size. |
|---|
| 4244 | + * |
|---|
| 4245 | + * <br /> |
|---|
| 4246 | + * <div class="alert alert-warning"> |
|---|
| 4247 | + * In order for `yOffset` to work properly, scrolling should take place on the document's root and |
|---|
| 4248 | + * not some child element. |
|---|
| 4249 | + * </div> |
|---|
| 4250 | + * |
|---|
| 4251 | + * @example |
|---|
| 4252 | + <example module="anchorScrollExample"> |
|---|
| 4253 | + <file name="index.html"> |
|---|
| 4254 | + <div id="scrollArea" ng-controller="ScrollController"> |
|---|
| 4255 | + <a ng-click="gotoBottom()">Go to bottom</a> |
|---|
| 4256 | + <a id="bottom"></a> You're at the bottom! |
|---|
| 4257 | + </div> |
|---|
| 4258 | + </file> |
|---|
| 4259 | + <file name="script.js"> |
|---|
| 4260 | + angular.module('anchorScrollExample', []) |
|---|
| 4261 | + .controller('ScrollController', ['$scope', '$location', '$anchorScroll', |
|---|
| 4262 | + function ($scope, $location, $anchorScroll) { |
|---|
| 4263 | + $scope.gotoBottom = function() { |
|---|
| 4264 | + // set the location.hash to the id of |
|---|
| 4265 | + // the element you wish to scroll to. |
|---|
| 4266 | + $location.hash('bottom'); |
|---|
| 4267 | + |
|---|
| 4268 | + // call $anchorScroll() |
|---|
| 4269 | + $anchorScroll(); |
|---|
| 4270 | + }; |
|---|
| 4271 | + }]); |
|---|
| 4272 | + </file> |
|---|
| 4273 | + <file name="style.css"> |
|---|
| 4274 | + #scrollArea { |
|---|
| 4275 | + height: 280px; |
|---|
| 4276 | + overflow: auto; |
|---|
| 4277 | + } |
|---|
| 4278 | + |
|---|
| 4279 | + #bottom { |
|---|
| 4280 | + display: block; |
|---|
| 4281 | + margin-top: 2000px; |
|---|
| 4282 | + } |
|---|
| 4283 | + </file> |
|---|
| 4284 | + </example> |
|---|
| 4285 | + * |
|---|
| 4286 | + * <hr /> |
|---|
| 4287 | + * The example below illustrates the use of a vertical scroll-offset (specified as a fixed value). |
|---|
| 4288 | + * See {@link ng.$anchorScroll#yOffset $anchorScroll.yOffset} for more details. |
|---|
| 4289 | + * |
|---|
| 4290 | + * @example |
|---|
| 4291 | + <example module="anchorScrollOffsetExample"> |
|---|
| 4292 | + <file name="index.html"> |
|---|
| 4293 | + <div class="fixed-header" ng-controller="headerCtrl"> |
|---|
| 4294 | + <a href="" ng-click="gotoAnchor(x)" ng-repeat="x in [1,2,3,4,5]"> |
|---|
| 4295 | + Go to anchor {{x}} |
|---|
| 4296 | + </a> |
|---|
| 4297 | + </div> |
|---|
| 4298 | + <div id="anchor{{x}}" class="anchor" ng-repeat="x in [1,2,3,4,5]"> |
|---|
| 4299 | + Anchor {{x}} of 5 |
|---|
| 4300 | + </div> |
|---|
| 4301 | + </file> |
|---|
| 4302 | + <file name="script.js"> |
|---|
| 4303 | + angular.module('anchorScrollOffsetExample', []) |
|---|
| 4304 | + .run(['$anchorScroll', function($anchorScroll) { |
|---|
| 4305 | + $anchorScroll.yOffset = 50; // always scroll by 50 extra pixels |
|---|
| 4306 | + }]) |
|---|
| 4307 | + .controller('headerCtrl', ['$anchorScroll', '$location', '$scope', |
|---|
| 4308 | + function ($anchorScroll, $location, $scope) { |
|---|
| 4309 | + $scope.gotoAnchor = function(x) { |
|---|
| 4310 | + var newHash = 'anchor' + x; |
|---|
| 4311 | + if ($location.hash() !== newHash) { |
|---|
| 4312 | + // set the $location.hash to `newHash` and |
|---|
| 4313 | + // $anchorScroll will automatically scroll to it |
|---|
| 4314 | + $location.hash('anchor' + x); |
|---|
| 4315 | + } else { |
|---|
| 4316 | + // call $anchorScroll() explicitly, |
|---|
| 4317 | + // since $location.hash hasn't changed |
|---|
| 4318 | + $anchorScroll(); |
|---|
| 4319 | + } |
|---|
| 4320 | + }; |
|---|
| 4321 | + } |
|---|
| 4322 | + ]); |
|---|
| 4323 | + </file> |
|---|
| 4324 | + <file name="style.css"> |
|---|
| 4325 | + body { |
|---|
| 4326 | + padding-top: 50px; |
|---|
| 4327 | + } |
|---|
| 4328 | + |
|---|
| 4329 | + .anchor { |
|---|
| 4330 | + border: 2px dashed DarkOrchid; |
|---|
| 4331 | + padding: 10px 10px 200px 10px; |
|---|
| 4332 | + } |
|---|
| 4333 | + |
|---|
| 4334 | + .fixed-header { |
|---|
| 4335 | + background-color: rgba(0, 0, 0, 0.2); |
|---|
| 4336 | + height: 50px; |
|---|
| 4337 | + position: fixed; |
|---|
| 4338 | + top: 0; left: 0; right: 0; |
|---|
| 4339 | + } |
|---|
| 4340 | + |
|---|
| 4341 | + .fixed-header > a { |
|---|
| 4342 | + display: inline-block; |
|---|
| 4343 | + margin: 5px 15px; |
|---|
| 4344 | + } |
|---|
| 4345 | + </file> |
|---|
| 4346 | + </example> |
|---|
| 4347 | + */ |
|---|
| 4348 | + this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) { |
|---|
| 4349 | + var document = $window.document; |
|---|
| 4350 | + var scrollScheduled = false; |
|---|
| 4351 | + |
|---|
| 4352 | + // Helper function to get first anchor from a NodeList |
|---|
| 4353 | + // (using `Array#some()` instead of `angular#forEach()` since it's more performant |
|---|
| 4354 | + // and working in all supported browsers.) |
|---|
| 4355 | + function getFirstAnchor(list) { |
|---|
| 4356 | + var result = null; |
|---|
| 4357 | + Array.prototype.some.call(list, function(element) { |
|---|
| 4358 | + if (nodeName_(element) === 'a') { |
|---|
| 4359 | + result = element; |
|---|
| 4360 | + return true; |
|---|
| 4361 | + } |
|---|
| 4362 | + }); |
|---|
| 4363 | + return result; |
|---|
| 4364 | + } |
|---|
| 4365 | + |
|---|
| 4366 | + function getYOffset() { |
|---|
| 4367 | + |
|---|
| 4368 | + var offset = scroll.yOffset; |
|---|
| 4369 | + |
|---|
| 4370 | + if (isFunction(offset)) { |
|---|
| 4371 | + offset = offset(); |
|---|
| 4372 | + } else if (isElement(offset)) { |
|---|
| 4373 | + var elem = offset[0]; |
|---|
| 4374 | + var style = $window.getComputedStyle(elem); |
|---|
| 4375 | + if (style.position !== 'fixed') { |
|---|
| 4376 | + offset = 0; |
|---|
| 4377 | + } else { |
|---|
| 4378 | + offset = elem.getBoundingClientRect().bottom; |
|---|
| 4379 | + } |
|---|
| 4380 | + } else if (!isNumber(offset)) { |
|---|
| 4381 | + offset = 0; |
|---|
| 4382 | + } |
|---|
| 4383 | + |
|---|
| 4384 | + return offset; |
|---|
| 4385 | + } |
|---|
| 4386 | + |
|---|
| 4387 | + function scrollTo(elem) { |
|---|
| 4388 | + if (elem) { |
|---|
| 4389 | + elem.scrollIntoView(); |
|---|
| 4390 | + |
|---|
| 4391 | + var offset = getYOffset(); |
|---|
| 4392 | + |
|---|
| 4393 | + if (offset) { |
|---|
| 4394 | + // `offset` is the number of pixels we should scroll UP in order to align `elem` properly. |
|---|
| 4395 | + // This is true ONLY if the call to `elem.scrollIntoView()` initially aligns `elem` at the |
|---|
| 4396 | + // top of the viewport. |
|---|
| 4397 | + // |
|---|
| 4398 | + // IF the number of pixels from the top of `elem` to the end of the page's content is less |
|---|
| 4399 | + // than the height of the viewport, then `elem.scrollIntoView()` will align the `elem` some |
|---|
| 4400 | + // way down the page. |
|---|
| 4401 | + // |
|---|
| 4402 | + // This is often the case for elements near the bottom of the page. |
|---|
| 4403 | + // |
|---|
| 4404 | + // In such cases we do not need to scroll the whole `offset` up, just the difference between |
|---|
| 4405 | + // the top of the element and the offset, which is enough to align the top of `elem` at the |
|---|
| 4406 | + // desired position. |
|---|
| 4407 | + var elemTop = elem.getBoundingClientRect().top; |
|---|
| 4408 | + $window.scrollBy(0, elemTop - offset); |
|---|
| 4409 | + } |
|---|
| 4410 | + } else { |
|---|
| 4411 | + $window.scrollTo(0, 0); |
|---|
| 4412 | + } |
|---|
| 4413 | + } |
|---|
| 4414 | + |
|---|
| 4415 | + function scroll() { |
|---|
| 4416 | + var hash = $location.hash(), elm; |
|---|
| 4417 | + |
|---|
| 4418 | + // empty hash, scroll to the top of the page |
|---|
| 4419 | + if (!hash) scrollTo(null); |
|---|
| 4420 | + |
|---|
| 4421 | + // element with given id |
|---|
| 4422 | + else if ((elm = document.getElementById(hash))) scrollTo(elm); |
|---|
| 4423 | + |
|---|
| 4424 | + // first anchor with given name :-D |
|---|
| 4425 | + else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) scrollTo(elm); |
|---|
| 4426 | + |
|---|
| 4427 | + // no element and hash == 'top', scroll to the top of the page |
|---|
| 4428 | + else if (hash === 'top') scrollTo(null); |
|---|
| 4429 | + } |
|---|
| 4430 | + |
|---|
| 4431 | + // does not scroll when user clicks on anchor link that is currently on |
|---|
| 4432 | + // (no url change, no $location.hash() change), browser native does scroll |
|---|
| 4433 | + if (autoScrollingEnabled) { |
|---|
| 4434 | + $rootScope.$watch(function autoScrollWatch() {return $location.hash();}, |
|---|
| 4435 | + function autoScrollWatchAction(newVal, oldVal) { |
|---|
| 4436 | + // skip the initial scroll if $location.hash is empty |
|---|
| 4437 | + if (newVal === oldVal && newVal === '') return; |
|---|
| 4438 | + |
|---|
| 4439 | + jqLiteDocumentLoaded(function() { |
|---|
| 4440 | + $rootScope.$evalAsync(scroll); |
|---|
| 4441 | + }); |
|---|
| 4442 | + }); |
|---|
| 4443 | + } |
|---|
| 4444 | + |
|---|
| 4445 | + return scroll; |
|---|
| 4446 | + }]; |
|---|
| 4447 | +} |
|---|
| 4448 | + |
|---|
| 4449 | +var $animateMinErr = minErr('$animate'); |
|---|
| 4450 | + |
|---|
| 4451 | +/** |
|---|
| 4452 | + * @ngdoc provider |
|---|
| 4453 | + * @name $animateProvider |
|---|
| 4454 | + * |
|---|
| 4455 | + * @description |
|---|
| 4456 | + * Default implementation of $animate that doesn't perform any animations, instead just |
|---|
| 4457 | + * synchronously performs DOM |
|---|
| 4458 | + * updates and calls done() callbacks. |
|---|
| 4459 | + * |
|---|
| 4460 | + * In order to enable animations the ngAnimate module has to be loaded. |
|---|
| 4461 | + * |
|---|
| 4462 | + * To see the functional implementation check out src/ngAnimate/animate.js |
|---|
| 4463 | + */ |
|---|
| 4464 | +var $AnimateProvider = ['$provide', function($provide) { |
|---|
| 4465 | + |
|---|
| 4466 | + |
|---|
| 4467 | + this.$$selectors = {}; |
|---|
| 4468 | + |
|---|
| 4469 | + |
|---|
| 4470 | + /** |
|---|
| 4471 | + * @ngdoc method |
|---|
| 4472 | + * @name $animateProvider#register |
|---|
| 4473 | + * |
|---|
| 4474 | + * @description |
|---|
| 4475 | + * Registers a new injectable animation factory function. The factory function produces the |
|---|
| 4476 | + * animation object which contains callback functions for each event that is expected to be |
|---|
| 4477 | + * animated. |
|---|
| 4478 | + * |
|---|
| 4479 | + * * `eventFn`: `function(Element, doneFunction)` The element to animate, the `doneFunction` |
|---|
| 4480 | + * must be called once the element animation is complete. If a function is returned then the |
|---|
| 4481 | + * animation service will use this function to cancel the animation whenever a cancel event is |
|---|
| 4482 | + * triggered. |
|---|
| 4483 | + * |
|---|
| 4484 | + * |
|---|
| 4485 | + * ```js |
|---|
| 4486 | + * return { |
|---|
| 4487 | + * eventFn : function(element, done) { |
|---|
| 4488 | + * //code to run the animation |
|---|
| 4489 | + * //once complete, then run done() |
|---|
| 4490 | + * return function cancellationFunction() { |
|---|
| 4491 | + * //code to cancel the animation |
|---|
| 4492 | + * } |
|---|
| 4493 | + * } |
|---|
| 4494 | + * } |
|---|
| 4495 | + * ``` |
|---|
| 4496 | + * |
|---|
| 4497 | + * @param {string} name The name of the animation. |
|---|
| 4498 | + * @param {Function} factory The factory function that will be executed to return the animation |
|---|
| 4499 | + * object. |
|---|
| 4500 | + */ |
|---|
| 4501 | + this.register = function(name, factory) { |
|---|
| 4502 | + var key = name + '-animation'; |
|---|
| 4503 | + if (name && name.charAt(0) != '.') throw $animateMinErr('notcsel', |
|---|
| 4504 | + "Expecting class selector starting with '.' got '{0}'.", name); |
|---|
| 4505 | + this.$$selectors[name.substr(1)] = key; |
|---|
| 4506 | + $provide.factory(key, factory); |
|---|
| 4507 | + }; |
|---|
| 4508 | + |
|---|
| 4509 | + /** |
|---|
| 4510 | + * @ngdoc method |
|---|
| 4511 | + * @name $animateProvider#classNameFilter |
|---|
| 4512 | + * |
|---|
| 4513 | + * @description |
|---|
| 4514 | + * Sets and/or returns the CSS class regular expression that is checked when performing |
|---|
| 4515 | + * an animation. Upon bootstrap the classNameFilter value is not set at all and will |
|---|
| 4516 | + * therefore enable $animate to attempt to perform an animation on any element. |
|---|
| 4517 | + * When setting the classNameFilter value, animations will only be performed on elements |
|---|
| 4518 | + * that successfully match the filter expression. This in turn can boost performance |
|---|
| 4519 | + * for low-powered devices as well as applications containing a lot of structural operations. |
|---|
| 4520 | + * @param {RegExp=} expression The className expression which will be checked against all animations |
|---|
| 4521 | + * @return {RegExp} The current CSS className expression value. If null then there is no expression value |
|---|
| 4522 | + */ |
|---|
| 4523 | + this.classNameFilter = function(expression) { |
|---|
| 4524 | + if(arguments.length === 1) { |
|---|
| 4525 | + this.$$classNameFilter = (expression instanceof RegExp) ? expression : null; |
|---|
| 4526 | + } |
|---|
| 4527 | + return this.$$classNameFilter; |
|---|
| 4528 | + }; |
|---|
| 4529 | + |
|---|
| 4530 | + this.$get = ['$$q', '$$asyncCallback', '$rootScope', function($$q, $$asyncCallback, $rootScope) { |
|---|
| 4531 | + |
|---|
| 4532 | + var currentDefer; |
|---|
| 4533 | + |
|---|
| 4534 | + function runAnimationPostDigest(fn) { |
|---|
| 4535 | + var cancelFn, defer = $$q.defer(); |
|---|
| 4536 | + defer.promise.$$cancelFn = function ngAnimateMaybeCancel() { |
|---|
| 4537 | + cancelFn && cancelFn(); |
|---|
| 4538 | + }; |
|---|
| 4539 | + |
|---|
| 4540 | + $rootScope.$$postDigest(function ngAnimatePostDigest() { |
|---|
| 4541 | + cancelFn = fn(function ngAnimateNotifyComplete() { |
|---|
| 4542 | + defer.resolve(); |
|---|
| 4543 | + }); |
|---|
| 4544 | + }); |
|---|
| 4545 | + |
|---|
| 4546 | + return defer.promise; |
|---|
| 4547 | + } |
|---|
| 4548 | + |
|---|
| 4549 | + function resolveElementClasses(element, classes) { |
|---|
| 4550 | + var toAdd = [], toRemove = []; |
|---|
| 4551 | + |
|---|
| 4552 | + var hasClasses = createMap(); |
|---|
| 4553 | + forEach((element.attr('class') || '').split(/\s+/), function(className) { |
|---|
| 4554 | + hasClasses[className] = true; |
|---|
| 4555 | + }); |
|---|
| 4556 | + |
|---|
| 4557 | + forEach(classes, function(status, className) { |
|---|
| 4558 | + var hasClass = hasClasses[className]; |
|---|
| 4559 | + |
|---|
| 4560 | + // If the most recent class manipulation (via $animate) was to remove the class, and the |
|---|
| 4561 | + // element currently has the class, the class is scheduled for removal. Otherwise, if |
|---|
| 4562 | + // the most recent class manipulation (via $animate) was to add the class, and the |
|---|
| 4563 | + // element does not currently have the class, the class is scheduled to be added. |
|---|
| 4564 | + if (status === false && hasClass) { |
|---|
| 4565 | + toRemove.push(className); |
|---|
| 4566 | + } else if (status === true && !hasClass) { |
|---|
| 4567 | + toAdd.push(className); |
|---|
| 4568 | + } |
|---|
| 4569 | + }); |
|---|
| 4570 | + |
|---|
| 4571 | + return (toAdd.length + toRemove.length) > 0 && |
|---|
| 4572 | + [toAdd.length ? toAdd : null, toRemove.length ? toRemove : null]; |
|---|
| 4573 | + } |
|---|
| 4574 | + |
|---|
| 4575 | + function cachedClassManipulation(cache, classes, op) { |
|---|
| 4576 | + for (var i=0, ii = classes.length; i < ii; ++i) { |
|---|
| 4577 | + var className = classes[i]; |
|---|
| 4578 | + cache[className] = op; |
|---|
| 4579 | + } |
|---|
| 4580 | + } |
|---|
| 4581 | + |
|---|
| 4582 | + function asyncPromise() { |
|---|
| 4583 | + // only serve one instance of a promise in order to save CPU cycles |
|---|
| 4584 | + if (!currentDefer) { |
|---|
| 4585 | + currentDefer = $$q.defer(); |
|---|
| 4586 | + $$asyncCallback(function() { |
|---|
| 4587 | + currentDefer.resolve(); |
|---|
| 4588 | + currentDefer = null; |
|---|
| 4589 | + }); |
|---|
| 4590 | + } |
|---|
| 4591 | + return currentDefer.promise; |
|---|
| 4592 | + } |
|---|
| 4593 | + |
|---|
| 4594 | + function applyStyles(element, options) { |
|---|
| 4595 | + if (angular.isObject(options)) { |
|---|
| 4596 | + var styles = extend(options.from || {}, options.to || {}); |
|---|
| 4597 | + element.css(styles); |
|---|
| 4598 | + } |
|---|
| 4599 | + } |
|---|
| 4600 | + |
|---|
| 4601 | + /** |
|---|
| 4602 | + * |
|---|
| 4603 | + * @ngdoc service |
|---|
| 4604 | + * @name $animate |
|---|
| 4605 | + * @description The $animate service provides rudimentary DOM manipulation functions to |
|---|
| 4606 | + * insert, remove and move elements within the DOM, as well as adding and removing classes. |
|---|
| 4607 | + * This service is the core service used by the ngAnimate $animator service which provides |
|---|
| 4608 | + * high-level animation hooks for CSS and JavaScript. |
|---|
| 4609 | + * |
|---|
| 4610 | + * $animate is available in the AngularJS core, however, the ngAnimate module must be included |
|---|
| 4611 | + * to enable full out animation support. Otherwise, $animate will only perform simple DOM |
|---|
| 4612 | + * manipulation operations. |
|---|
| 4613 | + * |
|---|
| 4614 | + * To learn more about enabling animation support, click here to visit the {@link ngAnimate |
|---|
| 4615 | + * ngAnimate module page} as well as the {@link ngAnimate.$animate ngAnimate $animate service |
|---|
| 4616 | + * page}. |
|---|
| 4617 | + */ |
|---|
| 4618 | + return { |
|---|
| 4619 | + animate : function(element, from, to) { |
|---|
| 4620 | + applyStyles(element, { from: from, to: to }); |
|---|
| 4621 | + return asyncPromise(); |
|---|
| 4622 | + }, |
|---|
| 4623 | + |
|---|
| 4624 | + /** |
|---|
| 4625 | + * |
|---|
| 4626 | + * @ngdoc method |
|---|
| 4627 | + * @name $animate#enter |
|---|
| 4628 | + * @kind function |
|---|
| 4629 | + * @description Inserts the element into the DOM either after the `after` element or |
|---|
| 4630 | + * as the first child within the `parent` element. When the function is called a promise |
|---|
| 4631 | + * is returned that will be resolved at a later time. |
|---|
| 4632 | + * @param {DOMElement} element the element which will be inserted into the DOM |
|---|
| 4633 | + * @param {DOMElement} parent the parent element which will append the element as |
|---|
| 4634 | + * a child (if the after element is not present) |
|---|
| 4635 | + * @param {DOMElement} after the sibling element which will append the element |
|---|
| 4636 | + * after itself |
|---|
| 4637 | + * @param {object=} options an optional collection of styles that will be applied to the element. |
|---|
| 4638 | + * @return {Promise} the animation callback promise |
|---|
| 4639 | + */ |
|---|
| 4640 | + enter : function(element, parent, after, options) { |
|---|
| 4641 | + applyStyles(element, options); |
|---|
| 4642 | + after ? after.after(element) |
|---|
| 4643 | + : parent.prepend(element); |
|---|
| 4644 | + return asyncPromise(); |
|---|
| 4645 | + }, |
|---|
| 4646 | + |
|---|
| 4647 | + /** |
|---|
| 4648 | + * |
|---|
| 4649 | + * @ngdoc method |
|---|
| 4650 | + * @name $animate#leave |
|---|
| 4651 | + * @kind function |
|---|
| 4652 | + * @description Removes the element from the DOM. When the function is called a promise |
|---|
| 4653 | + * is returned that will be resolved at a later time. |
|---|
| 4654 | + * @param {DOMElement} element the element which will be removed from the DOM |
|---|
| 4655 | + * @param {object=} options an optional collection of options that will be applied to the element. |
|---|
| 4656 | + * @return {Promise} the animation callback promise |
|---|
| 4657 | + */ |
|---|
| 4658 | + leave : function(element, options) { |
|---|
| 4659 | + element.remove(); |
|---|
| 4660 | + return asyncPromise(); |
|---|
| 4661 | + }, |
|---|
| 4662 | + |
|---|
| 4663 | + /** |
|---|
| 4664 | + * |
|---|
| 4665 | + * @ngdoc method |
|---|
| 4666 | + * @name $animate#move |
|---|
| 4667 | + * @kind function |
|---|
| 4668 | + * @description Moves the position of the provided element within the DOM to be placed |
|---|
| 4669 | + * either after the `after` element or inside of the `parent` element. When the function |
|---|
| 4670 | + * is called a promise is returned that will be resolved at a later time. |
|---|
| 4671 | + * |
|---|
| 4672 | + * @param {DOMElement} element the element which will be moved around within the |
|---|
| 4673 | + * DOM |
|---|
| 4674 | + * @param {DOMElement} parent the parent element where the element will be |
|---|
| 4675 | + * inserted into (if the after element is not present) |
|---|
| 4676 | + * @param {DOMElement} after the sibling element where the element will be |
|---|
| 4677 | + * positioned next to |
|---|
| 4678 | + * @param {object=} options an optional collection of options that will be applied to the element. |
|---|
| 4679 | + * @return {Promise} the animation callback promise |
|---|
| 4680 | + */ |
|---|
| 4681 | + move : function(element, parent, after, options) { |
|---|
| 4682 | + // Do not remove element before insert. Removing will cause data associated with the |
|---|
| 4683 | + // element to be dropped. Insert will implicitly do the remove. |
|---|
| 4684 | + return this.enter(element, parent, after, options); |
|---|
| 4685 | + }, |
|---|
| 4686 | + |
|---|
| 4687 | + /** |
|---|
| 4688 | + * |
|---|
| 4689 | + * @ngdoc method |
|---|
| 4690 | + * @name $animate#addClass |
|---|
| 4691 | + * @kind function |
|---|
| 4692 | + * @description Adds the provided className CSS class value to the provided element. |
|---|
| 4693 | + * When the function is called a promise is returned that will be resolved at a later time. |
|---|
| 4694 | + * @param {DOMElement} element the element which will have the className value |
|---|
| 4695 | + * added to it |
|---|
| 4696 | + * @param {string} className the CSS class which will be added to the element |
|---|
| 4697 | + * @param {object=} options an optional collection of options that will be applied to the element. |
|---|
| 4698 | + * @return {Promise} the animation callback promise |
|---|
| 4699 | + */ |
|---|
| 4700 | + addClass : function(element, className, options) { |
|---|
| 4701 | + return this.setClass(element, className, [], options); |
|---|
| 4702 | + }, |
|---|
| 4703 | + |
|---|
| 4704 | + $$addClassImmediately : function(element, className, options) { |
|---|
| 4705 | + element = jqLite(element); |
|---|
| 4706 | + className = !isString(className) |
|---|
| 4707 | + ? (isArray(className) ? className.join(' ') : '') |
|---|
| 4708 | + : className; |
|---|
| 4709 | + forEach(element, function (element) { |
|---|
| 4710 | + jqLiteAddClass(element, className); |
|---|
| 4711 | + }); |
|---|
| 4712 | + applyStyles(element, options); |
|---|
| 4713 | + return asyncPromise(); |
|---|
| 4714 | + }, |
|---|
| 4715 | + |
|---|
| 4716 | + /** |
|---|
| 4717 | + * |
|---|
| 4718 | + * @ngdoc method |
|---|
| 4719 | + * @name $animate#removeClass |
|---|
| 4720 | + * @kind function |
|---|
| 4721 | + * @description Removes the provided className CSS class value from the provided element. |
|---|
| 4722 | + * When the function is called a promise is returned that will be resolved at a later time. |
|---|
| 4723 | + * @param {DOMElement} element the element which will have the className value |
|---|
| 4724 | + * removed from it |
|---|
| 4725 | + * @param {string} className the CSS class which will be removed from the element |
|---|
| 4726 | + * @param {object=} options an optional collection of options that will be applied to the element. |
|---|
| 4727 | + * @return {Promise} the animation callback promise |
|---|
| 4728 | + */ |
|---|
| 4729 | + removeClass : function(element, className, options) { |
|---|
| 4730 | + return this.setClass(element, [], className, options); |
|---|
| 4731 | + }, |
|---|
| 4732 | + |
|---|
| 4733 | + $$removeClassImmediately : function(element, className, options) { |
|---|
| 4734 | + element = jqLite(element); |
|---|
| 4735 | + className = !isString(className) |
|---|
| 4736 | + ? (isArray(className) ? className.join(' ') : '') |
|---|
| 4737 | + : className; |
|---|
| 4738 | + forEach(element, function (element) { |
|---|
| 4739 | + jqLiteRemoveClass(element, className); |
|---|
| 4740 | + }); |
|---|
| 4741 | + applyStyles(element, options); |
|---|
| 4742 | + return asyncPromise(); |
|---|
| 4743 | + }, |
|---|
| 4744 | + |
|---|
| 4745 | + /** |
|---|
| 4746 | + * |
|---|
| 4747 | + * @ngdoc method |
|---|
| 4748 | + * @name $animate#setClass |
|---|
| 4749 | + * @kind function |
|---|
| 4750 | + * @description Adds and/or removes the given CSS classes to and from the element. |
|---|
| 4751 | + * When the function is called a promise is returned that will be resolved at a later time. |
|---|
| 4752 | + * @param {DOMElement} element the element which will have its CSS classes changed |
|---|
| 4753 | + * removed from it |
|---|
| 4754 | + * @param {string} add the CSS classes which will be added to the element |
|---|
| 4755 | + * @param {string} remove the CSS class which will be removed from the element |
|---|
| 4756 | + * @param {object=} options an optional collection of options that will be applied to the element. |
|---|
| 4757 | + * @return {Promise} the animation callback promise |
|---|
| 4758 | + */ |
|---|
| 4759 | + setClass : function(element, add, remove, options) { |
|---|
| 4760 | + var self = this; |
|---|
| 4761 | + var STORAGE_KEY = '$$animateClasses'; |
|---|
| 4762 | + var createdCache = false; |
|---|
| 4763 | + element = jqLite(element); |
|---|
| 4764 | + |
|---|
| 4765 | + var cache = element.data(STORAGE_KEY); |
|---|
| 4766 | + if (!cache) { |
|---|
| 4767 | + cache = { |
|---|
| 4768 | + classes: {}, |
|---|
| 4769 | + options : options |
|---|
| 4770 | + }; |
|---|
| 4771 | + createdCache = true; |
|---|
| 4772 | + } else if (options && cache.options) { |
|---|
| 4773 | + cache.options = angular.extend(cache.options || {}, options); |
|---|
| 4774 | + } |
|---|
| 4775 | + |
|---|
| 4776 | + var classes = cache.classes; |
|---|
| 4777 | + |
|---|
| 4778 | + add = isArray(add) ? add : add.split(' '); |
|---|
| 4779 | + remove = isArray(remove) ? remove : remove.split(' '); |
|---|
| 4780 | + cachedClassManipulation(classes, add, true); |
|---|
| 4781 | + cachedClassManipulation(classes, remove, false); |
|---|
| 4782 | + |
|---|
| 4783 | + if (createdCache) { |
|---|
| 4784 | + cache.promise = runAnimationPostDigest(function(done) { |
|---|
| 4785 | + var cache = element.data(STORAGE_KEY); |
|---|
| 4786 | + element.removeData(STORAGE_KEY); |
|---|
| 4787 | + |
|---|
| 4788 | + // in the event that the element is removed before postDigest |
|---|
| 4789 | + // is run then the cache will be undefined and there will be |
|---|
| 4790 | + // no need anymore to add or remove and of the element classes |
|---|
| 4791 | + if (cache) { |
|---|
| 4792 | + var classes = resolveElementClasses(element, cache.classes); |
|---|
| 4793 | + if (classes) { |
|---|
| 4794 | + self.$$setClassImmediately(element, classes[0], classes[1], cache.options); |
|---|
| 4795 | + } |
|---|
| 4796 | + } |
|---|
| 4797 | + |
|---|
| 4798 | + done(); |
|---|
| 4799 | + }); |
|---|
| 4800 | + element.data(STORAGE_KEY, cache); |
|---|
| 4801 | + } |
|---|
| 4802 | + |
|---|
| 4803 | + return cache.promise; |
|---|
| 4804 | + }, |
|---|
| 4805 | + |
|---|
| 4806 | + $$setClassImmediately : function(element, add, remove, options) { |
|---|
| 4807 | + add && this.$$addClassImmediately(element, add); |
|---|
| 4808 | + remove && this.$$removeClassImmediately(element, remove); |
|---|
| 4809 | + applyStyles(element, options); |
|---|
| 4810 | + return asyncPromise(); |
|---|
| 4811 | + }, |
|---|
| 4812 | + |
|---|
| 4813 | + enabled : noop, |
|---|
| 4814 | + cancel : noop |
|---|
| 4815 | + }; |
|---|
| 4816 | + }]; |
|---|
| 4817 | +}]; |
|---|
| 4818 | + |
|---|
| 4819 | +function $$AsyncCallbackProvider(){ |
|---|
| 4820 | + this.$get = ['$$rAF', '$timeout', function($$rAF, $timeout) { |
|---|
| 4821 | + return $$rAF.supported |
|---|
| 4822 | + ? function(fn) { return $$rAF(fn); } |
|---|
| 4823 | + : function(fn) { |
|---|
| 4824 | + return $timeout(fn, 0, false); |
|---|
| 4825 | + }; |
|---|
| 4826 | + }]; |
|---|
| 4827 | +} |
|---|
| 4828 | + |
|---|
| 4829 | +/* global stripHash: true */ |
|---|
| 4830 | + |
|---|
| 4831 | +/** |
|---|
| 4832 | + * ! This is a private undocumented service ! |
|---|
| 4833 | + * |
|---|
| 4834 | + * @name $browser |
|---|
| 4835 | + * @requires $log |
|---|
| 4836 | + * @description |
|---|
| 4837 | + * This object has two goals: |
|---|
| 4838 | + * |
|---|
| 4839 | + * - hide all the global state in the browser caused by the window object |
|---|
| 4840 | + * - abstract away all the browser specific features and inconsistencies |
|---|
| 4841 | + * |
|---|
| 4842 | + * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser` |
|---|
| 4843 | + * service, which can be used for convenient testing of the application without the interaction with |
|---|
| 4844 | + * the real browser apis. |
|---|
| 4845 | + */ |
|---|
| 4846 | +/** |
|---|
| 4847 | + * @param {object} window The global window object. |
|---|
| 4848 | + * @param {object} document jQuery wrapped document. |
|---|
| 4849 | + * @param {function()} XHR XMLHttpRequest constructor. |
|---|
| 4850 | + * @param {object} $log console.log or an object with the same interface. |
|---|
| 4851 | + * @param {object} $sniffer $sniffer service |
|---|
| 4852 | + */ |
|---|
| 4853 | +function Browser(window, document, $log, $sniffer) { |
|---|
| 4854 | + var self = this, |
|---|
| 4855 | + rawDocument = document[0], |
|---|
| 4856 | + location = window.location, |
|---|
| 4857 | + history = window.history, |
|---|
| 4858 | + setTimeout = window.setTimeout, |
|---|
| 4859 | + clearTimeout = window.clearTimeout, |
|---|
| 4860 | + pendingDeferIds = {}; |
|---|
| 4861 | + |
|---|
| 4862 | + self.isMock = false; |
|---|
| 4863 | + |
|---|
| 4864 | + var outstandingRequestCount = 0; |
|---|
| 4865 | + var outstandingRequestCallbacks = []; |
|---|
| 4866 | + |
|---|
| 4867 | + // TODO(vojta): remove this temporary api |
|---|
| 4868 | + self.$$completeOutstandingRequest = completeOutstandingRequest; |
|---|
| 4869 | + self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; }; |
|---|
| 4870 | + |
|---|
| 4871 | + /** |
|---|
| 4872 | + * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks` |
|---|
| 4873 | + * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed. |
|---|
| 4874 | + */ |
|---|
| 4875 | + function completeOutstandingRequest(fn) { |
|---|
| 4876 | + try { |
|---|
| 4877 | + fn.apply(null, sliceArgs(arguments, 1)); |
|---|
| 4878 | + } finally { |
|---|
| 4879 | + outstandingRequestCount--; |
|---|
| 4880 | + if (outstandingRequestCount === 0) { |
|---|
| 4881 | + while(outstandingRequestCallbacks.length) { |
|---|
| 4882 | + try { |
|---|
| 4883 | + outstandingRequestCallbacks.pop()(); |
|---|
| 4884 | + } catch (e) { |
|---|
| 4885 | + $log.error(e); |
|---|
| 4886 | + } |
|---|
| 4887 | + } |
|---|
| 4888 | + } |
|---|
| 4889 | + } |
|---|
| 4890 | + } |
|---|
| 4891 | + |
|---|
| 4892 | + /** |
|---|
| 4893 | + * @private |
|---|
| 4894 | + * Note: this method is used only by scenario runner |
|---|
| 4895 | + * TODO(vojta): prefix this method with $$ ? |
|---|
| 4896 | + * @param {function()} callback Function that will be called when no outstanding request |
|---|
| 4897 | + */ |
|---|
| 4898 | + self.notifyWhenNoOutstandingRequests = function(callback) { |
|---|
| 4899 | + // force browser to execute all pollFns - this is needed so that cookies and other pollers fire |
|---|
| 4900 | + // at some deterministic time in respect to the test runner's actions. Leaving things up to the |
|---|
| 4901 | + // regular poller would result in flaky tests. |
|---|
| 4902 | + forEach(pollFns, function(pollFn){ pollFn(); }); |
|---|
| 4903 | + |
|---|
| 4904 | + if (outstandingRequestCount === 0) { |
|---|
| 4905 | + callback(); |
|---|
| 4906 | + } else { |
|---|
| 4907 | + outstandingRequestCallbacks.push(callback); |
|---|
| 4908 | + } |
|---|
| 4909 | + }; |
|---|
| 4910 | + |
|---|
| 4911 | + ////////////////////////////////////////////////////////////// |
|---|
| 4912 | + // Poll Watcher API |
|---|
| 4913 | + ////////////////////////////////////////////////////////////// |
|---|
| 4914 | + var pollFns = [], |
|---|
| 4915 | + pollTimeout; |
|---|
| 4916 | + |
|---|
| 4917 | + /** |
|---|
| 4918 | + * @name $browser#addPollFn |
|---|
| 4919 | + * |
|---|
| 4920 | + * @param {function()} fn Poll function to add |
|---|
| 4921 | + * |
|---|
| 4922 | + * @description |
|---|
| 4923 | + * Adds a function to the list of functions that poller periodically executes, |
|---|
| 4924 | + * and starts polling if not started yet. |
|---|
| 4925 | + * |
|---|
| 4926 | + * @returns {function()} the added function |
|---|
| 4927 | + */ |
|---|
| 4928 | + self.addPollFn = function(fn) { |
|---|
| 4929 | + if (isUndefined(pollTimeout)) startPoller(100, setTimeout); |
|---|
| 4930 | + pollFns.push(fn); |
|---|
| 4931 | + return fn; |
|---|
| 4932 | + }; |
|---|
| 4933 | + |
|---|
| 4934 | + /** |
|---|
| 4935 | + * @param {number} interval How often should browser call poll functions (ms) |
|---|
| 4936 | + * @param {function()} setTimeout Reference to a real or fake `setTimeout` function. |
|---|
| 4937 | + * |
|---|
| 4938 | + * @description |
|---|
| 4939 | + * Configures the poller to run in the specified intervals, using the specified |
|---|
| 4940 | + * setTimeout fn and kicks it off. |
|---|
| 4941 | + */ |
|---|
| 4942 | + function startPoller(interval, setTimeout) { |
|---|
| 4943 | + (function check() { |
|---|
| 4944 | + forEach(pollFns, function(pollFn){ pollFn(); }); |
|---|
| 4945 | + pollTimeout = setTimeout(check, interval); |
|---|
| 4946 | + })(); |
|---|
| 4947 | + } |
|---|
| 4948 | + |
|---|
| 4949 | + ////////////////////////////////////////////////////////////// |
|---|
| 4950 | + // URL API |
|---|
| 4951 | + ////////////////////////////////////////////////////////////// |
|---|
| 4952 | + |
|---|
| 4953 | + var cachedState, lastHistoryState, |
|---|
| 4954 | + lastBrowserUrl = location.href, |
|---|
| 4955 | + baseElement = document.find('base'), |
|---|
| 4956 | + reloadLocation = null; |
|---|
| 4957 | + |
|---|
| 4958 | + cacheState(); |
|---|
| 4959 | + lastHistoryState = cachedState; |
|---|
| 4960 | + |
|---|
| 4961 | + /** |
|---|
| 4962 | + * @name $browser#url |
|---|
| 4963 | + * |
|---|
| 4964 | + * @description |
|---|
| 4965 | + * GETTER: |
|---|
| 4966 | + * Without any argument, this method just returns current value of location.href. |
|---|
| 4967 | + * |
|---|
| 4968 | + * SETTER: |
|---|
| 4969 | + * With at least one argument, this method sets url to new value. |
|---|
| 4970 | + * If html5 history api supported, pushState/replaceState is used, otherwise |
|---|
| 4971 | + * location.href/location.replace is used. |
|---|
| 4972 | + * Returns its own instance to allow chaining |
|---|
| 4973 | + * |
|---|
| 4974 | + * NOTE: this api is intended for use only by the $location service. Please use the |
|---|
| 4975 | + * {@link ng.$location $location service} to change url. |
|---|
| 4976 | + * |
|---|
| 4977 | + * @param {string} url New url (when used as setter) |
|---|
| 4978 | + * @param {boolean=} replace Should new url replace current history record? |
|---|
| 4979 | + * @param {object=} state object to use with pushState/replaceState |
|---|
| 4980 | + */ |
|---|
| 4981 | + self.url = function(url, replace, state) { |
|---|
| 4982 | + // In modern browsers `history.state` is `null` by default; treating it separately |
|---|
| 4983 | + // from `undefined` would cause `$browser.url('/foo')` to change `history.state` |
|---|
| 4984 | + // to undefined via `pushState`. Instead, let's change `undefined` to `null` here. |
|---|
| 4985 | + if (isUndefined(state)) { |
|---|
| 4986 | + state = null; |
|---|
| 4987 | + } |
|---|
| 4988 | + |
|---|
| 4989 | + // Android Browser BFCache causes location, history reference to become stale. |
|---|
| 4990 | + if (location !== window.location) location = window.location; |
|---|
| 4991 | + if (history !== window.history) history = window.history; |
|---|
| 4992 | + |
|---|
| 4993 | + // setter |
|---|
| 4994 | + if (url) { |
|---|
| 4995 | + var sameState = lastHistoryState === state; |
|---|
| 4996 | + |
|---|
| 4997 | + // Don't change anything if previous and current URLs and states match. This also prevents |
|---|
| 4998 | + // IE<10 from getting into redirect loop when in LocationHashbangInHtml5Url mode. |
|---|
| 4999 | + // See https://github.com/angular/angular.js/commit/ffb2701 |
|---|
| 5000 | + if (lastBrowserUrl === url && (!$sniffer.history || sameState)) { |
|---|
| 5001 | + return; |
|---|
| 5002 | + } |
|---|
| 5003 | + var sameBase = lastBrowserUrl && stripHash(lastBrowserUrl) === stripHash(url); |
|---|
| 5004 | + lastBrowserUrl = url; |
|---|
| 5005 | + lastHistoryState = state; |
|---|
| 5006 | + // Don't use history API if only the hash changed |
|---|
| 5007 | + // due to a bug in IE10/IE11 which leads |
|---|
| 5008 | + // to not firing a `hashchange` nor `popstate` event |
|---|
| 5009 | + // in some cases (see #9143). |
|---|
| 5010 | + if ($sniffer.history && (!sameBase || !sameState)) { |
|---|
| 5011 | + history[replace ? 'replaceState' : 'pushState'](state, '', url); |
|---|
| 5012 | + cacheState(); |
|---|
| 5013 | + // Do the assignment again so that those two variables are referentially identical. |
|---|
| 5014 | + lastHistoryState = cachedState; |
|---|
| 5015 | + } else { |
|---|
| 5016 | + if (!sameBase) { |
|---|
| 5017 | + reloadLocation = url; |
|---|
| 5018 | + } |
|---|
| 5019 | + if (replace) { |
|---|
| 5020 | + location.replace(url); |
|---|
| 5021 | + } else { |
|---|
| 5022 | + location.href = url; |
|---|
| 5023 | + } |
|---|
| 5024 | + } |
|---|
| 5025 | + return self; |
|---|
| 5026 | + // getter |
|---|
| 5027 | + } else { |
|---|
| 5028 | + // - reloadLocation is needed as browsers don't allow to read out |
|---|
| 5029 | + // the new location.href if a reload happened. |
|---|
| 5030 | + // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172 |
|---|
| 5031 | + return reloadLocation || location.href.replace(/%27/g,"'"); |
|---|
| 5032 | + } |
|---|
| 5033 | + }; |
|---|
| 5034 | + |
|---|
| 5035 | + /** |
|---|
| 5036 | + * @name $browser#state |
|---|
| 5037 | + * |
|---|
| 5038 | + * @description |
|---|
| 5039 | + * This method is a getter. |
|---|
| 5040 | + * |
|---|
| 5041 | + * Return history.state or null if history.state is undefined. |
|---|
| 5042 | + * |
|---|
| 5043 | + * @returns {object} state |
|---|
| 5044 | + */ |
|---|
| 5045 | + self.state = function() { |
|---|
| 5046 | + return cachedState; |
|---|
| 5047 | + }; |
|---|
| 5048 | + |
|---|
| 5049 | + var urlChangeListeners = [], |
|---|
| 5050 | + urlChangeInit = false; |
|---|
| 5051 | + |
|---|
| 5052 | + function cacheStateAndFireUrlChange() { |
|---|
| 5053 | + cacheState(); |
|---|
| 5054 | + fireUrlChange(); |
|---|
| 5055 | + } |
|---|
| 5056 | + |
|---|
| 5057 | + // This variable should be used *only* inside the cacheState function. |
|---|
| 5058 | + var lastCachedState = null; |
|---|
| 5059 | + function cacheState() { |
|---|
| 5060 | + // This should be the only place in $browser where `history.state` is read. |
|---|
| 5061 | + cachedState = window.history.state; |
|---|
| 5062 | + cachedState = isUndefined(cachedState) ? null : cachedState; |
|---|
| 5063 | + |
|---|
| 5064 | + // Prevent callbacks fo fire twice if both hashchange & popstate were fired. |
|---|
| 5065 | + if (equals(cachedState, lastCachedState)) { |
|---|
| 5066 | + cachedState = lastCachedState; |
|---|
| 5067 | + } |
|---|
| 5068 | + lastCachedState = cachedState; |
|---|
| 5069 | + } |
|---|
| 5070 | + |
|---|
| 5071 | + function fireUrlChange() { |
|---|
| 5072 | + if (lastBrowserUrl === self.url() && lastHistoryState === cachedState) { |
|---|
| 5073 | + return; |
|---|
| 5074 | + } |
|---|
| 5075 | + |
|---|
| 5076 | + lastBrowserUrl = self.url(); |
|---|
| 5077 | + lastHistoryState = cachedState; |
|---|
| 5078 | + forEach(urlChangeListeners, function(listener) { |
|---|
| 5079 | + listener(self.url(), cachedState); |
|---|
| 5080 | + }); |
|---|
| 5081 | + } |
|---|
| 5082 | + |
|---|
| 5083 | + /** |
|---|
| 5084 | + * @name $browser#onUrlChange |
|---|
| 5085 | + * |
|---|
| 5086 | + * @description |
|---|
| 5087 | + * Register callback function that will be called, when url changes. |
|---|
| 5088 | + * |
|---|
| 5089 | + * It's only called when the url is changed from outside of angular: |
|---|
| 5090 | + * - user types different url into address bar |
|---|
| 5091 | + * - user clicks on history (forward/back) button |
|---|
| 5092 | + * - user clicks on a link |
|---|
| 5093 | + * |
|---|
| 5094 | + * It's not called when url is changed by $browser.url() method |
|---|
| 5095 | + * |
|---|
| 5096 | + * The listener gets called with new url as parameter. |
|---|
| 5097 | + * |
|---|
| 5098 | + * NOTE: this api is intended for use only by the $location service. Please use the |
|---|
| 5099 | + * {@link ng.$location $location service} to monitor url changes in angular apps. |
|---|
| 5100 | + * |
|---|
| 5101 | + * @param {function(string)} listener Listener function to be called when url changes. |
|---|
| 5102 | + * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous. |
|---|
| 5103 | + */ |
|---|
| 5104 | + self.onUrlChange = function(callback) { |
|---|
| 5105 | + // TODO(vojta): refactor to use node's syntax for events |
|---|
| 5106 | + if (!urlChangeInit) { |
|---|
| 5107 | + // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera) |
|---|
| 5108 | + // don't fire popstate when user change the address bar and don't fire hashchange when url |
|---|
| 5109 | + // changed by push/replaceState |
|---|
| 5110 | + |
|---|
| 5111 | + // html5 history api - popstate event |
|---|
| 5112 | + if ($sniffer.history) jqLite(window).on('popstate', cacheStateAndFireUrlChange); |
|---|
| 5113 | + // hashchange event |
|---|
| 5114 | + jqLite(window).on('hashchange', cacheStateAndFireUrlChange); |
|---|
| 5115 | + |
|---|
| 5116 | + urlChangeInit = true; |
|---|
| 5117 | + } |
|---|
| 5118 | + |
|---|
| 5119 | + urlChangeListeners.push(callback); |
|---|
| 5120 | + return callback; |
|---|
| 5121 | + }; |
|---|
| 5122 | + |
|---|
| 5123 | + /** |
|---|
| 5124 | + * Checks whether the url has changed outside of Angular. |
|---|
| 5125 | + * Needs to be exported to be able to check for changes that have been done in sync, |
|---|
| 5126 | + * as hashchange/popstate events fire in async. |
|---|
| 5127 | + */ |
|---|
| 5128 | + self.$$checkUrlChange = fireUrlChange; |
|---|
| 5129 | + |
|---|
| 5130 | + ////////////////////////////////////////////////////////////// |
|---|
| 5131 | + // Misc API |
|---|
| 5132 | + ////////////////////////////////////////////////////////////// |
|---|
| 5133 | + |
|---|
| 5134 | + /** |
|---|
| 5135 | + * @name $browser#baseHref |
|---|
| 5136 | + * |
|---|
| 5137 | + * @description |
|---|
| 5138 | + * Returns current <base href> |
|---|
| 5139 | + * (always relative - without domain) |
|---|
| 5140 | + * |
|---|
| 5141 | + * @returns {string} The current base href |
|---|
| 5142 | + */ |
|---|
| 5143 | + self.baseHref = function() { |
|---|
| 5144 | + var href = baseElement.attr('href'); |
|---|
| 5145 | + return href ? href.replace(/^(https?\:)?\/\/[^\/]*/, '') : ''; |
|---|
| 5146 | + }; |
|---|
| 5147 | + |
|---|
| 5148 | + ////////////////////////////////////////////////////////////// |
|---|
| 5149 | + // Cookies API |
|---|
| 5150 | + ////////////////////////////////////////////////////////////// |
|---|
| 5151 | + var lastCookies = {}; |
|---|
| 5152 | + var lastCookieString = ''; |
|---|
| 5153 | + var cookiePath = self.baseHref(); |
|---|
| 5154 | + |
|---|
| 5155 | + function safeDecodeURIComponent(str) { |
|---|
| 5156 | + try { |
|---|
| 5157 | + return decodeURIComponent(str); |
|---|
| 5158 | + } catch (e) { |
|---|
| 5159 | + return str; |
|---|
| 5160 | + } |
|---|
| 5161 | + } |
|---|
| 5162 | + |
|---|
| 5163 | + /** |
|---|
| 5164 | + * @name $browser#cookies |
|---|
| 5165 | + * |
|---|
| 5166 | + * @param {string=} name Cookie name |
|---|
| 5167 | + * @param {string=} value Cookie value |
|---|
| 5168 | + * |
|---|
| 5169 | + * @description |
|---|
| 5170 | + * The cookies method provides a 'private' low level access to browser cookies. |
|---|
| 5171 | + * It is not meant to be used directly, use the $cookie service instead. |
|---|
| 5172 | + * |
|---|
| 5173 | + * The return values vary depending on the arguments that the method was called with as follows: |
|---|
| 5174 | + * |
|---|
| 5175 | + * - cookies() -> hash of all cookies, this is NOT a copy of the internal state, so do not modify |
|---|
| 5176 | + * it |
|---|
| 5177 | + * - cookies(name, value) -> set name to value, if value is undefined delete the cookie |
|---|
| 5178 | + * - cookies(name) -> the same as (name, undefined) == DELETES (no one calls it right now that |
|---|
| 5179 | + * way) |
|---|
| 5180 | + * |
|---|
| 5181 | + * @returns {Object} Hash of all cookies (if called without any parameter) |
|---|
| 5182 | + */ |
|---|
| 5183 | + self.cookies = function(name, value) { |
|---|
| 5184 | + var cookieLength, cookieArray, cookie, i, index; |
|---|
| 5185 | + |
|---|
| 5186 | + if (name) { |
|---|
| 5187 | + if (value === undefined) { |
|---|
| 5188 | + rawDocument.cookie = encodeURIComponent(name) + "=;path=" + cookiePath + |
|---|
| 5189 | + ";expires=Thu, 01 Jan 1970 00:00:00 GMT"; |
|---|
| 5190 | + } else { |
|---|
| 5191 | + if (isString(value)) { |
|---|
| 5192 | + cookieLength = (rawDocument.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value) + |
|---|
| 5193 | + ';path=' + cookiePath).length + 1; |
|---|
| 5194 | + |
|---|
| 5195 | + // per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum: |
|---|
| 5196 | + // - 300 cookies |
|---|
| 5197 | + // - 20 cookies per unique domain |
|---|
| 5198 | + // - 4096 bytes per cookie |
|---|
| 5199 | + if (cookieLength > 4096) { |
|---|
| 5200 | + $log.warn("Cookie '"+ name + |
|---|
| 5201 | + "' possibly not set or overflowed because it was too large ("+ |
|---|
| 5202 | + cookieLength + " > 4096 bytes)!"); |
|---|
| 5203 | + } |
|---|
| 5204 | + } |
|---|
| 5205 | + } |
|---|
| 5206 | + } else { |
|---|
| 5207 | + if (rawDocument.cookie !== lastCookieString) { |
|---|
| 5208 | + lastCookieString = rawDocument.cookie; |
|---|
| 5209 | + cookieArray = lastCookieString.split("; "); |
|---|
| 5210 | + lastCookies = {}; |
|---|
| 5211 | + |
|---|
| 5212 | + for (i = 0; i < cookieArray.length; i++) { |
|---|
| 5213 | + cookie = cookieArray[i]; |
|---|
| 5214 | + index = cookie.indexOf('='); |
|---|
| 5215 | + if (index > 0) { //ignore nameless cookies |
|---|
| 5216 | + name = safeDecodeURIComponent(cookie.substring(0, index)); |
|---|
| 5217 | + // the first value that is seen for a cookie is the most |
|---|
| 5218 | + // specific one. values for the same cookie name that |
|---|
| 5219 | + // follow are for less specific paths. |
|---|
| 5220 | + if (lastCookies[name] === undefined) { |
|---|
| 5221 | + lastCookies[name] = safeDecodeURIComponent(cookie.substring(index + 1)); |
|---|
| 5222 | + } |
|---|
| 5223 | + } |
|---|
| 5224 | + } |
|---|
| 5225 | + } |
|---|
| 5226 | + return lastCookies; |
|---|
| 5227 | + } |
|---|
| 5228 | + }; |
|---|
| 5229 | + |
|---|
| 5230 | + |
|---|
| 5231 | + /** |
|---|
| 5232 | + * @name $browser#defer |
|---|
| 5233 | + * @param {function()} fn A function, who's execution should be deferred. |
|---|
| 5234 | + * @param {number=} [delay=0] of milliseconds to defer the function execution. |
|---|
| 5235 | + * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`. |
|---|
| 5236 | + * |
|---|
| 5237 | + * @description |
|---|
| 5238 | + * Executes a fn asynchronously via `setTimeout(fn, delay)`. |
|---|
| 5239 | + * |
|---|
| 5240 | + * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using |
|---|
| 5241 | + * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed |
|---|
| 5242 | + * via `$browser.defer.flush()`. |
|---|
| 5243 | + * |
|---|
| 5244 | + */ |
|---|
| 5245 | + self.defer = function(fn, delay) { |
|---|
| 5246 | + var timeoutId; |
|---|
| 5247 | + outstandingRequestCount++; |
|---|
| 5248 | + timeoutId = setTimeout(function() { |
|---|
| 5249 | + delete pendingDeferIds[timeoutId]; |
|---|
| 5250 | + completeOutstandingRequest(fn); |
|---|
| 5251 | + }, delay || 0); |
|---|
| 5252 | + pendingDeferIds[timeoutId] = true; |
|---|
| 5253 | + return timeoutId; |
|---|
| 5254 | + }; |
|---|
| 5255 | + |
|---|
| 5256 | + |
|---|
| 5257 | + /** |
|---|
| 5258 | + * @name $browser#defer.cancel |
|---|
| 5259 | + * |
|---|
| 5260 | + * @description |
|---|
| 5261 | + * Cancels a deferred task identified with `deferId`. |
|---|
| 5262 | + * |
|---|
| 5263 | + * @param {*} deferId Token returned by the `$browser.defer` function. |
|---|
| 5264 | + * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully |
|---|
| 5265 | + * canceled. |
|---|
| 5266 | + */ |
|---|
| 5267 | + self.defer.cancel = function(deferId) { |
|---|
| 5268 | + if (pendingDeferIds[deferId]) { |
|---|
| 5269 | + delete pendingDeferIds[deferId]; |
|---|
| 5270 | + clearTimeout(deferId); |
|---|
| 5271 | + completeOutstandingRequest(noop); |
|---|
| 5272 | + return true; |
|---|
| 5273 | + } |
|---|
| 5274 | + return false; |
|---|
| 5275 | + }; |
|---|
| 5276 | + |
|---|
| 5277 | +} |
|---|
| 5278 | + |
|---|
| 5279 | +function $BrowserProvider(){ |
|---|
| 5280 | + this.$get = ['$window', '$log', '$sniffer', '$document', |
|---|
| 5281 | + function( $window, $log, $sniffer, $document){ |
|---|
| 5282 | + return new Browser($window, $document, $log, $sniffer); |
|---|
| 5283 | + }]; |
|---|
| 5284 | +} |
|---|
| 5285 | + |
|---|
| 5286 | +/** |
|---|
| 5287 | + * @ngdoc service |
|---|
| 5288 | + * @name $cacheFactory |
|---|
| 5289 | + * |
|---|
| 5290 | + * @description |
|---|
| 5291 | + * Factory that constructs {@link $cacheFactory.Cache Cache} objects and gives access to |
|---|
| 5292 | + * them. |
|---|
| 5293 | + * |
|---|
| 5294 | + * ```js |
|---|
| 5295 | + * |
|---|
| 5296 | + * var cache = $cacheFactory('cacheId'); |
|---|
| 5297 | + * expect($cacheFactory.get('cacheId')).toBe(cache); |
|---|
| 5298 | + * expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined(); |
|---|
| 5299 | + * |
|---|
| 5300 | + * cache.put("key", "value"); |
|---|
| 5301 | + * cache.put("another key", "another value"); |
|---|
| 5302 | + * |
|---|
| 5303 | + * // We've specified no options on creation |
|---|
| 5304 | + * expect(cache.info()).toEqual({id: 'cacheId', size: 2}); |
|---|
| 5305 | + * |
|---|
| 5306 | + * ``` |
|---|
| 5307 | + * |
|---|
| 5308 | + * |
|---|
| 5309 | + * @param {string} cacheId Name or id of the newly created cache. |
|---|
| 5310 | + * @param {object=} options Options object that specifies the cache behavior. Properties: |
|---|
| 5311 | + * |
|---|
| 5312 | + * - `{number=}` `capacity` — turns the cache into LRU cache. |
|---|
| 5313 | + * |
|---|
| 5314 | + * @returns {object} Newly created cache object with the following set of methods: |
|---|
| 5315 | + * |
|---|
| 5316 | + * - `{object}` `info()` — Returns id, size, and options of cache. |
|---|
| 5317 | + * - `{{*}}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache and returns |
|---|
| 5318 | + * it. |
|---|
| 5319 | + * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss. |
|---|
| 5320 | + * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache. |
|---|
| 5321 | + * - `{void}` `removeAll()` — Removes all cached values. |
|---|
| 5322 | + * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory. |
|---|
| 5323 | + * |
|---|
| 5324 | + * @example |
|---|
| 5325 | + <example module="cacheExampleApp"> |
|---|
| 5326 | + <file name="index.html"> |
|---|
| 5327 | + <div ng-controller="CacheController"> |
|---|
| 5328 | + <input ng-model="newCacheKey" placeholder="Key"> |
|---|
| 5329 | + <input ng-model="newCacheValue" placeholder="Value"> |
|---|
| 5330 | + <button ng-click="put(newCacheKey, newCacheValue)">Cache</button> |
|---|
| 5331 | + |
|---|
| 5332 | + <p ng-if="keys.length">Cached Values</p> |
|---|
| 5333 | + <div ng-repeat="key in keys"> |
|---|
| 5334 | + <span ng-bind="key"></span> |
|---|
| 5335 | + <span>: </span> |
|---|
| 5336 | + <b ng-bind="cache.get(key)"></b> |
|---|
| 5337 | + </div> |
|---|
| 5338 | + |
|---|
| 5339 | + <p>Cache Info</p> |
|---|
| 5340 | + <div ng-repeat="(key, value) in cache.info()"> |
|---|
| 5341 | + <span ng-bind="key"></span> |
|---|
| 5342 | + <span>: </span> |
|---|
| 5343 | + <b ng-bind="value"></b> |
|---|
| 5344 | + </div> |
|---|
| 5345 | + </div> |
|---|
| 5346 | + </file> |
|---|
| 5347 | + <file name="script.js"> |
|---|
| 5348 | + angular.module('cacheExampleApp', []). |
|---|
| 5349 | + controller('CacheController', ['$scope', '$cacheFactory', function($scope, $cacheFactory) { |
|---|
| 5350 | + $scope.keys = []; |
|---|
| 5351 | + $scope.cache = $cacheFactory('cacheId'); |
|---|
| 5352 | + $scope.put = function(key, value) { |
|---|
| 5353 | + if ($scope.cache.get(key) === undefined) { |
|---|
| 5354 | + $scope.keys.push(key); |
|---|
| 5355 | + } |
|---|
| 5356 | + $scope.cache.put(key, value === undefined ? null : value); |
|---|
| 5357 | + }; |
|---|
| 5358 | + }]); |
|---|
| 5359 | + </file> |
|---|
| 5360 | + <file name="style.css"> |
|---|
| 5361 | + p { |
|---|
| 5362 | + margin: 10px 0 3px; |
|---|
| 5363 | + } |
|---|
| 5364 | + </file> |
|---|
| 5365 | + </example> |
|---|
| 5366 | + */ |
|---|
| 5367 | +function $CacheFactoryProvider() { |
|---|
| 5368 | + |
|---|
| 5369 | + this.$get = function() { |
|---|
| 5370 | + var caches = {}; |
|---|
| 5371 | + |
|---|
| 5372 | + function cacheFactory(cacheId, options) { |
|---|
| 5373 | + if (cacheId in caches) { |
|---|
| 5374 | + throw minErr('$cacheFactory')('iid', "CacheId '{0}' is already taken!", cacheId); |
|---|
| 5375 | + } |
|---|
| 5376 | + |
|---|
| 5377 | + var size = 0, |
|---|
| 5378 | + stats = extend({}, options, {id: cacheId}), |
|---|
| 5379 | + data = {}, |
|---|
| 5380 | + capacity = (options && options.capacity) || Number.MAX_VALUE, |
|---|
| 5381 | + lruHash = {}, |
|---|
| 5382 | + freshEnd = null, |
|---|
| 5383 | + staleEnd = null; |
|---|
| 5384 | + |
|---|
| 5385 | + /** |
|---|
| 5386 | + * @ngdoc type |
|---|
| 5387 | + * @name $cacheFactory.Cache |
|---|
| 5388 | + * |
|---|
| 5389 | + * @description |
|---|
| 5390 | + * A cache object used to store and retrieve data, primarily used by |
|---|
| 5391 | + * {@link $http $http} and the {@link ng.directive:script script} directive to cache |
|---|
| 5392 | + * templates and other data. |
|---|
| 5393 | + * |
|---|
| 5394 | + * ```js |
|---|
| 5395 | + * angular.module('superCache') |
|---|
| 5396 | + * .factory('superCache', ['$cacheFactory', function($cacheFactory) { |
|---|
| 5397 | + * return $cacheFactory('super-cache'); |
|---|
| 5398 | + * }]); |
|---|
| 5399 | + * ``` |
|---|
| 5400 | + * |
|---|
| 5401 | + * Example test: |
|---|
| 5402 | + * |
|---|
| 5403 | + * ```js |
|---|
| 5404 | + * it('should behave like a cache', inject(function(superCache) { |
|---|
| 5405 | + * superCache.put('key', 'value'); |
|---|
| 5406 | + * superCache.put('another key', 'another value'); |
|---|
| 5407 | + * |
|---|
| 5408 | + * expect(superCache.info()).toEqual({ |
|---|
| 5409 | + * id: 'super-cache', |
|---|
| 5410 | + * size: 2 |
|---|
| 5411 | + * }); |
|---|
| 5412 | + * |
|---|
| 5413 | + * superCache.remove('another key'); |
|---|
| 5414 | + * expect(superCache.get('another key')).toBeUndefined(); |
|---|
| 5415 | + * |
|---|
| 5416 | + * superCache.removeAll(); |
|---|
| 5417 | + * expect(superCache.info()).toEqual({ |
|---|
| 5418 | + * id: 'super-cache', |
|---|
| 5419 | + * size: 0 |
|---|
| 5420 | + * }); |
|---|
| 5421 | + * })); |
|---|
| 5422 | + * ``` |
|---|
| 5423 | + */ |
|---|
| 5424 | + return caches[cacheId] = { |
|---|
| 5425 | + |
|---|
| 5426 | + /** |
|---|
| 5427 | + * @ngdoc method |
|---|
| 5428 | + * @name $cacheFactory.Cache#put |
|---|
| 5429 | + * @kind function |
|---|
| 5430 | + * |
|---|
| 5431 | + * @description |
|---|
| 5432 | + * Inserts a named entry into the {@link $cacheFactory.Cache Cache} object to be |
|---|
| 5433 | + * retrieved later, and incrementing the size of the cache if the key was not already |
|---|
| 5434 | + * present in the cache. If behaving like an LRU cache, it will also remove stale |
|---|
| 5435 | + * entries from the set. |
|---|
| 5436 | + * |
|---|
| 5437 | + * It will not insert undefined values into the cache. |
|---|
| 5438 | + * |
|---|
| 5439 | + * @param {string} key the key under which the cached data is stored. |
|---|
| 5440 | + * @param {*} value the value to store alongside the key. If it is undefined, the key |
|---|
| 5441 | + * will not be stored. |
|---|
| 5442 | + * @returns {*} the value stored. |
|---|
| 5443 | + */ |
|---|
| 5444 | + put: function(key, value) { |
|---|
| 5445 | + if (capacity < Number.MAX_VALUE) { |
|---|
| 5446 | + var lruEntry = lruHash[key] || (lruHash[key] = {key: key}); |
|---|
| 5447 | + |
|---|
| 5448 | + refresh(lruEntry); |
|---|
| 5449 | + } |
|---|
| 5450 | + |
|---|
| 5451 | + if (isUndefined(value)) return; |
|---|
| 5452 | + if (!(key in data)) size++; |
|---|
| 5453 | + data[key] = value; |
|---|
| 5454 | + |
|---|
| 5455 | + if (size > capacity) { |
|---|
| 5456 | + this.remove(staleEnd.key); |
|---|
| 5457 | + } |
|---|
| 5458 | + |
|---|
| 5459 | + return value; |
|---|
| 5460 | + }, |
|---|
| 5461 | + |
|---|
| 5462 | + /** |
|---|
| 5463 | + * @ngdoc method |
|---|
| 5464 | + * @name $cacheFactory.Cache#get |
|---|
| 5465 | + * @kind function |
|---|
| 5466 | + * |
|---|
| 5467 | + * @description |
|---|
| 5468 | + * Retrieves named data stored in the {@link $cacheFactory.Cache Cache} object. |
|---|
| 5469 | + * |
|---|
| 5470 | + * @param {string} key the key of the data to be retrieved |
|---|
| 5471 | + * @returns {*} the value stored. |
|---|
| 5472 | + */ |
|---|
| 5473 | + get: function(key) { |
|---|
| 5474 | + if (capacity < Number.MAX_VALUE) { |
|---|
| 5475 | + var lruEntry = lruHash[key]; |
|---|
| 5476 | + |
|---|
| 5477 | + if (!lruEntry) return; |
|---|
| 5478 | + |
|---|
| 5479 | + refresh(lruEntry); |
|---|
| 5480 | + } |
|---|
| 5481 | + |
|---|
| 5482 | + return data[key]; |
|---|
| 5483 | + }, |
|---|
| 5484 | + |
|---|
| 5485 | + |
|---|
| 5486 | + /** |
|---|
| 5487 | + * @ngdoc method |
|---|
| 5488 | + * @name $cacheFactory.Cache#remove |
|---|
| 5489 | + * @kind function |
|---|
| 5490 | + * |
|---|
| 5491 | + * @description |
|---|
| 5492 | + * Removes an entry from the {@link $cacheFactory.Cache Cache} object. |
|---|
| 5493 | + * |
|---|
| 5494 | + * @param {string} key the key of the entry to be removed |
|---|
| 5495 | + */ |
|---|
| 5496 | + remove: function(key) { |
|---|
| 5497 | + if (capacity < Number.MAX_VALUE) { |
|---|
| 5498 | + var lruEntry = lruHash[key]; |
|---|
| 5499 | + |
|---|
| 5500 | + if (!lruEntry) return; |
|---|
| 5501 | + |
|---|
| 5502 | + if (lruEntry == freshEnd) freshEnd = lruEntry.p; |
|---|
| 5503 | + if (lruEntry == staleEnd) staleEnd = lruEntry.n; |
|---|
| 5504 | + link(lruEntry.n,lruEntry.p); |
|---|
| 5505 | + |
|---|
| 5506 | + delete lruHash[key]; |
|---|
| 5507 | + } |
|---|
| 5508 | + |
|---|
| 5509 | + delete data[key]; |
|---|
| 5510 | + size--; |
|---|
| 5511 | + }, |
|---|
| 5512 | + |
|---|
| 5513 | + |
|---|
| 5514 | + /** |
|---|
| 5515 | + * @ngdoc method |
|---|
| 5516 | + * @name $cacheFactory.Cache#removeAll |
|---|
| 5517 | + * @kind function |
|---|
| 5518 | + * |
|---|
| 5519 | + * @description |
|---|
| 5520 | + * Clears the cache object of any entries. |
|---|
| 5521 | + */ |
|---|
| 5522 | + removeAll: function() { |
|---|
| 5523 | + data = {}; |
|---|
| 5524 | + size = 0; |
|---|
| 5525 | + lruHash = {}; |
|---|
| 5526 | + freshEnd = staleEnd = null; |
|---|
| 5527 | + }, |
|---|
| 5528 | + |
|---|
| 5529 | + |
|---|
| 5530 | + /** |
|---|
| 5531 | + * @ngdoc method |
|---|
| 5532 | + * @name $cacheFactory.Cache#destroy |
|---|
| 5533 | + * @kind function |
|---|
| 5534 | + * |
|---|
| 5535 | + * @description |
|---|
| 5536 | + * Destroys the {@link $cacheFactory.Cache Cache} object entirely, |
|---|
| 5537 | + * removing it from the {@link $cacheFactory $cacheFactory} set. |
|---|
| 5538 | + */ |
|---|
| 5539 | + destroy: function() { |
|---|
| 5540 | + data = null; |
|---|
| 5541 | + stats = null; |
|---|
| 5542 | + lruHash = null; |
|---|
| 5543 | + delete caches[cacheId]; |
|---|
| 5544 | + }, |
|---|
| 5545 | + |
|---|
| 5546 | + |
|---|
| 5547 | + /** |
|---|
| 5548 | + * @ngdoc method |
|---|
| 5549 | + * @name $cacheFactory.Cache#info |
|---|
| 5550 | + * @kind function |
|---|
| 5551 | + * |
|---|
| 5552 | + * @description |
|---|
| 5553 | + * Retrieve information regarding a particular {@link $cacheFactory.Cache Cache}. |
|---|
| 5554 | + * |
|---|
| 5555 | + * @returns {object} an object with the following properties: |
|---|
| 5556 | + * <ul> |
|---|
| 5557 | + * <li>**id**: the id of the cache instance</li> |
|---|
| 5558 | + * <li>**size**: the number of entries kept in the cache instance</li> |
|---|
| 5559 | + * <li>**...**: any additional properties from the options object when creating the |
|---|
| 5560 | + * cache.</li> |
|---|
| 5561 | + * </ul> |
|---|
| 5562 | + */ |
|---|
| 5563 | + info: function() { |
|---|
| 5564 | + return extend({}, stats, {size: size}); |
|---|
| 5565 | + } |
|---|
| 5566 | + }; |
|---|
| 5567 | + |
|---|
| 5568 | + |
|---|
| 5569 | + /** |
|---|
| 5570 | + * makes the `entry` the freshEnd of the LRU linked list |
|---|
| 5571 | + */ |
|---|
| 5572 | + function refresh(entry) { |
|---|
| 5573 | + if (entry != freshEnd) { |
|---|
| 5574 | + if (!staleEnd) { |
|---|
| 5575 | + staleEnd = entry; |
|---|
| 5576 | + } else if (staleEnd == entry) { |
|---|
| 5577 | + staleEnd = entry.n; |
|---|
| 5578 | + } |
|---|
| 5579 | + |
|---|
| 5580 | + link(entry.n, entry.p); |
|---|
| 5581 | + link(entry, freshEnd); |
|---|
| 5582 | + freshEnd = entry; |
|---|
| 5583 | + freshEnd.n = null; |
|---|
| 5584 | + } |
|---|
| 5585 | + } |
|---|
| 5586 | + |
|---|
| 5587 | + |
|---|
| 5588 | + /** |
|---|
| 5589 | + * bidirectionally links two entries of the LRU linked list |
|---|
| 5590 | + */ |
|---|
| 5591 | + function link(nextEntry, prevEntry) { |
|---|
| 5592 | + if (nextEntry != prevEntry) { |
|---|
| 5593 | + if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify |
|---|
| 5594 | + if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify |
|---|
| 5595 | + } |
|---|
| 5596 | + } |
|---|
| 5597 | + } |
|---|
| 5598 | + |
|---|
| 5599 | + |
|---|
| 5600 | + /** |
|---|
| 5601 | + * @ngdoc method |
|---|
| 5602 | + * @name $cacheFactory#info |
|---|
| 5603 | + * |
|---|
| 5604 | + * @description |
|---|
| 5605 | + * Get information about all the caches that have been created |
|---|
| 5606 | + * |
|---|
| 5607 | + * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info` |
|---|
| 5608 | + */ |
|---|
| 5609 | + cacheFactory.info = function() { |
|---|
| 5610 | + var info = {}; |
|---|
| 5611 | + forEach(caches, function(cache, cacheId) { |
|---|
| 5612 | + info[cacheId] = cache.info(); |
|---|
| 5613 | + }); |
|---|
| 5614 | + return info; |
|---|
| 5615 | + }; |
|---|
| 5616 | + |
|---|
| 5617 | + |
|---|
| 5618 | + /** |
|---|
| 5619 | + * @ngdoc method |
|---|
| 5620 | + * @name $cacheFactory#get |
|---|
| 5621 | + * |
|---|
| 5622 | + * @description |
|---|
| 5623 | + * Get access to a cache object by the `cacheId` used when it was created. |
|---|
| 5624 | + * |
|---|
| 5625 | + * @param {string} cacheId Name or id of a cache to access. |
|---|
| 5626 | + * @returns {object} Cache object identified by the cacheId or undefined if no such cache. |
|---|
| 5627 | + */ |
|---|
| 5628 | + cacheFactory.get = function(cacheId) { |
|---|
| 5629 | + return caches[cacheId]; |
|---|
| 5630 | + }; |
|---|
| 5631 | + |
|---|
| 5632 | + |
|---|
| 5633 | + return cacheFactory; |
|---|
| 5634 | + }; |
|---|
| 5635 | +} |
|---|
| 5636 | + |
|---|
| 5637 | +/** |
|---|
| 5638 | + * @ngdoc service |
|---|
| 5639 | + * @name $templateCache |
|---|
| 5640 | + * |
|---|
| 5641 | + * @description |
|---|
| 5642 | + * The first time a template is used, it is loaded in the template cache for quick retrieval. You |
|---|
| 5643 | + * can load templates directly into the cache in a `script` tag, or by consuming the |
|---|
| 5644 | + * `$templateCache` service directly. |
|---|
| 5645 | + * |
|---|
| 5646 | + * Adding via the `script` tag: |
|---|
| 5647 | + * |
|---|
| 5648 | + * ```html |
|---|
| 5649 | + * <script type="text/ng-template" id="templateId.html"> |
|---|
| 5650 | + * <p>This is the content of the template</p> |
|---|
| 5651 | + * </script> |
|---|
| 5652 | + * ``` |
|---|
| 5653 | + * |
|---|
| 5654 | + * **Note:** the `script` tag containing the template does not need to be included in the `head` of |
|---|
| 5655 | + * the document, but it must be below the `ng-app` definition. |
|---|
| 5656 | + * |
|---|
| 5657 | + * Adding via the $templateCache service: |
|---|
| 5658 | + * |
|---|
| 5659 | + * ```js |
|---|
| 5660 | + * var myApp = angular.module('myApp', []); |
|---|
| 5661 | + * myApp.run(function($templateCache) { |
|---|
| 5662 | + * $templateCache.put('templateId.html', 'This is the content of the template'); |
|---|
| 5663 | + * }); |
|---|
| 5664 | + * ``` |
|---|
| 5665 | + * |
|---|
| 5666 | + * To retrieve the template later, simply use it in your HTML: |
|---|
| 5667 | + * ```html |
|---|
| 5668 | + * <div ng-include=" 'templateId.html' "></div> |
|---|
| 5669 | + * ``` |
|---|
| 5670 | + * |
|---|
| 5671 | + * or get it via Javascript: |
|---|
| 5672 | + * ```js |
|---|
| 5673 | + * $templateCache.get('templateId.html') |
|---|
| 5674 | + * ``` |
|---|
| 5675 | + * |
|---|
| 5676 | + * See {@link ng.$cacheFactory $cacheFactory}. |
|---|
| 5677 | + * |
|---|
| 5678 | + */ |
|---|
| 5679 | +function $TemplateCacheProvider() { |
|---|
| 5680 | + this.$get = ['$cacheFactory', function($cacheFactory) { |
|---|
| 5681 | + return $cacheFactory('templates'); |
|---|
| 5682 | + }]; |
|---|
| 5683 | +} |
|---|
| 5684 | + |
|---|
| 5685 | +/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE! |
|---|
| 5686 | + * |
|---|
| 5687 | + * DOM-related variables: |
|---|
| 5688 | + * |
|---|
| 5689 | + * - "node" - DOM Node |
|---|
| 5690 | + * - "element" - DOM Element or Node |
|---|
| 5691 | + * - "$node" or "$element" - jqLite-wrapped node or element |
|---|
| 5692 | + * |
|---|
| 5693 | + * |
|---|
| 5694 | + * Compiler related stuff: |
|---|
| 5695 | + * |
|---|
| 5696 | + * - "linkFn" - linking fn of a single directive |
|---|
| 5697 | + * - "nodeLinkFn" - function that aggregates all linking fns for a particular node |
|---|
| 5698 | + * - "childLinkFn" - function that aggregates all linking fns for child nodes of a particular node |
|---|
| 5699 | + * - "compositeLinkFn" - function that aggregates all linking fns for a compilation root (nodeList) |
|---|
| 5700 | + */ |
|---|
| 5701 | + |
|---|
| 5702 | + |
|---|
| 5703 | +/** |
|---|
| 5704 | + * @ngdoc service |
|---|
| 5705 | + * @name $compile |
|---|
| 5706 | + * @kind function |
|---|
| 5707 | + * |
|---|
| 5708 | + * @description |
|---|
| 5709 | + * Compiles an HTML string or DOM into a template and produces a template function, which |
|---|
| 5710 | + * can then be used to link {@link ng.$rootScope.Scope `scope`} and the template together. |
|---|
| 5711 | + * |
|---|
| 5712 | + * The compilation is a process of walking the DOM tree and matching DOM elements to |
|---|
| 5713 | + * {@link ng.$compileProvider#directive directives}. |
|---|
| 5714 | + * |
|---|
| 5715 | + * <div class="alert alert-warning"> |
|---|
| 5716 | + * **Note:** This document is an in-depth reference of all directive options. |
|---|
| 5717 | + * For a gentle introduction to directives with examples of common use cases, |
|---|
| 5718 | + * see the {@link guide/directive directive guide}. |
|---|
| 5719 | + * </div> |
|---|
| 5720 | + * |
|---|
| 5721 | + * ## Comprehensive Directive API |
|---|
| 5722 | + * |
|---|
| 5723 | + * There are many different options for a directive. |
|---|
| 5724 | + * |
|---|
| 5725 | + * The difference resides in the return value of the factory function. |
|---|
| 5726 | + * You can either return a "Directive Definition Object" (see below) that defines the directive properties, |
|---|
| 5727 | + * or just the `postLink` function (all other properties will have the default values). |
|---|
| 5728 | + * |
|---|
| 5729 | + * <div class="alert alert-success"> |
|---|
| 5730 | + * **Best Practice:** It's recommended to use the "directive definition object" form. |
|---|
| 5731 | + * </div> |
|---|
| 5732 | + * |
|---|
| 5733 | + * Here's an example directive declared with a Directive Definition Object: |
|---|
| 5734 | + * |
|---|
| 5735 | + * ```js |
|---|
| 5736 | + * var myModule = angular.module(...); |
|---|
| 5737 | + * |
|---|
| 5738 | + * myModule.directive('directiveName', function factory(injectables) { |
|---|
| 5739 | + * var directiveDefinitionObject = { |
|---|
| 5740 | + * priority: 0, |
|---|
| 5741 | + * template: '<div></div>', // or // function(tElement, tAttrs) { ... }, |
|---|
| 5742 | + * // or |
|---|
| 5743 | + * // templateUrl: 'directive.html', // or // function(tElement, tAttrs) { ... }, |
|---|
| 5744 | + * transclude: false, |
|---|
| 5745 | + * restrict: 'A', |
|---|
| 5746 | + * templateNamespace: 'html', |
|---|
| 5747 | + * scope: false, |
|---|
| 5748 | + * controller: function($scope, $element, $attrs, $transclude, otherInjectables) { ... }, |
|---|
| 5749 | + * controllerAs: 'stringAlias', |
|---|
| 5750 | + * require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'], |
|---|
| 5751 | + * compile: function compile(tElement, tAttrs, transclude) { |
|---|
| 5752 | + * return { |
|---|
| 5753 | + * pre: function preLink(scope, iElement, iAttrs, controller) { ... }, |
|---|
| 5754 | + * post: function postLink(scope, iElement, iAttrs, controller) { ... } |
|---|
| 5755 | + * } |
|---|
| 5756 | + * // or |
|---|
| 5757 | + * // return function postLink( ... ) { ... } |
|---|
| 5758 | + * }, |
|---|
| 5759 | + * // or |
|---|
| 5760 | + * // link: { |
|---|
| 5761 | + * // pre: function preLink(scope, iElement, iAttrs, controller) { ... }, |
|---|
| 5762 | + * // post: function postLink(scope, iElement, iAttrs, controller) { ... } |
|---|
| 5763 | + * // } |
|---|
| 5764 | + * // or |
|---|
| 5765 | + * // link: function postLink( ... ) { ... } |
|---|
| 5766 | + * }; |
|---|
| 5767 | + * return directiveDefinitionObject; |
|---|
| 5768 | + * }); |
|---|
| 5769 | + * ``` |
|---|
| 5770 | + * |
|---|
| 5771 | + * <div class="alert alert-warning"> |
|---|
| 5772 | + * **Note:** Any unspecified options will use the default value. You can see the default values below. |
|---|
| 5773 | + * </div> |
|---|
| 5774 | + * |
|---|
| 5775 | + * Therefore the above can be simplified as: |
|---|
| 5776 | + * |
|---|
| 5777 | + * ```js |
|---|
| 5778 | + * var myModule = angular.module(...); |
|---|
| 5779 | + * |
|---|
| 5780 | + * myModule.directive('directiveName', function factory(injectables) { |
|---|
| 5781 | + * var directiveDefinitionObject = { |
|---|
| 5782 | + * link: function postLink(scope, iElement, iAttrs) { ... } |
|---|
| 5783 | + * }; |
|---|
| 5784 | + * return directiveDefinitionObject; |
|---|
| 5785 | + * // or |
|---|
| 5786 | + * // return function postLink(scope, iElement, iAttrs) { ... } |
|---|
| 5787 | + * }); |
|---|
| 5788 | + * ``` |
|---|
| 5789 | + * |
|---|
| 5790 | + * |
|---|
| 5791 | + * |
|---|
| 5792 | + * ### Directive Definition Object |
|---|
| 5793 | + * |
|---|
| 5794 | + * The directive definition object provides instructions to the {@link ng.$compile |
|---|
| 5795 | + * compiler}. The attributes are: |
|---|
| 5796 | + * |
|---|
| 5797 | + * #### `multiElement` |
|---|
| 5798 | + * When this property is set to true, the HTML compiler will collect DOM nodes between |
|---|
| 5799 | + * nodes with the attributes `directive-name-start` and `directive-name-end`, and group them |
|---|
| 5800 | + * together as the directive elements. It is recomended that this feature be used on directives |
|---|
| 5801 | + * which are not strictly behavioural (such as {@link ngClick}), and which |
|---|
| 5802 | + * do not manipulate or replace child nodes (such as {@link ngInclude}). |
|---|
| 5803 | + * |
|---|
| 5804 | + * #### `priority` |
|---|
| 5805 | + * When there are multiple directives defined on a single DOM element, sometimes it |
|---|
| 5806 | + * is necessary to specify the order in which the directives are applied. The `priority` is used |
|---|
| 5807 | + * to sort the directives before their `compile` functions get called. Priority is defined as a |
|---|
| 5808 | + * number. Directives with greater numerical `priority` are compiled first. Pre-link functions |
|---|
| 5809 | + * are also run in priority order, but post-link functions are run in reverse order. The order |
|---|
| 5810 | + * of directives with the same priority is undefined. The default priority is `0`. |
|---|
| 5811 | + * |
|---|
| 5812 | + * #### `terminal` |
|---|
| 5813 | + * If set to true then the current `priority` will be the last set of directives |
|---|
| 5814 | + * which will execute (any directives at the current priority will still execute |
|---|
| 5815 | + * as the order of execution on same `priority` is undefined). Note that expressions |
|---|
| 5816 | + * and other directives used in the directive's template will also be excluded from execution. |
|---|
| 5817 | + * |
|---|
| 5818 | + * #### `scope` |
|---|
| 5819 | + * **If set to `true`,** then a new scope will be created for this directive. If multiple directives on the |
|---|
| 5820 | + * same element request a new scope, only one new scope is created. The new scope rule does not |
|---|
| 5821 | + * apply for the root of the template since the root of the template always gets a new scope. |
|---|
| 5822 | + * |
|---|
| 5823 | + * **If set to `{}` (object hash),** then a new "isolate" scope is created. The 'isolate' scope differs from |
|---|
| 5824 | + * normal scope in that it does not prototypically inherit from the parent scope. This is useful |
|---|
| 5825 | + * when creating reusable components, which should not accidentally read or modify data in the |
|---|
| 5826 | + * parent scope. |
|---|
| 5827 | + * |
|---|
| 5828 | + * The 'isolate' scope takes an object hash which defines a set of local scope properties |
|---|
| 5829 | + * derived from the parent scope. These local properties are useful for aliasing values for |
|---|
| 5830 | + * templates. Locals definition is a hash of local scope property to its source: |
|---|
| 5831 | + * |
|---|
| 5832 | + * * `@` or `@attr` - bind a local scope property to the value of DOM attribute. The result is |
|---|
| 5833 | + * always a string since DOM attributes are strings. If no `attr` name is specified then the |
|---|
| 5834 | + * attribute name is assumed to be the same as the local name. |
|---|
| 5835 | + * Given `<widget my-attr="hello {{name}}">` and widget definition |
|---|
| 5836 | + * of `scope: { localName:'@myAttr' }`, then widget scope property `localName` will reflect |
|---|
| 5837 | + * the interpolated value of `hello {{name}}`. As the `name` attribute changes so will the |
|---|
| 5838 | + * `localName` property on the widget scope. The `name` is read from the parent scope (not |
|---|
| 5839 | + * component scope). |
|---|
| 5840 | + * |
|---|
| 5841 | + * * `=` or `=attr` - set up bi-directional binding between a local scope property and the |
|---|
| 5842 | + * parent scope property of name defined via the value of the `attr` attribute. If no `attr` |
|---|
| 5843 | + * name is specified then the attribute name is assumed to be the same as the local name. |
|---|
| 5844 | + * Given `<widget my-attr="parentModel">` and widget definition of |
|---|
| 5845 | + * `scope: { localModel:'=myAttr' }`, then widget scope property `localModel` will reflect the |
|---|
| 5846 | + * value of `parentModel` on the parent scope. Any changes to `parentModel` will be reflected |
|---|
| 5847 | + * in `localModel` and any changes in `localModel` will reflect in `parentModel`. If the parent |
|---|
| 5848 | + * scope property doesn't exist, it will throw a NON_ASSIGNABLE_MODEL_EXPRESSION exception. You |
|---|
| 5849 | + * can avoid this behavior using `=?` or `=?attr` in order to flag the property as optional. |
|---|
| 5850 | + * |
|---|
| 5851 | + * * `&` or `&attr` - provides a way to execute an expression in the context of the parent scope. |
|---|
| 5852 | + * If no `attr` name is specified then the attribute name is assumed to be the same as the |
|---|
| 5853 | + * local name. Given `<widget my-attr="count = count + value">` and widget definition of |
|---|
| 5854 | + * `scope: { localFn:'&myAttr' }`, then isolate scope property `localFn` will point to |
|---|
| 5855 | + * a function wrapper for the `count = count + value` expression. Often it's desirable to |
|---|
| 5856 | + * pass data from the isolated scope via an expression to the parent scope, this can be |
|---|
| 5857 | + * done by passing a map of local variable names and values into the expression wrapper fn. |
|---|
| 5858 | + * For example, if the expression is `increment(amount)` then we can specify the amount value |
|---|
| 5859 | + * by calling the `localFn` as `localFn({amount: 22})`. |
|---|
| 5860 | + * |
|---|
| 5861 | + * |
|---|
| 5862 | + * #### `bindToController` |
|---|
| 5863 | + * When an isolate scope is used for a component (see above), and `controllerAs` is used, `bindToController` will |
|---|
| 5864 | + * allow a component to have its properties bound to the controller, rather than to scope. When the controller |
|---|
| 5865 | + * is instantiated, the initial values of the isolate scope bindings are already available. |
|---|
| 5866 | + * |
|---|
| 5867 | + * #### `controller` |
|---|
| 5868 | + * Controller constructor function. The controller is instantiated before the |
|---|
| 5869 | + * pre-linking phase and it is shared with other directives (see |
|---|
| 5870 | + * `require` attribute). This allows the directives to communicate with each other and augment |
|---|
| 5871 | + * each other's behavior. The controller is injectable (and supports bracket notation) with the following locals: |
|---|
| 5872 | + * |
|---|
| 5873 | + * * `$scope` - Current scope associated with the element |
|---|
| 5874 | + * * `$element` - Current element |
|---|
| 5875 | + * * `$attrs` - Current attributes object for the element |
|---|
| 5876 | + * * `$transclude` - A transclude linking function pre-bound to the correct transclusion scope: |
|---|
| 5877 | + * `function([scope], cloneLinkingFn, futureParentElement)`. |
|---|
| 5878 | + * * `scope`: optional argument to override the scope. |
|---|
| 5879 | + * * `cloneLinkingFn`: optional argument to create clones of the original transcluded content. |
|---|
| 5880 | + * * `futureParentElement`: |
|---|
| 5881 | + * * defines the parent to which the `cloneLinkingFn` will add the cloned elements. |
|---|
| 5882 | + * * default: `$element.parent()` resp. `$element` for `transclude:'element'` resp. `transclude:true`. |
|---|
| 5883 | + * * only needed for transcludes that are allowed to contain non html elements (e.g. SVG elements) |
|---|
| 5884 | + * and when the `cloneLinkinFn` is passed, |
|---|
| 5885 | + * as those elements need to created and cloned in a special way when they are defined outside their |
|---|
| 5886 | + * usual containers (e.g. like `<svg>`). |
|---|
| 5887 | + * * See also the `directive.templateNamespace` property. |
|---|
| 5888 | + * |
|---|
| 5889 | + * |
|---|
| 5890 | + * #### `require` |
|---|
| 5891 | + * Require another directive and inject its controller as the fourth argument to the linking function. The |
|---|
| 5892 | + * `require` takes a string name (or array of strings) of the directive(s) to pass in. If an array is used, the |
|---|
| 5893 | + * injected argument will be an array in corresponding order. If no such directive can be |
|---|
| 5894 | + * found, or if the directive does not have a controller, then an error is raised. The name can be prefixed with: |
|---|
| 5895 | + * |
|---|
| 5896 | + * * (no prefix) - Locate the required controller on the current element. Throw an error if not found. |
|---|
| 5897 | + * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found. |
|---|
| 5898 | + * * `^` - Locate the required controller by searching the element and its parents. Throw an error if not found. |
|---|
| 5899 | + * * `^^` - Locate the required controller by searching the element's parents. Throw an error if not found. |
|---|
| 5900 | + * * `?^` - Attempt to locate the required controller by searching the element and its parents or pass |
|---|
| 5901 | + * `null` to the `link` fn if not found. |
|---|
| 5902 | + * * `?^^` - Attempt to locate the required controller by searching the element's parents, or pass |
|---|
| 5903 | + * `null` to the `link` fn if not found. |
|---|
| 5904 | + * |
|---|
| 5905 | + * |
|---|
| 5906 | + * #### `controllerAs` |
|---|
| 5907 | + * Controller alias at the directive scope. An alias for the controller so it |
|---|
| 5908 | + * can be referenced at the directive template. The directive needs to define a scope for this |
|---|
| 5909 | + * configuration to be used. Useful in the case when directive is used as component. |
|---|
| 5910 | + * |
|---|
| 5911 | + * |
|---|
| 5912 | + * #### `restrict` |
|---|
| 5913 | + * String of subset of `EACM` which restricts the directive to a specific directive |
|---|
| 5914 | + * declaration style. If omitted, the defaults (elements and attributes) are used. |
|---|
| 5915 | + * |
|---|
| 5916 | + * * `E` - Element name (default): `<my-directive></my-directive>` |
|---|
| 5917 | + * * `A` - Attribute (default): `<div my-directive="exp"></div>` |
|---|
| 5918 | + * * `C` - Class: `<div class="my-directive: exp;"></div>` |
|---|
| 5919 | + * * `M` - Comment: `<!-- directive: my-directive exp -->` |
|---|
| 5920 | + * |
|---|
| 5921 | + * |
|---|
| 5922 | + * #### `templateNamespace` |
|---|
| 5923 | + * String representing the document type used by the markup in the template. |
|---|
| 5924 | + * AngularJS needs this information as those elements need to be created and cloned |
|---|
| 5925 | + * in a special way when they are defined outside their usual containers like `<svg>` and `<math>`. |
|---|
| 5926 | + * |
|---|
| 5927 | + * * `html` - All root nodes in the template are HTML. Root nodes may also be |
|---|
| 5928 | + * top-level elements such as `<svg>` or `<math>`. |
|---|
| 5929 | + * * `svg` - The root nodes in the template are SVG elements (excluding `<math>`). |
|---|
| 5930 | + * * `math` - The root nodes in the template are MathML elements (excluding `<svg>`). |
|---|
| 5931 | + * |
|---|
| 5932 | + * If no `templateNamespace` is specified, then the namespace is considered to be `html`. |
|---|
| 5933 | + * |
|---|
| 5934 | + * #### `template` |
|---|
| 5935 | + * HTML markup that may: |
|---|
| 5936 | + * * Replace the contents of the directive's element (default). |
|---|
| 5937 | + * * Replace the directive's element itself (if `replace` is true - DEPRECATED). |
|---|
| 5938 | + * * Wrap the contents of the directive's element (if `transclude` is true). |
|---|
| 5939 | + * |
|---|
| 5940 | + * Value may be: |
|---|
| 5941 | + * |
|---|
| 5942 | + * * A string. For example `<div red-on-hover>{{delete_str}}</div>`. |
|---|
| 5943 | + * * A function which takes two arguments `tElement` and `tAttrs` (described in the `compile` |
|---|
| 5944 | + * function api below) and returns a string value. |
|---|
| 5945 | + * |
|---|
| 5946 | + * |
|---|
| 5947 | + * #### `templateUrl` |
|---|
| 5948 | + * This is similar to `template` but the template is loaded from the specified URL, asynchronously. |
|---|
| 5949 | + * |
|---|
| 5950 | + * Because template loading is asynchronous the compiler will suspend compilation of directives on that element |
|---|
| 5951 | + * for later when the template has been resolved. In the meantime it will continue to compile and link |
|---|
| 5952 | + * sibling and parent elements as though this element had not contained any directives. |
|---|
| 5953 | + * |
|---|
| 5954 | + * The compiler does not suspend the entire compilation to wait for templates to be loaded because this |
|---|
| 5955 | + * would result in the whole app "stalling" until all templates are loaded asynchronously - even in the |
|---|
| 5956 | + * case when only one deeply nested directive has `templateUrl`. |
|---|
| 5957 | + * |
|---|
| 5958 | + * Template loading is asynchronous even if the template has been preloaded into the {@link $templateCache} |
|---|
| 5959 | + * |
|---|
| 5960 | + * You can specify `templateUrl` as a string representing the URL or as a function which takes two |
|---|
| 5961 | + * arguments `tElement` and `tAttrs` (described in the `compile` function api below) and returns |
|---|
| 5962 | + * a string value representing the url. In either case, the template URL is passed through {@link |
|---|
| 5963 | + * $sce#getTrustedResourceUrl $sce.getTrustedResourceUrl}. |
|---|
| 5964 | + * |
|---|
| 5965 | + * |
|---|
| 5966 | + * #### `replace` ([*DEPRECATED*!], will be removed in next major release - i.e. v2.0) |
|---|
| 5967 | + * specify what the template should replace. Defaults to `false`. |
|---|
| 5968 | + * |
|---|
| 5969 | + * * `true` - the template will replace the directive's element. |
|---|
| 5970 | + * * `false` - the template will replace the contents of the directive's element. |
|---|
| 5971 | + * |
|---|
| 5972 | + * The replacement process migrates all of the attributes / classes from the old element to the new |
|---|
| 5973 | + * one. See the {@link guide/directive#template-expanding-directive |
|---|
| 5974 | + * Directives Guide} for an example. |
|---|
| 5975 | + * |
|---|
| 5976 | + * There are very few scenarios where element replacement is required for the application function, |
|---|
| 5977 | + * the main one being reusable custom components that are used within SVG contexts |
|---|
| 5978 | + * (because SVG doesn't work with custom elements in the DOM tree). |
|---|
| 5979 | + * |
|---|
| 5980 | + * #### `transclude` |
|---|
| 5981 | + * Extract the contents of the element where the directive appears and make it available to the directive. |
|---|
| 5982 | + * The contents are compiled and provided to the directive as a **transclusion function**. See the |
|---|
| 5983 | + * {@link $compile#transclusion Transclusion} section below. |
|---|
| 5984 | + * |
|---|
| 5985 | + * There are two kinds of transclusion depending upon whether you want to transclude just the contents of the |
|---|
| 5986 | + * directive's element or the entire element: |
|---|
| 5987 | + * |
|---|
| 5988 | + * * `true` - transclude the content (i.e. the child nodes) of the directive's element. |
|---|
| 5989 | + * * `'element'` - transclude the whole of the directive's element including any directives on this |
|---|
| 5990 | + * element that defined at a lower priority than this directive. When used, the `template` |
|---|
| 5991 | + * property is ignored. |
|---|
| 5992 | + * |
|---|
| 5993 | + * |
|---|
| 5994 | + * #### `compile` |
|---|
| 5995 | + * |
|---|
| 5996 | + * ```js |
|---|
| 5997 | + * function compile(tElement, tAttrs, transclude) { ... } |
|---|
| 5998 | + * ``` |
|---|
| 5999 | + * |
|---|
| 6000 | + * The compile function deals with transforming the template DOM. Since most directives do not do |
|---|
| 6001 | + * template transformation, it is not used often. The compile function takes the following arguments: |
|---|
| 6002 | + * |
|---|
| 6003 | + * * `tElement` - template element - The element where the directive has been declared. It is |
|---|
| 6004 | + * safe to do template transformation on the element and child elements only. |
|---|
| 6005 | + * |
|---|
| 6006 | + * * `tAttrs` - template attributes - Normalized list of attributes declared on this element shared |
|---|
| 6007 | + * between all directive compile functions. |
|---|
| 6008 | + * |
|---|
| 6009 | + * * `transclude` - [*DEPRECATED*!] A transclude linking function: `function(scope, cloneLinkingFn)` |
|---|
| 6010 | + * |
|---|
| 6011 | + * <div class="alert alert-warning"> |
|---|
| 6012 | + * **Note:** The template instance and the link instance may be different objects if the template has |
|---|
| 6013 | + * been cloned. For this reason it is **not** safe to do anything other than DOM transformations that |
|---|
| 6014 | + * apply to all cloned DOM nodes within the compile function. Specifically, DOM listener registration |
|---|
| 6015 | + * should be done in a linking function rather than in a compile function. |
|---|
| 6016 | + * </div> |
|---|
| 6017 | + |
|---|
| 6018 | + * <div class="alert alert-warning"> |
|---|
| 6019 | + * **Note:** The compile function cannot handle directives that recursively use themselves in their |
|---|
| 6020 | + * own templates or compile functions. Compiling these directives results in an infinite loop and a |
|---|
| 6021 | + * stack overflow errors. |
|---|
| 6022 | + * |
|---|
| 6023 | + * This can be avoided by manually using $compile in the postLink function to imperatively compile |
|---|
| 6024 | + * a directive's template instead of relying on automatic template compilation via `template` or |
|---|
| 6025 | + * `templateUrl` declaration or manual compilation inside the compile function. |
|---|
| 6026 | + * </div> |
|---|
| 6027 | + * |
|---|
| 6028 | + * <div class="alert alert-error"> |
|---|
| 6029 | + * **Note:** The `transclude` function that is passed to the compile function is deprecated, as it |
|---|
| 6030 | + * e.g. does not know about the right outer scope. Please use the transclude function that is passed |
|---|
| 6031 | + * to the link function instead. |
|---|
| 6032 | + * </div> |
|---|
| 6033 | + |
|---|
| 6034 | + * A compile function can have a return value which can be either a function or an object. |
|---|
| 6035 | + * |
|---|
| 6036 | + * * returning a (post-link) function - is equivalent to registering the linking function via the |
|---|
| 6037 | + * `link` property of the config object when the compile function is empty. |
|---|
| 6038 | + * |
|---|
| 6039 | + * * returning an object with function(s) registered via `pre` and `post` properties - allows you to |
|---|
| 6040 | + * control when a linking function should be called during the linking phase. See info about |
|---|
| 6041 | + * pre-linking and post-linking functions below. |
|---|
| 6042 | + * |
|---|
| 6043 | + * |
|---|
| 6044 | + * #### `link` |
|---|
| 6045 | + * This property is used only if the `compile` property is not defined. |
|---|
| 6046 | + * |
|---|
| 6047 | + * ```js |
|---|
| 6048 | + * function link(scope, iElement, iAttrs, controller, transcludeFn) { ... } |
|---|
| 6049 | + * ``` |
|---|
| 6050 | + * |
|---|
| 6051 | + * The link function is responsible for registering DOM listeners as well as updating the DOM. It is |
|---|
| 6052 | + * executed after the template has been cloned. This is where most of the directive logic will be |
|---|
| 6053 | + * put. |
|---|
| 6054 | + * |
|---|
| 6055 | + * * `scope` - {@link ng.$rootScope.Scope Scope} - The scope to be used by the |
|---|
| 6056 | + * directive for registering {@link ng.$rootScope.Scope#$watch watches}. |
|---|
| 6057 | + * |
|---|
| 6058 | + * * `iElement` - instance element - The element where the directive is to be used. It is safe to |
|---|
| 6059 | + * manipulate the children of the element only in `postLink` function since the children have |
|---|
| 6060 | + * already been linked. |
|---|
| 6061 | + * |
|---|
| 6062 | + * * `iAttrs` - instance attributes - Normalized list of attributes declared on this element shared |
|---|
| 6063 | + * between all directive linking functions. |
|---|
| 6064 | + * |
|---|
| 6065 | + * * `controller` - a controller instance - A controller instance if at least one directive on the |
|---|
| 6066 | + * element defines a controller. The controller is shared among all the directives, which allows |
|---|
| 6067 | + * the directives to use the controllers as a communication channel. |
|---|
| 6068 | + * |
|---|
| 6069 | + * * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope. |
|---|
| 6070 | + * This is the same as the `$transclude` |
|---|
| 6071 | + * parameter of directive controllers, see there for details. |
|---|
| 6072 | + * `function([scope], cloneLinkingFn, futureParentElement)`. |
|---|
| 6073 | + * |
|---|
| 6074 | + * #### Pre-linking function |
|---|
| 6075 | + * |
|---|
| 6076 | + * Executed before the child elements are linked. Not safe to do DOM transformation since the |
|---|
| 6077 | + * compiler linking function will fail to locate the correct elements for linking. |
|---|
| 6078 | + * |
|---|
| 6079 | + * #### Post-linking function |
|---|
| 6080 | + * |
|---|
| 6081 | + * Executed after the child elements are linked. |
|---|
| 6082 | + * |
|---|
| 6083 | + * Note that child elements that contain `templateUrl` directives will not have been compiled |
|---|
| 6084 | + * and linked since they are waiting for their template to load asynchronously and their own |
|---|
| 6085 | + * compilation and linking has been suspended until that occurs. |
|---|
| 6086 | + * |
|---|
| 6087 | + * It is safe to do DOM transformation in the post-linking function on elements that are not waiting |
|---|
| 6088 | + * for their async templates to be resolved. |
|---|
| 6089 | + * |
|---|
| 6090 | + * |
|---|
| 6091 | + * ### Transclusion |
|---|
| 6092 | + * |
|---|
| 6093 | + * Transclusion is the process of extracting a collection of DOM element from one part of the DOM and |
|---|
| 6094 | + * copying them to another part of the DOM, while maintaining their connection to the original AngularJS |
|---|
| 6095 | + * scope from where they were taken. |
|---|
| 6096 | + * |
|---|
| 6097 | + * Transclusion is used (often with {@link ngTransclude}) to insert the |
|---|
| 6098 | + * original contents of a directive's element into a specified place in the template of the directive. |
|---|
| 6099 | + * The benefit of transclusion, over simply moving the DOM elements manually, is that the transcluded |
|---|
| 6100 | + * content has access to the properties on the scope from which it was taken, even if the directive |
|---|
| 6101 | + * has isolated scope. |
|---|
| 6102 | + * See the {@link guide/directive#creating-a-directive-that-wraps-other-elements Directives Guide}. |
|---|
| 6103 | + * |
|---|
| 6104 | + * This makes it possible for the widget to have private state for its template, while the transcluded |
|---|
| 6105 | + * content has access to its originating scope. |
|---|
| 6106 | + * |
|---|
| 6107 | + * <div class="alert alert-warning"> |
|---|
| 6108 | + * **Note:** When testing an element transclude directive you must not place the directive at the root of the |
|---|
| 6109 | + * DOM fragment that is being compiled. See {@link guide/unit-testing#testing-transclusion-directives |
|---|
| 6110 | + * Testing Transclusion Directives}. |
|---|
| 6111 | + * </div> |
|---|
| 6112 | + * |
|---|
| 6113 | + * #### Transclusion Functions |
|---|
| 6114 | + * |
|---|
| 6115 | + * When a directive requests transclusion, the compiler extracts its contents and provides a **transclusion |
|---|
| 6116 | + * function** to the directive's `link` function and `controller`. This transclusion function is a special |
|---|
| 6117 | + * **linking function** that will return the compiled contents linked to a new transclusion scope. |
|---|
| 6118 | + * |
|---|
| 6119 | + * <div class="alert alert-info"> |
|---|
| 6120 | + * If you are just using {@link ngTransclude} then you don't need to worry about this function, since |
|---|
| 6121 | + * ngTransclude will deal with it for us. |
|---|
| 6122 | + * </div> |
|---|
| 6123 | + * |
|---|
| 6124 | + * If you want to manually control the insertion and removal of the transcluded content in your directive |
|---|
| 6125 | + * then you must use this transclude function. When you call a transclude function it returns a a jqLite/JQuery |
|---|
| 6126 | + * object that contains the compiled DOM, which is linked to the correct transclusion scope. |
|---|
| 6127 | + * |
|---|
| 6128 | + * When you call a transclusion function you can pass in a **clone attach function**. This function accepts |
|---|
| 6129 | + * two parameters, `function(clone, scope) { ... }`, where the `clone` is a fresh compiled copy of your transcluded |
|---|
| 6130 | + * content and the `scope` is the newly created transclusion scope, to which the clone is bound. |
|---|
| 6131 | + * |
|---|
| 6132 | + * <div class="alert alert-info"> |
|---|
| 6133 | + * **Best Practice**: Always provide a `cloneFn` (clone attach function) when you call a translude function |
|---|
| 6134 | + * since you then get a fresh clone of the original DOM and also have access to the new transclusion scope. |
|---|
| 6135 | + * </div> |
|---|
| 6136 | + * |
|---|
| 6137 | + * It is normal practice to attach your transcluded content (`clone`) to the DOM inside your **clone |
|---|
| 6138 | + * attach function**: |
|---|
| 6139 | + * |
|---|
| 6140 | + * ```js |
|---|
| 6141 | + * var transcludedContent, transclusionScope; |
|---|
| 6142 | + * |
|---|
| 6143 | + * $transclude(function(clone, scope) { |
|---|
| 6144 | + * element.append(clone); |
|---|
| 6145 | + * transcludedContent = clone; |
|---|
| 6146 | + * transclusionScope = scope; |
|---|
| 6147 | + * }); |
|---|
| 6148 | + * ``` |
|---|
| 6149 | + * |
|---|
| 6150 | + * Later, if you want to remove the transcluded content from your DOM then you should also destroy the |
|---|
| 6151 | + * associated transclusion scope: |
|---|
| 6152 | + * |
|---|
| 6153 | + * ```js |
|---|
| 6154 | + * transcludedContent.remove(); |
|---|
| 6155 | + * transclusionScope.$destroy(); |
|---|
| 6156 | + * ``` |
|---|
| 6157 | + * |
|---|
| 6158 | + * <div class="alert alert-info"> |
|---|
| 6159 | + * **Best Practice**: if you intend to add and remove transcluded content manually in your directive |
|---|
| 6160 | + * (by calling the transclude function to get the DOM and and calling `element.remove()` to remove it), |
|---|
| 6161 | + * then you are also responsible for calling `$destroy` on the transclusion scope. |
|---|
| 6162 | + * </div> |
|---|
| 6163 | + * |
|---|
| 6164 | + * The built-in DOM manipulation directives, such as {@link ngIf}, {@link ngSwitch} and {@link ngRepeat} |
|---|
| 6165 | + * automatically destroy their transluded clones as necessary so you do not need to worry about this if |
|---|
| 6166 | + * you are simply using {@link ngTransclude} to inject the transclusion into your directive. |
|---|
| 6167 | + * |
|---|
| 6168 | + * |
|---|
| 6169 | + * #### Transclusion Scopes |
|---|
| 6170 | + * |
|---|
| 6171 | + * When you call a transclude function it returns a DOM fragment that is pre-bound to a **transclusion |
|---|
| 6172 | + * scope**. This scope is special, in that it is a child of the directive's scope (and so gets destroyed |
|---|
| 6173 | + * when the directive's scope gets destroyed) but it inherits the properties of the scope from which it |
|---|
| 6174 | + * was taken. |
|---|
| 6175 | + * |
|---|
| 6176 | + * For example consider a directive that uses transclusion and isolated scope. The DOM hierarchy might look |
|---|
| 6177 | + * like this: |
|---|
| 6178 | + * |
|---|
| 6179 | + * ```html |
|---|
| 6180 | + * <div ng-app> |
|---|
| 6181 | + * <div isolate> |
|---|
| 6182 | + * <div transclusion> |
|---|
| 6183 | + * </div> |
|---|
| 6184 | + * </div> |
|---|
| 6185 | + * </div> |
|---|
| 6186 | + * ``` |
|---|
| 6187 | + * |
|---|
| 6188 | + * The `$parent` scope hierarchy will look like this: |
|---|
| 6189 | + * |
|---|
| 6190 | + * ``` |
|---|
| 6191 | + * - $rootScope |
|---|
| 6192 | + * - isolate |
|---|
| 6193 | + * - transclusion |
|---|
| 6194 | + * ``` |
|---|
| 6195 | + * |
|---|
| 6196 | + * but the scopes will inherit prototypically from different scopes to their `$parent`. |
|---|
| 6197 | + * |
|---|
| 6198 | + * ``` |
|---|
| 6199 | + * - $rootScope |
|---|
| 6200 | + * - transclusion |
|---|
| 6201 | + * - isolate |
|---|
| 6202 | + * ``` |
|---|
| 6203 | + * |
|---|
| 6204 | + * |
|---|
| 6205 | + * ### Attributes |
|---|
| 6206 | + * |
|---|
| 6207 | + * The {@link ng.$compile.directive.Attributes Attributes} object - passed as a parameter in the |
|---|
| 6208 | + * `link()` or `compile()` functions. It has a variety of uses. |
|---|
| 6209 | + * |
|---|
| 6210 | + * accessing *Normalized attribute names:* |
|---|
| 6211 | + * Directives like 'ngBind' can be expressed in many ways: 'ng:bind', `data-ng-bind`, or 'x-ng-bind'. |
|---|
| 6212 | + * the attributes object allows for normalized access to |
|---|
| 6213 | + * the attributes. |
|---|
| 6214 | + * |
|---|
| 6215 | + * * *Directive inter-communication:* All directives share the same instance of the attributes |
|---|
| 6216 | + * object which allows the directives to use the attributes object as inter directive |
|---|
| 6217 | + * communication. |
|---|
| 6218 | + * |
|---|
| 6219 | + * * *Supports interpolation:* Interpolation attributes are assigned to the attribute object |
|---|
| 6220 | + * allowing other directives to read the interpolated value. |
|---|
| 6221 | + * |
|---|
| 6222 | + * * *Observing interpolated attributes:* Use `$observe` to observe the value changes of attributes |
|---|
| 6223 | + * that contain interpolation (e.g. `src="{{bar}}"`). Not only is this very efficient but it's also |
|---|
| 6224 | + * the only way to easily get the actual value because during the linking phase the interpolation |
|---|
| 6225 | + * hasn't been evaluated yet and so the value is at this time set to `undefined`. |
|---|
| 6226 | + * |
|---|
| 6227 | + * ```js |
|---|
| 6228 | + * function linkingFn(scope, elm, attrs, ctrl) { |
|---|
| 6229 | + * // get the attribute value |
|---|
| 6230 | + * console.log(attrs.ngModel); |
|---|
| 6231 | + * |
|---|
| 6232 | + * // change the attribute |
|---|
| 6233 | + * attrs.$set('ngModel', 'new value'); |
|---|
| 6234 | + * |
|---|
| 6235 | + * // observe changes to interpolated attribute |
|---|
| 6236 | + * attrs.$observe('ngModel', function(value) { |
|---|
| 6237 | + * console.log('ngModel has changed value to ' + value); |
|---|
| 6238 | + * }); |
|---|
| 6239 | + * } |
|---|
| 6240 | + * ``` |
|---|
| 6241 | + * |
|---|
| 6242 | + * ## Example |
|---|
| 6243 | + * |
|---|
| 6244 | + * <div class="alert alert-warning"> |
|---|
| 6245 | + * **Note**: Typically directives are registered with `module.directive`. The example below is |
|---|
| 6246 | + * to illustrate how `$compile` works. |
|---|
| 6247 | + * </div> |
|---|
| 6248 | + * |
|---|
| 6249 | + <example module="compileExample"> |
|---|
| 6250 | + <file name="index.html"> |
|---|
| 6251 | + <script> |
|---|
| 6252 | + angular.module('compileExample', [], function($compileProvider) { |
|---|
| 6253 | + // configure new 'compile' directive by passing a directive |
|---|
| 6254 | + // factory function. The factory function injects the '$compile' |
|---|
| 6255 | + $compileProvider.directive('compile', function($compile) { |
|---|
| 6256 | + // directive factory creates a link function |
|---|
| 6257 | + return function(scope, element, attrs) { |
|---|
| 6258 | + scope.$watch( |
|---|
| 6259 | + function(scope) { |
|---|
| 6260 | + // watch the 'compile' expression for changes |
|---|
| 6261 | + return scope.$eval(attrs.compile); |
|---|
| 6262 | + }, |
|---|
| 6263 | + function(value) { |
|---|
| 6264 | + // when the 'compile' expression changes |
|---|
| 6265 | + // assign it into the current DOM |
|---|
| 6266 | + element.html(value); |
|---|
| 6267 | + |
|---|
| 6268 | + // compile the new DOM and link it to the current |
|---|
| 6269 | + // scope. |
|---|
| 6270 | + // NOTE: we only compile .childNodes so that |
|---|
| 6271 | + // we don't get into infinite loop compiling ourselves |
|---|
| 6272 | + $compile(element.contents())(scope); |
|---|
| 6273 | + } |
|---|
| 6274 | + ); |
|---|
| 6275 | + }; |
|---|
| 6276 | + }); |
|---|
| 6277 | + }) |
|---|
| 6278 | + .controller('GreeterController', ['$scope', function($scope) { |
|---|
| 6279 | + $scope.name = 'Angular'; |
|---|
| 6280 | + $scope.html = 'Hello {{name}}'; |
|---|
| 6281 | + }]); |
|---|
| 6282 | + </script> |
|---|
| 6283 | + <div ng-controller="GreeterController"> |
|---|
| 6284 | + <input ng-model="name"> <br> |
|---|
| 6285 | + <textarea ng-model="html"></textarea> <br> |
|---|
| 6286 | + <div compile="html"></div> |
|---|
| 6287 | + </div> |
|---|
| 6288 | + </file> |
|---|
| 6289 | + <file name="protractor.js" type="protractor"> |
|---|
| 6290 | + it('should auto compile', function() { |
|---|
| 6291 | + var textarea = $('textarea'); |
|---|
| 6292 | + var output = $('div[compile]'); |
|---|
| 6293 | + // The initial state reads 'Hello Angular'. |
|---|
| 6294 | + expect(output.getText()).toBe('Hello Angular'); |
|---|
| 6295 | + textarea.clear(); |
|---|
| 6296 | + textarea.sendKeys('{{name}}!'); |
|---|
| 6297 | + expect(output.getText()).toBe('Angular!'); |
|---|
| 6298 | + }); |
|---|
| 6299 | + </file> |
|---|
| 6300 | + </example> |
|---|
| 6301 | + |
|---|
| 6302 | + * |
|---|
| 6303 | + * |
|---|
| 6304 | + * @param {string|DOMElement} element Element or HTML string to compile into a template function. |
|---|
| 6305 | + * @param {function(angular.Scope, cloneAttachFn=)} transclude function available to directives. |
|---|
| 6306 | + * @param {number} maxPriority only apply directives lower than given priority (Only effects the |
|---|
| 6307 | + * root element(s), not their children) |
|---|
| 6308 | + * @returns {function(scope, cloneAttachFn=)} a link function which is used to bind template |
|---|
| 6309 | + * (a DOM element/tree) to a scope. Where: |
|---|
| 6310 | + * |
|---|
| 6311 | + * * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to. |
|---|
| 6312 | + * * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the |
|---|
| 6313 | + * `template` and call the `cloneAttachFn` function allowing the caller to attach the |
|---|
| 6314 | + * cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is |
|---|
| 6315 | + * called as: <br> `cloneAttachFn(clonedElement, scope)` where: |
|---|
| 6316 | + * |
|---|
| 6317 | + * * `clonedElement` - is a clone of the original `element` passed into the compiler. |
|---|
| 6318 | + * * `scope` - is the current scope with which the linking function is working with. |
|---|
| 6319 | + * |
|---|
| 6320 | + * Calling the linking function returns the element of the template. It is either the original |
|---|
| 6321 | + * element passed in, or the clone of the element if the `cloneAttachFn` is provided. |
|---|
| 6322 | + * |
|---|
| 6323 | + * After linking the view is not updated until after a call to $digest which typically is done by |
|---|
| 6324 | + * Angular automatically. |
|---|
| 6325 | + * |
|---|
| 6326 | + * If you need access to the bound view, there are two ways to do it: |
|---|
| 6327 | + * |
|---|
| 6328 | + * - If you are not asking the linking function to clone the template, create the DOM element(s) |
|---|
| 6329 | + * before you send them to the compiler and keep this reference around. |
|---|
| 6330 | + * ```js |
|---|
| 6331 | + * var element = $compile('<p>{{total}}</p>')(scope); |
|---|
| 6332 | + * ``` |
|---|
| 6333 | + * |
|---|
| 6334 | + * - if on the other hand, you need the element to be cloned, the view reference from the original |
|---|
| 6335 | + * example would not point to the clone, but rather to the original template that was cloned. In |
|---|
| 6336 | + * this case, you can access the clone via the cloneAttachFn: |
|---|
| 6337 | + * ```js |
|---|
| 6338 | + * var templateElement = angular.element('<p>{{total}}</p>'), |
|---|
| 6339 | + * scope = ....; |
|---|
| 6340 | + * |
|---|
| 6341 | + * var clonedElement = $compile(templateElement)(scope, function(clonedElement, scope) { |
|---|
| 6342 | + * //attach the clone to DOM document at the right place |
|---|
| 6343 | + * }); |
|---|
| 6344 | + * |
|---|
| 6345 | + * //now we have reference to the cloned DOM via `clonedElement` |
|---|
| 6346 | + * ``` |
|---|
| 6347 | + * |
|---|
| 6348 | + * |
|---|
| 6349 | + * For information on how the compiler works, see the |
|---|
| 6350 | + * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide. |
|---|
| 6351 | + */ |
|---|
| 6352 | + |
|---|
| 6353 | +var $compileMinErr = minErr('$compile'); |
|---|
| 6354 | + |
|---|
| 6355 | +/** |
|---|
| 6356 | + * @ngdoc provider |
|---|
| 6357 | + * @name $compileProvider |
|---|
| 6358 | + * |
|---|
| 6359 | + * @description |
|---|
| 6360 | + */ |
|---|
| 6361 | +$CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider']; |
|---|
| 6362 | +function $CompileProvider($provide, $$sanitizeUriProvider) { |
|---|
| 6363 | + var hasDirectives = {}, |
|---|
| 6364 | + Suffix = 'Directive', |
|---|
| 6365 | + COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\d\w_\-]+)\s+(.*)$/, |
|---|
| 6366 | + CLASS_DIRECTIVE_REGEXP = /(([\d\w_\-]+)(?:\:([^;]+))?;?)/, |
|---|
| 6367 | + ALL_OR_NOTHING_ATTRS = makeMap('ngSrc,ngSrcset,src,srcset'), |
|---|
| 6368 | + REQUIRE_PREFIX_REGEXP = /^(?:(\^\^?)?(\?)?(\^\^?)?)?/; |
|---|
| 6369 | + |
|---|
| 6370 | + // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes |
|---|
| 6371 | + // The assumption is that future DOM event attribute names will begin with |
|---|
| 6372 | + // 'on' and be composed of only English letters. |
|---|
| 6373 | + var EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/; |
|---|
| 6374 | + |
|---|
| 6375 | + function parseIsolateBindings(scope, directiveName) { |
|---|
| 6376 | + var LOCAL_REGEXP = /^\s*([@=&])(\??)\s*(\w*)\s*$/; |
|---|
| 6377 | + |
|---|
| 6378 | + var bindings = {}; |
|---|
| 6379 | + |
|---|
| 6380 | + forEach(scope, function(definition, scopeName) { |
|---|
| 6381 | + var match = definition.match(LOCAL_REGEXP); |
|---|
| 6382 | + |
|---|
| 6383 | + if (!match) { |
|---|
| 6384 | + throw $compileMinErr('iscp', |
|---|
| 6385 | + "Invalid isolate scope definition for directive '{0}'." + |
|---|
| 6386 | + " Definition: {... {1}: '{2}' ...}", |
|---|
| 6387 | + directiveName, scopeName, definition); |
|---|
| 6388 | + } |
|---|
| 6389 | + |
|---|
| 6390 | + bindings[scopeName] = { |
|---|
| 6391 | + attrName: match[3] || scopeName, |
|---|
| 6392 | + mode: match[1], |
|---|
| 6393 | + optional: match[2] === '?' |
|---|
| 6394 | + }; |
|---|
| 6395 | + }); |
|---|
| 6396 | + |
|---|
| 6397 | + return bindings; |
|---|
| 6398 | + } |
|---|
| 6399 | + |
|---|
| 6400 | + /** |
|---|
| 6401 | + * @ngdoc method |
|---|
| 6402 | + * @name $compileProvider#directive |
|---|
| 6403 | + * @kind function |
|---|
| 6404 | + * |
|---|
| 6405 | + * @description |
|---|
| 6406 | + * Register a new directive with the compiler. |
|---|
| 6407 | + * |
|---|
| 6408 | + * @param {string|Object} name Name of the directive in camel-case (i.e. <code>ngBind</code> which |
|---|
| 6409 | + * will match as <code>ng-bind</code>), or an object map of directives where the keys are the |
|---|
| 6410 | + * names and the values are the factories. |
|---|
| 6411 | + * @param {Function|Array} directiveFactory An injectable directive factory function. See |
|---|
| 6412 | + * {@link guide/directive} for more info. |
|---|
| 6413 | + * @returns {ng.$compileProvider} Self for chaining. |
|---|
| 6414 | + */ |
|---|
| 6415 | + this.directive = function registerDirective(name, directiveFactory) { |
|---|
| 6416 | + assertNotHasOwnProperty(name, 'directive'); |
|---|
| 6417 | + if (isString(name)) { |
|---|
| 6418 | + assertArg(directiveFactory, 'directiveFactory'); |
|---|
| 6419 | + if (!hasDirectives.hasOwnProperty(name)) { |
|---|
| 6420 | + hasDirectives[name] = []; |
|---|
| 6421 | + $provide.factory(name + Suffix, ['$injector', '$exceptionHandler', |
|---|
| 6422 | + function($injector, $exceptionHandler) { |
|---|
| 6423 | + var directives = []; |
|---|
| 6424 | + forEach(hasDirectives[name], function(directiveFactory, index) { |
|---|
| 6425 | + try { |
|---|
| 6426 | + var directive = $injector.invoke(directiveFactory); |
|---|
| 6427 | + if (isFunction(directive)) { |
|---|
| 6428 | + directive = { compile: valueFn(directive) }; |
|---|
| 6429 | + } else if (!directive.compile && directive.link) { |
|---|
| 6430 | + directive.compile = valueFn(directive.link); |
|---|
| 6431 | + } |
|---|
| 6432 | + directive.priority = directive.priority || 0; |
|---|
| 6433 | + directive.index = index; |
|---|
| 6434 | + directive.name = directive.name || name; |
|---|
| 6435 | + directive.require = directive.require || (directive.controller && directive.name); |
|---|
| 6436 | + directive.restrict = directive.restrict || 'EA'; |
|---|
| 6437 | + if (isObject(directive.scope)) { |
|---|
| 6438 | + directive.$$isolateBindings = parseIsolateBindings(directive.scope, directive.name); |
|---|
| 6439 | + } |
|---|
| 6440 | + directives.push(directive); |
|---|
| 6441 | + } catch (e) { |
|---|
| 6442 | + $exceptionHandler(e); |
|---|
| 6443 | + } |
|---|
| 6444 | + }); |
|---|
| 6445 | + return directives; |
|---|
| 6446 | + }]); |
|---|
| 6447 | + } |
|---|
| 6448 | + hasDirectives[name].push(directiveFactory); |
|---|
| 6449 | + } else { |
|---|
| 6450 | + forEach(name, reverseParams(registerDirective)); |
|---|
| 6451 | + } |
|---|
| 6452 | + return this; |
|---|
| 6453 | + }; |
|---|
| 6454 | + |
|---|
| 6455 | + |
|---|
| 6456 | + /** |
|---|
| 6457 | + * @ngdoc method |
|---|
| 6458 | + * @name $compileProvider#aHrefSanitizationWhitelist |
|---|
| 6459 | + * @kind function |
|---|
| 6460 | + * |
|---|
| 6461 | + * @description |
|---|
| 6462 | + * Retrieves or overrides the default regular expression that is used for whitelisting of safe |
|---|
| 6463 | + * urls during a[href] sanitization. |
|---|
| 6464 | + * |
|---|
| 6465 | + * The sanitization is a security measure aimed at prevent XSS attacks via html links. |
|---|
| 6466 | + * |
|---|
| 6467 | + * Any url about to be assigned to a[href] via data-binding is first normalized and turned into |
|---|
| 6468 | + * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist` |
|---|
| 6469 | + * regular expression. If a match is found, the original url is written into the dom. Otherwise, |
|---|
| 6470 | + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. |
|---|
| 6471 | + * |
|---|
| 6472 | + * @param {RegExp=} regexp New regexp to whitelist urls with. |
|---|
| 6473 | + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for |
|---|
| 6474 | + * chaining otherwise. |
|---|
| 6475 | + */ |
|---|
| 6476 | + this.aHrefSanitizationWhitelist = function(regexp) { |
|---|
| 6477 | + if (isDefined(regexp)) { |
|---|
| 6478 | + $$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp); |
|---|
| 6479 | + return this; |
|---|
| 6480 | + } else { |
|---|
| 6481 | + return $$sanitizeUriProvider.aHrefSanitizationWhitelist(); |
|---|
| 6482 | + } |
|---|
| 6483 | + }; |
|---|
| 6484 | + |
|---|
| 6485 | + |
|---|
| 6486 | + /** |
|---|
| 6487 | + * @ngdoc method |
|---|
| 6488 | + * @name $compileProvider#imgSrcSanitizationWhitelist |
|---|
| 6489 | + * @kind function |
|---|
| 6490 | + * |
|---|
| 6491 | + * @description |
|---|
| 6492 | + * Retrieves or overrides the default regular expression that is used for whitelisting of safe |
|---|
| 6493 | + * urls during img[src] sanitization. |
|---|
| 6494 | + * |
|---|
| 6495 | + * The sanitization is a security measure aimed at prevent XSS attacks via html links. |
|---|
| 6496 | + * |
|---|
| 6497 | + * Any url about to be assigned to img[src] via data-binding is first normalized and turned into |
|---|
| 6498 | + * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist` |
|---|
| 6499 | + * regular expression. If a match is found, the original url is written into the dom. Otherwise, |
|---|
| 6500 | + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. |
|---|
| 6501 | + * |
|---|
| 6502 | + * @param {RegExp=} regexp New regexp to whitelist urls with. |
|---|
| 6503 | + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for |
|---|
| 6504 | + * chaining otherwise. |
|---|
| 6505 | + */ |
|---|
| 6506 | + this.imgSrcSanitizationWhitelist = function(regexp) { |
|---|
| 6507 | + if (isDefined(regexp)) { |
|---|
| 6508 | + $$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp); |
|---|
| 6509 | + return this; |
|---|
| 6510 | + } else { |
|---|
| 6511 | + return $$sanitizeUriProvider.imgSrcSanitizationWhitelist(); |
|---|
| 6512 | + } |
|---|
| 6513 | + }; |
|---|
| 6514 | + |
|---|
| 6515 | + /** |
|---|
| 6516 | + * @ngdoc method |
|---|
| 6517 | + * @name $compileProvider#debugInfoEnabled |
|---|
| 6518 | + * |
|---|
| 6519 | + * @param {boolean=} enabled update the debugInfoEnabled state if provided, otherwise just return the |
|---|
| 6520 | + * current debugInfoEnabled state |
|---|
| 6521 | + * @returns {*} current value if used as getter or itself (chaining) if used as setter |
|---|
| 6522 | + * |
|---|
| 6523 | + * @kind function |
|---|
| 6524 | + * |
|---|
| 6525 | + * @description |
|---|
| 6526 | + * Call this method to enable/disable various debug runtime information in the compiler such as adding |
|---|
| 6527 | + * binding information and a reference to the current scope on to DOM elements. |
|---|
| 6528 | + * If enabled, the compiler will add the following to DOM elements that have been bound to the scope |
|---|
| 6529 | + * * `ng-binding` CSS class |
|---|
| 6530 | + * * `$binding` data property containing an array of the binding expressions |
|---|
| 6531 | + * |
|---|
| 6532 | + * You may want to use this in production for a significant performance boost. See |
|---|
| 6533 | + * {@link guide/production#disabling-debug-data Disabling Debug Data} for more. |
|---|
| 6534 | + * |
|---|
| 6535 | + * The default value is true. |
|---|
| 6536 | + */ |
|---|
| 6537 | + var debugInfoEnabled = true; |
|---|
| 6538 | + this.debugInfoEnabled = function(enabled) { |
|---|
| 6539 | + if(isDefined(enabled)) { |
|---|
| 6540 | + debugInfoEnabled = enabled; |
|---|
| 6541 | + return this; |
|---|
| 6542 | + } |
|---|
| 6543 | + return debugInfoEnabled; |
|---|
| 6544 | + }; |
|---|
| 6545 | + |
|---|
| 6546 | + this.$get = [ |
|---|
| 6547 | + '$injector', '$interpolate', '$exceptionHandler', '$templateRequest', '$parse', |
|---|
| 6548 | + '$controller', '$rootScope', '$document', '$sce', '$animate', '$$sanitizeUri', |
|---|
| 6549 | + function($injector, $interpolate, $exceptionHandler, $templateRequest, $parse, |
|---|
| 6550 | + $controller, $rootScope, $document, $sce, $animate, $$sanitizeUri) { |
|---|
| 6551 | + |
|---|
| 6552 | + var Attributes = function(element, attributesToCopy) { |
|---|
| 6553 | + if (attributesToCopy) { |
|---|
| 6554 | + var keys = Object.keys(attributesToCopy); |
|---|
| 6555 | + var i, l, key; |
|---|
| 6556 | + |
|---|
| 6557 | + for (i = 0, l = keys.length; i < l; i++) { |
|---|
| 6558 | + key = keys[i]; |
|---|
| 6559 | + this[key] = attributesToCopy[key]; |
|---|
| 6560 | + } |
|---|
| 6561 | + } else { |
|---|
| 6562 | + this.$attr = {}; |
|---|
| 6563 | + } |
|---|
| 6564 | + |
|---|
| 6565 | + this.$$element = element; |
|---|
| 6566 | + }; |
|---|
| 6567 | + |
|---|
| 6568 | + Attributes.prototype = { |
|---|
| 6569 | + $normalize: directiveNormalize, |
|---|
| 6570 | + |
|---|
| 6571 | + |
|---|
| 6572 | + /** |
|---|
| 6573 | + * @ngdoc method |
|---|
| 6574 | + * @name $compile.directive.Attributes#$addClass |
|---|
| 6575 | + * @kind function |
|---|
| 6576 | + * |
|---|
| 6577 | + * @description |
|---|
| 6578 | + * Adds the CSS class value specified by the classVal parameter to the element. If animations |
|---|
| 6579 | + * are enabled then an animation will be triggered for the class addition. |
|---|
| 6580 | + * |
|---|
| 6581 | + * @param {string} classVal The className value that will be added to the element |
|---|
| 6582 | + */ |
|---|
| 6583 | + $addClass : function(classVal) { |
|---|
| 6584 | + if(classVal && classVal.length > 0) { |
|---|
| 6585 | + $animate.addClass(this.$$element, classVal); |
|---|
| 6586 | + } |
|---|
| 6587 | + }, |
|---|
| 6588 | + |
|---|
| 6589 | + /** |
|---|
| 6590 | + * @ngdoc method |
|---|
| 6591 | + * @name $compile.directive.Attributes#$removeClass |
|---|
| 6592 | + * @kind function |
|---|
| 6593 | + * |
|---|
| 6594 | + * @description |
|---|
| 6595 | + * Removes the CSS class value specified by the classVal parameter from the element. If |
|---|
| 6596 | + * animations are enabled then an animation will be triggered for the class removal. |
|---|
| 6597 | + * |
|---|
| 6598 | + * @param {string} classVal The className value that will be removed from the element |
|---|
| 6599 | + */ |
|---|
| 6600 | + $removeClass : function(classVal) { |
|---|
| 6601 | + if(classVal && classVal.length > 0) { |
|---|
| 6602 | + $animate.removeClass(this.$$element, classVal); |
|---|
| 6603 | + } |
|---|
| 6604 | + }, |
|---|
| 6605 | + |
|---|
| 6606 | + /** |
|---|
| 6607 | + * @ngdoc method |
|---|
| 6608 | + * @name $compile.directive.Attributes#$updateClass |
|---|
| 6609 | + * @kind function |
|---|
| 6610 | + * |
|---|
| 6611 | + * @description |
|---|
| 6612 | + * Adds and removes the appropriate CSS class values to the element based on the difference |
|---|
| 6613 | + * between the new and old CSS class values (specified as newClasses and oldClasses). |
|---|
| 6614 | + * |
|---|
| 6615 | + * @param {string} newClasses The current CSS className value |
|---|
| 6616 | + * @param {string} oldClasses The former CSS className value |
|---|
| 6617 | + */ |
|---|
| 6618 | + $updateClass : function(newClasses, oldClasses) { |
|---|
| 6619 | + var toAdd = tokenDifference(newClasses, oldClasses); |
|---|
| 6620 | + if (toAdd && toAdd.length) { |
|---|
| 6621 | + $animate.addClass(this.$$element, toAdd); |
|---|
| 6622 | + } |
|---|
| 6623 | + |
|---|
| 6624 | + var toRemove = tokenDifference(oldClasses, newClasses); |
|---|
| 6625 | + if (toRemove && toRemove.length) { |
|---|
| 6626 | + $animate.removeClass(this.$$element, toRemove); |
|---|
| 6627 | + } |
|---|
| 6628 | + }, |
|---|
| 6629 | + |
|---|
| 6630 | + /** |
|---|
| 6631 | + * Set a normalized attribute on the element in a way such that all directives |
|---|
| 6632 | + * can share the attribute. This function properly handles boolean attributes. |
|---|
| 6633 | + * @param {string} key Normalized key. (ie ngAttribute) |
|---|
| 6634 | + * @param {string|boolean} value The value to set. If `null` attribute will be deleted. |
|---|
| 6635 | + * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute. |
|---|
| 6636 | + * Defaults to true. |
|---|
| 6637 | + * @param {string=} attrName Optional none normalized name. Defaults to key. |
|---|
| 6638 | + */ |
|---|
| 6639 | + $set: function(key, value, writeAttr, attrName) { |
|---|
| 6640 | + // TODO: decide whether or not to throw an error if "class" |
|---|
| 6641 | + //is set through this function since it may cause $updateClass to |
|---|
| 6642 | + //become unstable. |
|---|
| 6643 | + |
|---|
| 6644 | + var node = this.$$element[0], |
|---|
| 6645 | + booleanKey = getBooleanAttrName(node, key), |
|---|
| 6646 | + aliasedKey = getAliasedAttrName(node, key), |
|---|
| 6647 | + observer = key, |
|---|
| 6648 | + normalizedVal, |
|---|
| 6649 | + nodeName; |
|---|
| 6650 | + |
|---|
| 6651 | + if (booleanKey) { |
|---|
| 6652 | + this.$$element.prop(key, value); |
|---|
| 6653 | + attrName = booleanKey; |
|---|
| 6654 | + } else if(aliasedKey) { |
|---|
| 6655 | + this[aliasedKey] = value; |
|---|
| 6656 | + observer = aliasedKey; |
|---|
| 6657 | + } |
|---|
| 6658 | + |
|---|
| 6659 | + this[key] = value; |
|---|
| 6660 | + |
|---|
| 6661 | + // translate normalized key to actual key |
|---|
| 6662 | + if (attrName) { |
|---|
| 6663 | + this.$attr[key] = attrName; |
|---|
| 6664 | + } else { |
|---|
| 6665 | + attrName = this.$attr[key]; |
|---|
| 6666 | + if (!attrName) { |
|---|
| 6667 | + this.$attr[key] = attrName = snake_case(key, '-'); |
|---|
| 6668 | + } |
|---|
| 6669 | + } |
|---|
| 6670 | + |
|---|
| 6671 | + nodeName = nodeName_(this.$$element); |
|---|
| 6672 | + |
|---|
| 6673 | + if ((nodeName === 'a' && key === 'href') || |
|---|
| 6674 | + (nodeName === 'img' && key === 'src')) { |
|---|
| 6675 | + // sanitize a[href] and img[src] values |
|---|
| 6676 | + this[key] = value = $$sanitizeUri(value, key === 'src'); |
|---|
| 6677 | + } else if (nodeName === 'img' && key === 'srcset') { |
|---|
| 6678 | + // sanitize img[srcset] values |
|---|
| 6679 | + var result = ""; |
|---|
| 6680 | + |
|---|
| 6681 | + // first check if there are spaces because it's not the same pattern |
|---|
| 6682 | + var trimmedSrcset = trim(value); |
|---|
| 6683 | + // ( 999x ,| 999w ,| ,|, ) |
|---|
| 6684 | + var srcPattern = /(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/; |
|---|
| 6685 | + var pattern = /\s/.test(trimmedSrcset) ? srcPattern : /(,)/; |
|---|
| 6686 | + |
|---|
| 6687 | + // split srcset into tuple of uri and descriptor except for the last item |
|---|
| 6688 | + var rawUris = trimmedSrcset.split(pattern); |
|---|
| 6689 | + |
|---|
| 6690 | + // for each tuples |
|---|
| 6691 | + var nbrUrisWith2parts = Math.floor(rawUris.length / 2); |
|---|
| 6692 | + for (var i=0; i<nbrUrisWith2parts; i++) { |
|---|
| 6693 | + var innerIdx = i*2; |
|---|
| 6694 | + // sanitize the uri |
|---|
| 6695 | + result += $$sanitizeUri(trim( rawUris[innerIdx]), true); |
|---|
| 6696 | + // add the descriptor |
|---|
| 6697 | + result += ( " " + trim(rawUris[innerIdx+1])); |
|---|
| 6698 | + } |
|---|
| 6699 | + |
|---|
| 6700 | + // split the last item into uri and descriptor |
|---|
| 6701 | + var lastTuple = trim(rawUris[i*2]).split(/\s/); |
|---|
| 6702 | + |
|---|
| 6703 | + // sanitize the last uri |
|---|
| 6704 | + result += $$sanitizeUri(trim(lastTuple[0]), true); |
|---|
| 6705 | + |
|---|
| 6706 | + // and add the last descriptor if any |
|---|
| 6707 | + if( lastTuple.length === 2) { |
|---|
| 6708 | + result += (" " + trim(lastTuple[1])); |
|---|
| 6709 | + } |
|---|
| 6710 | + this[key] = value = result; |
|---|
| 6711 | + } |
|---|
| 6712 | + |
|---|
| 6713 | + if (writeAttr !== false) { |
|---|
| 6714 | + if (value === null || value === undefined) { |
|---|
| 6715 | + this.$$element.removeAttr(attrName); |
|---|
| 6716 | + } else { |
|---|
| 6717 | + this.$$element.attr(attrName, value); |
|---|
| 6718 | + } |
|---|
| 6719 | + } |
|---|
| 6720 | + |
|---|
| 6721 | + // fire observers |
|---|
| 6722 | + var $$observers = this.$$observers; |
|---|
| 6723 | + $$observers && forEach($$observers[observer], function(fn) { |
|---|
| 6724 | + try { |
|---|
| 6725 | + fn(value); |
|---|
| 6726 | + } catch (e) { |
|---|
| 6727 | + $exceptionHandler(e); |
|---|
| 6728 | + } |
|---|
| 6729 | + }); |
|---|
| 6730 | + }, |
|---|
| 6731 | + |
|---|
| 6732 | + |
|---|
| 6733 | + /** |
|---|
| 6734 | + * @ngdoc method |
|---|
| 6735 | + * @name $compile.directive.Attributes#$observe |
|---|
| 6736 | + * @kind function |
|---|
| 6737 | + * |
|---|
| 6738 | + * @description |
|---|
| 6739 | + * Observes an interpolated attribute. |
|---|
| 6740 | + * |
|---|
| 6741 | + * The observer function will be invoked once during the next `$digest` following |
|---|
| 6742 | + * compilation. The observer is then invoked whenever the interpolated value |
|---|
| 6743 | + * changes. |
|---|
| 6744 | + * |
|---|
| 6745 | + * @param {string} key Normalized key. (ie ngAttribute) . |
|---|
| 6746 | + * @param {function(interpolatedValue)} fn Function that will be called whenever |
|---|
| 6747 | + the interpolated value of the attribute changes. |
|---|
| 6748 | + * See the {@link guide/directive#text-and-attribute-bindings Directives} guide for more info. |
|---|
| 6749 | + * @returns {function()} Returns a deregistration function for this observer. |
|---|
| 6750 | + */ |
|---|
| 6751 | + $observe: function(key, fn) { |
|---|
| 6752 | + var attrs = this, |
|---|
| 6753 | + $$observers = (attrs.$$observers || (attrs.$$observers = createMap())), |
|---|
| 6754 | + listeners = ($$observers[key] || ($$observers[key] = [])); |
|---|
| 6755 | + |
|---|
| 6756 | + listeners.push(fn); |
|---|
| 6757 | + $rootScope.$evalAsync(function() { |
|---|
| 6758 | + if (!listeners.$$inter) { |
|---|
| 6759 | + // no one registered attribute interpolation function, so lets call it manually |
|---|
| 6760 | + fn(attrs[key]); |
|---|
| 6761 | + } |
|---|
| 6762 | + }); |
|---|
| 6763 | + |
|---|
| 6764 | + return function() { |
|---|
| 6765 | + arrayRemove(listeners, fn); |
|---|
| 6766 | + }; |
|---|
| 6767 | + } |
|---|
| 6768 | + }; |
|---|
| 6769 | + |
|---|
| 6770 | + |
|---|
| 6771 | + function safeAddClass($element, className) { |
|---|
| 6772 | + try { |
|---|
| 6773 | + $element.addClass(className); |
|---|
| 6774 | + } catch(e) { |
|---|
| 6775 | + // ignore, since it means that we are trying to set class on |
|---|
| 6776 | + // SVG element, where class name is read-only. |
|---|
| 6777 | + } |
|---|
| 6778 | + } |
|---|
| 6779 | + |
|---|
| 6780 | + |
|---|
| 6781 | + var startSymbol = $interpolate.startSymbol(), |
|---|
| 6782 | + endSymbol = $interpolate.endSymbol(), |
|---|
| 6783 | + denormalizeTemplate = (startSymbol == '{{' || endSymbol == '}}') |
|---|
| 6784 | + ? identity |
|---|
| 6785 | + : function denormalizeTemplate(template) { |
|---|
| 6786 | + return template.replace(/\{\{/g, startSymbol).replace(/}}/g, endSymbol); |
|---|
| 6787 | + }, |
|---|
| 6788 | + NG_ATTR_BINDING = /^ngAttr[A-Z]/; |
|---|
| 6789 | + |
|---|
| 6790 | + compile.$$addBindingInfo = debugInfoEnabled ? function $$addBindingInfo($element, binding) { |
|---|
| 6791 | + var bindings = $element.data('$binding') || []; |
|---|
| 6792 | + |
|---|
| 6793 | + if (isArray(binding)) { |
|---|
| 6794 | + bindings = bindings.concat(binding); |
|---|
| 6795 | + } else { |
|---|
| 6796 | + bindings.push(binding); |
|---|
| 6797 | + } |
|---|
| 6798 | + |
|---|
| 6799 | + $element.data('$binding', bindings); |
|---|
| 6800 | + } : noop; |
|---|
| 6801 | + |
|---|
| 6802 | + compile.$$addBindingClass = debugInfoEnabled ? function $$addBindingClass($element) { |
|---|
| 6803 | + safeAddClass($element, 'ng-binding'); |
|---|
| 6804 | + } : noop; |
|---|
| 6805 | + |
|---|
| 6806 | + compile.$$addScopeInfo = debugInfoEnabled ? function $$addScopeInfo($element, scope, isolated, noTemplate) { |
|---|
| 6807 | + var dataName = isolated ? (noTemplate ? '$isolateScopeNoTemplate' : '$isolateScope') : '$scope'; |
|---|
| 6808 | + $element.data(dataName, scope); |
|---|
| 6809 | + } : noop; |
|---|
| 6810 | + |
|---|
| 6811 | + compile.$$addScopeClass = debugInfoEnabled ? function $$addScopeClass($element, isolated) { |
|---|
| 6812 | + safeAddClass($element, isolated ? 'ng-isolate-scope' : 'ng-scope'); |
|---|
| 6813 | + } : noop; |
|---|
| 6814 | + |
|---|
| 6815 | + return compile; |
|---|
| 6816 | + |
|---|
| 6817 | + //================================ |
|---|
| 6818 | + |
|---|
| 6819 | + function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, |
|---|
| 6820 | + previousCompileContext) { |
|---|
| 6821 | + if (!($compileNodes instanceof jqLite)) { |
|---|
| 6822 | + // jquery always rewraps, whereas we need to preserve the original selector so that we can |
|---|
| 6823 | + // modify it. |
|---|
| 6824 | + $compileNodes = jqLite($compileNodes); |
|---|
| 6825 | + } |
|---|
| 6826 | + // We can not compile top level text elements since text nodes can be merged and we will |
|---|
| 6827 | + // not be able to attach scope data to them, so we will wrap them in <span> |
|---|
| 6828 | + forEach($compileNodes, function(node, index){ |
|---|
| 6829 | + if (node.nodeType == NODE_TYPE_TEXT && node.nodeValue.match(/\S+/) /* non-empty */ ) { |
|---|
| 6830 | + $compileNodes[index] = jqLite(node).wrap('<span></span>').parent()[0]; |
|---|
| 6831 | + } |
|---|
| 6832 | + }); |
|---|
| 6833 | + var compositeLinkFn = |
|---|
| 6834 | + compileNodes($compileNodes, transcludeFn, $compileNodes, |
|---|
| 6835 | + maxPriority, ignoreDirective, previousCompileContext); |
|---|
| 6836 | + compile.$$addScopeClass($compileNodes); |
|---|
| 6837 | + var namespace = null; |
|---|
| 6838 | + return function publicLinkFn(scope, cloneConnectFn, transcludeControllers, parentBoundTranscludeFn, futureParentElement){ |
|---|
| 6839 | + assertArg(scope, 'scope'); |
|---|
| 6840 | + if (!namespace) { |
|---|
| 6841 | + namespace = detectNamespaceForChildElements(futureParentElement); |
|---|
| 6842 | + } |
|---|
| 6843 | + var $linkNode; |
|---|
| 6844 | + if (namespace !== 'html') { |
|---|
| 6845 | + // When using a directive with replace:true and templateUrl the $compileNodes |
|---|
| 6846 | + // (or a child element inside of them) |
|---|
| 6847 | + // might change, so we need to recreate the namespace adapted compileNodes |
|---|
| 6848 | + // for call to the link function. |
|---|
| 6849 | + // Note: This will already clone the nodes... |
|---|
| 6850 | + $linkNode = jqLite( |
|---|
| 6851 | + wrapTemplate(namespace, jqLite('<div>').append($compileNodes).html()) |
|---|
| 6852 | + ); |
|---|
| 6853 | + } else if (cloneConnectFn) { |
|---|
| 6854 | + // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart |
|---|
| 6855 | + // and sometimes changes the structure of the DOM. |
|---|
| 6856 | + $linkNode = JQLitePrototype.clone.call($compileNodes); |
|---|
| 6857 | + } else { |
|---|
| 6858 | + $linkNode = $compileNodes; |
|---|
| 6859 | + } |
|---|
| 6860 | + |
|---|
| 6861 | + if (transcludeControllers) { |
|---|
| 6862 | + for (var controllerName in transcludeControllers) { |
|---|
| 6863 | + $linkNode.data('$' + controllerName + 'Controller', transcludeControllers[controllerName].instance); |
|---|
| 6864 | + } |
|---|
| 6865 | + } |
|---|
| 6866 | + |
|---|
| 6867 | + compile.$$addScopeInfo($linkNode, scope); |
|---|
| 6868 | + |
|---|
| 6869 | + if (cloneConnectFn) cloneConnectFn($linkNode, scope); |
|---|
| 6870 | + if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode, parentBoundTranscludeFn); |
|---|
| 6871 | + return $linkNode; |
|---|
| 6872 | + }; |
|---|
| 6873 | + } |
|---|
| 6874 | + |
|---|
| 6875 | + function detectNamespaceForChildElements(parentElement) { |
|---|
| 6876 | + // TODO: Make this detect MathML as well... |
|---|
| 6877 | + var node = parentElement && parentElement[0]; |
|---|
| 6878 | + if (!node) { |
|---|
| 6879 | + return 'html'; |
|---|
| 6880 | + } else { |
|---|
| 6881 | + return nodeName_(node) !== 'foreignobject' && node.toString().match(/SVG/) ? 'svg': 'html'; |
|---|
| 6882 | + } |
|---|
| 6883 | + } |
|---|
| 6884 | + |
|---|
| 6885 | + /** |
|---|
| 6886 | + * Compile function matches each node in nodeList against the directives. Once all directives |
|---|
| 6887 | + * for a particular node are collected their compile functions are executed. The compile |
|---|
| 6888 | + * functions return values - the linking functions - are combined into a composite linking |
|---|
| 6889 | + * function, which is the a linking function for the node. |
|---|
| 6890 | + * |
|---|
| 6891 | + * @param {NodeList} nodeList an array of nodes or NodeList to compile |
|---|
| 6892 | + * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the |
|---|
| 6893 | + * scope argument is auto-generated to the new child of the transcluded parent scope. |
|---|
| 6894 | + * @param {DOMElement=} $rootElement If the nodeList is the root of the compilation tree then |
|---|
| 6895 | + * the rootElement must be set the jqLite collection of the compile root. This is |
|---|
| 6896 | + * needed so that the jqLite collection items can be replaced with widgets. |
|---|
| 6897 | + * @param {number=} maxPriority Max directive priority. |
|---|
| 6898 | + * @returns {Function} A composite linking function of all of the matched directives or null. |
|---|
| 6899 | + */ |
|---|
| 6900 | + function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective, |
|---|
| 6901 | + previousCompileContext) { |
|---|
| 6902 | + var linkFns = [], |
|---|
| 6903 | + attrs, directives, nodeLinkFn, childNodes, childLinkFn, linkFnFound, nodeLinkFnFound; |
|---|
| 6904 | + |
|---|
| 6905 | + for (var i = 0; i < nodeList.length; i++) { |
|---|
| 6906 | + attrs = new Attributes(); |
|---|
| 6907 | + |
|---|
| 6908 | + // we must always refer to nodeList[i] since the nodes can be replaced underneath us. |
|---|
| 6909 | + directives = collectDirectives(nodeList[i], [], attrs, i === 0 ? maxPriority : undefined, |
|---|
| 6910 | + ignoreDirective); |
|---|
| 6911 | + |
|---|
| 6912 | + nodeLinkFn = (directives.length) |
|---|
| 6913 | + ? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement, |
|---|
| 6914 | + null, [], [], previousCompileContext) |
|---|
| 6915 | + : null; |
|---|
| 6916 | + |
|---|
| 6917 | + if (nodeLinkFn && nodeLinkFn.scope) { |
|---|
| 6918 | + compile.$$addScopeClass(attrs.$$element); |
|---|
| 6919 | + } |
|---|
| 6920 | + |
|---|
| 6921 | + childLinkFn = (nodeLinkFn && nodeLinkFn.terminal || |
|---|
| 6922 | + !(childNodes = nodeList[i].childNodes) || |
|---|
| 6923 | + !childNodes.length) |
|---|
| 6924 | + ? null |
|---|
| 6925 | + : compileNodes(childNodes, |
|---|
| 6926 | + nodeLinkFn ? ( |
|---|
| 6927 | + (nodeLinkFn.transcludeOnThisElement || !nodeLinkFn.templateOnThisElement) |
|---|
| 6928 | + && nodeLinkFn.transclude) : transcludeFn); |
|---|
| 6929 | + |
|---|
| 6930 | + if (nodeLinkFn || childLinkFn) { |
|---|
| 6931 | + linkFns.push(i, nodeLinkFn, childLinkFn); |
|---|
| 6932 | + linkFnFound = true; |
|---|
| 6933 | + nodeLinkFnFound = nodeLinkFnFound || nodeLinkFn; |
|---|
| 6934 | + } |
|---|
| 6935 | + |
|---|
| 6936 | + //use the previous context only for the first element in the virtual group |
|---|
| 6937 | + previousCompileContext = null; |
|---|
| 6938 | + } |
|---|
| 6939 | + |
|---|
| 6940 | + // return a linking function if we have found anything, null otherwise |
|---|
| 6941 | + return linkFnFound ? compositeLinkFn : null; |
|---|
| 6942 | + |
|---|
| 6943 | + function compositeLinkFn(scope, nodeList, $rootElement, parentBoundTranscludeFn) { |
|---|
| 6944 | + var nodeLinkFn, childLinkFn, node, childScope, i, ii, idx, childBoundTranscludeFn; |
|---|
| 6945 | + var stableNodeList; |
|---|
| 6946 | + |
|---|
| 6947 | + |
|---|
| 6948 | + if (nodeLinkFnFound) { |
|---|
| 6949 | + // copy nodeList so that if a nodeLinkFn removes or adds an element at this DOM level our |
|---|
| 6950 | + // offsets don't get screwed up |
|---|
| 6951 | + var nodeListLength = nodeList.length; |
|---|
| 6952 | + stableNodeList = new Array(nodeListLength); |
|---|
| 6953 | + |
|---|
| 6954 | + // create a sparse array by only copying the elements which have a linkFn |
|---|
| 6955 | + for (i = 0; i < linkFns.length; i+=3) { |
|---|
| 6956 | + idx = linkFns[i]; |
|---|
| 6957 | + stableNodeList[idx] = nodeList[idx]; |
|---|
| 6958 | + } |
|---|
| 6959 | + } else { |
|---|
| 6960 | + stableNodeList = nodeList; |
|---|
| 6961 | + } |
|---|
| 6962 | + |
|---|
| 6963 | + for(i = 0, ii = linkFns.length; i < ii;) { |
|---|
| 6964 | + node = stableNodeList[linkFns[i++]]; |
|---|
| 6965 | + nodeLinkFn = linkFns[i++]; |
|---|
| 6966 | + childLinkFn = linkFns[i++]; |
|---|
| 6967 | + |
|---|
| 6968 | + if (nodeLinkFn) { |
|---|
| 6969 | + if (nodeLinkFn.scope) { |
|---|
| 6970 | + childScope = scope.$new(); |
|---|
| 6971 | + compile.$$addScopeInfo(jqLite(node), childScope); |
|---|
| 6972 | + } else { |
|---|
| 6973 | + childScope = scope; |
|---|
| 6974 | + } |
|---|
| 6975 | + |
|---|
| 6976 | + if ( nodeLinkFn.transcludeOnThisElement ) { |
|---|
| 6977 | + childBoundTranscludeFn = createBoundTranscludeFn( |
|---|
| 6978 | + scope, nodeLinkFn.transclude, parentBoundTranscludeFn, |
|---|
| 6979 | + nodeLinkFn.elementTranscludeOnThisElement); |
|---|
| 6980 | + |
|---|
| 6981 | + } else if (!nodeLinkFn.templateOnThisElement && parentBoundTranscludeFn) { |
|---|
| 6982 | + childBoundTranscludeFn = parentBoundTranscludeFn; |
|---|
| 6983 | + |
|---|
| 6984 | + } else if (!parentBoundTranscludeFn && transcludeFn) { |
|---|
| 6985 | + childBoundTranscludeFn = createBoundTranscludeFn(scope, transcludeFn); |
|---|
| 6986 | + |
|---|
| 6987 | + } else { |
|---|
| 6988 | + childBoundTranscludeFn = null; |
|---|
| 6989 | + } |
|---|
| 6990 | + |
|---|
| 6991 | + nodeLinkFn(childLinkFn, childScope, node, $rootElement, childBoundTranscludeFn); |
|---|
| 6992 | + |
|---|
| 6993 | + } else if (childLinkFn) { |
|---|
| 6994 | + childLinkFn(scope, node.childNodes, undefined, parentBoundTranscludeFn); |
|---|
| 6995 | + } |
|---|
| 6996 | + } |
|---|
| 6997 | + } |
|---|
| 6998 | + } |
|---|
| 6999 | + |
|---|
| 7000 | + function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn, elementTransclusion) { |
|---|
| 7001 | + |
|---|
| 7002 | + var boundTranscludeFn = function(transcludedScope, cloneFn, controllers, futureParentElement, containingScope) { |
|---|
| 7003 | + |
|---|
| 7004 | + if (!transcludedScope) { |
|---|
| 7005 | + transcludedScope = scope.$new(false, containingScope); |
|---|
| 7006 | + transcludedScope.$$transcluded = true; |
|---|
| 7007 | + } |
|---|
| 7008 | + |
|---|
| 7009 | + return transcludeFn(transcludedScope, cloneFn, controllers, previousBoundTranscludeFn, futureParentElement); |
|---|
| 7010 | + }; |
|---|
| 7011 | + |
|---|
| 7012 | + return boundTranscludeFn; |
|---|
| 7013 | + } |
|---|
| 7014 | + |
|---|
| 7015 | + /** |
|---|
| 7016 | + * Looks for directives on the given node and adds them to the directive collection which is |
|---|
| 7017 | + * sorted. |
|---|
| 7018 | + * |
|---|
| 7019 | + * @param node Node to search. |
|---|
| 7020 | + * @param directives An array to which the directives are added to. This array is sorted before |
|---|
| 7021 | + * the function returns. |
|---|
| 7022 | + * @param attrs The shared attrs object which is used to populate the normalized attributes. |
|---|
| 7023 | + * @param {number=} maxPriority Max directive priority. |
|---|
| 7024 | + */ |
|---|
| 7025 | + function collectDirectives(node, directives, attrs, maxPriority, ignoreDirective) { |
|---|
| 7026 | + var nodeType = node.nodeType, |
|---|
| 7027 | + attrsMap = attrs.$attr, |
|---|
| 7028 | + match, |
|---|
| 7029 | + className; |
|---|
| 7030 | + |
|---|
| 7031 | + switch(nodeType) { |
|---|
| 7032 | + case NODE_TYPE_ELEMENT: /* Element */ |
|---|
| 7033 | + // use the node name: <directive> |
|---|
| 7034 | + addDirective(directives, |
|---|
| 7035 | + directiveNormalize(nodeName_(node)), 'E', maxPriority, ignoreDirective); |
|---|
| 7036 | + |
|---|
| 7037 | + // iterate over the attributes |
|---|
| 7038 | + for (var attr, name, nName, ngAttrName, value, isNgAttr, nAttrs = node.attributes, |
|---|
| 7039 | + j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) { |
|---|
| 7040 | + var attrStartName = false; |
|---|
| 7041 | + var attrEndName = false; |
|---|
| 7042 | + |
|---|
| 7043 | + attr = nAttrs[j]; |
|---|
| 7044 | + name = attr.name; |
|---|
| 7045 | + value = trim(attr.value); |
|---|
| 7046 | + |
|---|
| 7047 | + // support ngAttr attribute binding |
|---|
| 7048 | + ngAttrName = directiveNormalize(name); |
|---|
| 7049 | + if (isNgAttr = NG_ATTR_BINDING.test(ngAttrName)) { |
|---|
| 7050 | + name = snake_case(ngAttrName.substr(6), '-'); |
|---|
| 7051 | + } |
|---|
| 7052 | + |
|---|
| 7053 | + var directiveNName = ngAttrName.replace(/(Start|End)$/, ''); |
|---|
| 7054 | + if (directiveIsMultiElement(directiveNName)) { |
|---|
| 7055 | + if (ngAttrName === directiveNName + 'Start') { |
|---|
| 7056 | + attrStartName = name; |
|---|
| 7057 | + attrEndName = name.substr(0, name.length - 5) + 'end'; |
|---|
| 7058 | + name = name.substr(0, name.length - 6); |
|---|
| 7059 | + } |
|---|
| 7060 | + } |
|---|
| 7061 | + |
|---|
| 7062 | + nName = directiveNormalize(name.toLowerCase()); |
|---|
| 7063 | + attrsMap[nName] = name; |
|---|
| 7064 | + if (isNgAttr || !attrs.hasOwnProperty(nName)) { |
|---|
| 7065 | + attrs[nName] = value; |
|---|
| 7066 | + if (getBooleanAttrName(node, nName)) { |
|---|
| 7067 | + attrs[nName] = true; // presence means true |
|---|
| 7068 | + } |
|---|
| 7069 | + } |
|---|
| 7070 | + addAttrInterpolateDirective(node, directives, value, nName, isNgAttr); |
|---|
| 7071 | + addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName, |
|---|
| 7072 | + attrEndName); |
|---|
| 7073 | + } |
|---|
| 7074 | + |
|---|
| 7075 | + // use class as directive |
|---|
| 7076 | + className = node.className; |
|---|
| 7077 | + if (isString(className) && className !== '') { |
|---|
| 7078 | + while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) { |
|---|
| 7079 | + nName = directiveNormalize(match[2]); |
|---|
| 7080 | + if (addDirective(directives, nName, 'C', maxPriority, ignoreDirective)) { |
|---|
| 7081 | + attrs[nName] = trim(match[3]); |
|---|
| 7082 | + } |
|---|
| 7083 | + className = className.substr(match.index + match[0].length); |
|---|
| 7084 | + } |
|---|
| 7085 | + } |
|---|
| 7086 | + break; |
|---|
| 7087 | + case NODE_TYPE_TEXT: /* Text Node */ |
|---|
| 7088 | + addTextInterpolateDirective(directives, node.nodeValue); |
|---|
| 7089 | + break; |
|---|
| 7090 | + case NODE_TYPE_COMMENT: /* Comment */ |
|---|
| 7091 | + try { |
|---|
| 7092 | + match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue); |
|---|
| 7093 | + if (match) { |
|---|
| 7094 | + nName = directiveNormalize(match[1]); |
|---|
| 7095 | + if (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) { |
|---|
| 7096 | + attrs[nName] = trim(match[2]); |
|---|
| 7097 | + } |
|---|
| 7098 | + } |
|---|
| 7099 | + } catch (e) { |
|---|
| 7100 | + // turns out that under some circumstances IE9 throws errors when one attempts to read |
|---|
| 7101 | + // comment's node value. |
|---|
| 7102 | + // Just ignore it and continue. (Can't seem to reproduce in test case.) |
|---|
| 7103 | + } |
|---|
| 7104 | + break; |
|---|
| 7105 | + } |
|---|
| 7106 | + |
|---|
| 7107 | + directives.sort(byPriority); |
|---|
| 7108 | + return directives; |
|---|
| 7109 | + } |
|---|
| 7110 | + |
|---|
| 7111 | + /** |
|---|
| 7112 | + * Given a node with an directive-start it collects all of the siblings until it finds |
|---|
| 7113 | + * directive-end. |
|---|
| 7114 | + * @param node |
|---|
| 7115 | + * @param attrStart |
|---|
| 7116 | + * @param attrEnd |
|---|
| 7117 | + * @returns {*} |
|---|
| 7118 | + */ |
|---|
| 7119 | + function groupScan(node, attrStart, attrEnd) { |
|---|
| 7120 | + var nodes = []; |
|---|
| 7121 | + var depth = 0; |
|---|
| 7122 | + if (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) { |
|---|
| 7123 | + var startNode = node; |
|---|
| 7124 | + do { |
|---|
| 7125 | + if (!node) { |
|---|
| 7126 | + throw $compileMinErr('uterdir', |
|---|
| 7127 | + "Unterminated attribute, found '{0}' but no matching '{1}' found.", |
|---|
| 7128 | + attrStart, attrEnd); |
|---|
| 7129 | + } |
|---|
| 7130 | + if (node.nodeType == NODE_TYPE_ELEMENT) { |
|---|
| 7131 | + if (node.hasAttribute(attrStart)) depth++; |
|---|
| 7132 | + if (node.hasAttribute(attrEnd)) depth--; |
|---|
| 7133 | + } |
|---|
| 7134 | + nodes.push(node); |
|---|
| 7135 | + node = node.nextSibling; |
|---|
| 7136 | + } while (depth > 0); |
|---|
| 7137 | + } else { |
|---|
| 7138 | + nodes.push(node); |
|---|
| 7139 | + } |
|---|
| 7140 | + |
|---|
| 7141 | + return jqLite(nodes); |
|---|
| 7142 | + } |
|---|
| 7143 | + |
|---|
| 7144 | + /** |
|---|
| 7145 | + * Wrapper for linking function which converts normal linking function into a grouped |
|---|
| 7146 | + * linking function. |
|---|
| 7147 | + * @param linkFn |
|---|
| 7148 | + * @param attrStart |
|---|
| 7149 | + * @param attrEnd |
|---|
| 7150 | + * @returns {Function} |
|---|
| 7151 | + */ |
|---|
| 7152 | + function groupElementsLinkFnWrapper(linkFn, attrStart, attrEnd) { |
|---|
| 7153 | + return function(scope, element, attrs, controllers, transcludeFn) { |
|---|
| 7154 | + element = groupScan(element[0], attrStart, attrEnd); |
|---|
| 7155 | + return linkFn(scope, element, attrs, controllers, transcludeFn); |
|---|
| 7156 | + }; |
|---|
| 7157 | + } |
|---|
| 7158 | + |
|---|
| 7159 | + /** |
|---|
| 7160 | + * Once the directives have been collected, their compile functions are executed. This method |
|---|
| 7161 | + * is responsible for inlining directive templates as well as terminating the application |
|---|
| 7162 | + * of the directives if the terminal directive has been reached. |
|---|
| 7163 | + * |
|---|
| 7164 | + * @param {Array} directives Array of collected directives to execute their compile function. |
|---|
| 7165 | + * this needs to be pre-sorted by priority order. |
|---|
| 7166 | + * @param {Node} compileNode The raw DOM node to apply the compile functions to |
|---|
| 7167 | + * @param {Object} templateAttrs The shared attribute function |
|---|
| 7168 | + * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the |
|---|
| 7169 | + * scope argument is auto-generated to the new |
|---|
| 7170 | + * child of the transcluded parent scope. |
|---|
| 7171 | + * @param {JQLite} jqCollection If we are working on the root of the compile tree then this |
|---|
| 7172 | + * argument has the root jqLite array so that we can replace nodes |
|---|
| 7173 | + * on it. |
|---|
| 7174 | + * @param {Object=} originalReplaceDirective An optional directive that will be ignored when |
|---|
| 7175 | + * compiling the transclusion. |
|---|
| 7176 | + * @param {Array.<Function>} preLinkFns |
|---|
| 7177 | + * @param {Array.<Function>} postLinkFns |
|---|
| 7178 | + * @param {Object} previousCompileContext Context used for previous compilation of the current |
|---|
| 7179 | + * node |
|---|
| 7180 | + * @returns {Function} linkFn |
|---|
| 7181 | + */ |
|---|
| 7182 | + function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn, |
|---|
| 7183 | + jqCollection, originalReplaceDirective, preLinkFns, postLinkFns, |
|---|
| 7184 | + previousCompileContext) { |
|---|
| 7185 | + previousCompileContext = previousCompileContext || {}; |
|---|
| 7186 | + |
|---|
| 7187 | + var terminalPriority = -Number.MAX_VALUE, |
|---|
| 7188 | + newScopeDirective, |
|---|
| 7189 | + controllerDirectives = previousCompileContext.controllerDirectives, |
|---|
| 7190 | + controllers, |
|---|
| 7191 | + newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective, |
|---|
| 7192 | + templateDirective = previousCompileContext.templateDirective, |
|---|
| 7193 | + nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective, |
|---|
| 7194 | + hasTranscludeDirective = false, |
|---|
| 7195 | + hasTemplate = false, |
|---|
| 7196 | + hasElementTranscludeDirective = previousCompileContext.hasElementTranscludeDirective, |
|---|
| 7197 | + $compileNode = templateAttrs.$$element = jqLite(compileNode), |
|---|
| 7198 | + directive, |
|---|
| 7199 | + directiveName, |
|---|
| 7200 | + $template, |
|---|
| 7201 | + replaceDirective = originalReplaceDirective, |
|---|
| 7202 | + childTranscludeFn = transcludeFn, |
|---|
| 7203 | + linkFn, |
|---|
| 7204 | + directiveValue; |
|---|
| 7205 | + |
|---|
| 7206 | + // executes all directives on the current element |
|---|
| 7207 | + for(var i = 0, ii = directives.length; i < ii; i++) { |
|---|
| 7208 | + directive = directives[i]; |
|---|
| 7209 | + var attrStart = directive.$$start; |
|---|
| 7210 | + var attrEnd = directive.$$end; |
|---|
| 7211 | + |
|---|
| 7212 | + // collect multiblock sections |
|---|
| 7213 | + if (attrStart) { |
|---|
| 7214 | + $compileNode = groupScan(compileNode, attrStart, attrEnd); |
|---|
| 7215 | + } |
|---|
| 7216 | + $template = undefined; |
|---|
| 7217 | + |
|---|
| 7218 | + if (terminalPriority > directive.priority) { |
|---|
| 7219 | + break; // prevent further processing of directives |
|---|
| 7220 | + } |
|---|
| 7221 | + |
|---|
| 7222 | + if (directiveValue = directive.scope) { |
|---|
| 7223 | + |
|---|
| 7224 | + // skip the check for directives with async templates, we'll check the derived sync |
|---|
| 7225 | + // directive when the template arrives |
|---|
| 7226 | + if (!directive.templateUrl) { |
|---|
| 7227 | + if (isObject(directiveValue)) { |
|---|
| 7228 | + // This directive is trying to add an isolated scope. |
|---|
| 7229 | + // Check that there is no scope of any kind already |
|---|
| 7230 | + assertNoDuplicate('new/isolated scope', newIsolateScopeDirective || newScopeDirective, |
|---|
| 7231 | + directive, $compileNode); |
|---|
| 7232 | + newIsolateScopeDirective = directive; |
|---|
| 7233 | + } else { |
|---|
| 7234 | + // This directive is trying to add a child scope. |
|---|
| 7235 | + // Check that there is no isolated scope already |
|---|
| 7236 | + assertNoDuplicate('new/isolated scope', newIsolateScopeDirective, directive, |
|---|
| 7237 | + $compileNode); |
|---|
| 7238 | + } |
|---|
| 7239 | + } |
|---|
| 7240 | + |
|---|
| 7241 | + newScopeDirective = newScopeDirective || directive; |
|---|
| 7242 | + } |
|---|
| 7243 | + |
|---|
| 7244 | + directiveName = directive.name; |
|---|
| 7245 | + |
|---|
| 7246 | + if (!directive.templateUrl && directive.controller) { |
|---|
| 7247 | + directiveValue = directive.controller; |
|---|
| 7248 | + controllerDirectives = controllerDirectives || {}; |
|---|
| 7249 | + assertNoDuplicate("'" + directiveName + "' controller", |
|---|
| 7250 | + controllerDirectives[directiveName], directive, $compileNode); |
|---|
| 7251 | + controllerDirectives[directiveName] = directive; |
|---|
| 7252 | + } |
|---|
| 7253 | + |
|---|
| 7254 | + if (directiveValue = directive.transclude) { |
|---|
| 7255 | + hasTranscludeDirective = true; |
|---|
| 7256 | + |
|---|
| 7257 | + // Special case ngIf and ngRepeat so that we don't complain about duplicate transclusion. |
|---|
| 7258 | + // This option should only be used by directives that know how to safely handle element transclusion, |
|---|
| 7259 | + // where the transcluded nodes are added or replaced after linking. |
|---|
| 7260 | + if (!directive.$$tlb) { |
|---|
| 7261 | + assertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive, $compileNode); |
|---|
| 7262 | + nonTlbTranscludeDirective = directive; |
|---|
| 7263 | + } |
|---|
| 7264 | + |
|---|
| 7265 | + if (directiveValue == 'element') { |
|---|
| 7266 | + hasElementTranscludeDirective = true; |
|---|
| 7267 | + terminalPriority = directive.priority; |
|---|
| 7268 | + $template = $compileNode; |
|---|
| 7269 | + $compileNode = templateAttrs.$$element = |
|---|
| 7270 | + jqLite(document.createComment(' ' + directiveName + ': ' + |
|---|
| 7271 | + templateAttrs[directiveName] + ' ')); |
|---|
| 7272 | + compileNode = $compileNode[0]; |
|---|
| 7273 | + replaceWith(jqCollection, sliceArgs($template), compileNode); |
|---|
| 7274 | + |
|---|
| 7275 | + childTranscludeFn = compile($template, transcludeFn, terminalPriority, |
|---|
| 7276 | + replaceDirective && replaceDirective.name, { |
|---|
| 7277 | + // Don't pass in: |
|---|
| 7278 | + // - controllerDirectives - otherwise we'll create duplicates controllers |
|---|
| 7279 | + // - newIsolateScopeDirective or templateDirective - combining templates with |
|---|
| 7280 | + // element transclusion doesn't make sense. |
|---|
| 7281 | + // |
|---|
| 7282 | + // We need only nonTlbTranscludeDirective so that we prevent putting transclusion |
|---|
| 7283 | + // on the same element more than once. |
|---|
| 7284 | + nonTlbTranscludeDirective: nonTlbTranscludeDirective |
|---|
| 7285 | + }); |
|---|
| 7286 | + } else { |
|---|
| 7287 | + $template = jqLite(jqLiteClone(compileNode)).contents(); |
|---|
| 7288 | + $compileNode.empty(); // clear contents |
|---|
| 7289 | + childTranscludeFn = compile($template, transcludeFn); |
|---|
| 7290 | + } |
|---|
| 7291 | + } |
|---|
| 7292 | + |
|---|
| 7293 | + if (directive.template) { |
|---|
| 7294 | + hasTemplate = true; |
|---|
| 7295 | + assertNoDuplicate('template', templateDirective, directive, $compileNode); |
|---|
| 7296 | + templateDirective = directive; |
|---|
| 7297 | + |
|---|
| 7298 | + directiveValue = (isFunction(directive.template)) |
|---|
| 7299 | + ? directive.template($compileNode, templateAttrs) |
|---|
| 7300 | + : directive.template; |
|---|
| 7301 | + |
|---|
| 7302 | + directiveValue = denormalizeTemplate(directiveValue); |
|---|
| 7303 | + |
|---|
| 7304 | + if (directive.replace) { |
|---|
| 7305 | + replaceDirective = directive; |
|---|
| 7306 | + if (jqLiteIsTextNode(directiveValue)) { |
|---|
| 7307 | + $template = []; |
|---|
| 7308 | + } else { |
|---|
| 7309 | + $template = removeComments(wrapTemplate(directive.templateNamespace, trim(directiveValue))); |
|---|
| 7310 | + } |
|---|
| 7311 | + compileNode = $template[0]; |
|---|
| 7312 | + |
|---|
| 7313 | + if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) { |
|---|
| 7314 | + throw $compileMinErr('tplrt', |
|---|
| 7315 | + "Template for directive '{0}' must have exactly one root element. {1}", |
|---|
| 7316 | + directiveName, ''); |
|---|
| 7317 | + } |
|---|
| 7318 | + |
|---|
| 7319 | + replaceWith(jqCollection, $compileNode, compileNode); |
|---|
| 7320 | + |
|---|
| 7321 | + var newTemplateAttrs = {$attr: {}}; |
|---|
| 7322 | + |
|---|
| 7323 | + // combine directives from the original node and from the template: |
|---|
| 7324 | + // - take the array of directives for this element |
|---|
| 7325 | + // - split it into two parts, those that already applied (processed) and those that weren't (unprocessed) |
|---|
| 7326 | + // - collect directives from the template and sort them by priority |
|---|
| 7327 | + // - combine directives as: processed + template + unprocessed |
|---|
| 7328 | + var templateDirectives = collectDirectives(compileNode, [], newTemplateAttrs); |
|---|
| 7329 | + var unprocessedDirectives = directives.splice(i + 1, directives.length - (i + 1)); |
|---|
| 7330 | + |
|---|
| 7331 | + if (newIsolateScopeDirective) { |
|---|
| 7332 | + markDirectivesAsIsolate(templateDirectives); |
|---|
| 7333 | + } |
|---|
| 7334 | + directives = directives.concat(templateDirectives).concat(unprocessedDirectives); |
|---|
| 7335 | + mergeTemplateAttributes(templateAttrs, newTemplateAttrs); |
|---|
| 7336 | + |
|---|
| 7337 | + ii = directives.length; |
|---|
| 7338 | + } else { |
|---|
| 7339 | + $compileNode.html(directiveValue); |
|---|
| 7340 | + } |
|---|
| 7341 | + } |
|---|
| 7342 | + |
|---|
| 7343 | + if (directive.templateUrl) { |
|---|
| 7344 | + hasTemplate = true; |
|---|
| 7345 | + assertNoDuplicate('template', templateDirective, directive, $compileNode); |
|---|
| 7346 | + templateDirective = directive; |
|---|
| 7347 | + |
|---|
| 7348 | + if (directive.replace) { |
|---|
| 7349 | + replaceDirective = directive; |
|---|
| 7350 | + } |
|---|
| 7351 | + |
|---|
| 7352 | + nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode, |
|---|
| 7353 | + templateAttrs, jqCollection, hasTranscludeDirective && childTranscludeFn, preLinkFns, postLinkFns, { |
|---|
| 7354 | + controllerDirectives: controllerDirectives, |
|---|
| 7355 | + newIsolateScopeDirective: newIsolateScopeDirective, |
|---|
| 7356 | + templateDirective: templateDirective, |
|---|
| 7357 | + nonTlbTranscludeDirective: nonTlbTranscludeDirective |
|---|
| 7358 | + }); |
|---|
| 7359 | + ii = directives.length; |
|---|
| 7360 | + } else if (directive.compile) { |
|---|
| 7361 | + try { |
|---|
| 7362 | + linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn); |
|---|
| 7363 | + if (isFunction(linkFn)) { |
|---|
| 7364 | + addLinkFns(null, linkFn, attrStart, attrEnd); |
|---|
| 7365 | + } else if (linkFn) { |
|---|
| 7366 | + addLinkFns(linkFn.pre, linkFn.post, attrStart, attrEnd); |
|---|
| 7367 | + } |
|---|
| 7368 | + } catch (e) { |
|---|
| 7369 | + $exceptionHandler(e, startingTag($compileNode)); |
|---|
| 7370 | + } |
|---|
| 7371 | + } |
|---|
| 7372 | + |
|---|
| 7373 | + if (directive.terminal) { |
|---|
| 7374 | + nodeLinkFn.terminal = true; |
|---|
| 7375 | + terminalPriority = Math.max(terminalPriority, directive.priority); |
|---|
| 7376 | + } |
|---|
| 7377 | + |
|---|
| 7378 | + } |
|---|
| 7379 | + |
|---|
| 7380 | + nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true; |
|---|
| 7381 | + nodeLinkFn.transcludeOnThisElement = hasTranscludeDirective; |
|---|
| 7382 | + nodeLinkFn.elementTranscludeOnThisElement = hasElementTranscludeDirective; |
|---|
| 7383 | + nodeLinkFn.templateOnThisElement = hasTemplate; |
|---|
| 7384 | + nodeLinkFn.transclude = childTranscludeFn; |
|---|
| 7385 | + |
|---|
| 7386 | + previousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective; |
|---|
| 7387 | + |
|---|
| 7388 | + // might be normal or delayed nodeLinkFn depending on if templateUrl is present |
|---|
| 7389 | + return nodeLinkFn; |
|---|
| 7390 | + |
|---|
| 7391 | + //////////////////// |
|---|
| 7392 | + |
|---|
| 7393 | + function addLinkFns(pre, post, attrStart, attrEnd) { |
|---|
| 7394 | + if (pre) { |
|---|
| 7395 | + if (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd); |
|---|
| 7396 | + pre.require = directive.require; |
|---|
| 7397 | + pre.directiveName = directiveName; |
|---|
| 7398 | + if (newIsolateScopeDirective === directive || directive.$$isolateScope) { |
|---|
| 7399 | + pre = cloneAndAnnotateFn(pre, {isolateScope: true}); |
|---|
| 7400 | + } |
|---|
| 7401 | + preLinkFns.push(pre); |
|---|
| 7402 | + } |
|---|
| 7403 | + if (post) { |
|---|
| 7404 | + if (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd); |
|---|
| 7405 | + post.require = directive.require; |
|---|
| 7406 | + post.directiveName = directiveName; |
|---|
| 7407 | + if (newIsolateScopeDirective === directive || directive.$$isolateScope) { |
|---|
| 7408 | + post = cloneAndAnnotateFn(post, {isolateScope: true}); |
|---|
| 7409 | + } |
|---|
| 7410 | + postLinkFns.push(post); |
|---|
| 7411 | + } |
|---|
| 7412 | + } |
|---|
| 7413 | + |
|---|
| 7414 | + |
|---|
| 7415 | + function getControllers(directiveName, require, $element, elementControllers) { |
|---|
| 7416 | + var value, retrievalMethod = 'data', optional = false; |
|---|
| 7417 | + var $searchElement = $element; |
|---|
| 7418 | + var match; |
|---|
| 7419 | + if (isString(require)) { |
|---|
| 7420 | + match = require.match(REQUIRE_PREFIX_REGEXP); |
|---|
| 7421 | + require = require.substring(match[0].length); |
|---|
| 7422 | + |
|---|
| 7423 | + if (match[3]) { |
|---|
| 7424 | + if (match[1]) match[3] = null; |
|---|
| 7425 | + else match[1] = match[3]; |
|---|
| 7426 | + } |
|---|
| 7427 | + if (match[1] === '^') { |
|---|
| 7428 | + retrievalMethod = 'inheritedData'; |
|---|
| 7429 | + } else if (match[1] === '^^') { |
|---|
| 7430 | + retrievalMethod = 'inheritedData'; |
|---|
| 7431 | + $searchElement = $element.parent(); |
|---|
| 7432 | + } |
|---|
| 7433 | + if (match[2] === '?') { |
|---|
| 7434 | + optional = true; |
|---|
| 7435 | + } |
|---|
| 7436 | + |
|---|
| 7437 | + value = null; |
|---|
| 7438 | + |
|---|
| 7439 | + if (elementControllers && retrievalMethod === 'data') { |
|---|
| 7440 | + if (value = elementControllers[require]) { |
|---|
| 7441 | + value = value.instance; |
|---|
| 7442 | + } |
|---|
| 7443 | + } |
|---|
| 7444 | + value = value || $searchElement[retrievalMethod]('$' + require + 'Controller'); |
|---|
| 7445 | + |
|---|
| 7446 | + if (!value && !optional) { |
|---|
| 7447 | + throw $compileMinErr('ctreq', |
|---|
| 7448 | + "Controller '{0}', required by directive '{1}', can't be found!", |
|---|
| 7449 | + require, directiveName); |
|---|
| 7450 | + } |
|---|
| 7451 | + return value; |
|---|
| 7452 | + } else if (isArray(require)) { |
|---|
| 7453 | + value = []; |
|---|
| 7454 | + forEach(require, function(require) { |
|---|
| 7455 | + value.push(getControllers(directiveName, require, $element, elementControllers)); |
|---|
| 7456 | + }); |
|---|
| 7457 | + } |
|---|
| 7458 | + return value; |
|---|
| 7459 | + } |
|---|
| 7460 | + |
|---|
| 7461 | + |
|---|
| 7462 | + function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) { |
|---|
| 7463 | + var i, ii, linkFn, controller, isolateScope, elementControllers, transcludeFn, $element, |
|---|
| 7464 | + attrs; |
|---|
| 7465 | + |
|---|
| 7466 | + if (compileNode === linkNode) { |
|---|
| 7467 | + attrs = templateAttrs; |
|---|
| 7468 | + $element = templateAttrs.$$element; |
|---|
| 7469 | + } else { |
|---|
| 7470 | + $element = jqLite(linkNode); |
|---|
| 7471 | + attrs = new Attributes($element, templateAttrs); |
|---|
| 7472 | + } |
|---|
| 7473 | + |
|---|
| 7474 | + if (newIsolateScopeDirective) { |
|---|
| 7475 | + isolateScope = scope.$new(true); |
|---|
| 7476 | + } |
|---|
| 7477 | + |
|---|
| 7478 | + transcludeFn = boundTranscludeFn && controllersBoundTransclude; |
|---|
| 7479 | + if (controllerDirectives) { |
|---|
| 7480 | + // TODO: merge `controllers` and `elementControllers` into single object. |
|---|
| 7481 | + controllers = {}; |
|---|
| 7482 | + elementControllers = {}; |
|---|
| 7483 | + forEach(controllerDirectives, function(directive) { |
|---|
| 7484 | + var locals = { |
|---|
| 7485 | + $scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope, |
|---|
| 7486 | + $element: $element, |
|---|
| 7487 | + $attrs: attrs, |
|---|
| 7488 | + $transclude: transcludeFn |
|---|
| 7489 | + }, controllerInstance; |
|---|
| 7490 | + |
|---|
| 7491 | + controller = directive.controller; |
|---|
| 7492 | + if (controller == '@') { |
|---|
| 7493 | + controller = attrs[directive.name]; |
|---|
| 7494 | + } |
|---|
| 7495 | + |
|---|
| 7496 | + controllerInstance = $controller(controller, locals, true, directive.controllerAs); |
|---|
| 7497 | + |
|---|
| 7498 | + // For directives with element transclusion the element is a comment, |
|---|
| 7499 | + // but jQuery .data doesn't support attaching data to comment nodes as it's hard to |
|---|
| 7500 | + // clean up (http://bugs.jquery.com/ticket/8335). |
|---|
| 7501 | + // Instead, we save the controllers for the element in a local hash and attach to .data |
|---|
| 7502 | + // later, once we have the actual element. |
|---|
| 7503 | + elementControllers[directive.name] = controllerInstance; |
|---|
| 7504 | + if (!hasElementTranscludeDirective) { |
|---|
| 7505 | + $element.data('$' + directive.name + 'Controller', controllerInstance.instance); |
|---|
| 7506 | + } |
|---|
| 7507 | + |
|---|
| 7508 | + controllers[directive.name] = controllerInstance; |
|---|
| 7509 | + }); |
|---|
| 7510 | + } |
|---|
| 7511 | + |
|---|
| 7512 | + if (newIsolateScopeDirective) { |
|---|
| 7513 | + var LOCAL_REGEXP = /^\s*([@=&])(\??)\s*(\w*)\s*$/; |
|---|
| 7514 | + |
|---|
| 7515 | + compile.$$addScopeInfo($element, isolateScope, true, !(templateDirective && (templateDirective === newIsolateScopeDirective || |
|---|
| 7516 | + templateDirective === newIsolateScopeDirective.$$originalDirective))); |
|---|
| 7517 | + compile.$$addScopeClass($element, true); |
|---|
| 7518 | + |
|---|
| 7519 | + var isolateScopeController = controllers && controllers[newIsolateScopeDirective.name]; |
|---|
| 7520 | + var isolateBindingContext = isolateScope; |
|---|
| 7521 | + if (isolateScopeController && isolateScopeController.identifier && |
|---|
| 7522 | + newIsolateScopeDirective.bindToController === true) { |
|---|
| 7523 | + isolateBindingContext = isolateScopeController.instance; |
|---|
| 7524 | + } |
|---|
| 7525 | + |
|---|
| 7526 | + forEach(isolateScope.$$isolateBindings = newIsolateScopeDirective.$$isolateBindings, function(definition, scopeName) { |
|---|
| 7527 | + var attrName = definition.attrName, |
|---|
| 7528 | + optional = definition.optional, |
|---|
| 7529 | + mode = definition.mode, // @, =, or & |
|---|
| 7530 | + lastValue, |
|---|
| 7531 | + parentGet, parentSet, compare; |
|---|
| 7532 | + |
|---|
| 7533 | + switch (mode) { |
|---|
| 7534 | + |
|---|
| 7535 | + case '@': |
|---|
| 7536 | + attrs.$observe(attrName, function(value) { |
|---|
| 7537 | + isolateBindingContext[scopeName] = value; |
|---|
| 7538 | + }); |
|---|
| 7539 | + attrs.$$observers[attrName].$$scope = scope; |
|---|
| 7540 | + if( attrs[attrName] ) { |
|---|
| 7541 | + // If the attribute has been provided then we trigger an interpolation to ensure |
|---|
| 7542 | + // the value is there for use in the link fn |
|---|
| 7543 | + isolateBindingContext[scopeName] = $interpolate(attrs[attrName])(scope); |
|---|
| 7544 | + } |
|---|
| 7545 | + break; |
|---|
| 7546 | + |
|---|
| 7547 | + case '=': |
|---|
| 7548 | + if (optional && !attrs[attrName]) { |
|---|
| 7549 | + return; |
|---|
| 7550 | + } |
|---|
| 7551 | + parentGet = $parse(attrs[attrName]); |
|---|
| 7552 | + if (parentGet.literal) { |
|---|
| 7553 | + compare = equals; |
|---|
| 7554 | + } else { |
|---|
| 7555 | + compare = function(a,b) { return a === b || (a !== a && b !== b); }; |
|---|
| 7556 | + } |
|---|
| 7557 | + parentSet = parentGet.assign || function() { |
|---|
| 7558 | + // reset the change, or we will throw this exception on every $digest |
|---|
| 7559 | + lastValue = isolateBindingContext[scopeName] = parentGet(scope); |
|---|
| 7560 | + throw $compileMinErr('nonassign', |
|---|
| 7561 | + "Expression '{0}' used with directive '{1}' is non-assignable!", |
|---|
| 7562 | + attrs[attrName], newIsolateScopeDirective.name); |
|---|
| 7563 | + }; |
|---|
| 7564 | + lastValue = isolateBindingContext[scopeName] = parentGet(scope); |
|---|
| 7565 | + var parentValueWatch = function parentValueWatch(parentValue) { |
|---|
| 7566 | + if (!compare(parentValue, isolateBindingContext[scopeName])) { |
|---|
| 7567 | + // we are out of sync and need to copy |
|---|
| 7568 | + if (!compare(parentValue, lastValue)) { |
|---|
| 7569 | + // parent changed and it has precedence |
|---|
| 7570 | + isolateBindingContext[scopeName] = parentValue; |
|---|
| 7571 | + } else { |
|---|
| 7572 | + // if the parent can be assigned then do so |
|---|
| 7573 | + parentSet(scope, parentValue = isolateBindingContext[scopeName]); |
|---|
| 7574 | + } |
|---|
| 7575 | + } |
|---|
| 7576 | + return lastValue = parentValue; |
|---|
| 7577 | + }; |
|---|
| 7578 | + parentValueWatch.$stateful = true; |
|---|
| 7579 | + var unwatch = scope.$watch($parse(attrs[attrName], parentValueWatch), null, parentGet.literal); |
|---|
| 7580 | + isolateScope.$on('$destroy', unwatch); |
|---|
| 7581 | + break; |
|---|
| 7582 | + |
|---|
| 7583 | + case '&': |
|---|
| 7584 | + parentGet = $parse(attrs[attrName]); |
|---|
| 7585 | + isolateBindingContext[scopeName] = function(locals) { |
|---|
| 7586 | + return parentGet(scope, locals); |
|---|
| 7587 | + }; |
|---|
| 7588 | + break; |
|---|
| 7589 | + } |
|---|
| 7590 | + }); |
|---|
| 7591 | + } |
|---|
| 7592 | + if (controllers) { |
|---|
| 7593 | + forEach(controllers, function(controller) { |
|---|
| 7594 | + controller(); |
|---|
| 7595 | + }); |
|---|
| 7596 | + controllers = null; |
|---|
| 7597 | + } |
|---|
| 7598 | + |
|---|
| 7599 | + // PRELINKING |
|---|
| 7600 | + for(i = 0, ii = preLinkFns.length; i < ii; i++) { |
|---|
| 7601 | + linkFn = preLinkFns[i]; |
|---|
| 7602 | + invokeLinkFn(linkFn, |
|---|
| 7603 | + linkFn.isolateScope ? isolateScope : scope, |
|---|
| 7604 | + $element, |
|---|
| 7605 | + attrs, |
|---|
| 7606 | + linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), |
|---|
| 7607 | + transcludeFn |
|---|
| 7608 | + ); |
|---|
| 7609 | + } |
|---|
| 7610 | + |
|---|
| 7611 | + // RECURSION |
|---|
| 7612 | + // We only pass the isolate scope, if the isolate directive has a template, |
|---|
| 7613 | + // otherwise the child elements do not belong to the isolate directive. |
|---|
| 7614 | + var scopeToChild = scope; |
|---|
| 7615 | + if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) { |
|---|
| 7616 | + scopeToChild = isolateScope; |
|---|
| 7617 | + } |
|---|
| 7618 | + childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn); |
|---|
| 7619 | + |
|---|
| 7620 | + // POSTLINKING |
|---|
| 7621 | + for(i = postLinkFns.length - 1; i >= 0; i--) { |
|---|
| 7622 | + linkFn = postLinkFns[i]; |
|---|
| 7623 | + invokeLinkFn(linkFn, |
|---|
| 7624 | + linkFn.isolateScope ? isolateScope : scope, |
|---|
| 7625 | + $element, |
|---|
| 7626 | + attrs, |
|---|
| 7627 | + linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), |
|---|
| 7628 | + transcludeFn |
|---|
| 7629 | + ); |
|---|
| 7630 | + } |
|---|
| 7631 | + |
|---|
| 7632 | + // This is the function that is injected as `$transclude`. |
|---|
| 7633 | + // Note: all arguments are optional! |
|---|
| 7634 | + function controllersBoundTransclude(scope, cloneAttachFn, futureParentElement) { |
|---|
| 7635 | + var transcludeControllers; |
|---|
| 7636 | + |
|---|
| 7637 | + // No scope passed in: |
|---|
| 7638 | + if (!isScope(scope)) { |
|---|
| 7639 | + futureParentElement = cloneAttachFn; |
|---|
| 7640 | + cloneAttachFn = scope; |
|---|
| 7641 | + scope = undefined; |
|---|
| 7642 | + } |
|---|
| 7643 | + |
|---|
| 7644 | + if (hasElementTranscludeDirective) { |
|---|
| 7645 | + transcludeControllers = elementControllers; |
|---|
| 7646 | + } |
|---|
| 7647 | + if (!futureParentElement) { |
|---|
| 7648 | + futureParentElement = hasElementTranscludeDirective ? $element.parent() : $element; |
|---|
| 7649 | + } |
|---|
| 7650 | + return boundTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild); |
|---|
| 7651 | + } |
|---|
| 7652 | + } |
|---|
| 7653 | + } |
|---|
| 7654 | + |
|---|
| 7655 | + function markDirectivesAsIsolate(directives) { |
|---|
| 7656 | + // mark all directives as needing isolate scope. |
|---|
| 7657 | + for (var j = 0, jj = directives.length; j < jj; j++) { |
|---|
| 7658 | + directives[j] = inherit(directives[j], {$$isolateScope: true}); |
|---|
| 7659 | + } |
|---|
| 7660 | + } |
|---|
| 7661 | + |
|---|
| 7662 | + /** |
|---|
| 7663 | + * looks up the directive and decorates it with exception handling and proper parameters. We |
|---|
| 7664 | + * call this the boundDirective. |
|---|
| 7665 | + * |
|---|
| 7666 | + * @param {string} name name of the directive to look up. |
|---|
| 7667 | + * @param {string} location The directive must be found in specific format. |
|---|
| 7668 | + * String containing any of theses characters: |
|---|
| 7669 | + * |
|---|
| 7670 | + * * `E`: element name |
|---|
| 7671 | + * * `A': attribute |
|---|
| 7672 | + * * `C`: class |
|---|
| 7673 | + * * `M`: comment |
|---|
| 7674 | + * @returns {boolean} true if directive was added. |
|---|
| 7675 | + */ |
|---|
| 7676 | + function addDirective(tDirectives, name, location, maxPriority, ignoreDirective, startAttrName, |
|---|
| 7677 | + endAttrName) { |
|---|
| 7678 | + if (name === ignoreDirective) return null; |
|---|
| 7679 | + var match = null; |
|---|
| 7680 | + if (hasDirectives.hasOwnProperty(name)) { |
|---|
| 7681 | + for(var directive, directives = $injector.get(name + Suffix), |
|---|
| 7682 | + i = 0, ii = directives.length; i<ii; i++) { |
|---|
| 7683 | + try { |
|---|
| 7684 | + directive = directives[i]; |
|---|
| 7685 | + if ( (maxPriority === undefined || maxPriority > directive.priority) && |
|---|
| 7686 | + directive.restrict.indexOf(location) != -1) { |
|---|
| 7687 | + if (startAttrName) { |
|---|
| 7688 | + directive = inherit(directive, {$$start: startAttrName, $$end: endAttrName}); |
|---|
| 7689 | + } |
|---|
| 7690 | + tDirectives.push(directive); |
|---|
| 7691 | + match = directive; |
|---|
| 7692 | + } |
|---|
| 7693 | + } catch(e) { $exceptionHandler(e); } |
|---|
| 7694 | + } |
|---|
| 7695 | + } |
|---|
| 7696 | + return match; |
|---|
| 7697 | + } |
|---|
| 7698 | + |
|---|
| 7699 | + |
|---|
| 7700 | + /** |
|---|
| 7701 | + * looks up the directive and returns true if it is a multi-element directive, |
|---|
| 7702 | + * and therefore requires DOM nodes between -start and -end markers to be grouped |
|---|
| 7703 | + * together. |
|---|
| 7704 | + * |
|---|
| 7705 | + * @param {string} name name of the directive to look up. |
|---|
| 7706 | + * @returns true if directive was registered as multi-element. |
|---|
| 7707 | + */ |
|---|
| 7708 | + function directiveIsMultiElement(name) { |
|---|
| 7709 | + if (hasDirectives.hasOwnProperty(name)) { |
|---|
| 7710 | + for(var directive, directives = $injector.get(name + Suffix), |
|---|
| 7711 | + i = 0, ii = directives.length; i<ii; i++) { |
|---|
| 7712 | + directive = directives[i]; |
|---|
| 7713 | + if (directive.multiElement) { |
|---|
| 7714 | + return true; |
|---|
| 7715 | + } |
|---|
| 7716 | + } |
|---|
| 7717 | + } |
|---|
| 7718 | + return false; |
|---|
| 7719 | + } |
|---|
| 7720 | + |
|---|
| 7721 | + /** |
|---|
| 7722 | + * When the element is replaced with HTML template then the new attributes |
|---|
| 7723 | + * on the template need to be merged with the existing attributes in the DOM. |
|---|
| 7724 | + * The desired effect is to have both of the attributes present. |
|---|
| 7725 | + * |
|---|
| 7726 | + * @param {object} dst destination attributes (original DOM) |
|---|
| 7727 | + * @param {object} src source attributes (from the directive template) |
|---|
| 7728 | + */ |
|---|
| 7729 | + function mergeTemplateAttributes(dst, src) { |
|---|
| 7730 | + var srcAttr = src.$attr, |
|---|
| 7731 | + dstAttr = dst.$attr, |
|---|
| 7732 | + $element = dst.$$element; |
|---|
| 7733 | + |
|---|
| 7734 | + // reapply the old attributes to the new element |
|---|
| 7735 | + forEach(dst, function(value, key) { |
|---|
| 7736 | + if (key.charAt(0) != '$') { |
|---|
| 7737 | + if (src[key] && src[key] !== value) { |
|---|
| 7738 | + value += (key === 'style' ? ';' : ' ') + src[key]; |
|---|
| 7739 | + } |
|---|
| 7740 | + dst.$set(key, value, true, srcAttr[key]); |
|---|
| 7741 | + } |
|---|
| 7742 | + }); |
|---|
| 7743 | + |
|---|
| 7744 | + // copy the new attributes on the old attrs object |
|---|
| 7745 | + forEach(src, function(value, key) { |
|---|
| 7746 | + if (key == 'class') { |
|---|
| 7747 | + safeAddClass($element, value); |
|---|
| 7748 | + dst['class'] = (dst['class'] ? dst['class'] + ' ' : '') + value; |
|---|
| 7749 | + } else if (key == 'style') { |
|---|
| 7750 | + $element.attr('style', $element.attr('style') + ';' + value); |
|---|
| 7751 | + dst['style'] = (dst['style'] ? dst['style'] + ';' : '') + value; |
|---|
| 7752 | + // `dst` will never contain hasOwnProperty as DOM parser won't let it. |
|---|
| 7753 | + // You will get an "InvalidCharacterError: DOM Exception 5" error if you |
|---|
| 7754 | + // have an attribute like "has-own-property" or "data-has-own-property", etc. |
|---|
| 7755 | + } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) { |
|---|
| 7756 | + dst[key] = value; |
|---|
| 7757 | + dstAttr[key] = srcAttr[key]; |
|---|
| 7758 | + } |
|---|
| 7759 | + }); |
|---|
| 7760 | + } |
|---|
| 7761 | + |
|---|
| 7762 | + |
|---|
| 7763 | + function compileTemplateUrl(directives, $compileNode, tAttrs, |
|---|
| 7764 | + $rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext) { |
|---|
| 7765 | + var linkQueue = [], |
|---|
| 7766 | + afterTemplateNodeLinkFn, |
|---|
| 7767 | + afterTemplateChildLinkFn, |
|---|
| 7768 | + beforeTemplateCompileNode = $compileNode[0], |
|---|
| 7769 | + origAsyncDirective = directives.shift(), |
|---|
| 7770 | + // The fact that we have to copy and patch the directive seems wrong! |
|---|
| 7771 | + derivedSyncDirective = extend({}, origAsyncDirective, { |
|---|
| 7772 | + templateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective |
|---|
| 7773 | + }), |
|---|
| 7774 | + templateUrl = (isFunction(origAsyncDirective.templateUrl)) |
|---|
| 7775 | + ? origAsyncDirective.templateUrl($compileNode, tAttrs) |
|---|
| 7776 | + : origAsyncDirective.templateUrl, |
|---|
| 7777 | + templateNamespace = origAsyncDirective.templateNamespace; |
|---|
| 7778 | + |
|---|
| 7779 | + $compileNode.empty(); |
|---|
| 7780 | + |
|---|
| 7781 | + $templateRequest($sce.getTrustedResourceUrl(templateUrl)) |
|---|
| 7782 | + .then(function(content) { |
|---|
| 7783 | + var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn; |
|---|
| 7784 | + |
|---|
| 7785 | + content = denormalizeTemplate(content); |
|---|
| 7786 | + |
|---|
| 7787 | + if (origAsyncDirective.replace) { |
|---|
| 7788 | + if (jqLiteIsTextNode(content)) { |
|---|
| 7789 | + $template = []; |
|---|
| 7790 | + } else { |
|---|
| 7791 | + $template = removeComments(wrapTemplate(templateNamespace, trim(content))); |
|---|
| 7792 | + } |
|---|
| 7793 | + compileNode = $template[0]; |
|---|
| 7794 | + |
|---|
| 7795 | + if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) { |
|---|
| 7796 | + throw $compileMinErr('tplrt', |
|---|
| 7797 | + "Template for directive '{0}' must have exactly one root element. {1}", |
|---|
| 7798 | + origAsyncDirective.name, templateUrl); |
|---|
| 7799 | + } |
|---|
| 7800 | + |
|---|
| 7801 | + tempTemplateAttrs = {$attr: {}}; |
|---|
| 7802 | + replaceWith($rootElement, $compileNode, compileNode); |
|---|
| 7803 | + var templateDirectives = collectDirectives(compileNode, [], tempTemplateAttrs); |
|---|
| 7804 | + |
|---|
| 7805 | + if (isObject(origAsyncDirective.scope)) { |
|---|
| 7806 | + markDirectivesAsIsolate(templateDirectives); |
|---|
| 7807 | + } |
|---|
| 7808 | + directives = templateDirectives.concat(directives); |
|---|
| 7809 | + mergeTemplateAttributes(tAttrs, tempTemplateAttrs); |
|---|
| 7810 | + } else { |
|---|
| 7811 | + compileNode = beforeTemplateCompileNode; |
|---|
| 7812 | + $compileNode.html(content); |
|---|
| 7813 | + } |
|---|
| 7814 | + |
|---|
| 7815 | + directives.unshift(derivedSyncDirective); |
|---|
| 7816 | + |
|---|
| 7817 | + afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs, |
|---|
| 7818 | + childTranscludeFn, $compileNode, origAsyncDirective, preLinkFns, postLinkFns, |
|---|
| 7819 | + previousCompileContext); |
|---|
| 7820 | + forEach($rootElement, function(node, i) { |
|---|
| 7821 | + if (node == compileNode) { |
|---|
| 7822 | + $rootElement[i] = $compileNode[0]; |
|---|
| 7823 | + } |
|---|
| 7824 | + }); |
|---|
| 7825 | + afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn); |
|---|
| 7826 | + |
|---|
| 7827 | + while(linkQueue.length) { |
|---|
| 7828 | + var scope = linkQueue.shift(), |
|---|
| 7829 | + beforeTemplateLinkNode = linkQueue.shift(), |
|---|
| 7830 | + linkRootElement = linkQueue.shift(), |
|---|
| 7831 | + boundTranscludeFn = linkQueue.shift(), |
|---|
| 7832 | + linkNode = $compileNode[0]; |
|---|
| 7833 | + |
|---|
| 7834 | + if (scope.$$destroyed) continue; |
|---|
| 7835 | + |
|---|
| 7836 | + if (beforeTemplateLinkNode !== beforeTemplateCompileNode) { |
|---|
| 7837 | + var oldClasses = beforeTemplateLinkNode.className; |
|---|
| 7838 | + |
|---|
| 7839 | + if (!(previousCompileContext.hasElementTranscludeDirective && |
|---|
| 7840 | + origAsyncDirective.replace)) { |
|---|
| 7841 | + // it was cloned therefore we have to clone as well. |
|---|
| 7842 | + linkNode = jqLiteClone(compileNode); |
|---|
| 7843 | + } |
|---|
| 7844 | + replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode); |
|---|
| 7845 | + |
|---|
| 7846 | + // Copy in CSS classes from original node |
|---|
| 7847 | + safeAddClass(jqLite(linkNode), oldClasses); |
|---|
| 7848 | + } |
|---|
| 7849 | + if (afterTemplateNodeLinkFn.transcludeOnThisElement) { |
|---|
| 7850 | + childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn); |
|---|
| 7851 | + } else { |
|---|
| 7852 | + childBoundTranscludeFn = boundTranscludeFn; |
|---|
| 7853 | + } |
|---|
| 7854 | + afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement, |
|---|
| 7855 | + childBoundTranscludeFn); |
|---|
| 7856 | + } |
|---|
| 7857 | + linkQueue = null; |
|---|
| 7858 | + }); |
|---|
| 7859 | + |
|---|
| 7860 | + return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) { |
|---|
| 7861 | + var childBoundTranscludeFn = boundTranscludeFn; |
|---|
| 7862 | + if (scope.$$destroyed) return; |
|---|
| 7863 | + if (linkQueue) { |
|---|
| 7864 | + linkQueue.push(scope); |
|---|
| 7865 | + linkQueue.push(node); |
|---|
| 7866 | + linkQueue.push(rootElement); |
|---|
| 7867 | + linkQueue.push(childBoundTranscludeFn); |
|---|
| 7868 | + } else { |
|---|
| 7869 | + if (afterTemplateNodeLinkFn.transcludeOnThisElement) { |
|---|
| 7870 | + childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn); |
|---|
| 7871 | + } |
|---|
| 7872 | + afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, childBoundTranscludeFn); |
|---|
| 7873 | + } |
|---|
| 7874 | + }; |
|---|
| 7875 | + } |
|---|
| 7876 | + |
|---|
| 7877 | + |
|---|
| 7878 | + /** |
|---|
| 7879 | + * Sorting function for bound directives. |
|---|
| 7880 | + */ |
|---|
| 7881 | + function byPriority(a, b) { |
|---|
| 7882 | + var diff = b.priority - a.priority; |
|---|
| 7883 | + if (diff !== 0) return diff; |
|---|
| 7884 | + if (a.name !== b.name) return (a.name < b.name) ? -1 : 1; |
|---|
| 7885 | + return a.index - b.index; |
|---|
| 7886 | + } |
|---|
| 7887 | + |
|---|
| 7888 | + |
|---|
| 7889 | + function assertNoDuplicate(what, previousDirective, directive, element) { |
|---|
| 7890 | + if (previousDirective) { |
|---|
| 7891 | + throw $compileMinErr('multidir', 'Multiple directives [{0}, {1}] asking for {2} on: {3}', |
|---|
| 7892 | + previousDirective.name, directive.name, what, startingTag(element)); |
|---|
| 7893 | + } |
|---|
| 7894 | + } |
|---|
| 7895 | + |
|---|
| 7896 | + |
|---|
| 7897 | + function addTextInterpolateDirective(directives, text) { |
|---|
| 7898 | + var interpolateFn = $interpolate(text, true); |
|---|
| 7899 | + if (interpolateFn) { |
|---|
| 7900 | + directives.push({ |
|---|
| 7901 | + priority: 0, |
|---|
| 7902 | + compile: function textInterpolateCompileFn(templateNode) { |
|---|
| 7903 | + var templateNodeParent = templateNode.parent(), |
|---|
| 7904 | + hasCompileParent = !!templateNodeParent.length; |
|---|
| 7905 | + |
|---|
| 7906 | + // When transcluding a template that has bindings in the root |
|---|
| 7907 | + // we don't have a parent and thus need to add the class during linking fn. |
|---|
| 7908 | + if (hasCompileParent) compile.$$addBindingClass(templateNodeParent); |
|---|
| 7909 | + |
|---|
| 7910 | + return function textInterpolateLinkFn(scope, node) { |
|---|
| 7911 | + var parent = node.parent(); |
|---|
| 7912 | + if (!hasCompileParent) compile.$$addBindingClass(parent); |
|---|
| 7913 | + compile.$$addBindingInfo(parent, interpolateFn.expressions); |
|---|
| 7914 | + scope.$watch(interpolateFn, function interpolateFnWatchAction(value) { |
|---|
| 7915 | + node[0].nodeValue = value; |
|---|
| 7916 | + }); |
|---|
| 7917 | + }; |
|---|
| 7918 | + } |
|---|
| 7919 | + }); |
|---|
| 7920 | + } |
|---|
| 7921 | + } |
|---|
| 7922 | + |
|---|
| 7923 | + |
|---|
| 7924 | + function wrapTemplate(type, template) { |
|---|
| 7925 | + type = lowercase(type || 'html'); |
|---|
| 7926 | + switch(type) { |
|---|
| 7927 | + case 'svg': |
|---|
| 7928 | + case 'math': |
|---|
| 7929 | + var wrapper = document.createElement('div'); |
|---|
| 7930 | + wrapper.innerHTML = '<'+type+'>'+template+'</'+type+'>'; |
|---|
| 7931 | + return wrapper.childNodes[0].childNodes; |
|---|
| 7932 | + default: |
|---|
| 7933 | + return template; |
|---|
| 7934 | + } |
|---|
| 7935 | + } |
|---|
| 7936 | + |
|---|
| 7937 | + |
|---|
| 7938 | + function getTrustedContext(node, attrNormalizedName) { |
|---|
| 7939 | + if (attrNormalizedName == "srcdoc") { |
|---|
| 7940 | + return $sce.HTML; |
|---|
| 7941 | + } |
|---|
| 7942 | + var tag = nodeName_(node); |
|---|
| 7943 | + // maction[xlink:href] can source SVG. It's not limited to <maction>. |
|---|
| 7944 | + if (attrNormalizedName == "xlinkHref" || |
|---|
| 7945 | + (tag == "form" && attrNormalizedName == "action") || |
|---|
| 7946 | + (tag != "img" && (attrNormalizedName == "src" || |
|---|
| 7947 | + attrNormalizedName == "ngSrc"))) { |
|---|
| 7948 | + return $sce.RESOURCE_URL; |
|---|
| 7949 | + } |
|---|
| 7950 | + } |
|---|
| 7951 | + |
|---|
| 7952 | + |
|---|
| 7953 | + function addAttrInterpolateDirective(node, directives, value, name, allOrNothing) { |
|---|
| 7954 | + var interpolateFn = $interpolate(value, true); |
|---|
| 7955 | + |
|---|
| 7956 | + // no interpolation found -> ignore |
|---|
| 7957 | + if (!interpolateFn) return; |
|---|
| 7958 | + |
|---|
| 7959 | + |
|---|
| 7960 | + if (name === "multiple" && nodeName_(node) === "select") { |
|---|
| 7961 | + throw $compileMinErr("selmulti", |
|---|
| 7962 | + "Binding to the 'multiple' attribute is not supported. Element: {0}", |
|---|
| 7963 | + startingTag(node)); |
|---|
| 7964 | + } |
|---|
| 7965 | + |
|---|
| 7966 | + directives.push({ |
|---|
| 7967 | + priority: 100, |
|---|
| 7968 | + compile: function() { |
|---|
| 7969 | + return { |
|---|
| 7970 | + pre: function attrInterpolatePreLinkFn(scope, element, attr) { |
|---|
| 7971 | + var $$observers = (attr.$$observers || (attr.$$observers = {})); |
|---|
| 7972 | + |
|---|
| 7973 | + if (EVENT_HANDLER_ATTR_REGEXP.test(name)) { |
|---|
| 7974 | + throw $compileMinErr('nodomevents', |
|---|
| 7975 | + "Interpolations for HTML DOM event attributes are disallowed. Please use the " + |
|---|
| 7976 | + "ng- versions (such as ng-click instead of onclick) instead."); |
|---|
| 7977 | + } |
|---|
| 7978 | + |
|---|
| 7979 | + // If the attribute was removed, then we are done |
|---|
| 7980 | + if (!attr[name]) { |
|---|
| 7981 | + return; |
|---|
| 7982 | + } |
|---|
| 7983 | + |
|---|
| 7984 | + // we need to interpolate again, in case the attribute value has been updated |
|---|
| 7985 | + // (e.g. by another directive's compile function) |
|---|
| 7986 | + interpolateFn = $interpolate(attr[name], true, getTrustedContext(node, name), |
|---|
| 7987 | + ALL_OR_NOTHING_ATTRS[name] || allOrNothing); |
|---|
| 7988 | + |
|---|
| 7989 | + // if attribute was updated so that there is no interpolation going on we don't want to |
|---|
| 7990 | + // register any observers |
|---|
| 7991 | + if (!interpolateFn) return; |
|---|
| 7992 | + |
|---|
| 7993 | + // initialize attr object so that it's ready in case we need the value for isolate |
|---|
| 7994 | + // scope initialization, otherwise the value would not be available from isolate |
|---|
| 7995 | + // directive's linking fn during linking phase |
|---|
| 7996 | + attr[name] = interpolateFn(scope); |
|---|
| 7997 | + |
|---|
| 7998 | + ($$observers[name] || ($$observers[name] = [])).$$inter = true; |
|---|
| 7999 | + (attr.$$observers && attr.$$observers[name].$$scope || scope). |
|---|
| 8000 | + $watch(interpolateFn, function interpolateFnWatchAction(newValue, oldValue) { |
|---|
| 8001 | + //special case for class attribute addition + removal |
|---|
| 8002 | + //so that class changes can tap into the animation |
|---|
| 8003 | + //hooks provided by the $animate service. Be sure to |
|---|
| 8004 | + //skip animations when the first digest occurs (when |
|---|
| 8005 | + //both the new and the old values are the same) since |
|---|
| 8006 | + //the CSS classes are the non-interpolated values |
|---|
| 8007 | + if(name === 'class' && newValue != oldValue) { |
|---|
| 8008 | + attr.$updateClass(newValue, oldValue); |
|---|
| 8009 | + } else { |
|---|
| 8010 | + attr.$set(name, newValue); |
|---|
| 8011 | + } |
|---|
| 8012 | + }); |
|---|
| 8013 | + } |
|---|
| 8014 | + }; |
|---|
| 8015 | + } |
|---|
| 8016 | + }); |
|---|
| 8017 | + } |
|---|
| 8018 | + |
|---|
| 8019 | + |
|---|
| 8020 | + /** |
|---|
| 8021 | + * This is a special jqLite.replaceWith, which can replace items which |
|---|
| 8022 | + * have no parents, provided that the containing jqLite collection is provided. |
|---|
| 8023 | + * |
|---|
| 8024 | + * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes |
|---|
| 8025 | + * in the root of the tree. |
|---|
| 8026 | + * @param {JqLite} elementsToRemove The jqLite element which we are going to replace. We keep |
|---|
| 8027 | + * the shell, but replace its DOM node reference. |
|---|
| 8028 | + * @param {Node} newNode The new DOM node. |
|---|
| 8029 | + */ |
|---|
| 8030 | + function replaceWith($rootElement, elementsToRemove, newNode) { |
|---|
| 8031 | + var firstElementToRemove = elementsToRemove[0], |
|---|
| 8032 | + removeCount = elementsToRemove.length, |
|---|
| 8033 | + parent = firstElementToRemove.parentNode, |
|---|
| 8034 | + i, ii; |
|---|
| 8035 | + |
|---|
| 8036 | + if ($rootElement) { |
|---|
| 8037 | + for(i = 0, ii = $rootElement.length; i < ii; i++) { |
|---|
| 8038 | + if ($rootElement[i] == firstElementToRemove) { |
|---|
| 8039 | + $rootElement[i++] = newNode; |
|---|
| 8040 | + for (var j = i, j2 = j + removeCount - 1, |
|---|
| 8041 | + jj = $rootElement.length; |
|---|
| 8042 | + j < jj; j++, j2++) { |
|---|
| 8043 | + if (j2 < jj) { |
|---|
| 8044 | + $rootElement[j] = $rootElement[j2]; |
|---|
| 8045 | + } else { |
|---|
| 8046 | + delete $rootElement[j]; |
|---|
| 8047 | + } |
|---|
| 8048 | + } |
|---|
| 8049 | + $rootElement.length -= removeCount - 1; |
|---|
| 8050 | + |
|---|
| 8051 | + // If the replaced element is also the jQuery .context then replace it |
|---|
| 8052 | + // .context is a deprecated jQuery api, so we should set it only when jQuery set it |
|---|
| 8053 | + // http://api.jquery.com/context/ |
|---|
| 8054 | + if ($rootElement.context === firstElementToRemove) { |
|---|
| 8055 | + $rootElement.context = newNode; |
|---|
| 8056 | + } |
|---|
| 8057 | + break; |
|---|
| 8058 | + } |
|---|
| 8059 | + } |
|---|
| 8060 | + } |
|---|
| 8061 | + |
|---|
| 8062 | + if (parent) { |
|---|
| 8063 | + parent.replaceChild(newNode, firstElementToRemove); |
|---|
| 8064 | + } |
|---|
| 8065 | + |
|---|
| 8066 | + // TODO(perf): what's this document fragment for? is it needed? can we at least reuse it? |
|---|
| 8067 | + var fragment = document.createDocumentFragment(); |
|---|
| 8068 | + fragment.appendChild(firstElementToRemove); |
|---|
| 8069 | + |
|---|
| 8070 | + // Copy over user data (that includes Angular's $scope etc.). Don't copy private |
|---|
| 8071 | + // data here because there's no public interface in jQuery to do that and copying over |
|---|
| 8072 | + // event listeners (which is the main use of private data) wouldn't work anyway. |
|---|
| 8073 | + jqLite(newNode).data(jqLite(firstElementToRemove).data()); |
|---|
| 8074 | + |
|---|
| 8075 | + // Remove data of the replaced element. We cannot just call .remove() |
|---|
| 8076 | + // on the element it since that would deallocate scope that is needed |
|---|
| 8077 | + // for the new node. Instead, remove the data "manually". |
|---|
| 8078 | + if (!jQuery) { |
|---|
| 8079 | + delete jqLite.cache[firstElementToRemove[jqLite.expando]]; |
|---|
| 8080 | + } else { |
|---|
| 8081 | + // jQuery 2.x doesn't expose the data storage. Use jQuery.cleanData to clean up after |
|---|
| 8082 | + // the replaced element. The cleanData version monkey-patched by Angular would cause |
|---|
| 8083 | + // the scope to be trashed and we do need the very same scope to work with the new |
|---|
| 8084 | + // element. However, we cannot just cache the non-patched version and use it here as |
|---|
| 8085 | + // that would break if another library patches the method after Angular does (one |
|---|
| 8086 | + // example is jQuery UI). Instead, set a flag indicating scope destroying should be |
|---|
| 8087 | + // skipped this one time. |
|---|
| 8088 | + skipDestroyOnNextJQueryCleanData = true; |
|---|
| 8089 | + jQuery.cleanData([firstElementToRemove]); |
|---|
| 8090 | + } |
|---|
| 8091 | + |
|---|
| 8092 | + for (var k = 1, kk = elementsToRemove.length; k < kk; k++) { |
|---|
| 8093 | + var element = elementsToRemove[k]; |
|---|
| 8094 | + jqLite(element).remove(); // must do this way to clean up expando |
|---|
| 8095 | + fragment.appendChild(element); |
|---|
| 8096 | + delete elementsToRemove[k]; |
|---|
| 8097 | + } |
|---|
| 8098 | + |
|---|
| 8099 | + elementsToRemove[0] = newNode; |
|---|
| 8100 | + elementsToRemove.length = 1; |
|---|
| 8101 | + } |
|---|
| 8102 | + |
|---|
| 8103 | + |
|---|
| 8104 | + function cloneAndAnnotateFn(fn, annotation) { |
|---|
| 8105 | + return extend(function() { return fn.apply(null, arguments); }, fn, annotation); |
|---|
| 8106 | + } |
|---|
| 8107 | + |
|---|
| 8108 | + |
|---|
| 8109 | + function invokeLinkFn(linkFn, scope, $element, attrs, controllers, transcludeFn) { |
|---|
| 8110 | + try { |
|---|
| 8111 | + linkFn(scope, $element, attrs, controllers, transcludeFn); |
|---|
| 8112 | + } catch(e) { |
|---|
| 8113 | + $exceptionHandler(e, startingTag($element)); |
|---|
| 8114 | + } |
|---|
| 8115 | + } |
|---|
| 8116 | + }]; |
|---|
| 8117 | +} |
|---|
| 8118 | + |
|---|
| 8119 | +var PREFIX_REGEXP = /^(x[\:\-_]|data[\:\-_])/i; |
|---|
| 8120 | +/** |
|---|
| 8121 | + * Converts all accepted directives format into proper directive name. |
|---|
| 8122 | + * All of these will become 'myDirective': |
|---|
| 8123 | + * my:Directive |
|---|
| 8124 | + * my-directive |
|---|
| 8125 | + * x-my-directive |
|---|
| 8126 | + * data-my:directive |
|---|
| 8127 | + * |
|---|
| 8128 | + * Also there is special case for Moz prefix starting with upper case letter. |
|---|
| 8129 | + * @param name Name to normalize |
|---|
| 8130 | + */ |
|---|
| 8131 | +function directiveNormalize(name) { |
|---|
| 8132 | + return camelCase(name.replace(PREFIX_REGEXP, '')); |
|---|
| 8133 | +} |
|---|
| 8134 | + |
|---|
| 8135 | +/** |
|---|
| 8136 | + * @ngdoc type |
|---|
| 8137 | + * @name $compile.directive.Attributes |
|---|
| 8138 | + * |
|---|
| 8139 | + * @description |
|---|
| 8140 | + * A shared object between directive compile / linking functions which contains normalized DOM |
|---|
| 8141 | + * element attributes. The values reflect current binding state `{{ }}`. The normalization is |
|---|
| 8142 | + * needed since all of these are treated as equivalent in Angular: |
|---|
| 8143 | + * |
|---|
| 8144 | + * ``` |
|---|
| 8145 | + * <span ng:bind="a" ng-bind="a" data-ng-bind="a" x-ng-bind="a"> |
|---|
| 8146 | + * ``` |
|---|
| 8147 | + */ |
|---|
| 8148 | + |
|---|
| 8149 | +/** |
|---|
| 8150 | + * @ngdoc property |
|---|
| 8151 | + * @name $compile.directive.Attributes#$attr |
|---|
| 8152 | + * |
|---|
| 8153 | + * @description |
|---|
| 8154 | + * A map of DOM element attribute names to the normalized name. This is |
|---|
| 8155 | + * needed to do reverse lookup from normalized name back to actual name. |
|---|
| 8156 | + */ |
|---|
| 8157 | + |
|---|
| 8158 | + |
|---|
| 8159 | +/** |
|---|
| 8160 | + * @ngdoc method |
|---|
| 8161 | + * @name $compile.directive.Attributes#$set |
|---|
| 8162 | + * @kind function |
|---|
| 8163 | + * |
|---|
| 8164 | + * @description |
|---|
| 8165 | + * Set DOM element attribute value. |
|---|
| 8166 | + * |
|---|
| 8167 | + * |
|---|
| 8168 | + * @param {string} name Normalized element attribute name of the property to modify. The name is |
|---|
| 8169 | + * reverse-translated using the {@link ng.$compile.directive.Attributes#$attr $attr} |
|---|
| 8170 | + * property to the original name. |
|---|
| 8171 | + * @param {string} value Value to set the attribute to. The value can be an interpolated string. |
|---|
| 8172 | + */ |
|---|
| 8173 | + |
|---|
| 8174 | + |
|---|
| 8175 | + |
|---|
| 8176 | +/** |
|---|
| 8177 | + * Closure compiler type information |
|---|
| 8178 | + */ |
|---|
| 8179 | + |
|---|
| 8180 | +function nodesetLinkingFn( |
|---|
| 8181 | + /* angular.Scope */ scope, |
|---|
| 8182 | + /* NodeList */ nodeList, |
|---|
| 8183 | + /* Element */ rootElement, |
|---|
| 8184 | + /* function(Function) */ boundTranscludeFn |
|---|
| 8185 | +){} |
|---|
| 8186 | + |
|---|
| 8187 | +function directiveLinkingFn( |
|---|
| 8188 | + /* nodesetLinkingFn */ nodesetLinkingFn, |
|---|
| 8189 | + /* angular.Scope */ scope, |
|---|
| 8190 | + /* Node */ node, |
|---|
| 8191 | + /* Element */ rootElement, |
|---|
| 8192 | + /* function(Function) */ boundTranscludeFn |
|---|
| 8193 | +){} |
|---|
| 8194 | + |
|---|
| 8195 | +function tokenDifference(str1, str2) { |
|---|
| 8196 | + var values = '', |
|---|
| 8197 | + tokens1 = str1.split(/\s+/), |
|---|
| 8198 | + tokens2 = str2.split(/\s+/); |
|---|
| 8199 | + |
|---|
| 8200 | + outer: |
|---|
| 8201 | + for(var i = 0; i < tokens1.length; i++) { |
|---|
| 8202 | + var token = tokens1[i]; |
|---|
| 8203 | + for(var j = 0; j < tokens2.length; j++) { |
|---|
| 8204 | + if(token == tokens2[j]) continue outer; |
|---|
| 8205 | + } |
|---|
| 8206 | + values += (values.length > 0 ? ' ' : '') + token; |
|---|
| 8207 | + } |
|---|
| 8208 | + return values; |
|---|
| 8209 | +} |
|---|
| 8210 | + |
|---|
| 8211 | +function removeComments(jqNodes) { |
|---|
| 8212 | + jqNodes = jqLite(jqNodes); |
|---|
| 8213 | + var i = jqNodes.length; |
|---|
| 8214 | + |
|---|
| 8215 | + if (i <= 1) { |
|---|
| 8216 | + return jqNodes; |
|---|
| 8217 | + } |
|---|
| 8218 | + |
|---|
| 8219 | + while (i--) { |
|---|
| 8220 | + var node = jqNodes[i]; |
|---|
| 8221 | + if (node.nodeType === NODE_TYPE_COMMENT) { |
|---|
| 8222 | + splice.call(jqNodes, i, 1); |
|---|
| 8223 | + } |
|---|
| 8224 | + } |
|---|
| 8225 | + return jqNodes; |
|---|
| 8226 | +} |
|---|
| 8227 | + |
|---|
| 8228 | +/** |
|---|
| 8229 | + * @ngdoc provider |
|---|
| 8230 | + * @name $controllerProvider |
|---|
| 8231 | + * @description |
|---|
| 8232 | + * The {@link ng.$controller $controller service} is used by Angular to create new |
|---|
| 8233 | + * controllers. |
|---|
| 8234 | + * |
|---|
| 8235 | + * This provider allows controller registration via the |
|---|
| 8236 | + * {@link ng.$controllerProvider#register register} method. |
|---|
| 8237 | + */ |
|---|
| 8238 | +function $ControllerProvider() { |
|---|
| 8239 | + var controllers = {}, |
|---|
| 8240 | + globals = false, |
|---|
| 8241 | + CNTRL_REG = /^(\S+)(\s+as\s+(\w+))?$/; |
|---|
| 8242 | + |
|---|
| 8243 | + |
|---|
| 8244 | + /** |
|---|
| 8245 | + * @ngdoc method |
|---|
| 8246 | + * @name $controllerProvider#register |
|---|
| 8247 | + * @param {string|Object} name Controller name, or an object map of controllers where the keys are |
|---|
| 8248 | + * the names and the values are the constructors. |
|---|
| 8249 | + * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI |
|---|
| 8250 | + * annotations in the array notation). |
|---|
| 8251 | + */ |
|---|
| 8252 | + this.register = function(name, constructor) { |
|---|
| 8253 | + assertNotHasOwnProperty(name, 'controller'); |
|---|
| 8254 | + if (isObject(name)) { |
|---|
| 8255 | + extend(controllers, name); |
|---|
| 8256 | + } else { |
|---|
| 8257 | + controllers[name] = constructor; |
|---|
| 8258 | + } |
|---|
| 8259 | + }; |
|---|
| 8260 | + |
|---|
| 8261 | + /** |
|---|
| 8262 | + * @ngdoc method |
|---|
| 8263 | + * @name $controllerProvider#allowGlobals |
|---|
| 8264 | + * @description If called, allows `$controller` to find controller constructors on `window` |
|---|
| 8265 | + */ |
|---|
| 8266 | + this.allowGlobals = function() { |
|---|
| 8267 | + globals = true; |
|---|
| 8268 | + }; |
|---|
| 8269 | + |
|---|
| 8270 | + |
|---|
| 8271 | + this.$get = ['$injector', '$window', function($injector, $window) { |
|---|
| 8272 | + |
|---|
| 8273 | + /** |
|---|
| 8274 | + * @ngdoc service |
|---|
| 8275 | + * @name $controller |
|---|
| 8276 | + * @requires $injector |
|---|
| 8277 | + * |
|---|
| 8278 | + * @param {Function|string} constructor If called with a function then it's considered to be the |
|---|
| 8279 | + * controller constructor function. Otherwise it's considered to be a string which is used |
|---|
| 8280 | + * to retrieve the controller constructor using the following steps: |
|---|
| 8281 | + * |
|---|
| 8282 | + * * check if a controller with given name is registered via `$controllerProvider` |
|---|
| 8283 | + * * check if evaluating the string on the current scope returns a constructor |
|---|
| 8284 | + * * if $controllerProvider#allowGlobals, check `window[constructor]` on the global |
|---|
| 8285 | + * `window` object (not recommended) |
|---|
| 8286 | + * |
|---|
| 8287 | + * @param {Object} locals Injection locals for Controller. |
|---|
| 8288 | + * @return {Object} Instance of given controller. |
|---|
| 8289 | + * |
|---|
| 8290 | + * @description |
|---|
| 8291 | + * `$controller` service is responsible for instantiating controllers. |
|---|
| 8292 | + * |
|---|
| 8293 | + * It's just a simple call to {@link auto.$injector $injector}, but extracted into |
|---|
| 8294 | + * a service, so that one can override this service with [BC version](https://gist.github.com/1649788). |
|---|
| 8295 | + */ |
|---|
| 8296 | + return function(expression, locals, later, ident) { |
|---|
| 8297 | + // PRIVATE API: |
|---|
| 8298 | + // param `later` --- indicates that the controller's constructor is invoked at a later time. |
|---|
| 8299 | + // If true, $controller will allocate the object with the correct |
|---|
| 8300 | + // prototype chain, but will not invoke the controller until a returned |
|---|
| 8301 | + // callback is invoked. |
|---|
| 8302 | + // param `ident` --- An optional label which overrides the label parsed from the controller |
|---|
| 8303 | + // expression, if any. |
|---|
| 8304 | + var instance, match, constructor, identifier; |
|---|
| 8305 | + later = later === true; |
|---|
| 8306 | + if (ident && isString(ident)) { |
|---|
| 8307 | + identifier = ident; |
|---|
| 8308 | + } |
|---|
| 8309 | + |
|---|
| 8310 | + if(isString(expression)) { |
|---|
| 8311 | + match = expression.match(CNTRL_REG), |
|---|
| 8312 | + constructor = match[1], |
|---|
| 8313 | + identifier = identifier || match[3]; |
|---|
| 8314 | + expression = controllers.hasOwnProperty(constructor) |
|---|
| 8315 | + ? controllers[constructor] |
|---|
| 8316 | + : getter(locals.$scope, constructor, true) || |
|---|
| 8317 | + (globals ? getter($window, constructor, true) : undefined); |
|---|
| 8318 | + |
|---|
| 8319 | + assertArgFn(expression, constructor, true); |
|---|
| 8320 | + } |
|---|
| 8321 | + |
|---|
| 8322 | + if (later) { |
|---|
| 8323 | + // Instantiate controller later: |
|---|
| 8324 | + // This machinery is used to create an instance of the object before calling the |
|---|
| 8325 | + // controller's constructor itself. |
|---|
| 8326 | + // |
|---|
| 8327 | + // This allows properties to be added to the controller before the constructor is |
|---|
| 8328 | + // invoked. Primarily, this is used for isolate scope bindings in $compile. |
|---|
| 8329 | + // |
|---|
| 8330 | + // This feature is not intended for use by applications, and is thus not documented |
|---|
| 8331 | + // publicly. |
|---|
| 8332 | + var Constructor = function() {}; |
|---|
| 8333 | + Constructor.prototype = (isArray(expression) ? |
|---|
| 8334 | + expression[expression.length - 1] : expression).prototype; |
|---|
| 8335 | + instance = new Constructor(); |
|---|
| 8336 | + |
|---|
| 8337 | + if (identifier) { |
|---|
| 8338 | + addIdentifier(locals, identifier, instance, constructor || expression.name); |
|---|
| 8339 | + } |
|---|
| 8340 | + |
|---|
| 8341 | + return extend(function() { |
|---|
| 8342 | + $injector.invoke(expression, instance, locals, constructor); |
|---|
| 8343 | + return instance; |
|---|
| 8344 | + }, { |
|---|
| 8345 | + instance: instance, |
|---|
| 8346 | + identifier: identifier |
|---|
| 8347 | + }); |
|---|
| 8348 | + } |
|---|
| 8349 | + |
|---|
| 8350 | + instance = $injector.instantiate(expression, locals, constructor); |
|---|
| 8351 | + |
|---|
| 8352 | + if (identifier) { |
|---|
| 8353 | + addIdentifier(locals, identifier, instance, constructor || expression.name); |
|---|
| 8354 | + } |
|---|
| 8355 | + |
|---|
| 8356 | + return instance; |
|---|
| 8357 | + }; |
|---|
| 8358 | + |
|---|
| 8359 | + function addIdentifier(locals, identifier, instance, name) { |
|---|
| 8360 | + if (!(locals && isObject(locals.$scope))) { |
|---|
| 8361 | + throw minErr('$controller')('noscp', |
|---|
| 8362 | + "Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.", |
|---|
| 8363 | + name, identifier); |
|---|
| 8364 | + } |
|---|
| 8365 | + |
|---|
| 8366 | + locals.$scope[identifier] = instance; |
|---|
| 8367 | + } |
|---|
| 8368 | + }]; |
|---|
| 8369 | +} |
|---|
| 8370 | + |
|---|
| 8371 | +/** |
|---|
| 8372 | + * @ngdoc service |
|---|
| 8373 | + * @name $document |
|---|
| 8374 | + * @requires $window |
|---|
| 8375 | + * |
|---|
| 8376 | + * @description |
|---|
| 8377 | + * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object. |
|---|
| 8378 | + * |
|---|
| 8379 | + * @example |
|---|
| 8380 | + <example module="documentExample"> |
|---|
| 8381 | + <file name="index.html"> |
|---|
| 8382 | + <div ng-controller="ExampleController"> |
|---|
| 8383 | + <p>$document title: <b ng-bind="title"></b></p> |
|---|
| 8384 | + <p>window.document title: <b ng-bind="windowTitle"></b></p> |
|---|
| 8385 | + </div> |
|---|
| 8386 | + </file> |
|---|
| 8387 | + <file name="script.js"> |
|---|
| 8388 | + angular.module('documentExample', []) |
|---|
| 8389 | + .controller('ExampleController', ['$scope', '$document', function($scope, $document) { |
|---|
| 8390 | + $scope.title = $document[0].title; |
|---|
| 8391 | + $scope.windowTitle = angular.element(window.document)[0].title; |
|---|
| 8392 | + }]); |
|---|
| 8393 | + </file> |
|---|
| 8394 | + </example> |
|---|
| 8395 | + */ |
|---|
| 8396 | +function $DocumentProvider(){ |
|---|
| 8397 | + this.$get = ['$window', function(window){ |
|---|
| 8398 | + return jqLite(window.document); |
|---|
| 8399 | + }]; |
|---|
| 8400 | +} |
|---|
| 8401 | + |
|---|
| 8402 | +/** |
|---|
| 8403 | + * @ngdoc service |
|---|
| 8404 | + * @name $exceptionHandler |
|---|
| 8405 | + * @requires ng.$log |
|---|
| 8406 | + * |
|---|
| 8407 | + * @description |
|---|
| 8408 | + * Any uncaught exception in angular expressions is delegated to this service. |
|---|
| 8409 | + * The default implementation simply delegates to `$log.error` which logs it into |
|---|
| 8410 | + * the browser console. |
|---|
| 8411 | + * |
|---|
| 8412 | + * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by |
|---|
| 8413 | + * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing. |
|---|
| 8414 | + * |
|---|
| 8415 | + * ## Example: |
|---|
| 8416 | + * |
|---|
| 8417 | + * ```js |
|---|
| 8418 | + * angular.module('exceptionOverride', []).factory('$exceptionHandler', function () { |
|---|
| 8419 | + * return function (exception, cause) { |
|---|
| 8420 | + * exception.message += ' (caused by "' + cause + '")'; |
|---|
| 8421 | + * throw exception; |
|---|
| 8422 | + * }; |
|---|
| 8423 | + * }); |
|---|
| 8424 | + * ``` |
|---|
| 8425 | + * |
|---|
| 8426 | + * This example will override the normal action of `$exceptionHandler`, to make angular |
|---|
| 8427 | + * exceptions fail hard when they happen, instead of just logging to the console. |
|---|
| 8428 | + * |
|---|
| 8429 | + * <hr /> |
|---|
| 8430 | + * Note, that code executed in event-listeners (even those registered using jqLite's `on`/`bind` |
|---|
| 8431 | + * methods) does not delegate exceptions to the {@link ng.$exceptionHandler $exceptionHandler} |
|---|
| 8432 | + * (unless executed during a digest). |
|---|
| 8433 | + * |
|---|
| 8434 | + * If you wish, you can manually delegate exceptions, e.g. |
|---|
| 8435 | + * `try { ... } catch(e) { $exceptionHandler(e); }` |
|---|
| 8436 | + * |
|---|
| 8437 | + * @param {Error} exception Exception associated with the error. |
|---|
| 8438 | + * @param {string=} cause optional information about the context in which |
|---|
| 8439 | + * the error was thrown. |
|---|
| 8440 | + * |
|---|
| 8441 | + */ |
|---|
| 8442 | +function $ExceptionHandlerProvider() { |
|---|
| 8443 | + this.$get = ['$log', function($log) { |
|---|
| 8444 | + return function(exception, cause) { |
|---|
| 8445 | + $log.error.apply($log, arguments); |
|---|
| 8446 | + }; |
|---|
| 8447 | + }]; |
|---|
| 8448 | +} |
|---|
| 8449 | + |
|---|
| 8450 | +/** |
|---|
| 8451 | + * Parse headers into key value object |
|---|
| 8452 | + * |
|---|
| 8453 | + * @param {string} headers Raw headers as a string |
|---|
| 8454 | + * @returns {Object} Parsed headers as key value object |
|---|
| 8455 | + */ |
|---|
| 8456 | +function parseHeaders(headers) { |
|---|
| 8457 | + var parsed = {}, key, val, i; |
|---|
| 8458 | + |
|---|
| 8459 | + if (!headers) return parsed; |
|---|
| 8460 | + |
|---|
| 8461 | + forEach(headers.split('\n'), function(line) { |
|---|
| 8462 | + i = line.indexOf(':'); |
|---|
| 8463 | + key = lowercase(trim(line.substr(0, i))); |
|---|
| 8464 | + val = trim(line.substr(i + 1)); |
|---|
| 8465 | + |
|---|
| 8466 | + if (key) { |
|---|
| 8467 | + parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; |
|---|
| 8468 | + } |
|---|
| 8469 | + }); |
|---|
| 8470 | + |
|---|
| 8471 | + return parsed; |
|---|
| 8472 | +} |
|---|
| 8473 | + |
|---|
| 8474 | + |
|---|
| 8475 | +/** |
|---|
| 8476 | + * Returns a function that provides access to parsed headers. |
|---|
| 8477 | + * |
|---|
| 8478 | + * Headers are lazy parsed when first requested. |
|---|
| 8479 | + * @see parseHeaders |
|---|
| 8480 | + * |
|---|
| 8481 | + * @param {(string|Object)} headers Headers to provide access to. |
|---|
| 8482 | + * @returns {function(string=)} Returns a getter function which if called with: |
|---|
| 8483 | + * |
|---|
| 8484 | + * - if called with single an argument returns a single header value or null |
|---|
| 8485 | + * - if called with no arguments returns an object containing all headers. |
|---|
| 8486 | + */ |
|---|
| 8487 | +function headersGetter(headers) { |
|---|
| 8488 | + var headersObj = isObject(headers) ? headers : undefined; |
|---|
| 8489 | + |
|---|
| 8490 | + return function(name) { |
|---|
| 8491 | + if (!headersObj) headersObj = parseHeaders(headers); |
|---|
| 8492 | + |
|---|
| 8493 | + if (name) { |
|---|
| 8494 | + return headersObj[lowercase(name)] || null; |
|---|
| 8495 | + } |
|---|
| 8496 | + |
|---|
| 8497 | + return headersObj; |
|---|
| 8498 | + }; |
|---|
| 8499 | +} |
|---|
| 8500 | + |
|---|
| 8501 | + |
|---|
| 8502 | +/** |
|---|
| 8503 | + * Chain all given functions |
|---|
| 8504 | + * |
|---|
| 8505 | + * This function is used for both request and response transforming |
|---|
| 8506 | + * |
|---|
| 8507 | + * @param {*} data Data to transform. |
|---|
| 8508 | + * @param {function(string=)} headers Http headers getter fn. |
|---|
| 8509 | + * @param {(Function|Array.<Function>)} fns Function or an array of functions. |
|---|
| 8510 | + * @returns {*} Transformed data. |
|---|
| 8511 | + */ |
|---|
| 8512 | +function transformData(data, headers, fns) { |
|---|
| 8513 | + if (isFunction(fns)) |
|---|
| 8514 | + return fns(data, headers); |
|---|
| 8515 | + |
|---|
| 8516 | + forEach(fns, function(fn) { |
|---|
| 8517 | + data = fn(data, headers); |
|---|
| 8518 | + }); |
|---|
| 8519 | + |
|---|
| 8520 | + return data; |
|---|
| 8521 | +} |
|---|
| 8522 | + |
|---|
| 8523 | + |
|---|
| 8524 | +function isSuccess(status) { |
|---|
| 8525 | + return 200 <= status && status < 300; |
|---|
| 8526 | +} |
|---|
| 8527 | + |
|---|
| 8528 | + |
|---|
| 8529 | +/** |
|---|
| 8530 | + * @ngdoc provider |
|---|
| 8531 | + * @name $httpProvider |
|---|
| 8532 | + * @description |
|---|
| 8533 | + * Use `$httpProvider` to change the default behavior of the {@link ng.$http $http} service. |
|---|
| 8534 | + * */ |
|---|
| 8535 | +function $HttpProvider() { |
|---|
| 8536 | + var JSON_START = /^\s*(\[|\{[^\{])/, |
|---|
| 8537 | + JSON_END = /[\}\]]\s*$/, |
|---|
| 8538 | + PROTECTION_PREFIX = /^\)\]\}',?\n/, |
|---|
| 8539 | + APPLICATION_JSON = 'application/json', |
|---|
| 8540 | + CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': APPLICATION_JSON + ';charset=utf-8'}; |
|---|
| 8541 | + |
|---|
| 8542 | + /** |
|---|
| 8543 | + * @ngdoc property |
|---|
| 8544 | + * @name $httpProvider#defaults |
|---|
| 8545 | + * @description |
|---|
| 8546 | + * |
|---|
| 8547 | + * Object containing default values for all {@link ng.$http $http} requests. |
|---|
| 8548 | + * |
|---|
| 8549 | + * - **`defaults.xsrfCookieName`** - {string} - Name of cookie containing the XSRF token. |
|---|
| 8550 | + * Defaults value is `'XSRF-TOKEN'`. |
|---|
| 8551 | + * |
|---|
| 8552 | + * - **`defaults.xsrfHeaderName`** - {string} - Name of HTTP header to populate with the |
|---|
| 8553 | + * XSRF token. Defaults value is `'X-XSRF-TOKEN'`. |
|---|
| 8554 | + * |
|---|
| 8555 | + * - **`defaults.headers`** - {Object} - Default headers for all $http requests. |
|---|
| 8556 | + * Refer to {@link ng.$http#setting-http-headers $http} for documentation on |
|---|
| 8557 | + * setting default headers. |
|---|
| 8558 | + * - **`defaults.headers.common`** |
|---|
| 8559 | + * - **`defaults.headers.post`** |
|---|
| 8560 | + * - **`defaults.headers.put`** |
|---|
| 8561 | + * - **`defaults.headers.patch`** |
|---|
| 8562 | + **/ |
|---|
| 8563 | + var defaults = this.defaults = { |
|---|
| 8564 | + // transform incoming response data |
|---|
| 8565 | + transformResponse: [function defaultHttpResponseTransform(data, headers) { |
|---|
| 8566 | + if (isString(data)) { |
|---|
| 8567 | + // strip json vulnerability protection prefix |
|---|
| 8568 | + data = data.replace(PROTECTION_PREFIX, ''); |
|---|
| 8569 | + var contentType = headers('Content-Type'); |
|---|
| 8570 | + if ((contentType && contentType.indexOf(APPLICATION_JSON) === 0) || |
|---|
| 8571 | + (JSON_START.test(data) && JSON_END.test(data))) { |
|---|
| 8572 | + data = fromJson(data); |
|---|
| 8573 | + } |
|---|
| 8574 | + } |
|---|
| 8575 | + return data; |
|---|
| 8576 | + }], |
|---|
| 8577 | + |
|---|
| 8578 | + // transform outgoing request data |
|---|
| 8579 | + transformRequest: [function(d) { |
|---|
| 8580 | + return isObject(d) && !isFile(d) && !isBlob(d) ? toJson(d) : d; |
|---|
| 8581 | + }], |
|---|
| 8582 | + |
|---|
| 8583 | + // default headers |
|---|
| 8584 | + headers: { |
|---|
| 8585 | + common: { |
|---|
| 8586 | + 'Accept': 'application/json, text/plain, */*' |
|---|
| 8587 | + }, |
|---|
| 8588 | + post: shallowCopy(CONTENT_TYPE_APPLICATION_JSON), |
|---|
| 8589 | + put: shallowCopy(CONTENT_TYPE_APPLICATION_JSON), |
|---|
| 8590 | + patch: shallowCopy(CONTENT_TYPE_APPLICATION_JSON) |
|---|
| 8591 | + }, |
|---|
| 8592 | + |
|---|
| 8593 | + xsrfCookieName: 'XSRF-TOKEN', |
|---|
| 8594 | + xsrfHeaderName: 'X-XSRF-TOKEN' |
|---|
| 8595 | + }; |
|---|
| 8596 | + |
|---|
| 8597 | + var useApplyAsync = false; |
|---|
| 8598 | + /** |
|---|
| 8599 | + * @ngdoc method |
|---|
| 8600 | + * @name $httpProvider#useApplyAsync |
|---|
| 8601 | + * @description |
|---|
| 8602 | + * |
|---|
| 8603 | + * Configure $http service to combine processing of multiple http responses received at around |
|---|
| 8604 | + * the same time via {@link ng.$rootScope.Scope#$applyAsync $rootScope.$applyAsync}. This can result in |
|---|
| 8605 | + * significant performance improvement for bigger applications that make many HTTP requests |
|---|
| 8606 | + * concurrently (common during application bootstrap). |
|---|
| 8607 | + * |
|---|
| 8608 | + * Defaults to false. If no value is specifed, returns the current configured value. |
|---|
| 8609 | + * |
|---|
| 8610 | + * @param {boolean=} value If true, when requests are loaded, they will schedule a deferred |
|---|
| 8611 | + * "apply" on the next tick, giving time for subsequent requests in a roughly ~10ms window |
|---|
| 8612 | + * to load and share the same digest cycle. |
|---|
| 8613 | + * |
|---|
| 8614 | + * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining. |
|---|
| 8615 | + * otherwise, returns the current configured value. |
|---|
| 8616 | + **/ |
|---|
| 8617 | + this.useApplyAsync = function(value) { |
|---|
| 8618 | + if (isDefined(value)) { |
|---|
| 8619 | + useApplyAsync = !!value; |
|---|
| 8620 | + return this; |
|---|
| 8621 | + } |
|---|
| 8622 | + return useApplyAsync; |
|---|
| 8623 | + }; |
|---|
| 8624 | + |
|---|
| 8625 | + /** |
|---|
| 8626 | + * Are ordered by request, i.e. they are applied in the same order as the |
|---|
| 8627 | + * array, on request, but reverse order, on response. |
|---|
| 8628 | + */ |
|---|
| 8629 | + var interceptorFactories = this.interceptors = []; |
|---|
| 8630 | + |
|---|
| 8631 | + this.$get = ['$httpBackend', '$browser', '$cacheFactory', '$rootScope', '$q', '$injector', |
|---|
| 8632 | + function($httpBackend, $browser, $cacheFactory, $rootScope, $q, $injector) { |
|---|
| 8633 | + |
|---|
| 8634 | + var defaultCache = $cacheFactory('$http'); |
|---|
| 8635 | + |
|---|
| 8636 | + /** |
|---|
| 8637 | + * Interceptors stored in reverse order. Inner interceptors before outer interceptors. |
|---|
| 8638 | + * The reversal is needed so that we can build up the interception chain around the |
|---|
| 8639 | + * server request. |
|---|
| 8640 | + */ |
|---|
| 8641 | + var reversedInterceptors = []; |
|---|
| 8642 | + |
|---|
| 8643 | + forEach(interceptorFactories, function(interceptorFactory) { |
|---|
| 8644 | + reversedInterceptors.unshift(isString(interceptorFactory) |
|---|
| 8645 | + ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory)); |
|---|
| 8646 | + }); |
|---|
| 8647 | + |
|---|
| 8648 | + /** |
|---|
| 8649 | + * @ngdoc service |
|---|
| 8650 | + * @kind function |
|---|
| 8651 | + * @name $http |
|---|
| 8652 | + * @requires ng.$httpBackend |
|---|
| 8653 | + * @requires $cacheFactory |
|---|
| 8654 | + * @requires $rootScope |
|---|
| 8655 | + * @requires $q |
|---|
| 8656 | + * @requires $injector |
|---|
| 8657 | + * |
|---|
| 8658 | + * @description |
|---|
| 8659 | + * The `$http` service is a core Angular service that facilitates communication with the remote |
|---|
| 8660 | + * HTTP servers via the browser's [XMLHttpRequest](https://developer.mozilla.org/en/xmlhttprequest) |
|---|
| 8661 | + * object or via [JSONP](http://en.wikipedia.org/wiki/JSONP). |
|---|
| 8662 | + * |
|---|
| 8663 | + * For unit testing applications that use `$http` service, see |
|---|
| 8664 | + * {@link ngMock.$httpBackend $httpBackend mock}. |
|---|
| 8665 | + * |
|---|
| 8666 | + * For a higher level of abstraction, please check out the {@link ngResource.$resource |
|---|
| 8667 | + * $resource} service. |
|---|
| 8668 | + * |
|---|
| 8669 | + * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by |
|---|
| 8670 | + * the $q service. While for simple usage patterns this doesn't matter much, for advanced usage |
|---|
| 8671 | + * it is important to familiarize yourself with these APIs and the guarantees they provide. |
|---|
| 8672 | + * |
|---|
| 8673 | + * |
|---|
| 8674 | + * ## General usage |
|---|
| 8675 | + * The `$http` service is a function which takes a single argument — a configuration object — |
|---|
| 8676 | + * that is used to generate an HTTP request and returns a {@link ng.$q promise} |
|---|
| 8677 | + * with two $http specific methods: `success` and `error`. |
|---|
| 8678 | + * |
|---|
| 8679 | + * ```js |
|---|
| 8680 | + * // Simple GET request example : |
|---|
| 8681 | + * $http.get('/someUrl'). |
|---|
| 8682 | + * success(function(data, status, headers, config) { |
|---|
| 8683 | + * // this callback will be called asynchronously |
|---|
| 8684 | + * // when the response is available |
|---|
| 8685 | + * }). |
|---|
| 8686 | + * error(function(data, status, headers, config) { |
|---|
| 8687 | + * // called asynchronously if an error occurs |
|---|
| 8688 | + * // or server returns response with an error status. |
|---|
| 8689 | + * }); |
|---|
| 8690 | + * ``` |
|---|
| 8691 | + * |
|---|
| 8692 | + * ```js |
|---|
| 8693 | + * // Simple POST request example (passing data) : |
|---|
| 8694 | + * $http.post('/someUrl', {msg:'hello word!'}). |
|---|
| 8695 | + * success(function(data, status, headers, config) { |
|---|
| 8696 | + * // this callback will be called asynchronously |
|---|
| 8697 | + * // when the response is available |
|---|
| 8698 | + * }). |
|---|
| 8699 | + * error(function(data, status, headers, config) { |
|---|
| 8700 | + * // called asynchronously if an error occurs |
|---|
| 8701 | + * // or server returns response with an error status. |
|---|
| 8702 | + * }); |
|---|
| 8703 | + * ``` |
|---|
| 8704 | + * |
|---|
| 8705 | + * |
|---|
| 8706 | + * Since the returned value of calling the $http function is a `promise`, you can also use |
|---|
| 8707 | + * the `then` method to register callbacks, and these callbacks will receive a single argument – |
|---|
| 8708 | + * an object representing the response. See the API signature and type info below for more |
|---|
| 8709 | + * details. |
|---|
| 8710 | + * |
|---|
| 8711 | + * A response status code between 200 and 299 is considered a success status and |
|---|
| 8712 | + * will result in the success callback being called. Note that if the response is a redirect, |
|---|
| 8713 | + * XMLHttpRequest will transparently follow it, meaning that the error callback will not be |
|---|
| 8714 | + * called for such responses. |
|---|
| 8715 | + * |
|---|
| 8716 | + * ## Writing Unit Tests that use $http |
|---|
| 8717 | + * When unit testing (using {@link ngMock ngMock}), it is necessary to call |
|---|
| 8718 | + * {@link ngMock.$httpBackend#flush $httpBackend.flush()} to flush each pending |
|---|
| 8719 | + * request using trained responses. |
|---|
| 8720 | + * |
|---|
| 8721 | + * ``` |
|---|
| 8722 | + * $httpBackend.expectGET(...); |
|---|
| 8723 | + * $http.get(...); |
|---|
| 8724 | + * $httpBackend.flush(); |
|---|
| 8725 | + * ``` |
|---|
| 8726 | + * |
|---|
| 8727 | + * ## Shortcut methods |
|---|
| 8728 | + * |
|---|
| 8729 | + * Shortcut methods are also available. All shortcut methods require passing in the URL, and |
|---|
| 8730 | + * request data must be passed in for POST/PUT requests. |
|---|
| 8731 | + * |
|---|
| 8732 | + * ```js |
|---|
| 8733 | + * $http.get('/someUrl').success(successCallback); |
|---|
| 8734 | + * $http.post('/someUrl', data).success(successCallback); |
|---|
| 8735 | + * ``` |
|---|
| 8736 | + * |
|---|
| 8737 | + * Complete list of shortcut methods: |
|---|
| 8738 | + * |
|---|
| 8739 | + * - {@link ng.$http#get $http.get} |
|---|
| 8740 | + * - {@link ng.$http#head $http.head} |
|---|
| 8741 | + * - {@link ng.$http#post $http.post} |
|---|
| 8742 | + * - {@link ng.$http#put $http.put} |
|---|
| 8743 | + * - {@link ng.$http#delete $http.delete} |
|---|
| 8744 | + * - {@link ng.$http#jsonp $http.jsonp} |
|---|
| 8745 | + * - {@link ng.$http#patch $http.patch} |
|---|
| 8746 | + * |
|---|
| 8747 | + * |
|---|
| 8748 | + * ## Setting HTTP Headers |
|---|
| 8749 | + * |
|---|
| 8750 | + * The $http service will automatically add certain HTTP headers to all requests. These defaults |
|---|
| 8751 | + * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration |
|---|
| 8752 | + * object, which currently contains this default configuration: |
|---|
| 8753 | + * |
|---|
| 8754 | + * - `$httpProvider.defaults.headers.common` (headers that are common for all requests): |
|---|
| 8755 | + * - `Accept: application/json, text/plain, * / *` |
|---|
| 8756 | + * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests) |
|---|
| 8757 | + * - `Content-Type: application/json` |
|---|
| 8758 | + * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests) |
|---|
| 8759 | + * - `Content-Type: application/json` |
|---|
| 8760 | + * |
|---|
| 8761 | + * To add or overwrite these defaults, simply add or remove a property from these configuration |
|---|
| 8762 | + * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object |
|---|
| 8763 | + * with the lowercased HTTP method name as the key, e.g. |
|---|
| 8764 | + * `$httpProvider.defaults.headers.get = { 'My-Header' : 'value' }. |
|---|
| 8765 | + * |
|---|
| 8766 | + * The defaults can also be set at runtime via the `$http.defaults` object in the same |
|---|
| 8767 | + * fashion. For example: |
|---|
| 8768 | + * |
|---|
| 8769 | + * ``` |
|---|
| 8770 | + * module.run(function($http) { |
|---|
| 8771 | + * $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w' |
|---|
| 8772 | + * }); |
|---|
| 8773 | + * ``` |
|---|
| 8774 | + * |
|---|
| 8775 | + * In addition, you can supply a `headers` property in the config object passed when |
|---|
| 8776 | + * calling `$http(config)`, which overrides the defaults without changing them globally. |
|---|
| 8777 | + * |
|---|
| 8778 | + * |
|---|
| 8779 | + * ## Transforming Requests and Responses |
|---|
| 8780 | + * |
|---|
| 8781 | + * Both requests and responses can be transformed using transformation functions: `transformRequest` |
|---|
| 8782 | + * and `transformResponse`. These properties can be a single function that returns |
|---|
| 8783 | + * the transformed value (`{function(data, headersGetter)`) or an array of such transformation functions, |
|---|
| 8784 | + * which allows you to `push` or `unshift` a new transformation function into the transformation chain. |
|---|
| 8785 | + * |
|---|
| 8786 | + * ### Default Transformations |
|---|
| 8787 | + * |
|---|
| 8788 | + * The `$httpProvider` provider and `$http` service expose `defaults.transformRequest` and |
|---|
| 8789 | + * `defaults.transformResponse` properties. If a request does not provide its own transformations |
|---|
| 8790 | + * then these will be applied. |
|---|
| 8791 | + * |
|---|
| 8792 | + * You can augment or replace the default transformations by modifying these properties by adding to or |
|---|
| 8793 | + * replacing the array. |
|---|
| 8794 | + * |
|---|
| 8795 | + * Angular provides the following default transformations: |
|---|
| 8796 | + * |
|---|
| 8797 | + * Request transformations (`$httpProvider.defaults.transformRequest` and `$http.defaults.transformRequest`): |
|---|
| 8798 | + * |
|---|
| 8799 | + * - If the `data` property of the request configuration object contains an object, serialize it |
|---|
| 8800 | + * into JSON format. |
|---|
| 8801 | + * |
|---|
| 8802 | + * Response transformations (`$httpProvider.defaults.transformResponse` and `$http.defaults.transformResponse`): |
|---|
| 8803 | + * |
|---|
| 8804 | + * - If XSRF prefix is detected, strip it (see Security Considerations section below). |
|---|
| 8805 | + * - If JSON response is detected, deserialize it using a JSON parser. |
|---|
| 8806 | + * |
|---|
| 8807 | + * |
|---|
| 8808 | + * ### Overriding the Default Transformations Per Request |
|---|
| 8809 | + * |
|---|
| 8810 | + * If you wish override the request/response transformations only for a single request then provide |
|---|
| 8811 | + * `transformRequest` and/or `transformResponse` properties on the configuration object passed |
|---|
| 8812 | + * into `$http`. |
|---|
| 8813 | + * |
|---|
| 8814 | + * Note that if you provide these properties on the config object the default transformations will be |
|---|
| 8815 | + * overwritten. If you wish to augment the default transformations then you must include them in your |
|---|
| 8816 | + * local transformation array. |
|---|
| 8817 | + * |
|---|
| 8818 | + * The following code demonstrates adding a new response transformation to be run after the default response |
|---|
| 8819 | + * transformations have been run. |
|---|
| 8820 | + * |
|---|
| 8821 | + * ```js |
|---|
| 8822 | + * function appendTransform(defaults, transform) { |
|---|
| 8823 | + * |
|---|
| 8824 | + * // We can't guarantee that the default transformation is an array |
|---|
| 8825 | + * defaults = angular.isArray(defaults) ? defaults : [defaults]; |
|---|
| 8826 | + * |
|---|
| 8827 | + * // Append the new transformation to the defaults |
|---|
| 8828 | + * return defaults.concat(transform); |
|---|
| 8829 | + * } |
|---|
| 8830 | + * |
|---|
| 8831 | + * $http({ |
|---|
| 8832 | + * url: '...', |
|---|
| 8833 | + * method: 'GET', |
|---|
| 8834 | + * transformResponse: appendTransform($http.defaults.transformResponse, function(value) { |
|---|
| 8835 | + * return doTransform(value); |
|---|
| 8836 | + * }) |
|---|
| 8837 | + * }); |
|---|
| 8838 | + * ``` |
|---|
| 8839 | + * |
|---|
| 8840 | + * |
|---|
| 8841 | + * ## Caching |
|---|
| 8842 | + * |
|---|
| 8843 | + * To enable caching, set the request configuration `cache` property to `true` (to use default |
|---|
| 8844 | + * cache) or to a custom cache object (built with {@link ng.$cacheFactory `$cacheFactory`}). |
|---|
| 8845 | + * When the cache is enabled, `$http` stores the response from the server in the specified |
|---|
| 8846 | + * cache. The next time the same request is made, the response is served from the cache without |
|---|
| 8847 | + * sending a request to the server. |
|---|
| 8848 | + * |
|---|
| 8849 | + * Note that even if the response is served from cache, delivery of the data is asynchronous in |
|---|
| 8850 | + * the same way that real requests are. |
|---|
| 8851 | + * |
|---|
| 8852 | + * If there are multiple GET requests for the same URL that should be cached using the same |
|---|
| 8853 | + * cache, but the cache is not populated yet, only one request to the server will be made and |
|---|
| 8854 | + * the remaining requests will be fulfilled using the response from the first request. |
|---|
| 8855 | + * |
|---|
| 8856 | + * You can change the default cache to a new object (built with |
|---|
| 8857 | + * {@link ng.$cacheFactory `$cacheFactory`}) by updating the |
|---|
| 8858 | + * {@link ng.$http#defaults `$http.defaults.cache`} property. All requests who set |
|---|
| 8859 | + * their `cache` property to `true` will now use this cache object. |
|---|
| 8860 | + * |
|---|
| 8861 | + * If you set the default cache to `false` then only requests that specify their own custom |
|---|
| 8862 | + * cache object will be cached. |
|---|
| 8863 | + * |
|---|
| 8864 | + * ## Interceptors |
|---|
| 8865 | + * |
|---|
| 8866 | + * Before you start creating interceptors, be sure to understand the |
|---|
| 8867 | + * {@link ng.$q $q and deferred/promise APIs}. |
|---|
| 8868 | + * |
|---|
| 8869 | + * For purposes of global error handling, authentication, or any kind of synchronous or |
|---|
| 8870 | + * asynchronous pre-processing of request or postprocessing of responses, it is desirable to be |
|---|
| 8871 | + * able to intercept requests before they are handed to the server and |
|---|
| 8872 | + * responses before they are handed over to the application code that |
|---|
| 8873 | + * initiated these requests. The interceptors leverage the {@link ng.$q |
|---|
| 8874 | + * promise APIs} to fulfill this need for both synchronous and asynchronous pre-processing. |
|---|
| 8875 | + * |
|---|
| 8876 | + * The interceptors are service factories that are registered with the `$httpProvider` by |
|---|
| 8877 | + * adding them to the `$httpProvider.interceptors` array. The factory is called and |
|---|
| 8878 | + * injected with dependencies (if specified) and returns the interceptor. |
|---|
| 8879 | + * |
|---|
| 8880 | + * There are two kinds of interceptors (and two kinds of rejection interceptors): |
|---|
| 8881 | + * |
|---|
| 8882 | + * * `request`: interceptors get called with a http `config` object. The function is free to |
|---|
| 8883 | + * modify the `config` object or create a new one. The function needs to return the `config` |
|---|
| 8884 | + * object directly, or a promise containing the `config` or a new `config` object. |
|---|
| 8885 | + * * `requestError`: interceptor gets called when a previous interceptor threw an error or |
|---|
| 8886 | + * resolved with a rejection. |
|---|
| 8887 | + * * `response`: interceptors get called with http `response` object. The function is free to |
|---|
| 8888 | + * modify the `response` object or create a new one. The function needs to return the `response` |
|---|
| 8889 | + * object directly, or as a promise containing the `response` or a new `response` object. |
|---|
| 8890 | + * * `responseError`: interceptor gets called when a previous interceptor threw an error or |
|---|
| 8891 | + * resolved with a rejection. |
|---|
| 8892 | + * |
|---|
| 8893 | + * |
|---|
| 8894 | + * ```js |
|---|
| 8895 | + * // register the interceptor as a service |
|---|
| 8896 | + * $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) { |
|---|
| 8897 | + * return { |
|---|
| 8898 | + * // optional method |
|---|
| 8899 | + * 'request': function(config) { |
|---|
| 8900 | + * // do something on success |
|---|
| 8901 | + * return config; |
|---|
| 8902 | + * }, |
|---|
| 8903 | + * |
|---|
| 8904 | + * // optional method |
|---|
| 8905 | + * 'requestError': function(rejection) { |
|---|
| 8906 | + * // do something on error |
|---|
| 8907 | + * if (canRecover(rejection)) { |
|---|
| 8908 | + * return responseOrNewPromise |
|---|
| 8909 | + * } |
|---|
| 8910 | + * return $q.reject(rejection); |
|---|
| 8911 | + * }, |
|---|
| 8912 | + * |
|---|
| 8913 | + * |
|---|
| 8914 | + * |
|---|
| 8915 | + * // optional method |
|---|
| 8916 | + * 'response': function(response) { |
|---|
| 8917 | + * // do something on success |
|---|
| 8918 | + * return response; |
|---|
| 8919 | + * }, |
|---|
| 8920 | + * |
|---|
| 8921 | + * // optional method |
|---|
| 8922 | + * 'responseError': function(rejection) { |
|---|
| 8923 | + * // do something on error |
|---|
| 8924 | + * if (canRecover(rejection)) { |
|---|
| 8925 | + * return responseOrNewPromise |
|---|
| 8926 | + * } |
|---|
| 8927 | + * return $q.reject(rejection); |
|---|
| 8928 | + * } |
|---|
| 8929 | + * }; |
|---|
| 8930 | + * }); |
|---|
| 8931 | + * |
|---|
| 8932 | + * $httpProvider.interceptors.push('myHttpInterceptor'); |
|---|
| 8933 | + * |
|---|
| 8934 | + * |
|---|
| 8935 | + * // alternatively, register the interceptor via an anonymous factory |
|---|
| 8936 | + * $httpProvider.interceptors.push(function($q, dependency1, dependency2) { |
|---|
| 8937 | + * return { |
|---|
| 8938 | + * 'request': function(config) { |
|---|
| 8939 | + * // same as above |
|---|
| 8940 | + * }, |
|---|
| 8941 | + * |
|---|
| 8942 | + * 'response': function(response) { |
|---|
| 8943 | + * // same as above |
|---|
| 8944 | + * } |
|---|
| 8945 | + * }; |
|---|
| 8946 | + * }); |
|---|
| 8947 | + * ``` |
|---|
| 8948 | + * |
|---|
| 8949 | + * ## Security Considerations |
|---|
| 8950 | + * |
|---|
| 8951 | + * When designing web applications, consider security threats from: |
|---|
| 8952 | + * |
|---|
| 8953 | + * - [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx) |
|---|
| 8954 | + * - [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) |
|---|
| 8955 | + * |
|---|
| 8956 | + * Both server and the client must cooperate in order to eliminate these threats. Angular comes |
|---|
| 8957 | + * pre-configured with strategies that address these issues, but for this to work backend server |
|---|
| 8958 | + * cooperation is required. |
|---|
| 8959 | + * |
|---|
| 8960 | + * ### JSON Vulnerability Protection |
|---|
| 8961 | + * |
|---|
| 8962 | + * A [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx) |
|---|
| 8963 | + * allows third party website to turn your JSON resource URL into |
|---|
| 8964 | + * [JSONP](http://en.wikipedia.org/wiki/JSONP) request under some conditions. To |
|---|
| 8965 | + * counter this your server can prefix all JSON requests with following string `")]}',\n"`. |
|---|
| 8966 | + * Angular will automatically strip the prefix before processing it as JSON. |
|---|
| 8967 | + * |
|---|
| 8968 | + * For example if your server needs to return: |
|---|
| 8969 | + * ```js |
|---|
| 8970 | + * ['one','two'] |
|---|
| 8971 | + * ``` |
|---|
| 8972 | + * |
|---|
| 8973 | + * which is vulnerable to attack, your server can return: |
|---|
| 8974 | + * ```js |
|---|
| 8975 | + * )]}', |
|---|
| 8976 | + * ['one','two'] |
|---|
| 8977 | + * ``` |
|---|
| 8978 | + * |
|---|
| 8979 | + * Angular will strip the prefix, before processing the JSON. |
|---|
| 8980 | + * |
|---|
| 8981 | + * |
|---|
| 8982 | + * ### Cross Site Request Forgery (XSRF) Protection |
|---|
| 8983 | + * |
|---|
| 8984 | + * [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) is a technique by which |
|---|
| 8985 | + * an unauthorized site can gain your user's private data. Angular provides a mechanism |
|---|
| 8986 | + * to counter XSRF. When performing XHR requests, the $http service reads a token from a cookie |
|---|
| 8987 | + * (by default, `XSRF-TOKEN`) and sets it as an HTTP header (`X-XSRF-TOKEN`). Since only |
|---|
| 8988 | + * JavaScript that runs on your domain could read the cookie, your server can be assured that |
|---|
| 8989 | + * the XHR came from JavaScript running on your domain. The header will not be set for |
|---|
| 8990 | + * cross-domain requests. |
|---|
| 8991 | + * |
|---|
| 8992 | + * To take advantage of this, your server needs to set a token in a JavaScript readable session |
|---|
| 8993 | + * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the |
|---|
| 8994 | + * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure |
|---|
| 8995 | + * that only JavaScript running on your domain could have sent the request. The token must be |
|---|
| 8996 | + * unique for each user and must be verifiable by the server (to prevent the JavaScript from |
|---|
| 8997 | + * making up its own tokens). We recommend that the token is a digest of your site's |
|---|
| 8998 | + * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography)) |
|---|
| 8999 | + * for added security. |
|---|
| 9000 | + * |
|---|
| 9001 | + * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName |
|---|
| 9002 | + * properties of either $httpProvider.defaults at config-time, $http.defaults at run-time, |
|---|
| 9003 | + * or the per-request config object. |
|---|
| 9004 | + * |
|---|
| 9005 | + * |
|---|
| 9006 | + * @param {object} config Object describing the request to be made and how it should be |
|---|
| 9007 | + * processed. The object has following properties: |
|---|
| 9008 | + * |
|---|
| 9009 | + * - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc) |
|---|
| 9010 | + * - **url** – `{string}` – Absolute or relative URL of the resource that is being requested. |
|---|
| 9011 | + * - **params** – `{Object.<string|Object>}` – Map of strings or objects which will be turned |
|---|
| 9012 | + * to `?key1=value1&key2=value2` after the url. If the value is not a string, it will be |
|---|
| 9013 | + * JSONified. |
|---|
| 9014 | + * - **data** – `{string|Object}` – Data to be sent as the request message data. |
|---|
| 9015 | + * - **headers** – `{Object}` – Map of strings or functions which return strings representing |
|---|
| 9016 | + * HTTP headers to send to the server. If the return value of a function is null, the |
|---|
| 9017 | + * header will not be sent. |
|---|
| 9018 | + * - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token. |
|---|
| 9019 | + * - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token. |
|---|
| 9020 | + * - **transformRequest** – |
|---|
| 9021 | + * `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` – |
|---|
| 9022 | + * transform function or an array of such functions. The transform function takes the http |
|---|
| 9023 | + * request body and headers and returns its transformed (typically serialized) version. |
|---|
| 9024 | + * See {@link #overriding-the-default-transformations-per-request Overriding the Default Transformations} |
|---|
| 9025 | + * - **transformResponse** – |
|---|
| 9026 | + * `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` – |
|---|
| 9027 | + * transform function or an array of such functions. The transform function takes the http |
|---|
| 9028 | + * response body and headers and returns its transformed (typically deserialized) version. |
|---|
| 9029 | + * See {@link #overriding-the-default-transformations-per-request Overriding the Default Transformations} |
|---|
| 9030 | + * - **cache** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the |
|---|
| 9031 | + * GET request, otherwise if a cache instance built with |
|---|
| 9032 | + * {@link ng.$cacheFactory $cacheFactory}, this cache will be used for |
|---|
| 9033 | + * caching. |
|---|
| 9034 | + * - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise} |
|---|
| 9035 | + * that should abort the request when resolved. |
|---|
| 9036 | + * - **withCredentials** - `{boolean}` - whether to set the `withCredentials` flag on the |
|---|
| 9037 | + * XHR object. See [requests with credentials](https://developer.mozilla.org/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials) |
|---|
| 9038 | + * for more information. |
|---|
| 9039 | + * - **responseType** - `{string}` - see |
|---|
| 9040 | + * [requestType](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType). |
|---|
| 9041 | + * |
|---|
| 9042 | + * @returns {HttpPromise} Returns a {@link ng.$q promise} object with the |
|---|
| 9043 | + * standard `then` method and two http specific methods: `success` and `error`. The `then` |
|---|
| 9044 | + * method takes two arguments a success and an error callback which will be called with a |
|---|
| 9045 | + * response object. The `success` and `error` methods take a single argument - a function that |
|---|
| 9046 | + * will be called when the request succeeds or fails respectively. The arguments passed into |
|---|
| 9047 | + * these functions are destructured representation of the response object passed into the |
|---|
| 9048 | + * `then` method. The response object has these properties: |
|---|
| 9049 | + * |
|---|
| 9050 | + * - **data** – `{string|Object}` – The response body transformed with the transform |
|---|
| 9051 | + * functions. |
|---|
| 9052 | + * - **status** – `{number}` – HTTP status code of the response. |
|---|
| 9053 | + * - **headers** – `{function([headerName])}` – Header getter function. |
|---|
| 9054 | + * - **config** – `{Object}` – The configuration object that was used to generate the request. |
|---|
| 9055 | + * - **statusText** – `{string}` – HTTP status text of the response. |
|---|
| 9056 | + * |
|---|
| 9057 | + * @property {Array.<Object>} pendingRequests Array of config objects for currently pending |
|---|
| 9058 | + * requests. This is primarily meant to be used for debugging purposes. |
|---|
| 9059 | + * |
|---|
| 9060 | + * |
|---|
| 9061 | + * @example |
|---|
| 9062 | +<example module="httpExample"> |
|---|
| 9063 | +<file name="index.html"> |
|---|
| 9064 | + <div ng-controller="FetchController"> |
|---|
| 9065 | + <select ng-model="method"> |
|---|
| 9066 | + <option>GET</option> |
|---|
| 9067 | + <option>JSONP</option> |
|---|
| 9068 | + </select> |
|---|
| 9069 | + <input type="text" ng-model="url" size="80"/> |
|---|
| 9070 | + <button id="fetchbtn" ng-click="fetch()">fetch</button><br> |
|---|
| 9071 | + <button id="samplegetbtn" ng-click="updateModel('GET', 'http-hello.html')">Sample GET</button> |
|---|
| 9072 | + <button id="samplejsonpbtn" |
|---|
| 9073 | + ng-click="updateModel('JSONP', |
|---|
| 9074 | + 'https://angularjs.org/greet.php?callback=JSON_CALLBACK&name=Super%20Hero')"> |
|---|
| 9075 | + Sample JSONP |
|---|
| 9076 | + </button> |
|---|
| 9077 | + <button id="invalidjsonpbtn" |
|---|
| 9078 | + ng-click="updateModel('JSONP', 'https://angularjs.org/doesntexist&callback=JSON_CALLBACK')"> |
|---|
| 9079 | + Invalid JSONP |
|---|
| 9080 | + </button> |
|---|
| 9081 | + <pre>http status code: {{status}}</pre> |
|---|
| 9082 | + <pre>http response data: {{data}}</pre> |
|---|
| 9083 | + </div> |
|---|
| 9084 | +</file> |
|---|
| 9085 | +<file name="script.js"> |
|---|
| 9086 | + angular.module('httpExample', []) |
|---|
| 9087 | + .controller('FetchController', ['$scope', '$http', '$templateCache', |
|---|
| 9088 | + function($scope, $http, $templateCache) { |
|---|
| 9089 | + $scope.method = 'GET'; |
|---|
| 9090 | + $scope.url = 'http-hello.html'; |
|---|
| 9091 | + |
|---|
| 9092 | + $scope.fetch = function() { |
|---|
| 9093 | + $scope.code = null; |
|---|
| 9094 | + $scope.response = null; |
|---|
| 9095 | + |
|---|
| 9096 | + $http({method: $scope.method, url: $scope.url, cache: $templateCache}). |
|---|
| 9097 | + success(function(data, status) { |
|---|
| 9098 | + $scope.status = status; |
|---|
| 9099 | + $scope.data = data; |
|---|
| 9100 | + }). |
|---|
| 9101 | + error(function(data, status) { |
|---|
| 9102 | + $scope.data = data || "Request failed"; |
|---|
| 9103 | + $scope.status = status; |
|---|
| 9104 | + }); |
|---|
| 9105 | + }; |
|---|
| 9106 | + |
|---|
| 9107 | + $scope.updateModel = function(method, url) { |
|---|
| 9108 | + $scope.method = method; |
|---|
| 9109 | + $scope.url = url; |
|---|
| 9110 | + }; |
|---|
| 9111 | + }]); |
|---|
| 9112 | +</file> |
|---|
| 9113 | +<file name="http-hello.html"> |
|---|
| 9114 | + Hello, $http! |
|---|
| 9115 | +</file> |
|---|
| 9116 | +<file name="protractor.js" type="protractor"> |
|---|
| 9117 | + var status = element(by.binding('status')); |
|---|
| 9118 | + var data = element(by.binding('data')); |
|---|
| 9119 | + var fetchBtn = element(by.id('fetchbtn')); |
|---|
| 9120 | + var sampleGetBtn = element(by.id('samplegetbtn')); |
|---|
| 9121 | + var sampleJsonpBtn = element(by.id('samplejsonpbtn')); |
|---|
| 9122 | + var invalidJsonpBtn = element(by.id('invalidjsonpbtn')); |
|---|
| 9123 | + |
|---|
| 9124 | + it('should make an xhr GET request', function() { |
|---|
| 9125 | + sampleGetBtn.click(); |
|---|
| 9126 | + fetchBtn.click(); |
|---|
| 9127 | + expect(status.getText()).toMatch('200'); |
|---|
| 9128 | + expect(data.getText()).toMatch(/Hello, \$http!/); |
|---|
| 9129 | + }); |
|---|
| 9130 | + |
|---|
| 9131 | +// Commented out due to flakes. See https://github.com/angular/angular.js/issues/9185 |
|---|
| 9132 | +// it('should make a JSONP request to angularjs.org', function() { |
|---|
| 9133 | +// sampleJsonpBtn.click(); |
|---|
| 9134 | +// fetchBtn.click(); |
|---|
| 9135 | +// expect(status.getText()).toMatch('200'); |
|---|
| 9136 | +// expect(data.getText()).toMatch(/Super Hero!/); |
|---|
| 9137 | +// }); |
|---|
| 9138 | + |
|---|
| 9139 | + it('should make JSONP request to invalid URL and invoke the error handler', |
|---|
| 9140 | + function() { |
|---|
| 9141 | + invalidJsonpBtn.click(); |
|---|
| 9142 | + fetchBtn.click(); |
|---|
| 9143 | + expect(status.getText()).toMatch('0'); |
|---|
| 9144 | + expect(data.getText()).toMatch('Request failed'); |
|---|
| 9145 | + }); |
|---|
| 9146 | +</file> |
|---|
| 9147 | +</example> |
|---|
| 9148 | + */ |
|---|
| 9149 | + function $http(requestConfig) { |
|---|
| 9150 | + var config = { |
|---|
| 9151 | + method: 'get', |
|---|
| 9152 | + transformRequest: defaults.transformRequest, |
|---|
| 9153 | + transformResponse: defaults.transformResponse |
|---|
| 9154 | + }; |
|---|
| 9155 | + var headers = mergeHeaders(requestConfig); |
|---|
| 9156 | + |
|---|
| 9157 | + extend(config, requestConfig); |
|---|
| 9158 | + config.headers = headers; |
|---|
| 9159 | + config.method = uppercase(config.method); |
|---|
| 9160 | + |
|---|
| 9161 | + var serverRequest = function(config) { |
|---|
| 9162 | + headers = config.headers; |
|---|
| 9163 | + var reqData = transformData(config.data, headersGetter(headers), config.transformRequest); |
|---|
| 9164 | + |
|---|
| 9165 | + // strip content-type if data is undefined |
|---|
| 9166 | + if (isUndefined(reqData)) { |
|---|
| 9167 | + forEach(headers, function(value, header) { |
|---|
| 9168 | + if (lowercase(header) === 'content-type') { |
|---|
| 9169 | + delete headers[header]; |
|---|
| 9170 | + } |
|---|
| 9171 | + }); |
|---|
| 9172 | + } |
|---|
| 9173 | + |
|---|
| 9174 | + if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) { |
|---|
| 9175 | + config.withCredentials = defaults.withCredentials; |
|---|
| 9176 | + } |
|---|
| 9177 | + |
|---|
| 9178 | + // send request |
|---|
| 9179 | + return sendReq(config, reqData, headers).then(transformResponse, transformResponse); |
|---|
| 9180 | + }; |
|---|
| 9181 | + |
|---|
| 9182 | + var chain = [serverRequest, undefined]; |
|---|
| 9183 | + var promise = $q.when(config); |
|---|
| 9184 | + |
|---|
| 9185 | + // apply interceptors |
|---|
| 9186 | + forEach(reversedInterceptors, function(interceptor) { |
|---|
| 9187 | + if (interceptor.request || interceptor.requestError) { |
|---|
| 9188 | + chain.unshift(interceptor.request, interceptor.requestError); |
|---|
| 9189 | + } |
|---|
| 9190 | + if (interceptor.response || interceptor.responseError) { |
|---|
| 9191 | + chain.push(interceptor.response, interceptor.responseError); |
|---|
| 9192 | + } |
|---|
| 9193 | + }); |
|---|
| 9194 | + |
|---|
| 9195 | + while(chain.length) { |
|---|
| 9196 | + var thenFn = chain.shift(); |
|---|
| 9197 | + var rejectFn = chain.shift(); |
|---|
| 9198 | + |
|---|
| 9199 | + promise = promise.then(thenFn, rejectFn); |
|---|
| 9200 | + } |
|---|
| 9201 | + |
|---|
| 9202 | + promise.success = function(fn) { |
|---|
| 9203 | + promise.then(function(response) { |
|---|
| 9204 | + fn(response.data, response.status, response.headers, config); |
|---|
| 9205 | + }); |
|---|
| 9206 | + return promise; |
|---|
| 9207 | + }; |
|---|
| 9208 | + |
|---|
| 9209 | + promise.error = function(fn) { |
|---|
| 9210 | + promise.then(null, function(response) { |
|---|
| 9211 | + fn(response.data, response.status, response.headers, config); |
|---|
| 9212 | + }); |
|---|
| 9213 | + return promise; |
|---|
| 9214 | + }; |
|---|
| 9215 | + |
|---|
| 9216 | + return promise; |
|---|
| 9217 | + |
|---|
| 9218 | + function transformResponse(response) { |
|---|
| 9219 | + // make a copy since the response must be cacheable |
|---|
| 9220 | + var resp = extend({}, response); |
|---|
| 9221 | + if (!response.data) { |
|---|
| 9222 | + resp.data = response.data; |
|---|
| 9223 | + } else { |
|---|
| 9224 | + resp.data = transformData(response.data, response.headers, config.transformResponse); |
|---|
| 9225 | + } |
|---|
| 9226 | + return (isSuccess(response.status)) |
|---|
| 9227 | + ? resp |
|---|
| 9228 | + : $q.reject(resp); |
|---|
| 9229 | + } |
|---|
| 9230 | + |
|---|
| 9231 | + function mergeHeaders(config) { |
|---|
| 9232 | + var defHeaders = defaults.headers, |
|---|
| 9233 | + reqHeaders = extend({}, config.headers), |
|---|
| 9234 | + defHeaderName, lowercaseDefHeaderName, reqHeaderName; |
|---|
| 9235 | + |
|---|
| 9236 | + defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]); |
|---|
| 9237 | + |
|---|
| 9238 | + // using for-in instead of forEach to avoid unecessary iteration after header has been found |
|---|
| 9239 | + defaultHeadersIteration: |
|---|
| 9240 | + for (defHeaderName in defHeaders) { |
|---|
| 9241 | + lowercaseDefHeaderName = lowercase(defHeaderName); |
|---|
| 9242 | + |
|---|
| 9243 | + for (reqHeaderName in reqHeaders) { |
|---|
| 9244 | + if (lowercase(reqHeaderName) === lowercaseDefHeaderName) { |
|---|
| 9245 | + continue defaultHeadersIteration; |
|---|
| 9246 | + } |
|---|
| 9247 | + } |
|---|
| 9248 | + |
|---|
| 9249 | + reqHeaders[defHeaderName] = defHeaders[defHeaderName]; |
|---|
| 9250 | + } |
|---|
| 9251 | + |
|---|
| 9252 | + // execute if header value is a function for merged headers |
|---|
| 9253 | + execHeaders(reqHeaders); |
|---|
| 9254 | + return reqHeaders; |
|---|
| 9255 | + |
|---|
| 9256 | + function execHeaders(headers) { |
|---|
| 9257 | + var headerContent; |
|---|
| 9258 | + |
|---|
| 9259 | + forEach(headers, function(headerFn, header) { |
|---|
| 9260 | + if (isFunction(headerFn)) { |
|---|
| 9261 | + headerContent = headerFn(); |
|---|
| 9262 | + if (headerContent != null) { |
|---|
| 9263 | + headers[header] = headerContent; |
|---|
| 9264 | + } else { |
|---|
| 9265 | + delete headers[header]; |
|---|
| 9266 | + } |
|---|
| 9267 | + } |
|---|
| 9268 | + }); |
|---|
| 9269 | + } |
|---|
| 9270 | + } |
|---|
| 9271 | + } |
|---|
| 9272 | + |
|---|
| 9273 | + $http.pendingRequests = []; |
|---|
| 9274 | + |
|---|
| 9275 | + /** |
|---|
| 9276 | + * @ngdoc method |
|---|
| 9277 | + * @name $http#get |
|---|
| 9278 | + * |
|---|
| 9279 | + * @description |
|---|
| 9280 | + * Shortcut method to perform `GET` request. |
|---|
| 9281 | + * |
|---|
| 9282 | + * @param {string} url Relative or absolute URL specifying the destination of the request |
|---|
| 9283 | + * @param {Object=} config Optional configuration object |
|---|
| 9284 | + * @returns {HttpPromise} Future object |
|---|
| 9285 | + */ |
|---|
| 9286 | + |
|---|
| 9287 | + /** |
|---|
| 9288 | + * @ngdoc method |
|---|
| 9289 | + * @name $http#delete |
|---|
| 9290 | + * |
|---|
| 9291 | + * @description |
|---|
| 9292 | + * Shortcut method to perform `DELETE` request. |
|---|
| 9293 | + * |
|---|
| 9294 | + * @param {string} url Relative or absolute URL specifying the destination of the request |
|---|
| 9295 | + * @param {Object=} config Optional configuration object |
|---|
| 9296 | + * @returns {HttpPromise} Future object |
|---|
| 9297 | + */ |
|---|
| 9298 | + |
|---|
| 9299 | + /** |
|---|
| 9300 | + * @ngdoc method |
|---|
| 9301 | + * @name $http#head |
|---|
| 9302 | + * |
|---|
| 9303 | + * @description |
|---|
| 9304 | + * Shortcut method to perform `HEAD` request. |
|---|
| 9305 | + * |
|---|
| 9306 | + * @param {string} url Relative or absolute URL specifying the destination of the request |
|---|
| 9307 | + * @param {Object=} config Optional configuration object |
|---|
| 9308 | + * @returns {HttpPromise} Future object |
|---|
| 9309 | + */ |
|---|
| 9310 | + |
|---|
| 9311 | + /** |
|---|
| 9312 | + * @ngdoc method |
|---|
| 9313 | + * @name $http#jsonp |
|---|
| 9314 | + * |
|---|
| 9315 | + * @description |
|---|
| 9316 | + * Shortcut method to perform `JSONP` request. |
|---|
| 9317 | + * |
|---|
| 9318 | + * @param {string} url Relative or absolute URL specifying the destination of the request. |
|---|
| 9319 | + * The name of the callback should be the string `JSON_CALLBACK`. |
|---|
| 9320 | + * @param {Object=} config Optional configuration object |
|---|
| 9321 | + * @returns {HttpPromise} Future object |
|---|
| 9322 | + */ |
|---|
| 9323 | + createShortMethods('get', 'delete', 'head', 'jsonp'); |
|---|
| 9324 | + |
|---|
| 9325 | + /** |
|---|
| 9326 | + * @ngdoc method |
|---|
| 9327 | + * @name $http#post |
|---|
| 9328 | + * |
|---|
| 9329 | + * @description |
|---|
| 9330 | + * Shortcut method to perform `POST` request. |
|---|
| 9331 | + * |
|---|
| 9332 | + * @param {string} url Relative or absolute URL specifying the destination of the request |
|---|
| 9333 | + * @param {*} data Request content |
|---|
| 9334 | + * @param {Object=} config Optional configuration object |
|---|
| 9335 | + * @returns {HttpPromise} Future object |
|---|
| 9336 | + */ |
|---|
| 9337 | + |
|---|
| 9338 | + /** |
|---|
| 9339 | + * @ngdoc method |
|---|
| 9340 | + * @name $http#put |
|---|
| 9341 | + * |
|---|
| 9342 | + * @description |
|---|
| 9343 | + * Shortcut method to perform `PUT` request. |
|---|
| 9344 | + * |
|---|
| 9345 | + * @param {string} url Relative or absolute URL specifying the destination of the request |
|---|
| 9346 | + * @param {*} data Request content |
|---|
| 9347 | + * @param {Object=} config Optional configuration object |
|---|
| 9348 | + * @returns {HttpPromise} Future object |
|---|
| 9349 | + */ |
|---|
| 9350 | + |
|---|
| 9351 | + /** |
|---|
| 9352 | + * @ngdoc method |
|---|
| 9353 | + * @name $http#patch |
|---|
| 9354 | + * |
|---|
| 9355 | + * @description |
|---|
| 9356 | + * Shortcut method to perform `PATCH` request. |
|---|
| 9357 | + * |
|---|
| 9358 | + * @param {string} url Relative or absolute URL specifying the destination of the request |
|---|
| 9359 | + * @param {*} data Request content |
|---|
| 9360 | + * @param {Object=} config Optional configuration object |
|---|
| 9361 | + * @returns {HttpPromise} Future object |
|---|
| 9362 | + */ |
|---|
| 9363 | + createShortMethodsWithData('post', 'put', 'patch'); |
|---|
| 9364 | + |
|---|
| 9365 | + /** |
|---|
| 9366 | + * @ngdoc property |
|---|
| 9367 | + * @name $http#defaults |
|---|
| 9368 | + * |
|---|
| 9369 | + * @description |
|---|
| 9370 | + * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of |
|---|
| 9371 | + * default headers, withCredentials as well as request and response transformations. |
|---|
| 9372 | + * |
|---|
| 9373 | + * See "Setting HTTP Headers" and "Transforming Requests and Responses" sections above. |
|---|
| 9374 | + */ |
|---|
| 9375 | + $http.defaults = defaults; |
|---|
| 9376 | + |
|---|
| 9377 | + |
|---|
| 9378 | + return $http; |
|---|
| 9379 | + |
|---|
| 9380 | + |
|---|
| 9381 | + function createShortMethods(names) { |
|---|
| 9382 | + forEach(arguments, function(name) { |
|---|
| 9383 | + $http[name] = function(url, config) { |
|---|
| 9384 | + return $http(extend(config || {}, { |
|---|
| 9385 | + method: name, |
|---|
| 9386 | + url: url |
|---|
| 9387 | + })); |
|---|
| 9388 | + }; |
|---|
| 9389 | + }); |
|---|
| 9390 | + } |
|---|
| 9391 | + |
|---|
| 9392 | + |
|---|
| 9393 | + function createShortMethodsWithData(name) { |
|---|
| 9394 | + forEach(arguments, function(name) { |
|---|
| 9395 | + $http[name] = function(url, data, config) { |
|---|
| 9396 | + return $http(extend(config || {}, { |
|---|
| 9397 | + method: name, |
|---|
| 9398 | + url: url, |
|---|
| 9399 | + data: data |
|---|
| 9400 | + })); |
|---|
| 9401 | + }; |
|---|
| 9402 | + }); |
|---|
| 9403 | + } |
|---|
| 9404 | + |
|---|
| 9405 | + |
|---|
| 9406 | + /** |
|---|
| 9407 | + * Makes the request. |
|---|
| 9408 | + * |
|---|
| 9409 | + * !!! ACCESSES CLOSURE VARS: |
|---|
| 9410 | + * $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests |
|---|
| 9411 | + */ |
|---|
| 9412 | + function sendReq(config, reqData, reqHeaders) { |
|---|
| 9413 | + var deferred = $q.defer(), |
|---|
| 9414 | + promise = deferred.promise, |
|---|
| 9415 | + cache, |
|---|
| 9416 | + cachedResp, |
|---|
| 9417 | + url = buildUrl(config.url, config.params); |
|---|
| 9418 | + |
|---|
| 9419 | + $http.pendingRequests.push(config); |
|---|
| 9420 | + promise.then(removePendingReq, removePendingReq); |
|---|
| 9421 | + |
|---|
| 9422 | + |
|---|
| 9423 | + if ((config.cache || defaults.cache) && config.cache !== false && |
|---|
| 9424 | + (config.method === 'GET' || config.method === 'JSONP')) { |
|---|
| 9425 | + cache = isObject(config.cache) ? config.cache |
|---|
| 9426 | + : isObject(defaults.cache) ? defaults.cache |
|---|
| 9427 | + : defaultCache; |
|---|
| 9428 | + } |
|---|
| 9429 | + |
|---|
| 9430 | + if (cache) { |
|---|
| 9431 | + cachedResp = cache.get(url); |
|---|
| 9432 | + if (isDefined(cachedResp)) { |
|---|
| 9433 | + if (isPromiseLike(cachedResp)) { |
|---|
| 9434 | + // cached request has already been sent, but there is no response yet |
|---|
| 9435 | + cachedResp.then(removePendingReq, removePendingReq); |
|---|
| 9436 | + return cachedResp; |
|---|
| 9437 | + } else { |
|---|
| 9438 | + // serving from cache |
|---|
| 9439 | + if (isArray(cachedResp)) { |
|---|
| 9440 | + resolvePromise(cachedResp[1], cachedResp[0], shallowCopy(cachedResp[2]), cachedResp[3]); |
|---|
| 9441 | + } else { |
|---|
| 9442 | + resolvePromise(cachedResp, 200, {}, 'OK'); |
|---|
| 9443 | + } |
|---|
| 9444 | + } |
|---|
| 9445 | + } else { |
|---|
| 9446 | + // put the promise for the non-transformed response into cache as a placeholder |
|---|
| 9447 | + cache.put(url, promise); |
|---|
| 9448 | + } |
|---|
| 9449 | + } |
|---|
| 9450 | + |
|---|
| 9451 | + |
|---|
| 9452 | + // if we won't have the response in cache, set the xsrf headers and |
|---|
| 9453 | + // send the request to the backend |
|---|
| 9454 | + if (isUndefined(cachedResp)) { |
|---|
| 9455 | + var xsrfValue = urlIsSameOrigin(config.url) |
|---|
| 9456 | + ? $browser.cookies()[config.xsrfCookieName || defaults.xsrfCookieName] |
|---|
| 9457 | + : undefined; |
|---|
| 9458 | + if (xsrfValue) { |
|---|
| 9459 | + reqHeaders[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue; |
|---|
| 9460 | + } |
|---|
| 9461 | + |
|---|
| 9462 | + $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout, |
|---|
| 9463 | + config.withCredentials, config.responseType); |
|---|
| 9464 | + } |
|---|
| 9465 | + |
|---|
| 9466 | + return promise; |
|---|
| 9467 | + |
|---|
| 9468 | + |
|---|
| 9469 | + /** |
|---|
| 9470 | + * Callback registered to $httpBackend(): |
|---|
| 9471 | + * - caches the response if desired |
|---|
| 9472 | + * - resolves the raw $http promise |
|---|
| 9473 | + * - calls $apply |
|---|
| 9474 | + */ |
|---|
| 9475 | + function done(status, response, headersString, statusText) { |
|---|
| 9476 | + if (cache) { |
|---|
| 9477 | + if (isSuccess(status)) { |
|---|
| 9478 | + cache.put(url, [status, response, parseHeaders(headersString), statusText]); |
|---|
| 9479 | + } else { |
|---|
| 9480 | + // remove promise from the cache |
|---|
| 9481 | + cache.remove(url); |
|---|
| 9482 | + } |
|---|
| 9483 | + } |
|---|
| 9484 | + |
|---|
| 9485 | + function resolveHttpPromise() { |
|---|
| 9486 | + resolvePromise(response, status, headersString, statusText); |
|---|
| 9487 | + } |
|---|
| 9488 | + |
|---|
| 9489 | + if (useApplyAsync) { |
|---|
| 9490 | + $rootScope.$applyAsync(resolveHttpPromise); |
|---|
| 9491 | + } else { |
|---|
| 9492 | + resolveHttpPromise(); |
|---|
| 9493 | + if (!$rootScope.$$phase) $rootScope.$apply(); |
|---|
| 9494 | + } |
|---|
| 9495 | + } |
|---|
| 9496 | + |
|---|
| 9497 | + |
|---|
| 9498 | + /** |
|---|
| 9499 | + * Resolves the raw $http promise. |
|---|
| 9500 | + */ |
|---|
| 9501 | + function resolvePromise(response, status, headers, statusText) { |
|---|
| 9502 | + // normalize internal statuses to 0 |
|---|
| 9503 | + status = Math.max(status, 0); |
|---|
| 9504 | + |
|---|
| 9505 | + (isSuccess(status) ? deferred.resolve : deferred.reject)({ |
|---|
| 9506 | + data: response, |
|---|
| 9507 | + status: status, |
|---|
| 9508 | + headers: headersGetter(headers), |
|---|
| 9509 | + config: config, |
|---|
| 9510 | + statusText : statusText |
|---|
| 9511 | + }); |
|---|
| 9512 | + } |
|---|
| 9513 | + |
|---|
| 9514 | + |
|---|
| 9515 | + function removePendingReq() { |
|---|
| 9516 | + var idx = $http.pendingRequests.indexOf(config); |
|---|
| 9517 | + if (idx !== -1) $http.pendingRequests.splice(idx, 1); |
|---|
| 9518 | + } |
|---|
| 9519 | + } |
|---|
| 9520 | + |
|---|
| 9521 | + |
|---|
| 9522 | + function buildUrl(url, params) { |
|---|
| 9523 | + if (!params) return url; |
|---|
| 9524 | + var parts = []; |
|---|
| 9525 | + forEachSorted(params, function(value, key) { |
|---|
| 9526 | + if (value === null || isUndefined(value)) return; |
|---|
| 9527 | + if (!isArray(value)) value = [value]; |
|---|
| 9528 | + |
|---|
| 9529 | + forEach(value, function(v) { |
|---|
| 9530 | + if (isObject(v)) { |
|---|
| 9531 | + if (isDate(v)){ |
|---|
| 9532 | + v = v.toISOString(); |
|---|
| 9533 | + } else { |
|---|
| 9534 | + v = toJson(v); |
|---|
| 9535 | + } |
|---|
| 9536 | + } |
|---|
| 9537 | + parts.push(encodeUriQuery(key) + '=' + |
|---|
| 9538 | + encodeUriQuery(v)); |
|---|
| 9539 | + }); |
|---|
| 9540 | + }); |
|---|
| 9541 | + if(parts.length > 0) { |
|---|
| 9542 | + url += ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&'); |
|---|
| 9543 | + } |
|---|
| 9544 | + return url; |
|---|
| 9545 | + } |
|---|
| 9546 | + }]; |
|---|
| 9547 | +} |
|---|
| 9548 | + |
|---|
| 9549 | +function createXhr() { |
|---|
| 9550 | + return new window.XMLHttpRequest(); |
|---|
| 9551 | +} |
|---|
| 9552 | + |
|---|
| 9553 | +/** |
|---|
| 9554 | + * @ngdoc service |
|---|
| 9555 | + * @name $httpBackend |
|---|
| 9556 | + * @requires $window |
|---|
| 9557 | + * @requires $document |
|---|
| 9558 | + * |
|---|
| 9559 | + * @description |
|---|
| 9560 | + * HTTP backend used by the {@link ng.$http service} that delegates to |
|---|
| 9561 | + * XMLHttpRequest object or JSONP and deals with browser incompatibilities. |
|---|
| 9562 | + * |
|---|
| 9563 | + * You should never need to use this service directly, instead use the higher-level abstractions: |
|---|
| 9564 | + * {@link ng.$http $http} or {@link ngResource.$resource $resource}. |
|---|
| 9565 | + * |
|---|
| 9566 | + * During testing this implementation is swapped with {@link ngMock.$httpBackend mock |
|---|
| 9567 | + * $httpBackend} which can be trained with responses. |
|---|
| 9568 | + */ |
|---|
| 9569 | +function $HttpBackendProvider() { |
|---|
| 9570 | + this.$get = ['$browser', '$window', '$document', function($browser, $window, $document) { |
|---|
| 9571 | + return createHttpBackend($browser, createXhr, $browser.defer, $window.angular.callbacks, $document[0]); |
|---|
| 9572 | + }]; |
|---|
| 9573 | +} |
|---|
| 9574 | + |
|---|
| 9575 | +function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) { |
|---|
| 9576 | + // TODO(vojta): fix the signature |
|---|
| 9577 | + return function(method, url, post, callback, headers, timeout, withCredentials, responseType) { |
|---|
| 9578 | + $browser.$$incOutstandingRequestCount(); |
|---|
| 9579 | + url = url || $browser.url(); |
|---|
| 9580 | + |
|---|
| 9581 | + if (lowercase(method) == 'jsonp') { |
|---|
| 9582 | + var callbackId = '_' + (callbacks.counter++).toString(36); |
|---|
| 9583 | + callbacks[callbackId] = function(data) { |
|---|
| 9584 | + callbacks[callbackId].data = data; |
|---|
| 9585 | + callbacks[callbackId].called = true; |
|---|
| 9586 | + }; |
|---|
| 9587 | + |
|---|
| 9588 | + var jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId), |
|---|
| 9589 | + callbackId, function(status, text) { |
|---|
| 9590 | + completeRequest(callback, status, callbacks[callbackId].data, "", text); |
|---|
| 9591 | + callbacks[callbackId] = noop; |
|---|
| 9592 | + }); |
|---|
| 9593 | + } else { |
|---|
| 9594 | + |
|---|
| 9595 | + var xhr = createXhr(); |
|---|
| 9596 | + |
|---|
| 9597 | + xhr.open(method, url, true); |
|---|
| 9598 | + forEach(headers, function(value, key) { |
|---|
| 9599 | + if (isDefined(value)) { |
|---|
| 9600 | + xhr.setRequestHeader(key, value); |
|---|
| 9601 | + } |
|---|
| 9602 | + }); |
|---|
| 9603 | + |
|---|
| 9604 | + xhr.onload = function requestLoaded() { |
|---|
| 9605 | + var statusText = xhr.statusText || ''; |
|---|
| 9606 | + |
|---|
| 9607 | + // responseText is the old-school way of retrieving response (supported by IE8 & 9) |
|---|
| 9608 | + // response/responseType properties were introduced in XHR Level2 spec (supported by IE10) |
|---|
| 9609 | + var response = ('response' in xhr) ? xhr.response : xhr.responseText; |
|---|
| 9610 | + |
|---|
| 9611 | + // normalize IE9 bug (http://bugs.jquery.com/ticket/1450) |
|---|
| 9612 | + var status = xhr.status === 1223 ? 204 : xhr.status; |
|---|
| 9613 | + |
|---|
| 9614 | + // fix status code when it is 0 (0 status is undocumented). |
|---|
| 9615 | + // Occurs when accessing file resources or on Android 4.1 stock browser |
|---|
| 9616 | + // while retrieving files from application cache. |
|---|
| 9617 | + if (status === 0) { |
|---|
| 9618 | + status = response ? 200 : urlResolve(url).protocol == 'file' ? 404 : 0; |
|---|
| 9619 | + } |
|---|
| 9620 | + |
|---|
| 9621 | + completeRequest(callback, |
|---|
| 9622 | + status, |
|---|
| 9623 | + response, |
|---|
| 9624 | + xhr.getAllResponseHeaders(), |
|---|
| 9625 | + statusText); |
|---|
| 9626 | + }; |
|---|
| 9627 | + |
|---|
| 9628 | + var requestError = function () { |
|---|
| 9629 | + // The response is always empty |
|---|
| 9630 | + // See https://xhr.spec.whatwg.org/#request-error-steps and https://fetch.spec.whatwg.org/#concept-network-error |
|---|
| 9631 | + completeRequest(callback, -1, null, null, ''); |
|---|
| 9632 | + }; |
|---|
| 9633 | + |
|---|
| 9634 | + xhr.onerror = requestError; |
|---|
| 9635 | + xhr.onabort = requestError; |
|---|
| 9636 | + |
|---|
| 9637 | + if (withCredentials) { |
|---|
| 9638 | + xhr.withCredentials = true; |
|---|
| 9639 | + } |
|---|
| 9640 | + |
|---|
| 9641 | + if (responseType) { |
|---|
| 9642 | + try { |
|---|
| 9643 | + xhr.responseType = responseType; |
|---|
| 9644 | + } catch (e) { |
|---|
| 9645 | + // WebKit added support for the json responseType value on 09/03/2013 |
|---|
| 9646 | + // https://bugs.webkit.org/show_bug.cgi?id=73648. Versions of Safari prior to 7 are |
|---|
| 9647 | + // known to throw when setting the value "json" as the response type. Other older |
|---|
| 9648 | + // browsers implementing the responseType |
|---|
| 9649 | + // |
|---|
| 9650 | + // The json response type can be ignored if not supported, because JSON payloads are |
|---|
| 9651 | + // parsed on the client-side regardless. |
|---|
| 9652 | + if (responseType !== 'json') { |
|---|
| 9653 | + throw e; |
|---|
| 9654 | + } |
|---|
| 9655 | + } |
|---|
| 9656 | + } |
|---|
| 9657 | + |
|---|
| 9658 | + xhr.send(post || null); |
|---|
| 9659 | + } |
|---|
| 9660 | + |
|---|
| 9661 | + if (timeout > 0) { |
|---|
| 9662 | + var timeoutId = $browserDefer(timeoutRequest, timeout); |
|---|
| 9663 | + } else if (isPromiseLike(timeout)) { |
|---|
| 9664 | + timeout.then(timeoutRequest); |
|---|
| 9665 | + } |
|---|
| 9666 | + |
|---|
| 9667 | + |
|---|
| 9668 | + function timeoutRequest() { |
|---|
| 9669 | + jsonpDone && jsonpDone(); |
|---|
| 9670 | + xhr && xhr.abort(); |
|---|
| 9671 | + } |
|---|
| 9672 | + |
|---|
| 9673 | + function completeRequest(callback, status, response, headersString, statusText) { |
|---|
| 9674 | + // cancel timeout and subsequent timeout promise resolution |
|---|
| 9675 | + timeoutId && $browserDefer.cancel(timeoutId); |
|---|
| 9676 | + jsonpDone = xhr = null; |
|---|
| 9677 | + |
|---|
| 9678 | + callback(status, response, headersString, statusText); |
|---|
| 9679 | + $browser.$$completeOutstandingRequest(noop); |
|---|
| 9680 | + } |
|---|
| 9681 | + }; |
|---|
| 9682 | + |
|---|
| 9683 | + function jsonpReq(url, callbackId, done) { |
|---|
| 9684 | + // we can't use jQuery/jqLite here because jQuery does crazy shit with script elements, e.g.: |
|---|
| 9685 | + // - fetches local scripts via XHR and evals them |
|---|
| 9686 | + // - adds and immediately removes script elements from the document |
|---|
| 9687 | + var script = rawDocument.createElement('script'), callback = null; |
|---|
| 9688 | + script.type = "text/javascript"; |
|---|
| 9689 | + script.src = url; |
|---|
| 9690 | + script.async = true; |
|---|
| 9691 | + |
|---|
| 9692 | + callback = function(event) { |
|---|
| 9693 | + removeEventListenerFn(script, "load", callback); |
|---|
| 9694 | + removeEventListenerFn(script, "error", callback); |
|---|
| 9695 | + rawDocument.body.removeChild(script); |
|---|
| 9696 | + script = null; |
|---|
| 9697 | + var status = -1; |
|---|
| 9698 | + var text = "unknown"; |
|---|
| 9699 | + |
|---|
| 9700 | + if (event) { |
|---|
| 9701 | + if (event.type === "load" && !callbacks[callbackId].called) { |
|---|
| 9702 | + event = { type: "error" }; |
|---|
| 9703 | + } |
|---|
| 9704 | + text = event.type; |
|---|
| 9705 | + status = event.type === "error" ? 404 : 200; |
|---|
| 9706 | + } |
|---|
| 9707 | + |
|---|
| 9708 | + if (done) { |
|---|
| 9709 | + done(status, text); |
|---|
| 9710 | + } |
|---|
| 9711 | + }; |
|---|
| 9712 | + |
|---|
| 9713 | + addEventListenerFn(script, "load", callback); |
|---|
| 9714 | + addEventListenerFn(script, "error", callback); |
|---|
| 9715 | + rawDocument.body.appendChild(script); |
|---|
| 9716 | + return callback; |
|---|
| 9717 | + } |
|---|
| 9718 | +} |
|---|
| 9719 | + |
|---|
| 9720 | +var $interpolateMinErr = minErr('$interpolate'); |
|---|
| 9721 | + |
|---|
| 9722 | +/** |
|---|
| 9723 | + * @ngdoc provider |
|---|
| 9724 | + * @name $interpolateProvider |
|---|
| 9725 | + * |
|---|
| 9726 | + * @description |
|---|
| 9727 | + * |
|---|
| 9728 | + * Used for configuring the interpolation markup. Defaults to `{{` and `}}`. |
|---|
| 9729 | + * |
|---|
| 9730 | + * @example |
|---|
| 9731 | +<example module="customInterpolationApp"> |
|---|
| 9732 | +<file name="index.html"> |
|---|
| 9733 | +<script> |
|---|
| 9734 | + var customInterpolationApp = angular.module('customInterpolationApp', []); |
|---|
| 9735 | + |
|---|
| 9736 | + customInterpolationApp.config(function($interpolateProvider) { |
|---|
| 9737 | + $interpolateProvider.startSymbol('//'); |
|---|
| 9738 | + $interpolateProvider.endSymbol('//'); |
|---|
| 9739 | + }); |
|---|
| 9740 | + |
|---|
| 9741 | + |
|---|
| 9742 | + customInterpolationApp.controller('DemoController', function() { |
|---|
| 9743 | + this.label = "This binding is brought you by // interpolation symbols."; |
|---|
| 9744 | + }); |
|---|
| 9745 | +</script> |
|---|
| 9746 | +<div ng-app="App" ng-controller="DemoController as demo"> |
|---|
| 9747 | + //demo.label// |
|---|
| 9748 | +</div> |
|---|
| 9749 | +</file> |
|---|
| 9750 | +<file name="protractor.js" type="protractor"> |
|---|
| 9751 | + it('should interpolate binding with custom symbols', function() { |
|---|
| 9752 | + expect(element(by.binding('demo.label')).getText()).toBe('This binding is brought you by // interpolation symbols.'); |
|---|
| 9753 | + }); |
|---|
| 9754 | +</file> |
|---|
| 9755 | +</example> |
|---|
| 9756 | + */ |
|---|
| 9757 | +function $InterpolateProvider() { |
|---|
| 9758 | + var startSymbol = '{{'; |
|---|
| 9759 | + var endSymbol = '}}'; |
|---|
| 9760 | + |
|---|
| 9761 | + /** |
|---|
| 9762 | + * @ngdoc method |
|---|
| 9763 | + * @name $interpolateProvider#startSymbol |
|---|
| 9764 | + * @description |
|---|
| 9765 | + * Symbol to denote start of expression in the interpolated string. Defaults to `{{`. |
|---|
| 9766 | + * |
|---|
| 9767 | + * @param {string=} value new value to set the starting symbol to. |
|---|
| 9768 | + * @returns {string|self} Returns the symbol when used as getter and self if used as setter. |
|---|
| 9769 | + */ |
|---|
| 9770 | + this.startSymbol = function(value){ |
|---|
| 9771 | + if (value) { |
|---|
| 9772 | + startSymbol = value; |
|---|
| 9773 | + return this; |
|---|
| 9774 | + } else { |
|---|
| 9775 | + return startSymbol; |
|---|
| 9776 | + } |
|---|
| 9777 | + }; |
|---|
| 9778 | + |
|---|
| 9779 | + /** |
|---|
| 9780 | + * @ngdoc method |
|---|
| 9781 | + * @name $interpolateProvider#endSymbol |
|---|
| 9782 | + * @description |
|---|
| 9783 | + * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`. |
|---|
| 9784 | + * |
|---|
| 9785 | + * @param {string=} value new value to set the ending symbol to. |
|---|
| 9786 | + * @returns {string|self} Returns the symbol when used as getter and self if used as setter. |
|---|
| 9787 | + */ |
|---|
| 9788 | + this.endSymbol = function(value){ |
|---|
| 9789 | + if (value) { |
|---|
| 9790 | + endSymbol = value; |
|---|
| 9791 | + return this; |
|---|
| 9792 | + } else { |
|---|
| 9793 | + return endSymbol; |
|---|
| 9794 | + } |
|---|
| 9795 | + }; |
|---|
| 9796 | + |
|---|
| 9797 | + |
|---|
| 9798 | + this.$get = ['$parse', '$exceptionHandler', '$sce', function($parse, $exceptionHandler, $sce) { |
|---|
| 9799 | + var startSymbolLength = startSymbol.length, |
|---|
| 9800 | + endSymbolLength = endSymbol.length, |
|---|
| 9801 | + escapedStartRegexp = new RegExp(startSymbol.replace(/./g, escape), 'g'), |
|---|
| 9802 | + escapedEndRegexp = new RegExp(endSymbol.replace(/./g, escape), 'g'); |
|---|
| 9803 | + |
|---|
| 9804 | + function escape(ch) { |
|---|
| 9805 | + return '\\\\\\' + ch; |
|---|
| 9806 | + } |
|---|
| 9807 | + |
|---|
| 9808 | + /** |
|---|
| 9809 | + * @ngdoc service |
|---|
| 9810 | + * @name $interpolate |
|---|
| 9811 | + * @kind function |
|---|
| 9812 | + * |
|---|
| 9813 | + * @requires $parse |
|---|
| 9814 | + * @requires $sce |
|---|
| 9815 | + * |
|---|
| 9816 | + * @description |
|---|
| 9817 | + * |
|---|
| 9818 | + * Compiles a string with markup into an interpolation function. This service is used by the |
|---|
| 9819 | + * HTML {@link ng.$compile $compile} service for data binding. See |
|---|
| 9820 | + * {@link ng.$interpolateProvider $interpolateProvider} for configuring the |
|---|
| 9821 | + * interpolation markup. |
|---|
| 9822 | + * |
|---|
| 9823 | + * |
|---|
| 9824 | + * ```js |
|---|
| 9825 | + * var $interpolate = ...; // injected |
|---|
| 9826 | + * var exp = $interpolate('Hello {{name | uppercase}}!'); |
|---|
| 9827 | + * expect(exp({name:'Angular'}).toEqual('Hello ANGULAR!'); |
|---|
| 9828 | + * ``` |
|---|
| 9829 | + * |
|---|
| 9830 | + * `$interpolate` takes an optional fourth argument, `allOrNothing`. If `allOrNothing` is |
|---|
| 9831 | + * `true`, the interpolation function will return `undefined` unless all embedded expressions |
|---|
| 9832 | + * evaluate to a value other than `undefined`. |
|---|
| 9833 | + * |
|---|
| 9834 | + * ```js |
|---|
| 9835 | + * var $interpolate = ...; // injected |
|---|
| 9836 | + * var context = {greeting: 'Hello', name: undefined }; |
|---|
| 9837 | + * |
|---|
| 9838 | + * // default "forgiving" mode |
|---|
| 9839 | + * var exp = $interpolate('{{greeting}} {{name}}!'); |
|---|
| 9840 | + * expect(exp(context)).toEqual('Hello !'); |
|---|
| 9841 | + * |
|---|
| 9842 | + * // "allOrNothing" mode |
|---|
| 9843 | + * exp = $interpolate('{{greeting}} {{name}}!', false, null, true); |
|---|
| 9844 | + * expect(exp(context)).toBeUndefined(); |
|---|
| 9845 | + * context.name = 'Angular'; |
|---|
| 9846 | + * expect(exp(context)).toEqual('Hello Angular!'); |
|---|
| 9847 | + * ``` |
|---|
| 9848 | + * |
|---|
| 9849 | + * `allOrNothing` is useful for interpolating URLs. `ngSrc` and `ngSrcset` use this behavior. |
|---|
| 9850 | + * |
|---|
| 9851 | + * ####Escaped Interpolation |
|---|
| 9852 | + * $interpolate provides a mechanism for escaping interpolation markers. Start and end markers |
|---|
| 9853 | + * can be escaped by preceding each of their characters with a REVERSE SOLIDUS U+005C (backslash). |
|---|
| 9854 | + * It will be rendered as a regular start/end marker, and will not be interpreted as an expression |
|---|
| 9855 | + * or binding. |
|---|
| 9856 | + * |
|---|
| 9857 | + * This enables web-servers to prevent script injection attacks and defacing attacks, to some |
|---|
| 9858 | + * degree, while also enabling code examples to work without relying on the |
|---|
| 9859 | + * {@link ng.directive:ngNonBindable ngNonBindable} directive. |
|---|
| 9860 | + * |
|---|
| 9861 | + * **For security purposes, it is strongly encouraged that web servers escape user-supplied data, |
|---|
| 9862 | + * replacing angle brackets (<, >) with &lt; and &gt; respectively, and replacing all |
|---|
| 9863 | + * interpolation start/end markers with their escaped counterparts.** |
|---|
| 9864 | + * |
|---|
| 9865 | + * Escaped interpolation markers are only replaced with the actual interpolation markers in rendered |
|---|
| 9866 | + * output when the $interpolate service processes the text. So, for HTML elements interpolated |
|---|
| 9867 | + * by {@link ng.$compile $compile}, or otherwise interpolated with the `mustHaveExpression` parameter |
|---|
| 9868 | + * set to `true`, the interpolated text must contain an unescaped interpolation expression. As such, |
|---|
| 9869 | + * this is typically useful only when user-data is used in rendering a template from the server, or |
|---|
| 9870 | + * when otherwise untrusted data is used by a directive. |
|---|
| 9871 | + * |
|---|
| 9872 | + * <example> |
|---|
| 9873 | + * <file name="index.html"> |
|---|
| 9874 | + * <div ng-init="username='A user'"> |
|---|
| 9875 | + * <p ng-init="apptitle='Escaping demo'">{{apptitle}}: \{\{ username = "defaced value"; \}\} |
|---|
| 9876 | + * </p> |
|---|
| 9877 | + * <p><strong>{{username}}</strong> attempts to inject code which will deface the |
|---|
| 9878 | + * application, but fails to accomplish their task, because the server has correctly |
|---|
| 9879 | + * escaped the interpolation start/end markers with REVERSE SOLIDUS U+005C (backslash) |
|---|
| 9880 | + * characters.</p> |
|---|
| 9881 | + * <p>Instead, the result of the attempted script injection is visible, and can be removed |
|---|
| 9882 | + * from the database by an administrator.</p> |
|---|
| 9883 | + * </div> |
|---|
| 9884 | + * </file> |
|---|
| 9885 | + * </example> |
|---|
| 9886 | + * |
|---|
| 9887 | + * @param {string} text The text with markup to interpolate. |
|---|
| 9888 | + * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have |
|---|
| 9889 | + * embedded expression in order to return an interpolation function. Strings with no |
|---|
| 9890 | + * embedded expression will return null for the interpolation function. |
|---|
| 9891 | + * @param {string=} trustedContext when provided, the returned function passes the interpolated |
|---|
| 9892 | + * result through {@link ng.$sce#getTrusted $sce.getTrusted(interpolatedResult, |
|---|
| 9893 | + * trustedContext)} before returning it. Refer to the {@link ng.$sce $sce} service that |
|---|
| 9894 | + * provides Strict Contextual Escaping for details. |
|---|
| 9895 | + * @param {boolean=} allOrNothing if `true`, then the returned function returns undefined |
|---|
| 9896 | + * unless all embedded expressions evaluate to a value other than `undefined`. |
|---|
| 9897 | + * @returns {function(context)} an interpolation function which is used to compute the |
|---|
| 9898 | + * interpolated string. The function has these parameters: |
|---|
| 9899 | + * |
|---|
| 9900 | + * - `context`: evaluation context for all expressions embedded in the interpolated text |
|---|
| 9901 | + */ |
|---|
| 9902 | + function $interpolate(text, mustHaveExpression, trustedContext, allOrNothing) { |
|---|
| 9903 | + allOrNothing = !!allOrNothing; |
|---|
| 9904 | + var startIndex, |
|---|
| 9905 | + endIndex, |
|---|
| 9906 | + index = 0, |
|---|
| 9907 | + expressions = [], |
|---|
| 9908 | + parseFns = [], |
|---|
| 9909 | + textLength = text.length, |
|---|
| 9910 | + exp, |
|---|
| 9911 | + concat = [], |
|---|
| 9912 | + expressionPositions = []; |
|---|
| 9913 | + |
|---|
| 9914 | + while(index < textLength) { |
|---|
| 9915 | + if ( ((startIndex = text.indexOf(startSymbol, index)) != -1) && |
|---|
| 9916 | + ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1) ) { |
|---|
| 9917 | + if (index !== startIndex) { |
|---|
| 9918 | + concat.push(unescapeText(text.substring(index, startIndex))); |
|---|
| 9919 | + } |
|---|
| 9920 | + exp = text.substring(startIndex + startSymbolLength, endIndex); |
|---|
| 9921 | + expressions.push(exp); |
|---|
| 9922 | + parseFns.push($parse(exp, parseStringifyInterceptor)); |
|---|
| 9923 | + index = endIndex + endSymbolLength; |
|---|
| 9924 | + expressionPositions.push(concat.length); |
|---|
| 9925 | + concat.push(''); |
|---|
| 9926 | + } else { |
|---|
| 9927 | + // we did not find an interpolation, so we have to add the remainder to the separators array |
|---|
| 9928 | + if (index !== textLength) { |
|---|
| 9929 | + concat.push(unescapeText(text.substring(index))); |
|---|
| 9930 | + } |
|---|
| 9931 | + break; |
|---|
| 9932 | + } |
|---|
| 9933 | + } |
|---|
| 9934 | + |
|---|
| 9935 | + // Concatenating expressions makes it hard to reason about whether some combination of |
|---|
| 9936 | + // concatenated values are unsafe to use and could easily lead to XSS. By requiring that a |
|---|
| 9937 | + // single expression be used for iframe[src], object[src], etc., we ensure that the value |
|---|
| 9938 | + // that's used is assigned or constructed by some JS code somewhere that is more testable or |
|---|
| 9939 | + // make it obvious that you bound the value to some user controlled value. This helps reduce |
|---|
| 9940 | + // the load when auditing for XSS issues. |
|---|
| 9941 | + if (trustedContext && concat.length > 1) { |
|---|
| 9942 | + throw $interpolateMinErr('noconcat', |
|---|
| 9943 | + "Error while interpolating: {0}\nStrict Contextual Escaping disallows " + |
|---|
| 9944 | + "interpolations that concatenate multiple expressions when a trusted value is " + |
|---|
| 9945 | + "required. See http://docs.angularjs.org/api/ng.$sce", text); |
|---|
| 9946 | + } |
|---|
| 9947 | + |
|---|
| 9948 | + if (!mustHaveExpression || expressions.length) { |
|---|
| 9949 | + var compute = function(values) { |
|---|
| 9950 | + for(var i = 0, ii = expressions.length; i < ii; i++) { |
|---|
| 9951 | + if (allOrNothing && isUndefined(values[i])) return; |
|---|
| 9952 | + concat[expressionPositions[i]] = values[i]; |
|---|
| 9953 | + } |
|---|
| 9954 | + return concat.join(''); |
|---|
| 9955 | + }; |
|---|
| 9956 | + |
|---|
| 9957 | + var getValue = function (value) { |
|---|
| 9958 | + return trustedContext ? |
|---|
| 9959 | + $sce.getTrusted(trustedContext, value) : |
|---|
| 9960 | + $sce.valueOf(value); |
|---|
| 9961 | + }; |
|---|
| 9962 | + |
|---|
| 9963 | + var stringify = function (value) { |
|---|
| 9964 | + if (value == null) { // null || undefined |
|---|
| 9965 | + return ''; |
|---|
| 9966 | + } |
|---|
| 9967 | + switch (typeof value) { |
|---|
| 9968 | + case 'string': |
|---|
| 9969 | + break; |
|---|
| 9970 | + case 'number': |
|---|
| 9971 | + value = '' + value; |
|---|
| 9972 | + break; |
|---|
| 9973 | + default: |
|---|
| 9974 | + value = toJson(value); |
|---|
| 9975 | + } |
|---|
| 9976 | + |
|---|
| 9977 | + return value; |
|---|
| 9978 | + }; |
|---|
| 9979 | + |
|---|
| 9980 | + return extend(function interpolationFn(context) { |
|---|
| 9981 | + var i = 0; |
|---|
| 9982 | + var ii = expressions.length; |
|---|
| 9983 | + var values = new Array(ii); |
|---|
| 9984 | + |
|---|
| 9985 | + try { |
|---|
| 9986 | + for (; i < ii; i++) { |
|---|
| 9987 | + values[i] = parseFns[i](context); |
|---|
| 9988 | + } |
|---|
| 9989 | + |
|---|
| 9990 | + return compute(values); |
|---|
| 9991 | + } catch(err) { |
|---|
| 9992 | + var newErr = $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text, |
|---|
| 9993 | + err.toString()); |
|---|
| 9994 | + $exceptionHandler(newErr); |
|---|
| 9995 | + } |
|---|
| 9996 | + |
|---|
| 9997 | + }, { |
|---|
| 9998 | + // all of these properties are undocumented for now |
|---|
| 9999 | + exp: text, //just for compatibility with regular watchers created via $watch |
|---|
| 10000 | + expressions: expressions, |
|---|
| 10001 | + $$watchDelegate: function (scope, listener, objectEquality) { |
|---|
| 10002 | + var lastValue; |
|---|
| 10003 | + return scope.$watchGroup(parseFns, function interpolateFnWatcher(values, oldValues) { |
|---|
| 10004 | + var currValue = compute(values); |
|---|
| 10005 | + if (isFunction(listener)) { |
|---|
| 10006 | + listener.call(this, currValue, values !== oldValues ? lastValue : currValue, scope); |
|---|
| 10007 | + } |
|---|
| 10008 | + lastValue = currValue; |
|---|
| 10009 | + }, objectEquality); |
|---|
| 10010 | + } |
|---|
| 10011 | + }); |
|---|
| 10012 | + } |
|---|
| 10013 | + |
|---|
| 10014 | + function unescapeText(text) { |
|---|
| 10015 | + return text.replace(escapedStartRegexp, startSymbol). |
|---|
| 10016 | + replace(escapedEndRegexp, endSymbol); |
|---|
| 10017 | + } |
|---|
| 10018 | + |
|---|
| 10019 | + function parseStringifyInterceptor(value) { |
|---|
| 10020 | + try { |
|---|
| 10021 | + return stringify(getValue(value)); |
|---|
| 10022 | + } catch(err) { |
|---|
| 10023 | + var newErr = $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text, |
|---|
| 10024 | + err.toString()); |
|---|
| 10025 | + $exceptionHandler(newErr); |
|---|
| 10026 | + } |
|---|
| 10027 | + } |
|---|
| 10028 | + } |
|---|
| 10029 | + |
|---|
| 10030 | + |
|---|
| 10031 | + /** |
|---|
| 10032 | + * @ngdoc method |
|---|
| 10033 | + * @name $interpolate#startSymbol |
|---|
| 10034 | + * @description |
|---|
| 10035 | + * Symbol to denote the start of expression in the interpolated string. Defaults to `{{`. |
|---|
| 10036 | + * |
|---|
| 10037 | + * Use {@link ng.$interpolateProvider#startSymbol `$interpolateProvider.startSymbol`} to change |
|---|
| 10038 | + * the symbol. |
|---|
| 10039 | + * |
|---|
| 10040 | + * @returns {string} start symbol. |
|---|
| 10041 | + */ |
|---|
| 10042 | + $interpolate.startSymbol = function() { |
|---|
| 10043 | + return startSymbol; |
|---|
| 10044 | + }; |
|---|
| 10045 | + |
|---|
| 10046 | + |
|---|
| 10047 | + /** |
|---|
| 10048 | + * @ngdoc method |
|---|
| 10049 | + * @name $interpolate#endSymbol |
|---|
| 10050 | + * @description |
|---|
| 10051 | + * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`. |
|---|
| 10052 | + * |
|---|
| 10053 | + * Use {@link ng.$interpolateProvider#endSymbol `$interpolateProvider.endSymbol`} to change |
|---|
| 10054 | + * the symbol. |
|---|
| 10055 | + * |
|---|
| 10056 | + * @returns {string} end symbol. |
|---|
| 10057 | + */ |
|---|
| 10058 | + $interpolate.endSymbol = function() { |
|---|
| 10059 | + return endSymbol; |
|---|
| 10060 | + }; |
|---|
| 10061 | + |
|---|
| 10062 | + return $interpolate; |
|---|
| 10063 | + }]; |
|---|
| 10064 | +} |
|---|
| 10065 | + |
|---|
| 10066 | +function $IntervalProvider() { |
|---|
| 10067 | + this.$get = ['$rootScope', '$window', '$q', '$$q', |
|---|
| 10068 | + function($rootScope, $window, $q, $$q) { |
|---|
| 10069 | + var intervals = {}; |
|---|
| 10070 | + |
|---|
| 10071 | + |
|---|
| 10072 | + /** |
|---|
| 10073 | + * @ngdoc service |
|---|
| 10074 | + * @name $interval |
|---|
| 10075 | + * |
|---|
| 10076 | + * @description |
|---|
| 10077 | + * Angular's wrapper for `window.setInterval`. The `fn` function is executed every `delay` |
|---|
| 10078 | + * milliseconds. |
|---|
| 10079 | + * |
|---|
| 10080 | + * The return value of registering an interval function is a promise. This promise will be |
|---|
| 10081 | + * notified upon each tick of the interval, and will be resolved after `count` iterations, or |
|---|
| 10082 | + * run indefinitely if `count` is not defined. The value of the notification will be the |
|---|
| 10083 | + * number of iterations that have run. |
|---|
| 10084 | + * To cancel an interval, call `$interval.cancel(promise)`. |
|---|
| 10085 | + * |
|---|
| 10086 | + * In tests you can use {@link ngMock.$interval#flush `$interval.flush(millis)`} to |
|---|
| 10087 | + * move forward by `millis` milliseconds and trigger any functions scheduled to run in that |
|---|
| 10088 | + * time. |
|---|
| 10089 | + * |
|---|
| 10090 | + * <div class="alert alert-warning"> |
|---|
| 10091 | + * **Note**: Intervals created by this service must be explicitly destroyed when you are finished |
|---|
| 10092 | + * with them. In particular they are not automatically destroyed when a controller's scope or a |
|---|
| 10093 | + * directive's element are destroyed. |
|---|
| 10094 | + * You should take this into consideration and make sure to always cancel the interval at the |
|---|
| 10095 | + * appropriate moment. See the example below for more details on how and when to do this. |
|---|
| 10096 | + * </div> |
|---|
| 10097 | + * |
|---|
| 10098 | + * @param {function()} fn A function that should be called repeatedly. |
|---|
| 10099 | + * @param {number} delay Number of milliseconds between each function call. |
|---|
| 10100 | + * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat |
|---|
| 10101 | + * indefinitely. |
|---|
| 10102 | + * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise |
|---|
| 10103 | + * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block. |
|---|
| 10104 | + * @returns {promise} A promise which will be notified on each iteration. |
|---|
| 10105 | + * |
|---|
| 10106 | + * @example |
|---|
| 10107 | + * <example module="intervalExample"> |
|---|
| 10108 | + * <file name="index.html"> |
|---|
| 10109 | + * <script> |
|---|
| 10110 | + * angular.module('intervalExample', []) |
|---|
| 10111 | + * .controller('ExampleController', ['$scope', '$interval', |
|---|
| 10112 | + * function($scope, $interval) { |
|---|
| 10113 | + * $scope.format = 'M/d/yy h:mm:ss a'; |
|---|
| 10114 | + * $scope.blood_1 = 100; |
|---|
| 10115 | + * $scope.blood_2 = 120; |
|---|
| 10116 | + * |
|---|
| 10117 | + * var stop; |
|---|
| 10118 | + * $scope.fight = function() { |
|---|
| 10119 | + * // Don't start a new fight if we are already fighting |
|---|
| 10120 | + * if ( angular.isDefined(stop) ) return; |
|---|
| 10121 | + * |
|---|
| 10122 | + * stop = $interval(function() { |
|---|
| 10123 | + * if ($scope.blood_1 > 0 && $scope.blood_2 > 0) { |
|---|
| 10124 | + * $scope.blood_1 = $scope.blood_1 - 3; |
|---|
| 10125 | + * $scope.blood_2 = $scope.blood_2 - 4; |
|---|
| 10126 | + * } else { |
|---|
| 10127 | + * $scope.stopFight(); |
|---|
| 10128 | + * } |
|---|
| 10129 | + * }, 100); |
|---|
| 10130 | + * }; |
|---|
| 10131 | + * |
|---|
| 10132 | + * $scope.stopFight = function() { |
|---|
| 10133 | + * if (angular.isDefined(stop)) { |
|---|
| 10134 | + * $interval.cancel(stop); |
|---|
| 10135 | + * stop = undefined; |
|---|
| 10136 | + * } |
|---|
| 10137 | + * }; |
|---|
| 10138 | + * |
|---|
| 10139 | + * $scope.resetFight = function() { |
|---|
| 10140 | + * $scope.blood_1 = 100; |
|---|
| 10141 | + * $scope.blood_2 = 120; |
|---|
| 10142 | + * }; |
|---|
| 10143 | + * |
|---|
| 10144 | + * $scope.$on('$destroy', function() { |
|---|
| 10145 | + * // Make sure that the interval is destroyed too |
|---|
| 10146 | + * $scope.stopFight(); |
|---|
| 10147 | + * }); |
|---|
| 10148 | + * }]) |
|---|
| 10149 | + * // Register the 'myCurrentTime' directive factory method. |
|---|
| 10150 | + * // We inject $interval and dateFilter service since the factory method is DI. |
|---|
| 10151 | + * .directive('myCurrentTime', ['$interval', 'dateFilter', |
|---|
| 10152 | + * function($interval, dateFilter) { |
|---|
| 10153 | + * // return the directive link function. (compile function not needed) |
|---|
| 10154 | + * return function(scope, element, attrs) { |
|---|
| 10155 | + * var format, // date format |
|---|
| 10156 | + * stopTime; // so that we can cancel the time updates |
|---|
| 10157 | + * |
|---|
| 10158 | + * // used to update the UI |
|---|
| 10159 | + * function updateTime() { |
|---|
| 10160 | + * element.text(dateFilter(new Date(), format)); |
|---|
| 10161 | + * } |
|---|
| 10162 | + * |
|---|
| 10163 | + * // watch the expression, and update the UI on change. |
|---|
| 10164 | + * scope.$watch(attrs.myCurrentTime, function(value) { |
|---|
| 10165 | + * format = value; |
|---|
| 10166 | + * updateTime(); |
|---|
| 10167 | + * }); |
|---|
| 10168 | + * |
|---|
| 10169 | + * stopTime = $interval(updateTime, 1000); |
|---|
| 10170 | + * |
|---|
| 10171 | + * // listen on DOM destroy (removal) event, and cancel the next UI update |
|---|
| 10172 | + * // to prevent updating time after the DOM element was removed. |
|---|
| 10173 | + * element.on('$destroy', function() { |
|---|
| 10174 | + * $interval.cancel(stopTime); |
|---|
| 10175 | + * }); |
|---|
| 10176 | + * } |
|---|
| 10177 | + * }]); |
|---|
| 10178 | + * </script> |
|---|
| 10179 | + * |
|---|
| 10180 | + * <div> |
|---|
| 10181 | + * <div ng-controller="ExampleController"> |
|---|
| 10182 | + * Date format: <input ng-model="format"> <hr/> |
|---|
| 10183 | + * Current time is: <span my-current-time="format"></span> |
|---|
| 10184 | + * <hr/> |
|---|
| 10185 | + * Blood 1 : <font color='red'>{{blood_1}}</font> |
|---|
| 10186 | + * Blood 2 : <font color='red'>{{blood_2}}</font> |
|---|
| 10187 | + * <button type="button" data-ng-click="fight()">Fight</button> |
|---|
| 10188 | + * <button type="button" data-ng-click="stopFight()">StopFight</button> |
|---|
| 10189 | + * <button type="button" data-ng-click="resetFight()">resetFight</button> |
|---|
| 10190 | + * </div> |
|---|
| 10191 | + * </div> |
|---|
| 10192 | + * |
|---|
| 10193 | + * </file> |
|---|
| 10194 | + * </example> |
|---|
| 10195 | + */ |
|---|
| 10196 | + function interval(fn, delay, count, invokeApply) { |
|---|
| 10197 | + var setInterval = $window.setInterval, |
|---|
| 10198 | + clearInterval = $window.clearInterval, |
|---|
| 10199 | + iteration = 0, |
|---|
| 10200 | + skipApply = (isDefined(invokeApply) && !invokeApply), |
|---|
| 10201 | + deferred = (skipApply ? $$q : $q).defer(), |
|---|
| 10202 | + promise = deferred.promise; |
|---|
| 10203 | + |
|---|
| 10204 | + count = isDefined(count) ? count : 0; |
|---|
| 10205 | + |
|---|
| 10206 | + promise.then(null, null, fn); |
|---|
| 10207 | + |
|---|
| 10208 | + promise.$$intervalId = setInterval(function tick() { |
|---|
| 10209 | + deferred.notify(iteration++); |
|---|
| 10210 | + |
|---|
| 10211 | + if (count > 0 && iteration >= count) { |
|---|
| 10212 | + deferred.resolve(iteration); |
|---|
| 10213 | + clearInterval(promise.$$intervalId); |
|---|
| 10214 | + delete intervals[promise.$$intervalId]; |
|---|
| 10215 | + } |
|---|
| 10216 | + |
|---|
| 10217 | + if (!skipApply) $rootScope.$apply(); |
|---|
| 10218 | + |
|---|
| 10219 | + }, delay); |
|---|
| 10220 | + |
|---|
| 10221 | + intervals[promise.$$intervalId] = deferred; |
|---|
| 10222 | + |
|---|
| 10223 | + return promise; |
|---|
| 10224 | + } |
|---|
| 10225 | + |
|---|
| 10226 | + |
|---|
| 10227 | + /** |
|---|
| 10228 | + * @ngdoc method |
|---|
| 10229 | + * @name $interval#cancel |
|---|
| 10230 | + * |
|---|
| 10231 | + * @description |
|---|
| 10232 | + * Cancels a task associated with the `promise`. |
|---|
| 10233 | + * |
|---|
| 10234 | + * @param {promise} promise returned by the `$interval` function. |
|---|
| 10235 | + * @returns {boolean} Returns `true` if the task was successfully canceled. |
|---|
| 10236 | + */ |
|---|
| 10237 | + interval.cancel = function(promise) { |
|---|
| 10238 | + if (promise && promise.$$intervalId in intervals) { |
|---|
| 10239 | + intervals[promise.$$intervalId].reject('canceled'); |
|---|
| 10240 | + $window.clearInterval(promise.$$intervalId); |
|---|
| 10241 | + delete intervals[promise.$$intervalId]; |
|---|
| 10242 | + return true; |
|---|
| 10243 | + } |
|---|
| 10244 | + return false; |
|---|
| 10245 | + }; |
|---|
| 10246 | + |
|---|
| 10247 | + return interval; |
|---|
| 10248 | + }]; |
|---|
| 10249 | +} |
|---|
| 10250 | + |
|---|
| 10251 | +/** |
|---|
| 10252 | + * @ngdoc service |
|---|
| 10253 | + * @name $locale |
|---|
| 10254 | + * |
|---|
| 10255 | + * @description |
|---|
| 10256 | + * $locale service provides localization rules for various Angular components. As of right now the |
|---|
| 10257 | + * only public api is: |
|---|
| 10258 | + * |
|---|
| 10259 | + * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`) |
|---|
| 10260 | + */ |
|---|
| 10261 | +function $LocaleProvider(){ |
|---|
| 10262 | + this.$get = function() { |
|---|
| 10263 | + return { |
|---|
| 10264 | + id: 'en-us', |
|---|
| 10265 | + |
|---|
| 10266 | + NUMBER_FORMATS: { |
|---|
| 10267 | + DECIMAL_SEP: '.', |
|---|
| 10268 | + GROUP_SEP: ',', |
|---|
| 10269 | + PATTERNS: [ |
|---|
| 10270 | + { // Decimal Pattern |
|---|
| 10271 | + minInt: 1, |
|---|
| 10272 | + minFrac: 0, |
|---|
| 10273 | + maxFrac: 3, |
|---|
| 10274 | + posPre: '', |
|---|
| 10275 | + posSuf: '', |
|---|
| 10276 | + negPre: '-', |
|---|
| 10277 | + negSuf: '', |
|---|
| 10278 | + gSize: 3, |
|---|
| 10279 | + lgSize: 3 |
|---|
| 10280 | + },{ //Currency Pattern |
|---|
| 10281 | + minInt: 1, |
|---|
| 10282 | + minFrac: 2, |
|---|
| 10283 | + maxFrac: 2, |
|---|
| 10284 | + posPre: '\u00A4', |
|---|
| 10285 | + posSuf: '', |
|---|
| 10286 | + negPre: '(\u00A4', |
|---|
| 10287 | + negSuf: ')', |
|---|
| 10288 | + gSize: 3, |
|---|
| 10289 | + lgSize: 3 |
|---|
| 10290 | + } |
|---|
| 10291 | + ], |
|---|
| 10292 | + CURRENCY_SYM: '$' |
|---|
| 10293 | + }, |
|---|
| 10294 | + |
|---|
| 10295 | + DATETIME_FORMATS: { |
|---|
| 10296 | + MONTH: |
|---|
| 10297 | + 'January,February,March,April,May,June,July,August,September,October,November,December' |
|---|
| 10298 | + .split(','), |
|---|
| 10299 | + SHORTMONTH: 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','), |
|---|
| 10300 | + DAY: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'.split(','), |
|---|
| 10301 | + SHORTDAY: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(','), |
|---|
| 10302 | + AMPMS: ['AM','PM'], |
|---|
| 10303 | + medium: 'MMM d, y h:mm:ss a', |
|---|
| 10304 | + short: 'M/d/yy h:mm a', |
|---|
| 10305 | + fullDate: 'EEEE, MMMM d, y', |
|---|
| 10306 | + longDate: 'MMMM d, y', |
|---|
| 10307 | + mediumDate: 'MMM d, y', |
|---|
| 10308 | + shortDate: 'M/d/yy', |
|---|
| 10309 | + mediumTime: 'h:mm:ss a', |
|---|
| 10310 | + shortTime: 'h:mm a' |
|---|
| 10311 | + }, |
|---|
| 10312 | + |
|---|
| 10313 | + pluralCat: function(num) { |
|---|
| 10314 | + if (num === 1) { |
|---|
| 10315 | + return 'one'; |
|---|
| 10316 | + } |
|---|
| 10317 | + return 'other'; |
|---|
| 10318 | + } |
|---|
| 10319 | + }; |
|---|
| 10320 | + }; |
|---|
| 10321 | +} |
|---|
| 10322 | + |
|---|
| 10323 | +var PATH_MATCH = /^([^\?#]*)(\?([^#]*))?(#(.*))?$/, |
|---|
| 10324 | + DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21}; |
|---|
| 10325 | +var $locationMinErr = minErr('$location'); |
|---|
| 10326 | + |
|---|
| 10327 | + |
|---|
| 10328 | +/** |
|---|
| 10329 | + * Encode path using encodeUriSegment, ignoring forward slashes |
|---|
| 10330 | + * |
|---|
| 10331 | + * @param {string} path Path to encode |
|---|
| 10332 | + * @returns {string} |
|---|
| 10333 | + */ |
|---|
| 10334 | +function encodePath(path) { |
|---|
| 10335 | + var segments = path.split('/'), |
|---|
| 10336 | + i = segments.length; |
|---|
| 10337 | + |
|---|
| 10338 | + while (i--) { |
|---|
| 10339 | + segments[i] = encodeUriSegment(segments[i]); |
|---|
| 10340 | + } |
|---|
| 10341 | + |
|---|
| 10342 | + return segments.join('/'); |
|---|
| 10343 | +} |
|---|
| 10344 | + |
|---|
| 10345 | +function parseAbsoluteUrl(absoluteUrl, locationObj, appBase) { |
|---|
| 10346 | + var parsedUrl = urlResolve(absoluteUrl, appBase); |
|---|
| 10347 | + |
|---|
| 10348 | + locationObj.$$protocol = parsedUrl.protocol; |
|---|
| 10349 | + locationObj.$$host = parsedUrl.hostname; |
|---|
| 10350 | + locationObj.$$port = int(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null; |
|---|
| 10351 | +} |
|---|
| 10352 | + |
|---|
| 10353 | + |
|---|
| 10354 | +function parseAppUrl(relativeUrl, locationObj, appBase) { |
|---|
| 10355 | + var prefixed = (relativeUrl.charAt(0) !== '/'); |
|---|
| 10356 | + if (prefixed) { |
|---|
| 10357 | + relativeUrl = '/' + relativeUrl; |
|---|
| 10358 | + } |
|---|
| 10359 | + var match = urlResolve(relativeUrl, appBase); |
|---|
| 10360 | + locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ? |
|---|
| 10361 | + match.pathname.substring(1) : match.pathname); |
|---|
| 10362 | + locationObj.$$search = parseKeyValue(match.search); |
|---|
| 10363 | + locationObj.$$hash = decodeURIComponent(match.hash); |
|---|
| 10364 | + |
|---|
| 10365 | + // make sure path starts with '/'; |
|---|
| 10366 | + if (locationObj.$$path && locationObj.$$path.charAt(0) != '/') { |
|---|
| 10367 | + locationObj.$$path = '/' + locationObj.$$path; |
|---|
| 10368 | + } |
|---|
| 10369 | +} |
|---|
| 10370 | + |
|---|
| 10371 | + |
|---|
| 10372 | +/** |
|---|
| 10373 | + * |
|---|
| 10374 | + * @param {string} begin |
|---|
| 10375 | + * @param {string} whole |
|---|
| 10376 | + * @returns {string} returns text from whole after begin or undefined if it does not begin with |
|---|
| 10377 | + * expected string. |
|---|
| 10378 | + */ |
|---|
| 10379 | +function beginsWith(begin, whole) { |
|---|
| 10380 | + if (whole.indexOf(begin) === 0) { |
|---|
| 10381 | + return whole.substr(begin.length); |
|---|
| 10382 | + } |
|---|
| 10383 | +} |
|---|
| 10384 | + |
|---|
| 10385 | + |
|---|
| 10386 | +function stripHash(url) { |
|---|
| 10387 | + var index = url.indexOf('#'); |
|---|
| 10388 | + return index == -1 ? url : url.substr(0, index); |
|---|
| 10389 | +} |
|---|
| 10390 | + |
|---|
| 10391 | + |
|---|
| 10392 | +function stripFile(url) { |
|---|
| 10393 | + return url.substr(0, stripHash(url).lastIndexOf('/') + 1); |
|---|
| 10394 | +} |
|---|
| 10395 | + |
|---|
| 10396 | +/* return the server only (scheme://host:port) */ |
|---|
| 10397 | +function serverBase(url) { |
|---|
| 10398 | + return url.substring(0, url.indexOf('/', url.indexOf('//') + 2)); |
|---|
| 10399 | +} |
|---|
| 10400 | + |
|---|
| 10401 | + |
|---|
| 10402 | +/** |
|---|
| 10403 | + * LocationHtml5Url represents an url |
|---|
| 10404 | + * This object is exposed as $location service when HTML5 mode is enabled and supported |
|---|
| 10405 | + * |
|---|
| 10406 | + * @constructor |
|---|
| 10407 | + * @param {string} appBase application base URL |
|---|
| 10408 | + * @param {string} basePrefix url path prefix |
|---|
| 10409 | + */ |
|---|
| 10410 | +function LocationHtml5Url(appBase, basePrefix) { |
|---|
| 10411 | + this.$$html5 = true; |
|---|
| 10412 | + basePrefix = basePrefix || ''; |
|---|
| 10413 | + var appBaseNoFile = stripFile(appBase); |
|---|
| 10414 | + parseAbsoluteUrl(appBase, this, appBase); |
|---|
| 10415 | + |
|---|
| 10416 | + |
|---|
| 10417 | + /** |
|---|
| 10418 | + * Parse given html5 (regular) url string into properties |
|---|
| 10419 | + * @param {string} newAbsoluteUrl HTML5 url |
|---|
| 10420 | + * @private |
|---|
| 10421 | + */ |
|---|
| 10422 | + this.$$parse = function(url) { |
|---|
| 10423 | + var pathUrl = beginsWith(appBaseNoFile, url); |
|---|
| 10424 | + if (!isString(pathUrl)) { |
|---|
| 10425 | + throw $locationMinErr('ipthprfx', 'Invalid url "{0}", missing path prefix "{1}".', url, |
|---|
| 10426 | + appBaseNoFile); |
|---|
| 10427 | + } |
|---|
| 10428 | + |
|---|
| 10429 | + parseAppUrl(pathUrl, this, appBase); |
|---|
| 10430 | + |
|---|
| 10431 | + if (!this.$$path) { |
|---|
| 10432 | + this.$$path = '/'; |
|---|
| 10433 | + } |
|---|
| 10434 | + |
|---|
| 10435 | + this.$$compose(); |
|---|
| 10436 | + }; |
|---|
| 10437 | + |
|---|
| 10438 | + /** |
|---|
| 10439 | + * Compose url and update `absUrl` property |
|---|
| 10440 | + * @private |
|---|
| 10441 | + */ |
|---|
| 10442 | + this.$$compose = function() { |
|---|
| 10443 | + var search = toKeyValue(this.$$search), |
|---|
| 10444 | + hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; |
|---|
| 10445 | + |
|---|
| 10446 | + this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; |
|---|
| 10447 | + this.$$absUrl = appBaseNoFile + this.$$url.substr(1); // first char is always '/' |
|---|
| 10448 | + }; |
|---|
| 10449 | + |
|---|
| 10450 | + this.$$parseLinkUrl = function(url, relHref) { |
|---|
| 10451 | + if (relHref && relHref[0] === '#') { |
|---|
| 10452 | + // special case for links to hash fragments: |
|---|
| 10453 | + // keep the old url and only replace the hash fragment |
|---|
| 10454 | + this.hash(relHref.slice(1)); |
|---|
| 10455 | + return true; |
|---|
| 10456 | + } |
|---|
| 10457 | + var appUrl, prevAppUrl; |
|---|
| 10458 | + var rewrittenUrl; |
|---|
| 10459 | + |
|---|
| 10460 | + if ( (appUrl = beginsWith(appBase, url)) !== undefined ) { |
|---|
| 10461 | + prevAppUrl = appUrl; |
|---|
| 10462 | + if ( (appUrl = beginsWith(basePrefix, appUrl)) !== undefined ) { |
|---|
| 10463 | + rewrittenUrl = appBaseNoFile + (beginsWith('/', appUrl) || appUrl); |
|---|
| 10464 | + } else { |
|---|
| 10465 | + rewrittenUrl = appBase + prevAppUrl; |
|---|
| 10466 | + } |
|---|
| 10467 | + } else if ( (appUrl = beginsWith(appBaseNoFile, url)) !== undefined ) { |
|---|
| 10468 | + rewrittenUrl = appBaseNoFile + appUrl; |
|---|
| 10469 | + } else if (appBaseNoFile == url + '/') { |
|---|
| 10470 | + rewrittenUrl = appBaseNoFile; |
|---|
| 10471 | + } |
|---|
| 10472 | + if (rewrittenUrl) { |
|---|
| 10473 | + this.$$parse(rewrittenUrl); |
|---|
| 10474 | + } |
|---|
| 10475 | + return !!rewrittenUrl; |
|---|
| 10476 | + }; |
|---|
| 10477 | +} |
|---|
| 10478 | + |
|---|
| 10479 | + |
|---|
| 10480 | +/** |
|---|
| 10481 | + * LocationHashbangUrl represents url |
|---|
| 10482 | + * This object is exposed as $location service when developer doesn't opt into html5 mode. |
|---|
| 10483 | + * It also serves as the base class for html5 mode fallback on legacy browsers. |
|---|
| 10484 | + * |
|---|
| 10485 | + * @constructor |
|---|
| 10486 | + * @param {string} appBase application base URL |
|---|
| 10487 | + * @param {string} hashPrefix hashbang prefix |
|---|
| 10488 | + */ |
|---|
| 10489 | +function LocationHashbangUrl(appBase, hashPrefix) { |
|---|
| 10490 | + var appBaseNoFile = stripFile(appBase); |
|---|
| 10491 | + |
|---|
| 10492 | + parseAbsoluteUrl(appBase, this, appBase); |
|---|
| 10493 | + |
|---|
| 10494 | + |
|---|
| 10495 | + /** |
|---|
| 10496 | + * Parse given hashbang url into properties |
|---|
| 10497 | + * @param {string} url Hashbang url |
|---|
| 10498 | + * @private |
|---|
| 10499 | + */ |
|---|
| 10500 | + this.$$parse = function(url) { |
|---|
| 10501 | + var withoutBaseUrl = beginsWith(appBase, url) || beginsWith(appBaseNoFile, url); |
|---|
| 10502 | + var withoutHashUrl = withoutBaseUrl.charAt(0) == '#' |
|---|
| 10503 | + ? beginsWith(hashPrefix, withoutBaseUrl) |
|---|
| 10504 | + : (this.$$html5) |
|---|
| 10505 | + ? withoutBaseUrl |
|---|
| 10506 | + : ''; |
|---|
| 10507 | + |
|---|
| 10508 | + if (!isString(withoutHashUrl)) { |
|---|
| 10509 | + throw $locationMinErr('ihshprfx', 'Invalid url "{0}", missing hash prefix "{1}".', url, |
|---|
| 10510 | + hashPrefix); |
|---|
| 10511 | + } |
|---|
| 10512 | + parseAppUrl(withoutHashUrl, this, appBase); |
|---|
| 10513 | + |
|---|
| 10514 | + this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase); |
|---|
| 10515 | + |
|---|
| 10516 | + this.$$compose(); |
|---|
| 10517 | + |
|---|
| 10518 | + /* |
|---|
| 10519 | + * In Windows, on an anchor node on documents loaded from |
|---|
| 10520 | + * the filesystem, the browser will return a pathname |
|---|
| 10521 | + * prefixed with the drive name ('/C:/path') when a |
|---|
| 10522 | + * pathname without a drive is set: |
|---|
| 10523 | + * * a.setAttribute('href', '/foo') |
|---|
| 10524 | + * * a.pathname === '/C:/foo' //true |
|---|
| 10525 | + * |
|---|
| 10526 | + * Inside of Angular, we're always using pathnames that |
|---|
| 10527 | + * do not include drive names for routing. |
|---|
| 10528 | + */ |
|---|
| 10529 | + function removeWindowsDriveName (path, url, base) { |
|---|
| 10530 | + /* |
|---|
| 10531 | + Matches paths for file protocol on windows, |
|---|
| 10532 | + such as /C:/foo/bar, and captures only /foo/bar. |
|---|
| 10533 | + */ |
|---|
| 10534 | + var windowsFilePathExp = /^\/[A-Z]:(\/.*)/; |
|---|
| 10535 | + |
|---|
| 10536 | + var firstPathSegmentMatch; |
|---|
| 10537 | + |
|---|
| 10538 | + //Get the relative path from the input URL. |
|---|
| 10539 | + if (url.indexOf(base) === 0) { |
|---|
| 10540 | + url = url.replace(base, ''); |
|---|
| 10541 | + } |
|---|
| 10542 | + |
|---|
| 10543 | + // The input URL intentionally contains a first path segment that ends with a colon. |
|---|
| 10544 | + if (windowsFilePathExp.exec(url)) { |
|---|
| 10545 | + return path; |
|---|
| 10546 | + } |
|---|
| 10547 | + |
|---|
| 10548 | + firstPathSegmentMatch = windowsFilePathExp.exec(path); |
|---|
| 10549 | + return firstPathSegmentMatch ? firstPathSegmentMatch[1] : path; |
|---|
| 10550 | + } |
|---|
| 10551 | + }; |
|---|
| 10552 | + |
|---|
| 10553 | + /** |
|---|
| 10554 | + * Compose hashbang url and update `absUrl` property |
|---|
| 10555 | + * @private |
|---|
| 10556 | + */ |
|---|
| 10557 | + this.$$compose = function() { |
|---|
| 10558 | + var search = toKeyValue(this.$$search), |
|---|
| 10559 | + hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; |
|---|
| 10560 | + |
|---|
| 10561 | + this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; |
|---|
| 10562 | + this.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : ''); |
|---|
| 10563 | + }; |
|---|
| 10564 | + |
|---|
| 10565 | + this.$$parseLinkUrl = function(url, relHref) { |
|---|
| 10566 | + if(stripHash(appBase) == stripHash(url)) { |
|---|
| 10567 | + this.$$parse(url); |
|---|
| 10568 | + return true; |
|---|
| 10569 | + } |
|---|
| 10570 | + return false; |
|---|
| 10571 | + }; |
|---|
| 10572 | +} |
|---|
| 10573 | + |
|---|
| 10574 | + |
|---|
| 10575 | +/** |
|---|
| 10576 | + * LocationHashbangUrl represents url |
|---|
| 10577 | + * This object is exposed as $location service when html5 history api is enabled but the browser |
|---|
| 10578 | + * does not support it. |
|---|
| 10579 | + * |
|---|
| 10580 | + * @constructor |
|---|
| 10581 | + * @param {string} appBase application base URL |
|---|
| 10582 | + * @param {string} hashPrefix hashbang prefix |
|---|
| 10583 | + */ |
|---|
| 10584 | +function LocationHashbangInHtml5Url(appBase, hashPrefix) { |
|---|
| 10585 | + this.$$html5 = true; |
|---|
| 10586 | + LocationHashbangUrl.apply(this, arguments); |
|---|
| 10587 | + |
|---|
| 10588 | + var appBaseNoFile = stripFile(appBase); |
|---|
| 10589 | + |
|---|
| 10590 | + this.$$parseLinkUrl = function(url, relHref) { |
|---|
| 10591 | + if (relHref && relHref[0] === '#') { |
|---|
| 10592 | + // special case for links to hash fragments: |
|---|
| 10593 | + // keep the old url and only replace the hash fragment |
|---|
| 10594 | + this.hash(relHref.slice(1)); |
|---|
| 10595 | + return true; |
|---|
| 10596 | + } |
|---|
| 10597 | + |
|---|
| 10598 | + var rewrittenUrl; |
|---|
| 10599 | + var appUrl; |
|---|
| 10600 | + |
|---|
| 10601 | + if ( appBase == stripHash(url) ) { |
|---|
| 10602 | + rewrittenUrl = url; |
|---|
| 10603 | + } else if ( (appUrl = beginsWith(appBaseNoFile, url)) ) { |
|---|
| 10604 | + rewrittenUrl = appBase + hashPrefix + appUrl; |
|---|
| 10605 | + } else if ( appBaseNoFile === url + '/') { |
|---|
| 10606 | + rewrittenUrl = appBaseNoFile; |
|---|
| 10607 | + } |
|---|
| 10608 | + if (rewrittenUrl) { |
|---|
| 10609 | + this.$$parse(rewrittenUrl); |
|---|
| 10610 | + } |
|---|
| 10611 | + return !!rewrittenUrl; |
|---|
| 10612 | + }; |
|---|
| 10613 | + |
|---|
| 10614 | + this.$$compose = function() { |
|---|
| 10615 | + var search = toKeyValue(this.$$search), |
|---|
| 10616 | + hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; |
|---|
| 10617 | + |
|---|
| 10618 | + this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; |
|---|
| 10619 | + // include hashPrefix in $$absUrl when $$url is empty so IE8 & 9 do not reload page because of removal of '#' |
|---|
| 10620 | + this.$$absUrl = appBase + hashPrefix + this.$$url; |
|---|
| 10621 | + }; |
|---|
| 10622 | + |
|---|
| 10623 | +} |
|---|
| 10624 | + |
|---|
| 10625 | + |
|---|
| 10626 | +var locationPrototype = { |
|---|
| 10627 | + |
|---|
| 10628 | + /** |
|---|
| 10629 | + * Are we in html5 mode? |
|---|
| 10630 | + * @private |
|---|
| 10631 | + */ |
|---|
| 10632 | + $$html5: false, |
|---|
| 10633 | + |
|---|
| 10634 | + /** |
|---|
| 10635 | + * Has any change been replacing? |
|---|
| 10636 | + * @private |
|---|
| 10637 | + */ |
|---|
| 10638 | + $$replace: false, |
|---|
| 10639 | + |
|---|
| 10640 | + /** |
|---|
| 10641 | + * @ngdoc method |
|---|
| 10642 | + * @name $location#absUrl |
|---|
| 10643 | + * |
|---|
| 10644 | + * @description |
|---|
| 10645 | + * This method is getter only. |
|---|
| 10646 | + * |
|---|
| 10647 | + * Return full url representation with all segments encoded according to rules specified in |
|---|
| 10648 | + * [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt). |
|---|
| 10649 | + * |
|---|
| 10650 | + * @return {string} full url |
|---|
| 10651 | + */ |
|---|
| 10652 | + absUrl: locationGetter('$$absUrl'), |
|---|
| 10653 | + |
|---|
| 10654 | + /** |
|---|
| 10655 | + * @ngdoc method |
|---|
| 10656 | + * @name $location#url |
|---|
| 10657 | + * |
|---|
| 10658 | + * @description |
|---|
| 10659 | + * This method is getter / setter. |
|---|
| 10660 | + * |
|---|
| 10661 | + * Return url (e.g. `/path?a=b#hash`) when called without any parameter. |
|---|
| 10662 | + * |
|---|
| 10663 | + * Change path, search and hash, when called with parameter and return `$location`. |
|---|
| 10664 | + * |
|---|
| 10665 | + * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`) |
|---|
| 10666 | + * @return {string} url |
|---|
| 10667 | + */ |
|---|
| 10668 | + url: function(url) { |
|---|
| 10669 | + if (isUndefined(url)) |
|---|
| 10670 | + return this.$$url; |
|---|
| 10671 | + |
|---|
| 10672 | + var match = PATH_MATCH.exec(url); |
|---|
| 10673 | + if (match[1]) this.path(decodeURIComponent(match[1])); |
|---|
| 10674 | + if (match[2] || match[1]) this.search(match[3] || ''); |
|---|
| 10675 | + this.hash(match[5] || ''); |
|---|
| 10676 | + |
|---|
| 10677 | + return this; |
|---|
| 10678 | + }, |
|---|
| 10679 | + |
|---|
| 10680 | + /** |
|---|
| 10681 | + * @ngdoc method |
|---|
| 10682 | + * @name $location#protocol |
|---|
| 10683 | + * |
|---|
| 10684 | + * @description |
|---|
| 10685 | + * This method is getter only. |
|---|
| 10686 | + * |
|---|
| 10687 | + * Return protocol of current url. |
|---|
| 10688 | + * |
|---|
| 10689 | + * @return {string} protocol of current url |
|---|
| 10690 | + */ |
|---|
| 10691 | + protocol: locationGetter('$$protocol'), |
|---|
| 10692 | + |
|---|
| 10693 | + /** |
|---|
| 10694 | + * @ngdoc method |
|---|
| 10695 | + * @name $location#host |
|---|
| 10696 | + * |
|---|
| 10697 | + * @description |
|---|
| 10698 | + * This method is getter only. |
|---|
| 10699 | + * |
|---|
| 10700 | + * Return host of current url. |
|---|
| 10701 | + * |
|---|
| 10702 | + * @return {string} host of current url. |
|---|
| 10703 | + */ |
|---|
| 10704 | + host: locationGetter('$$host'), |
|---|
| 10705 | + |
|---|
| 10706 | + /** |
|---|
| 10707 | + * @ngdoc method |
|---|
| 10708 | + * @name $location#port |
|---|
| 10709 | + * |
|---|
| 10710 | + * @description |
|---|
| 10711 | + * This method is getter only. |
|---|
| 10712 | + * |
|---|
| 10713 | + * Return port of current url. |
|---|
| 10714 | + * |
|---|
| 10715 | + * @return {Number} port |
|---|
| 10716 | + */ |
|---|
| 10717 | + port: locationGetter('$$port'), |
|---|
| 10718 | + |
|---|
| 10719 | + /** |
|---|
| 10720 | + * @ngdoc method |
|---|
| 10721 | + * @name $location#path |
|---|
| 10722 | + * |
|---|
| 10723 | + * @description |
|---|
| 10724 | + * This method is getter / setter. |
|---|
| 10725 | + * |
|---|
| 10726 | + * Return path of current url when called without any parameter. |
|---|
| 10727 | + * |
|---|
| 10728 | + * Change path when called with parameter and return `$location`. |
|---|
| 10729 | + * |
|---|
| 10730 | + * Note: Path should always begin with forward slash (/), this method will add the forward slash |
|---|
| 10731 | + * if it is missing. |
|---|
| 10732 | + * |
|---|
| 10733 | + * @param {(string|number)=} path New path |
|---|
| 10734 | + * @return {string} path |
|---|
| 10735 | + */ |
|---|
| 10736 | + path: locationGetterSetter('$$path', function(path) { |
|---|
| 10737 | + path = path !== null ? path.toString() : ''; |
|---|
| 10738 | + return path.charAt(0) == '/' ? path : '/' + path; |
|---|
| 10739 | + }), |
|---|
| 10740 | + |
|---|
| 10741 | + /** |
|---|
| 10742 | + * @ngdoc method |
|---|
| 10743 | + * @name $location#search |
|---|
| 10744 | + * |
|---|
| 10745 | + * @description |
|---|
| 10746 | + * This method is getter / setter. |
|---|
| 10747 | + * |
|---|
| 10748 | + * Return search part (as object) of current url when called without any parameter. |
|---|
| 10749 | + * |
|---|
| 10750 | + * Change search part when called with parameter and return `$location`. |
|---|
| 10751 | + * |
|---|
| 10752 | + * |
|---|
| 10753 | + * ```js |
|---|
| 10754 | + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo |
|---|
| 10755 | + * var searchObject = $location.search(); |
|---|
| 10756 | + * // => {foo: 'bar', baz: 'xoxo'} |
|---|
| 10757 | + * |
|---|
| 10758 | + * |
|---|
| 10759 | + * // set foo to 'yipee' |
|---|
| 10760 | + * $location.search('foo', 'yipee'); |
|---|
| 10761 | + * // => $location |
|---|
| 10762 | + * ``` |
|---|
| 10763 | + * |
|---|
| 10764 | + * @param {string|Object.<string>|Object.<Array.<string>>} search New search params - string or |
|---|
| 10765 | + * hash object. |
|---|
| 10766 | + * |
|---|
| 10767 | + * When called with a single argument the method acts as a setter, setting the `search` component |
|---|
| 10768 | + * of `$location` to the specified value. |
|---|
| 10769 | + * |
|---|
| 10770 | + * If the argument is a hash object containing an array of values, these values will be encoded |
|---|
| 10771 | + * as duplicate search parameters in the url. |
|---|
| 10772 | + * |
|---|
| 10773 | + * @param {(string|Number|Array<string>|boolean)=} paramValue If `search` is a string or number, then `paramValue` |
|---|
| 10774 | + * will override only a single search property. |
|---|
| 10775 | + * |
|---|
| 10776 | + * If `paramValue` is an array, it will override the property of the `search` component of |
|---|
| 10777 | + * `$location` specified via the first argument. |
|---|
| 10778 | + * |
|---|
| 10779 | + * If `paramValue` is `null`, the property specified via the first argument will be deleted. |
|---|
| 10780 | + * |
|---|
| 10781 | + * If `paramValue` is `true`, the property specified via the first argument will be added with no |
|---|
| 10782 | + * value nor trailing equal sign. |
|---|
| 10783 | + * |
|---|
| 10784 | + * @return {Object} If called with no arguments returns the parsed `search` object. If called with |
|---|
| 10785 | + * one or more arguments returns `$location` object itself. |
|---|
| 10786 | + */ |
|---|
| 10787 | + search: function(search, paramValue) { |
|---|
| 10788 | + switch (arguments.length) { |
|---|
| 10789 | + case 0: |
|---|
| 10790 | + return this.$$search; |
|---|
| 10791 | + case 1: |
|---|
| 10792 | + if (isString(search) || isNumber(search)) { |
|---|
| 10793 | + search = search.toString(); |
|---|
| 10794 | + this.$$search = parseKeyValue(search); |
|---|
| 10795 | + } else if (isObject(search)) { |
|---|
| 10796 | + search = copy(search, {}); |
|---|
| 10797 | + // remove object undefined or null properties |
|---|
| 10798 | + forEach(search, function(value, key) { |
|---|
| 10799 | + if (value == null) delete search[key]; |
|---|
| 10800 | + }); |
|---|
| 10801 | + |
|---|
| 10802 | + this.$$search = search; |
|---|
| 10803 | + } else { |
|---|
| 10804 | + throw $locationMinErr('isrcharg', |
|---|
| 10805 | + 'The first argument of the `$location#search()` call must be a string or an object.'); |
|---|
| 10806 | + } |
|---|
| 10807 | + break; |
|---|
| 10808 | + default: |
|---|
| 10809 | + if (isUndefined(paramValue) || paramValue === null) { |
|---|
| 10810 | + delete this.$$search[search]; |
|---|
| 10811 | + } else { |
|---|
| 10812 | + this.$$search[search] = paramValue; |
|---|
| 10813 | + } |
|---|
| 10814 | + } |
|---|
| 10815 | + |
|---|
| 10816 | + this.$$compose(); |
|---|
| 10817 | + return this; |
|---|
| 10818 | + }, |
|---|
| 10819 | + |
|---|
| 10820 | + /** |
|---|
| 10821 | + * @ngdoc method |
|---|
| 10822 | + * @name $location#hash |
|---|
| 10823 | + * |
|---|
| 10824 | + * @description |
|---|
| 10825 | + * This method is getter / setter. |
|---|
| 10826 | + * |
|---|
| 10827 | + * Return hash fragment when called without any parameter. |
|---|
| 10828 | + * |
|---|
| 10829 | + * Change hash fragment when called with parameter and return `$location`. |
|---|
| 10830 | + * |
|---|
| 10831 | + * @param {(string|number)=} hash New hash fragment |
|---|
| 10832 | + * @return {string} hash |
|---|
| 10833 | + */ |
|---|
| 10834 | + hash: locationGetterSetter('$$hash', function(hash) { |
|---|
| 10835 | + return hash !== null ? hash.toString() : ''; |
|---|
| 10836 | + }), |
|---|
| 10837 | + |
|---|
| 10838 | + /** |
|---|
| 10839 | + * @ngdoc method |
|---|
| 10840 | + * @name $location#replace |
|---|
| 10841 | + * |
|---|
| 10842 | + * @description |
|---|
| 10843 | + * If called, all changes to $location during current `$digest` will be replacing current history |
|---|
| 10844 | + * record, instead of adding new one. |
|---|
| 10845 | + */ |
|---|
| 10846 | + replace: function() { |
|---|
| 10847 | + this.$$replace = true; |
|---|
| 10848 | + return this; |
|---|
| 10849 | + } |
|---|
| 10850 | +}; |
|---|
| 10851 | + |
|---|
| 10852 | +forEach([LocationHashbangInHtml5Url, LocationHashbangUrl, LocationHtml5Url], function (Location) { |
|---|
| 10853 | + Location.prototype = Object.create(locationPrototype); |
|---|
| 10854 | + |
|---|
| 10855 | + /** |
|---|
| 10856 | + * @ngdoc method |
|---|
| 10857 | + * @name $location#state |
|---|
| 10858 | + * |
|---|
| 10859 | + * @description |
|---|
| 10860 | + * This method is getter / setter. |
|---|
| 10861 | + * |
|---|
| 10862 | + * Return the history state object when called without any parameter. |
|---|
| 10863 | + * |
|---|
| 10864 | + * Change the history state object when called with one parameter and return `$location`. |
|---|
| 10865 | + * The state object is later passed to `pushState` or `replaceState`. |
|---|
| 10866 | + * |
|---|
| 10867 | + * NOTE: This method is supported only in HTML5 mode and only in browsers supporting |
|---|
| 10868 | + * the HTML5 History API (i.e. methods `pushState` and `replaceState`). If you need to support |
|---|
| 10869 | + * older browsers (like IE9 or Android < 4.0), don't use this method. |
|---|
| 10870 | + * |
|---|
| 10871 | + * @param {object=} state State object for pushState or replaceState |
|---|
| 10872 | + * @return {object} state |
|---|
| 10873 | + */ |
|---|
| 10874 | + Location.prototype.state = function(state) { |
|---|
| 10875 | + if (!arguments.length) |
|---|
| 10876 | + return this.$$state; |
|---|
| 10877 | + |
|---|
| 10878 | + if (Location !== LocationHtml5Url || !this.$$html5) { |
|---|
| 10879 | + throw $locationMinErr('nostate', 'History API state support is available only ' + |
|---|
| 10880 | + 'in HTML5 mode and only in browsers supporting HTML5 History API'); |
|---|
| 10881 | + } |
|---|
| 10882 | + // The user might modify `stateObject` after invoking `$location.state(stateObject)` |
|---|
| 10883 | + // but we're changing the $$state reference to $browser.state() during the $digest |
|---|
| 10884 | + // so the modification window is narrow. |
|---|
| 10885 | + this.$$state = isUndefined(state) ? null : state; |
|---|
| 10886 | + |
|---|
| 10887 | + return this; |
|---|
| 10888 | + }; |
|---|
| 10889 | +}); |
|---|
| 10890 | + |
|---|
| 10891 | + |
|---|
| 10892 | +function locationGetter(property) { |
|---|
| 10893 | + return function() { |
|---|
| 10894 | + return this[property]; |
|---|
| 10895 | + }; |
|---|
| 10896 | +} |
|---|
| 10897 | + |
|---|
| 10898 | + |
|---|
| 10899 | +function locationGetterSetter(property, preprocess) { |
|---|
| 10900 | + return function(value) { |
|---|
| 10901 | + if (isUndefined(value)) |
|---|
| 10902 | + return this[property]; |
|---|
| 10903 | + |
|---|
| 10904 | + this[property] = preprocess(value); |
|---|
| 10905 | + this.$$compose(); |
|---|
| 10906 | + |
|---|
| 10907 | + return this; |
|---|
| 10908 | + }; |
|---|
| 10909 | +} |
|---|
| 10910 | + |
|---|
| 10911 | + |
|---|
| 10912 | +/** |
|---|
| 10913 | + * @ngdoc service |
|---|
| 10914 | + * @name $location |
|---|
| 10915 | + * |
|---|
| 10916 | + * @requires $rootElement |
|---|
| 10917 | + * |
|---|
| 10918 | + * @description |
|---|
| 10919 | + * The $location service parses the URL in the browser address bar (based on the |
|---|
| 10920 | + * [window.location](https://developer.mozilla.org/en/window.location)) and makes the URL |
|---|
| 10921 | + * available to your application. Changes to the URL in the address bar are reflected into |
|---|
| 10922 | + * $location service and changes to $location are reflected into the browser address bar. |
|---|
| 10923 | + * |
|---|
| 10924 | + * **The $location service:** |
|---|
| 10925 | + * |
|---|
| 10926 | + * - Exposes the current URL in the browser address bar, so you can |
|---|
| 10927 | + * - Watch and observe the URL. |
|---|
| 10928 | + * - Change the URL. |
|---|
| 10929 | + * - Synchronizes the URL with the browser when the user |
|---|
| 10930 | + * - Changes the address bar. |
|---|
| 10931 | + * - Clicks the back or forward button (or clicks a History link). |
|---|
| 10932 | + * - Clicks on a link. |
|---|
| 10933 | + * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash). |
|---|
| 10934 | + * |
|---|
| 10935 | + * For more information see {@link guide/$location Developer Guide: Using $location} |
|---|
| 10936 | + */ |
|---|
| 10937 | + |
|---|
| 10938 | +/** |
|---|
| 10939 | + * @ngdoc provider |
|---|
| 10940 | + * @name $locationProvider |
|---|
| 10941 | + * @description |
|---|
| 10942 | + * Use the `$locationProvider` to configure how the application deep linking paths are stored. |
|---|
| 10943 | + */ |
|---|
| 10944 | +function $LocationProvider(){ |
|---|
| 10945 | + var hashPrefix = '', |
|---|
| 10946 | + html5Mode = { |
|---|
| 10947 | + enabled: false, |
|---|
| 10948 | + requireBase: true, |
|---|
| 10949 | + rewriteLinks: true |
|---|
| 10950 | + }; |
|---|
| 10951 | + |
|---|
| 10952 | + /** |
|---|
| 10953 | + * @ngdoc method |
|---|
| 10954 | + * @name $locationProvider#hashPrefix |
|---|
| 10955 | + * @description |
|---|
| 10956 | + * @param {string=} prefix Prefix for hash part (containing path and search) |
|---|
| 10957 | + * @returns {*} current value if used as getter or itself (chaining) if used as setter |
|---|
| 10958 | + */ |
|---|
| 10959 | + this.hashPrefix = function(prefix) { |
|---|
| 10960 | + if (isDefined(prefix)) { |
|---|
| 10961 | + hashPrefix = prefix; |
|---|
| 10962 | + return this; |
|---|
| 10963 | + } else { |
|---|
| 10964 | + return hashPrefix; |
|---|
| 10965 | + } |
|---|
| 10966 | + }; |
|---|
| 10967 | + |
|---|
| 10968 | + /** |
|---|
| 10969 | + * @ngdoc method |
|---|
| 10970 | + * @name $locationProvider#html5Mode |
|---|
| 10971 | + * @description |
|---|
| 10972 | + * @param {(boolean|Object)=} mode If boolean, sets `html5Mode.enabled` to value. |
|---|
| 10973 | + * If object, sets `enabled`, `requireBase` and `rewriteLinks` to respective values. Supported |
|---|
| 10974 | + * properties: |
|---|
| 10975 | + * - **enabled** – `{boolean}` – (default: false) If true, will rely on `history.pushState` to |
|---|
| 10976 | + * change urls where supported. Will fall back to hash-prefixed paths in browsers that do not |
|---|
| 10977 | + * support `pushState`. |
|---|
| 10978 | + * - **requireBase** - `{boolean}` - (default: `true`) When html5Mode is enabled, specifies |
|---|
| 10979 | + * whether or not a <base> tag is required to be present. If `enabled` and `requireBase` are |
|---|
| 10980 | + * true, and a base tag is not present, an error will be thrown when `$location` is injected. |
|---|
| 10981 | + * See the {@link guide/$location $location guide for more information} |
|---|
| 10982 | + * - **rewriteLinks** - `{boolean}` - (default: `true`) When html5Mode is enabled, |
|---|
| 10983 | + * enables/disables url rewriting for relative links. |
|---|
| 10984 | + * |
|---|
| 10985 | + * @returns {Object} html5Mode object if used as getter or itself (chaining) if used as setter |
|---|
| 10986 | + */ |
|---|
| 10987 | + this.html5Mode = function(mode) { |
|---|
| 10988 | + if (isBoolean(mode)) { |
|---|
| 10989 | + html5Mode.enabled = mode; |
|---|
| 10990 | + return this; |
|---|
| 10991 | + } else if (isObject(mode)) { |
|---|
| 10992 | + |
|---|
| 10993 | + if (isBoolean(mode.enabled)) { |
|---|
| 10994 | + html5Mode.enabled = mode.enabled; |
|---|
| 10995 | + } |
|---|
| 10996 | + |
|---|
| 10997 | + if (isBoolean(mode.requireBase)) { |
|---|
| 10998 | + html5Mode.requireBase = mode.requireBase; |
|---|
| 10999 | + } |
|---|
| 11000 | + |
|---|
| 11001 | + if (isBoolean(mode.rewriteLinks)) { |
|---|
| 11002 | + html5Mode.rewriteLinks = mode.rewriteLinks; |
|---|
| 11003 | + } |
|---|
| 11004 | + |
|---|
| 11005 | + return this; |
|---|
| 11006 | + } else { |
|---|
| 11007 | + return html5Mode; |
|---|
| 11008 | + } |
|---|
| 11009 | + }; |
|---|
| 11010 | + |
|---|
| 11011 | + /** |
|---|
| 11012 | + * @ngdoc event |
|---|
| 11013 | + * @name $location#$locationChangeStart |
|---|
| 11014 | + * @eventType broadcast on root scope |
|---|
| 11015 | + * @description |
|---|
| 11016 | + * Broadcasted before a URL will change. |
|---|
| 11017 | + * |
|---|
| 11018 | + * This change can be prevented by calling |
|---|
| 11019 | + * `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on} for more |
|---|
| 11020 | + * details about event object. Upon successful change |
|---|
| 11021 | + * {@link ng.$location#$locationChangeSuccess $locationChangeSuccess} is fired. |
|---|
| 11022 | + * |
|---|
| 11023 | + * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when |
|---|
| 11024 | + * the browser supports the HTML5 History API. |
|---|
| 11025 | + * |
|---|
| 11026 | + * @param {Object} angularEvent Synthetic event object. |
|---|
| 11027 | + * @param {string} newUrl New URL |
|---|
| 11028 | + * @param {string=} oldUrl URL that was before it was changed. |
|---|
| 11029 | + * @param {string=} newState New history state object |
|---|
| 11030 | + * @param {string=} oldState History state object that was before it was changed. |
|---|
| 11031 | + */ |
|---|
| 11032 | + |
|---|
| 11033 | + /** |
|---|
| 11034 | + * @ngdoc event |
|---|
| 11035 | + * @name $location#$locationChangeSuccess |
|---|
| 11036 | + * @eventType broadcast on root scope |
|---|
| 11037 | + * @description |
|---|
| 11038 | + * Broadcasted after a URL was changed. |
|---|
| 11039 | + * |
|---|
| 11040 | + * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when |
|---|
| 11041 | + * the browser supports the HTML5 History API. |
|---|
| 11042 | + * |
|---|
| 11043 | + * @param {Object} angularEvent Synthetic event object. |
|---|
| 11044 | + * @param {string} newUrl New URL |
|---|
| 11045 | + * @param {string=} oldUrl URL that was before it was changed. |
|---|
| 11046 | + * @param {string=} newState New history state object |
|---|
| 11047 | + * @param {string=} oldState History state object that was before it was changed. |
|---|
| 11048 | + */ |
|---|
| 11049 | + |
|---|
| 11050 | + this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement', |
|---|
| 11051 | + function( $rootScope, $browser, $sniffer, $rootElement) { |
|---|
| 11052 | + var $location, |
|---|
| 11053 | + LocationMode, |
|---|
| 11054 | + baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to '' |
|---|
| 11055 | + initialUrl = $browser.url(), |
|---|
| 11056 | + appBase; |
|---|
| 11057 | + |
|---|
| 11058 | + if (html5Mode.enabled) { |
|---|
| 11059 | + if (!baseHref && html5Mode.requireBase) { |
|---|
| 11060 | + throw $locationMinErr('nobase', |
|---|
| 11061 | + "$location in HTML5 mode requires a <base> tag to be present!"); |
|---|
| 11062 | + } |
|---|
| 11063 | + appBase = serverBase(initialUrl) + (baseHref || '/'); |
|---|
| 11064 | + LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url; |
|---|
| 11065 | + } else { |
|---|
| 11066 | + appBase = stripHash(initialUrl); |
|---|
| 11067 | + LocationMode = LocationHashbangUrl; |
|---|
| 11068 | + } |
|---|
| 11069 | + $location = new LocationMode(appBase, '#' + hashPrefix); |
|---|
| 11070 | + $location.$$parseLinkUrl(initialUrl, initialUrl); |
|---|
| 11071 | + |
|---|
| 11072 | + $location.$$state = $browser.state(); |
|---|
| 11073 | + |
|---|
| 11074 | + var IGNORE_URI_REGEXP = /^\s*(javascript|mailto):/i; |
|---|
| 11075 | + |
|---|
| 11076 | + function setBrowserUrlWithFallback(url, replace, state) { |
|---|
| 11077 | + var oldUrl = $location.url(); |
|---|
| 11078 | + var oldState = $location.$$state; |
|---|
| 11079 | + try { |
|---|
| 11080 | + $browser.url(url, replace, state); |
|---|
| 11081 | + |
|---|
| 11082 | + // Make sure $location.state() returns referentially identical (not just deeply equal) |
|---|
| 11083 | + // state object; this makes possible quick checking if the state changed in the digest |
|---|
| 11084 | + // loop. Checking deep equality would be too expensive. |
|---|
| 11085 | + $location.$$state = $browser.state(); |
|---|
| 11086 | + } catch (e) { |
|---|
| 11087 | + // Restore old values if pushState fails |
|---|
| 11088 | + $location.url(oldUrl); |
|---|
| 11089 | + $location.$$state = oldState; |
|---|
| 11090 | + |
|---|
| 11091 | + throw e; |
|---|
| 11092 | + } |
|---|
| 11093 | + } |
|---|
| 11094 | + |
|---|
| 11095 | + $rootElement.on('click', function(event) { |
|---|
| 11096 | + // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser) |
|---|
| 11097 | + // currently we open nice url link and redirect then |
|---|
| 11098 | + |
|---|
| 11099 | + if (!html5Mode.rewriteLinks || event.ctrlKey || event.metaKey || event.which == 2) return; |
|---|
| 11100 | + |
|---|
| 11101 | + var elm = jqLite(event.target); |
|---|
| 11102 | + |
|---|
| 11103 | + // traverse the DOM up to find first A tag |
|---|
| 11104 | + while (nodeName_(elm[0]) !== 'a') { |
|---|
| 11105 | + // ignore rewriting if no A tag (reached root element, or no parent - removed from document) |
|---|
| 11106 | + if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return; |
|---|
| 11107 | + } |
|---|
| 11108 | + |
|---|
| 11109 | + var absHref = elm.prop('href'); |
|---|
| 11110 | + // get the actual href attribute - see |
|---|
| 11111 | + // http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx |
|---|
| 11112 | + var relHref = elm.attr('href') || elm.attr('xlink:href'); |
|---|
| 11113 | + |
|---|
| 11114 | + if (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') { |
|---|
| 11115 | + // SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during |
|---|
| 11116 | + // an animation. |
|---|
| 11117 | + absHref = urlResolve(absHref.animVal).href; |
|---|
| 11118 | + } |
|---|
| 11119 | + |
|---|
| 11120 | + // Ignore when url is started with javascript: or mailto: |
|---|
| 11121 | + if (IGNORE_URI_REGEXP.test(absHref)) return; |
|---|
| 11122 | + |
|---|
| 11123 | + if (absHref && !elm.attr('target') && !event.isDefaultPrevented()) { |
|---|
| 11124 | + if ($location.$$parseLinkUrl(absHref, relHref)) { |
|---|
| 11125 | + // We do a preventDefault for all urls that are part of the angular application, |
|---|
| 11126 | + // in html5mode and also without, so that we are able to abort navigation without |
|---|
| 11127 | + // getting double entries in the location history. |
|---|
| 11128 | + event.preventDefault(); |
|---|
| 11129 | + // update location manually |
|---|
| 11130 | + if ($location.absUrl() != $browser.url()) { |
|---|
| 11131 | + $rootScope.$apply(); |
|---|
| 11132 | + // hack to work around FF6 bug 684208 when scenario runner clicks on links |
|---|
| 11133 | + window.angular['ff-684208-preventDefault'] = true; |
|---|
| 11134 | + } |
|---|
| 11135 | + } |
|---|
| 11136 | + } |
|---|
| 11137 | + }); |
|---|
| 11138 | + |
|---|
| 11139 | + |
|---|
| 11140 | + // rewrite hashbang url <> html5 url |
|---|
| 11141 | + if ($location.absUrl() != initialUrl) { |
|---|
| 11142 | + $browser.url($location.absUrl(), true); |
|---|
| 11143 | + } |
|---|
| 11144 | + |
|---|
| 11145 | + var initializing = true; |
|---|
| 11146 | + |
|---|
| 11147 | + // update $location when $browser url changes |
|---|
| 11148 | + $browser.onUrlChange(function(newUrl, newState) { |
|---|
| 11149 | + $rootScope.$evalAsync(function() { |
|---|
| 11150 | + var oldUrl = $location.absUrl(); |
|---|
| 11151 | + var oldState = $location.$$state; |
|---|
| 11152 | + |
|---|
| 11153 | + $location.$$parse(newUrl); |
|---|
| 11154 | + $location.$$state = newState; |
|---|
| 11155 | + if ($rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl, |
|---|
| 11156 | + newState, oldState).defaultPrevented) { |
|---|
| 11157 | + $location.$$parse(oldUrl); |
|---|
| 11158 | + $location.$$state = oldState; |
|---|
| 11159 | + setBrowserUrlWithFallback(oldUrl, false, oldState); |
|---|
| 11160 | + } else { |
|---|
| 11161 | + initializing = false; |
|---|
| 11162 | + afterLocationChange(oldUrl, oldState); |
|---|
| 11163 | + } |
|---|
| 11164 | + }); |
|---|
| 11165 | + if (!$rootScope.$$phase) $rootScope.$digest(); |
|---|
| 11166 | + }); |
|---|
| 11167 | + |
|---|
| 11168 | + // update browser |
|---|
| 11169 | + $rootScope.$watch(function $locationWatch() { |
|---|
| 11170 | + var oldUrl = $browser.url(); |
|---|
| 11171 | + var oldState = $browser.state(); |
|---|
| 11172 | + var currentReplace = $location.$$replace; |
|---|
| 11173 | + var urlOrStateChanged = oldUrl !== $location.absUrl() || |
|---|
| 11174 | + ($location.$$html5 && $sniffer.history && oldState !== $location.$$state); |
|---|
| 11175 | + |
|---|
| 11176 | + if (initializing || urlOrStateChanged) { |
|---|
| 11177 | + initializing = false; |
|---|
| 11178 | + |
|---|
| 11179 | + $rootScope.$evalAsync(function() { |
|---|
| 11180 | + if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl, |
|---|
| 11181 | + $location.$$state, oldState).defaultPrevented) { |
|---|
| 11182 | + $location.$$parse(oldUrl); |
|---|
| 11183 | + $location.$$state = oldState; |
|---|
| 11184 | + } else { |
|---|
| 11185 | + if (urlOrStateChanged) { |
|---|
| 11186 | + setBrowserUrlWithFallback($location.absUrl(), currentReplace, |
|---|
| 11187 | + oldState === $location.$$state ? null : $location.$$state); |
|---|
| 11188 | + } |
|---|
| 11189 | + afterLocationChange(oldUrl, oldState); |
|---|
| 11190 | + } |
|---|
| 11191 | + }); |
|---|
| 11192 | + } |
|---|
| 11193 | + |
|---|
| 11194 | + $location.$$replace = false; |
|---|
| 11195 | + |
|---|
| 11196 | + // we don't need to return anything because $evalAsync will make the digest loop dirty when |
|---|
| 11197 | + // there is a change |
|---|
| 11198 | + }); |
|---|
| 11199 | + |
|---|
| 11200 | + return $location; |
|---|
| 11201 | + |
|---|
| 11202 | + function afterLocationChange(oldUrl, oldState) { |
|---|
| 11203 | + $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl, |
|---|
| 11204 | + $location.$$state, oldState); |
|---|
| 11205 | + } |
|---|
| 11206 | +}]; |
|---|
| 11207 | +} |
|---|
| 11208 | + |
|---|
| 11209 | +/** |
|---|
| 11210 | + * @ngdoc service |
|---|
| 11211 | + * @name $log |
|---|
| 11212 | + * @requires $window |
|---|
| 11213 | + * |
|---|
| 11214 | + * @description |
|---|
| 11215 | + * Simple service for logging. Default implementation safely writes the message |
|---|
| 11216 | + * into the browser's console (if present). |
|---|
| 11217 | + * |
|---|
| 11218 | + * The main purpose of this service is to simplify debugging and troubleshooting. |
|---|
| 11219 | + * |
|---|
| 11220 | + * The default is to log `debug` messages. You can use |
|---|
| 11221 | + * {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this. |
|---|
| 11222 | + * |
|---|
| 11223 | + * @example |
|---|
| 11224 | + <example module="logExample"> |
|---|
| 11225 | + <file name="script.js"> |
|---|
| 11226 | + angular.module('logExample', []) |
|---|
| 11227 | + .controller('LogController', ['$scope', '$log', function($scope, $log) { |
|---|
| 11228 | + $scope.$log = $log; |
|---|
| 11229 | + $scope.message = 'Hello World!'; |
|---|
| 11230 | + }]); |
|---|
| 11231 | + </file> |
|---|
| 11232 | + <file name="index.html"> |
|---|
| 11233 | + <div ng-controller="LogController"> |
|---|
| 11234 | + <p>Reload this page with open console, enter text and hit the log button...</p> |
|---|
| 11235 | + Message: |
|---|
| 11236 | + <input type="text" ng-model="message"/> |
|---|
| 11237 | + <button ng-click="$log.log(message)">log</button> |
|---|
| 11238 | + <button ng-click="$log.warn(message)">warn</button> |
|---|
| 11239 | + <button ng-click="$log.info(message)">info</button> |
|---|
| 11240 | + <button ng-click="$log.error(message)">error</button> |
|---|
| 11241 | + </div> |
|---|
| 11242 | + </file> |
|---|
| 11243 | + </example> |
|---|
| 11244 | + */ |
|---|
| 11245 | + |
|---|
| 11246 | +/** |
|---|
| 11247 | + * @ngdoc provider |
|---|
| 11248 | + * @name $logProvider |
|---|
| 11249 | + * @description |
|---|
| 11250 | + * Use the `$logProvider` to configure how the application logs messages |
|---|
| 11251 | + */ |
|---|
| 11252 | +function $LogProvider(){ |
|---|
| 11253 | + var debug = true, |
|---|
| 11254 | + self = this; |
|---|
| 11255 | + |
|---|
| 11256 | + /** |
|---|
| 11257 | + * @ngdoc method |
|---|
| 11258 | + * @name $logProvider#debugEnabled |
|---|
| 11259 | + * @description |
|---|
| 11260 | + * @param {boolean=} flag enable or disable debug level messages |
|---|
| 11261 | + * @returns {*} current value if used as getter or itself (chaining) if used as setter |
|---|
| 11262 | + */ |
|---|
| 11263 | + this.debugEnabled = function(flag) { |
|---|
| 11264 | + if (isDefined(flag)) { |
|---|
| 11265 | + debug = flag; |
|---|
| 11266 | + return this; |
|---|
| 11267 | + } else { |
|---|
| 11268 | + return debug; |
|---|
| 11269 | + } |
|---|
| 11270 | + }; |
|---|
| 11271 | + |
|---|
| 11272 | + this.$get = ['$window', function($window){ |
|---|
| 11273 | + return { |
|---|
| 11274 | + /** |
|---|
| 11275 | + * @ngdoc method |
|---|
| 11276 | + * @name $log#log |
|---|
| 11277 | + * |
|---|
| 11278 | + * @description |
|---|
| 11279 | + * Write a log message |
|---|
| 11280 | + */ |
|---|
| 11281 | + log: consoleLog('log'), |
|---|
| 11282 | + |
|---|
| 11283 | + /** |
|---|
| 11284 | + * @ngdoc method |
|---|
| 11285 | + * @name $log#info |
|---|
| 11286 | + * |
|---|
| 11287 | + * @description |
|---|
| 11288 | + * Write an information message |
|---|
| 11289 | + */ |
|---|
| 11290 | + info: consoleLog('info'), |
|---|
| 11291 | + |
|---|
| 11292 | + /** |
|---|
| 11293 | + * @ngdoc method |
|---|
| 11294 | + * @name $log#warn |
|---|
| 11295 | + * |
|---|
| 11296 | + * @description |
|---|
| 11297 | + * Write a warning message |
|---|
| 11298 | + */ |
|---|
| 11299 | + warn: consoleLog('warn'), |
|---|
| 11300 | + |
|---|
| 11301 | + /** |
|---|
| 11302 | + * @ngdoc method |
|---|
| 11303 | + * @name $log#error |
|---|
| 11304 | + * |
|---|
| 11305 | + * @description |
|---|
| 11306 | + * Write an error message |
|---|
| 11307 | + */ |
|---|
| 11308 | + error: consoleLog('error'), |
|---|
| 11309 | + |
|---|
| 11310 | + /** |
|---|
| 11311 | + * @ngdoc method |
|---|
| 11312 | + * @name $log#debug |
|---|
| 11313 | + * |
|---|
| 11314 | + * @description |
|---|
| 11315 | + * Write a debug message |
|---|
| 11316 | + */ |
|---|
| 11317 | + debug: (function () { |
|---|
| 11318 | + var fn = consoleLog('debug'); |
|---|
| 11319 | + |
|---|
| 11320 | + return function() { |
|---|
| 11321 | + if (debug) { |
|---|
| 11322 | + fn.apply(self, arguments); |
|---|
| 11323 | + } |
|---|
| 11324 | + }; |
|---|
| 11325 | + }()) |
|---|
| 11326 | + }; |
|---|
| 11327 | + |
|---|
| 11328 | + function formatError(arg) { |
|---|
| 11329 | + if (arg instanceof Error) { |
|---|
| 11330 | + if (arg.stack) { |
|---|
| 11331 | + arg = (arg.message && arg.stack.indexOf(arg.message) === -1) |
|---|
| 11332 | + ? 'Error: ' + arg.message + '\n' + arg.stack |
|---|
| 11333 | + : arg.stack; |
|---|
| 11334 | + } else if (arg.sourceURL) { |
|---|
| 11335 | + arg = arg.message + '\n' + arg.sourceURL + ':' + arg.line; |
|---|
| 11336 | + } |
|---|
| 11337 | + } |
|---|
| 11338 | + return arg; |
|---|
| 11339 | + } |
|---|
| 11340 | + |
|---|
| 11341 | + function consoleLog(type) { |
|---|
| 11342 | + var console = $window.console || {}, |
|---|
| 11343 | + logFn = console[type] || console.log || noop, |
|---|
| 11344 | + hasApply = false; |
|---|
| 11345 | + |
|---|
| 11346 | + // Note: reading logFn.apply throws an error in IE11 in IE8 document mode. |
|---|
| 11347 | + // The reason behind this is that console.log has type "object" in IE8... |
|---|
| 11348 | + try { |
|---|
| 11349 | + hasApply = !!logFn.apply; |
|---|
| 11350 | + } catch (e) {} |
|---|
| 11351 | + |
|---|
| 11352 | + if (hasApply) { |
|---|
| 11353 | + return function() { |
|---|
| 11354 | + var args = []; |
|---|
| 11355 | + forEach(arguments, function(arg) { |
|---|
| 11356 | + args.push(formatError(arg)); |
|---|
| 11357 | + }); |
|---|
| 11358 | + return logFn.apply(console, args); |
|---|
| 11359 | + }; |
|---|
| 11360 | + } |
|---|
| 11361 | + |
|---|
| 11362 | + // we are IE which either doesn't have window.console => this is noop and we do nothing, |
|---|
| 11363 | + // or we are IE where console.log doesn't have apply so we log at least first 2 args |
|---|
| 11364 | + return function(arg1, arg2) { |
|---|
| 11365 | + logFn(arg1, arg2 == null ? '' : arg2); |
|---|
| 11366 | + }; |
|---|
| 11367 | + } |
|---|
| 11368 | + }]; |
|---|
| 11369 | +} |
|---|
| 11370 | + |
|---|
| 11371 | +var $parseMinErr = minErr('$parse'); |
|---|
| 11372 | + |
|---|
| 11373 | +// Sandboxing Angular Expressions |
|---|
| 11374 | +// ------------------------------ |
|---|
| 11375 | +// Angular expressions are generally considered safe because these expressions only have direct |
|---|
| 11376 | +// access to $scope and locals. However, one can obtain the ability to execute arbitrary JS code by |
|---|
| 11377 | +// obtaining a reference to native JS functions such as the Function constructor. |
|---|
| 11378 | +// |
|---|
| 11379 | +// As an example, consider the following Angular expression: |
|---|
| 11380 | +// |
|---|
| 11381 | +// {}.toString.constructor('alert("evil JS code")') |
|---|
| 11382 | +// |
|---|
| 11383 | +// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits |
|---|
| 11384 | +// against the expression language, but not to prevent exploits that were enabled by exposing |
|---|
| 11385 | +// sensitive JavaScript or browser apis on Scope. Exposing such objects on a Scope is never a good |
|---|
| 11386 | +// practice and therefore we are not even trying to protect against interaction with an object |
|---|
| 11387 | +// explicitly exposed in this way. |
|---|
| 11388 | +// |
|---|
| 11389 | +// In general, it is not possible to access a Window object from an angular expression unless a |
|---|
| 11390 | +// window or some DOM object that has a reference to window is published onto a Scope. |
|---|
| 11391 | +// Similarly we prevent invocations of function known to be dangerous, as well as assignments to |
|---|
| 11392 | +// native objects. |
|---|
| 11393 | + |
|---|
| 11394 | + |
|---|
| 11395 | +function ensureSafeMemberName(name, fullExpression) { |
|---|
| 11396 | + if (name === "__defineGetter__" || name === "__defineSetter__" |
|---|
| 11397 | + || name === "__lookupGetter__" || name === "__lookupSetter__" |
|---|
| 11398 | + || name === "__proto__") { |
|---|
| 11399 | + throw $parseMinErr('isecfld', |
|---|
| 11400 | + 'Attempting to access a disallowed field in Angular expressions! ' |
|---|
| 11401 | + +'Expression: {0}', fullExpression); |
|---|
| 11402 | + } |
|---|
| 11403 | + return name; |
|---|
| 11404 | +} |
|---|
| 11405 | + |
|---|
| 11406 | +function ensureSafeObject(obj, fullExpression) { |
|---|
| 11407 | + // nifty check if obj is Function that is fast and works across iframes and other contexts |
|---|
| 11408 | + if (obj) { |
|---|
| 11409 | + if (obj.constructor === obj) { |
|---|
| 11410 | + throw $parseMinErr('isecfn', |
|---|
| 11411 | + 'Referencing Function in Angular expressions is disallowed! Expression: {0}', |
|---|
| 11412 | + fullExpression); |
|---|
| 11413 | + } else if (// isWindow(obj) |
|---|
| 11414 | + obj.window === obj) { |
|---|
| 11415 | + throw $parseMinErr('isecwindow', |
|---|
| 11416 | + 'Referencing the Window in Angular expressions is disallowed! Expression: {0}', |
|---|
| 11417 | + fullExpression); |
|---|
| 11418 | + } else if (// isElement(obj) |
|---|
| 11419 | + obj.children && (obj.nodeName || (obj.prop && obj.attr && obj.find))) { |
|---|
| 11420 | + throw $parseMinErr('isecdom', |
|---|
| 11421 | + 'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}', |
|---|
| 11422 | + fullExpression); |
|---|
| 11423 | + } else if (// block Object so that we can't get hold of dangerous Object.* methods |
|---|
| 11424 | + obj === Object) { |
|---|
| 11425 | + throw $parseMinErr('isecobj', |
|---|
| 11426 | + 'Referencing Object in Angular expressions is disallowed! Expression: {0}', |
|---|
| 11427 | + fullExpression); |
|---|
| 11428 | + } |
|---|
| 11429 | + } |
|---|
| 11430 | + return obj; |
|---|
| 11431 | +} |
|---|
| 11432 | + |
|---|
| 11433 | +var CALL = Function.prototype.call; |
|---|
| 11434 | +var APPLY = Function.prototype.apply; |
|---|
| 11435 | +var BIND = Function.prototype.bind; |
|---|
| 11436 | + |
|---|
| 11437 | +function ensureSafeFunction(obj, fullExpression) { |
|---|
| 11438 | + if (obj) { |
|---|
| 11439 | + if (obj.constructor === obj) { |
|---|
| 11440 | + throw $parseMinErr('isecfn', |
|---|
| 11441 | + 'Referencing Function in Angular expressions is disallowed! Expression: {0}', |
|---|
| 11442 | + fullExpression); |
|---|
| 11443 | + } else if (obj === CALL || obj === APPLY || obj === BIND) { |
|---|
| 11444 | + throw $parseMinErr('isecff', |
|---|
| 11445 | + 'Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}', |
|---|
| 11446 | + fullExpression); |
|---|
| 11447 | + } |
|---|
| 11448 | + } |
|---|
| 11449 | +} |
|---|
| 11450 | + |
|---|
| 11451 | +//Keyword constants |
|---|
| 11452 | +var CONSTANTS = createMap(); |
|---|
| 11453 | +forEach({ |
|---|
| 11454 | + 'null': function() { return null; }, |
|---|
| 11455 | + 'true': function() { return true; }, |
|---|
| 11456 | + 'false': function() { return false; }, |
|---|
| 11457 | + 'undefined': function() {} |
|---|
| 11458 | +}, function(constantGetter, name) { |
|---|
| 11459 | + constantGetter.constant = constantGetter.literal = constantGetter.sharedGetter = true; |
|---|
| 11460 | + CONSTANTS[name] = constantGetter; |
|---|
| 11461 | +}); |
|---|
| 11462 | + |
|---|
| 11463 | +//Not quite a constant, but can be lex/parsed the same |
|---|
| 11464 | +CONSTANTS['this'] = function(self) { return self; }; |
|---|
| 11465 | +CONSTANTS['this'].sharedGetter = true; |
|---|
| 11466 | + |
|---|
| 11467 | + |
|---|
| 11468 | +//Operators - will be wrapped by binaryFn/unaryFn/assignment/filter |
|---|
| 11469 | +var OPERATORS = extend(createMap(), { |
|---|
| 11470 | + '+':function(self, locals, a,b){ |
|---|
| 11471 | + a=a(self, locals); b=b(self, locals); |
|---|
| 11472 | + if (isDefined(a)) { |
|---|
| 11473 | + if (isDefined(b)) { |
|---|
| 11474 | + return a + b; |
|---|
| 11475 | + } |
|---|
| 11476 | + return a; |
|---|
| 11477 | + } |
|---|
| 11478 | + return isDefined(b)?b:undefined;}, |
|---|
| 11479 | + '-':function(self, locals, a,b){ |
|---|
| 11480 | + a=a(self, locals); b=b(self, locals); |
|---|
| 11481 | + return (isDefined(a)?a:0)-(isDefined(b)?b:0); |
|---|
| 11482 | + }, |
|---|
| 11483 | + '*':function(self, locals, a,b){return a(self, locals)*b(self, locals);}, |
|---|
| 11484 | + '/':function(self, locals, a,b){return a(self, locals)/b(self, locals);}, |
|---|
| 11485 | + '%':function(self, locals, a,b){return a(self, locals)%b(self, locals);}, |
|---|
| 11486 | + '===':function(self, locals, a, b){return a(self, locals)===b(self, locals);}, |
|---|
| 11487 | + '!==':function(self, locals, a, b){return a(self, locals)!==b(self, locals);}, |
|---|
| 11488 | + '==':function(self, locals, a,b){return a(self, locals)==b(self, locals);}, |
|---|
| 11489 | + '!=':function(self, locals, a,b){return a(self, locals)!=b(self, locals);}, |
|---|
| 11490 | + '<':function(self, locals, a,b){return a(self, locals)<b(self, locals);}, |
|---|
| 11491 | + '>':function(self, locals, a,b){return a(self, locals)>b(self, locals);}, |
|---|
| 11492 | + '<=':function(self, locals, a,b){return a(self, locals)<=b(self, locals);}, |
|---|
| 11493 | + '>=':function(self, locals, a,b){return a(self, locals)>=b(self, locals);}, |
|---|
| 11494 | + '&&':function(self, locals, a,b){return a(self, locals)&&b(self, locals);}, |
|---|
| 11495 | + '||':function(self, locals, a,b){return a(self, locals)||b(self, locals);}, |
|---|
| 11496 | + '!':function(self, locals, a){return !a(self, locals);}, |
|---|
| 11497 | + |
|---|
| 11498 | + //Tokenized as operators but parsed as assignment/filters |
|---|
| 11499 | + '=':true, |
|---|
| 11500 | + '|':true |
|---|
| 11501 | +}); |
|---|
| 11502 | +var ESCAPE = {"n":"\n", "f":"\f", "r":"\r", "t":"\t", "v":"\v", "'":"'", '"':'"'}; |
|---|
| 11503 | + |
|---|
| 11504 | + |
|---|
| 11505 | +///////////////////////////////////////// |
|---|
| 11506 | + |
|---|
| 11507 | + |
|---|
| 11508 | +/** |
|---|
| 11509 | + * @constructor |
|---|
| 11510 | + */ |
|---|
| 11511 | +var Lexer = function (options) { |
|---|
| 11512 | + this.options = options; |
|---|
| 11513 | +}; |
|---|
| 11514 | + |
|---|
| 11515 | +Lexer.prototype = { |
|---|
| 11516 | + constructor: Lexer, |
|---|
| 11517 | + |
|---|
| 11518 | + lex: function (text) { |
|---|
| 11519 | + this.text = text; |
|---|
| 11520 | + this.index = 0; |
|---|
| 11521 | + this.ch = undefined; |
|---|
| 11522 | + this.tokens = []; |
|---|
| 11523 | + |
|---|
| 11524 | + while (this.index < this.text.length) { |
|---|
| 11525 | + this.ch = this.text.charAt(this.index); |
|---|
| 11526 | + if (this.is('"\'')) { |
|---|
| 11527 | + this.readString(this.ch); |
|---|
| 11528 | + } else if (this.isNumber(this.ch) || this.is('.') && this.isNumber(this.peek())) { |
|---|
| 11529 | + this.readNumber(); |
|---|
| 11530 | + } else if (this.isIdent(this.ch)) { |
|---|
| 11531 | + this.readIdent(); |
|---|
| 11532 | + } else if (this.is('(){}[].,;:?')) { |
|---|
| 11533 | + this.tokens.push({ |
|---|
| 11534 | + index: this.index, |
|---|
| 11535 | + text: this.ch |
|---|
| 11536 | + }); |
|---|
| 11537 | + this.index++; |
|---|
| 11538 | + } else if (this.isWhitespace(this.ch)) { |
|---|
| 11539 | + this.index++; |
|---|
| 11540 | + } else { |
|---|
| 11541 | + var ch2 = this.ch + this.peek(); |
|---|
| 11542 | + var ch3 = ch2 + this.peek(2); |
|---|
| 11543 | + var fn = OPERATORS[this.ch]; |
|---|
| 11544 | + var fn2 = OPERATORS[ch2]; |
|---|
| 11545 | + var fn3 = OPERATORS[ch3]; |
|---|
| 11546 | + if (fn3) { |
|---|
| 11547 | + this.tokens.push({index: this.index, text: ch3, fn: fn3}); |
|---|
| 11548 | + this.index += 3; |
|---|
| 11549 | + } else if (fn2) { |
|---|
| 11550 | + this.tokens.push({index: this.index, text: ch2, fn: fn2}); |
|---|
| 11551 | + this.index += 2; |
|---|
| 11552 | + } else if (fn) { |
|---|
| 11553 | + this.tokens.push({ |
|---|
| 11554 | + index: this.index, |
|---|
| 11555 | + text: this.ch, |
|---|
| 11556 | + fn: fn |
|---|
| 11557 | + }); |
|---|
| 11558 | + this.index += 1; |
|---|
| 11559 | + } else { |
|---|
| 11560 | + this.throwError('Unexpected next character ', this.index, this.index + 1); |
|---|
| 11561 | + } |
|---|
| 11562 | + } |
|---|
| 11563 | + } |
|---|
| 11564 | + return this.tokens; |
|---|
| 11565 | + }, |
|---|
| 11566 | + |
|---|
| 11567 | + is: function(chars) { |
|---|
| 11568 | + return chars.indexOf(this.ch) !== -1; |
|---|
| 11569 | + }, |
|---|
| 11570 | + |
|---|
| 11571 | + peek: function(i) { |
|---|
| 11572 | + var num = i || 1; |
|---|
| 11573 | + return (this.index + num < this.text.length) ? this.text.charAt(this.index + num) : false; |
|---|
| 11574 | + }, |
|---|
| 11575 | + |
|---|
| 11576 | + isNumber: function(ch) { |
|---|
| 11577 | + return ('0' <= ch && ch <= '9'); |
|---|
| 11578 | + }, |
|---|
| 11579 | + |
|---|
| 11580 | + isWhitespace: function(ch) { |
|---|
| 11581 | + // IE treats non-breaking space as \u00A0 |
|---|
| 11582 | + return (ch === ' ' || ch === '\r' || ch === '\t' || |
|---|
| 11583 | + ch === '\n' || ch === '\v' || ch === '\u00A0'); |
|---|
| 11584 | + }, |
|---|
| 11585 | + |
|---|
| 11586 | + isIdent: function(ch) { |
|---|
| 11587 | + return ('a' <= ch && ch <= 'z' || |
|---|
| 11588 | + 'A' <= ch && ch <= 'Z' || |
|---|
| 11589 | + '_' === ch || ch === '$'); |
|---|
| 11590 | + }, |
|---|
| 11591 | + |
|---|
| 11592 | + isExpOperator: function(ch) { |
|---|
| 11593 | + return (ch === '-' || ch === '+' || this.isNumber(ch)); |
|---|
| 11594 | + }, |
|---|
| 11595 | + |
|---|
| 11596 | + throwError: function(error, start, end) { |
|---|
| 11597 | + end = end || this.index; |
|---|
| 11598 | + var colStr = (isDefined(start) |
|---|
| 11599 | + ? 's ' + start + '-' + this.index + ' [' + this.text.substring(start, end) + ']' |
|---|
| 11600 | + : ' ' + end); |
|---|
| 11601 | + throw $parseMinErr('lexerr', 'Lexer Error: {0} at column{1} in expression [{2}].', |
|---|
| 11602 | + error, colStr, this.text); |
|---|
| 11603 | + }, |
|---|
| 11604 | + |
|---|
| 11605 | + readNumber: function() { |
|---|
| 11606 | + var number = ''; |
|---|
| 11607 | + var start = this.index; |
|---|
| 11608 | + while (this.index < this.text.length) { |
|---|
| 11609 | + var ch = lowercase(this.text.charAt(this.index)); |
|---|
| 11610 | + if (ch == '.' || this.isNumber(ch)) { |
|---|
| 11611 | + number += ch; |
|---|
| 11612 | + } else { |
|---|
| 11613 | + var peekCh = this.peek(); |
|---|
| 11614 | + if (ch == 'e' && this.isExpOperator(peekCh)) { |
|---|
| 11615 | + number += ch; |
|---|
| 11616 | + } else if (this.isExpOperator(ch) && |
|---|
| 11617 | + peekCh && this.isNumber(peekCh) && |
|---|
| 11618 | + number.charAt(number.length - 1) == 'e') { |
|---|
| 11619 | + number += ch; |
|---|
| 11620 | + } else if (this.isExpOperator(ch) && |
|---|
| 11621 | + (!peekCh || !this.isNumber(peekCh)) && |
|---|
| 11622 | + number.charAt(number.length - 1) == 'e') { |
|---|
| 11623 | + this.throwError('Invalid exponent'); |
|---|
| 11624 | + } else { |
|---|
| 11625 | + break; |
|---|
| 11626 | + } |
|---|
| 11627 | + } |
|---|
| 11628 | + this.index++; |
|---|
| 11629 | + } |
|---|
| 11630 | + number = 1 * number; |
|---|
| 11631 | + this.tokens.push({ |
|---|
| 11632 | + index: start, |
|---|
| 11633 | + text: number, |
|---|
| 11634 | + constant: true, |
|---|
| 11635 | + fn: function() { return number; } |
|---|
| 11636 | + }); |
|---|
| 11637 | + }, |
|---|
| 11638 | + |
|---|
| 11639 | + readIdent: function() { |
|---|
| 11640 | + var expression = this.text; |
|---|
| 11641 | + |
|---|
| 11642 | + var ident = ''; |
|---|
| 11643 | + var start = this.index; |
|---|
| 11644 | + |
|---|
| 11645 | + var lastDot, peekIndex, methodName, ch; |
|---|
| 11646 | + |
|---|
| 11647 | + while (this.index < this.text.length) { |
|---|
| 11648 | + ch = this.text.charAt(this.index); |
|---|
| 11649 | + if (ch === '.' || this.isIdent(ch) || this.isNumber(ch)) { |
|---|
| 11650 | + if (ch === '.') lastDot = this.index; |
|---|
| 11651 | + ident += ch; |
|---|
| 11652 | + } else { |
|---|
| 11653 | + break; |
|---|
| 11654 | + } |
|---|
| 11655 | + this.index++; |
|---|
| 11656 | + } |
|---|
| 11657 | + |
|---|
| 11658 | + //check if the identifier ends with . and if so move back one char |
|---|
| 11659 | + if (lastDot && ident[ident.length - 1] === '.') { |
|---|
| 11660 | + this.index--; |
|---|
| 11661 | + ident = ident.slice(0, -1); |
|---|
| 11662 | + lastDot = ident.lastIndexOf('.'); |
|---|
| 11663 | + if (lastDot === -1) { |
|---|
| 11664 | + lastDot = undefined; |
|---|
| 11665 | + } |
|---|
| 11666 | + } |
|---|
| 11667 | + |
|---|
| 11668 | + //check if this is not a method invocation and if it is back out to last dot |
|---|
| 11669 | + if (lastDot) { |
|---|
| 11670 | + peekIndex = this.index; |
|---|
| 11671 | + while (peekIndex < this.text.length) { |
|---|
| 11672 | + ch = this.text.charAt(peekIndex); |
|---|
| 11673 | + if (ch === '(') { |
|---|
| 11674 | + methodName = ident.substr(lastDot - start + 1); |
|---|
| 11675 | + ident = ident.substr(0, lastDot - start); |
|---|
| 11676 | + this.index = peekIndex; |
|---|
| 11677 | + break; |
|---|
| 11678 | + } |
|---|
| 11679 | + if (this.isWhitespace(ch)) { |
|---|
| 11680 | + peekIndex++; |
|---|
| 11681 | + } else { |
|---|
| 11682 | + break; |
|---|
| 11683 | + } |
|---|
| 11684 | + } |
|---|
| 11685 | + } |
|---|
| 11686 | + |
|---|
| 11687 | + this.tokens.push({ |
|---|
| 11688 | + index: start, |
|---|
| 11689 | + text: ident, |
|---|
| 11690 | + fn: CONSTANTS[ident] || getterFn(ident, this.options, expression) |
|---|
| 11691 | + }); |
|---|
| 11692 | + |
|---|
| 11693 | + if (methodName) { |
|---|
| 11694 | + this.tokens.push({ |
|---|
| 11695 | + index: lastDot, |
|---|
| 11696 | + text: '.' |
|---|
| 11697 | + }); |
|---|
| 11698 | + this.tokens.push({ |
|---|
| 11699 | + index: lastDot + 1, |
|---|
| 11700 | + text: methodName |
|---|
| 11701 | + }); |
|---|
| 11702 | + } |
|---|
| 11703 | + }, |
|---|
| 11704 | + |
|---|
| 11705 | + readString: function(quote) { |
|---|
| 11706 | + var start = this.index; |
|---|
| 11707 | + this.index++; |
|---|
| 11708 | + var string = ''; |
|---|
| 11709 | + var rawString = quote; |
|---|
| 11710 | + var escape = false; |
|---|
| 11711 | + while (this.index < this.text.length) { |
|---|
| 11712 | + var ch = this.text.charAt(this.index); |
|---|
| 11713 | + rawString += ch; |
|---|
| 11714 | + if (escape) { |
|---|
| 11715 | + if (ch === 'u') { |
|---|
| 11716 | + var hex = this.text.substring(this.index + 1, this.index + 5); |
|---|
| 11717 | + if (!hex.match(/[\da-f]{4}/i)) |
|---|
| 11718 | + this.throwError('Invalid unicode escape [\\u' + hex + ']'); |
|---|
| 11719 | + this.index += 4; |
|---|
| 11720 | + string += String.fromCharCode(parseInt(hex, 16)); |
|---|
| 11721 | + } else { |
|---|
| 11722 | + var rep = ESCAPE[ch]; |
|---|
| 11723 | + string = string + (rep || ch); |
|---|
| 11724 | + } |
|---|
| 11725 | + escape = false; |
|---|
| 11726 | + } else if (ch === '\\') { |
|---|
| 11727 | + escape = true; |
|---|
| 11728 | + } else if (ch === quote) { |
|---|
| 11729 | + this.index++; |
|---|
| 11730 | + this.tokens.push({ |
|---|
| 11731 | + index: start, |
|---|
| 11732 | + text: rawString, |
|---|
| 11733 | + string: string, |
|---|
| 11734 | + constant: true, |
|---|
| 11735 | + fn: function() { return string; } |
|---|
| 11736 | + }); |
|---|
| 11737 | + return; |
|---|
| 11738 | + } else { |
|---|
| 11739 | + string += ch; |
|---|
| 11740 | + } |
|---|
| 11741 | + this.index++; |
|---|
| 11742 | + } |
|---|
| 11743 | + this.throwError('Unterminated quote', start); |
|---|
| 11744 | + } |
|---|
| 11745 | +}; |
|---|
| 11746 | + |
|---|
| 11747 | + |
|---|
| 11748 | +function isConstant(exp) { |
|---|
| 11749 | + return exp.constant; |
|---|
| 11750 | +} |
|---|
| 11751 | + |
|---|
| 11752 | +/** |
|---|
| 11753 | + * @constructor |
|---|
| 11754 | + */ |
|---|
| 11755 | +var Parser = function (lexer, $filter, options) { |
|---|
| 11756 | + this.lexer = lexer; |
|---|
| 11757 | + this.$filter = $filter; |
|---|
| 11758 | + this.options = options; |
|---|
| 11759 | +}; |
|---|
| 11760 | + |
|---|
| 11761 | +Parser.ZERO = extend(function () { |
|---|
| 11762 | + return 0; |
|---|
| 11763 | +}, { |
|---|
| 11764 | + sharedGetter: true, |
|---|
| 11765 | + constant: true |
|---|
| 11766 | +}); |
|---|
| 11767 | + |
|---|
| 11768 | +Parser.prototype = { |
|---|
| 11769 | + constructor: Parser, |
|---|
| 11770 | + |
|---|
| 11771 | + parse: function (text) { |
|---|
| 11772 | + this.text = text; |
|---|
| 11773 | + this.tokens = this.lexer.lex(text); |
|---|
| 11774 | + |
|---|
| 11775 | + var value = this.statements(); |
|---|
| 11776 | + |
|---|
| 11777 | + if (this.tokens.length !== 0) { |
|---|
| 11778 | + this.throwError('is an unexpected token', this.tokens[0]); |
|---|
| 11779 | + } |
|---|
| 11780 | + |
|---|
| 11781 | + value.literal = !!value.literal; |
|---|
| 11782 | + value.constant = !!value.constant; |
|---|
| 11783 | + |
|---|
| 11784 | + return value; |
|---|
| 11785 | + }, |
|---|
| 11786 | + |
|---|
| 11787 | + primary: function () { |
|---|
| 11788 | + var primary; |
|---|
| 11789 | + if (this.expect('(')) { |
|---|
| 11790 | + primary = this.filterChain(); |
|---|
| 11791 | + this.consume(')'); |
|---|
| 11792 | + } else if (this.expect('[')) { |
|---|
| 11793 | + primary = this.arrayDeclaration(); |
|---|
| 11794 | + } else if (this.expect('{')) { |
|---|
| 11795 | + primary = this.object(); |
|---|
| 11796 | + } else { |
|---|
| 11797 | + var token = this.expect(); |
|---|
| 11798 | + primary = token.fn; |
|---|
| 11799 | + if (!primary) { |
|---|
| 11800 | + this.throwError('not a primary expression', token); |
|---|
| 11801 | + } |
|---|
| 11802 | + if (token.constant) { |
|---|
| 11803 | + primary.constant = true; |
|---|
| 11804 | + primary.literal = true; |
|---|
| 11805 | + } |
|---|
| 11806 | + } |
|---|
| 11807 | + |
|---|
| 11808 | + var next, context; |
|---|
| 11809 | + while ((next = this.expect('(', '[', '.'))) { |
|---|
| 11810 | + if (next.text === '(') { |
|---|
| 11811 | + primary = this.functionCall(primary, context); |
|---|
| 11812 | + context = null; |
|---|
| 11813 | + } else if (next.text === '[') { |
|---|
| 11814 | + context = primary; |
|---|
| 11815 | + primary = this.objectIndex(primary); |
|---|
| 11816 | + } else if (next.text === '.') { |
|---|
| 11817 | + context = primary; |
|---|
| 11818 | + primary = this.fieldAccess(primary); |
|---|
| 11819 | + } else { |
|---|
| 11820 | + this.throwError('IMPOSSIBLE'); |
|---|
| 11821 | + } |
|---|
| 11822 | + } |
|---|
| 11823 | + return primary; |
|---|
| 11824 | + }, |
|---|
| 11825 | + |
|---|
| 11826 | + throwError: function(msg, token) { |
|---|
| 11827 | + throw $parseMinErr('syntax', |
|---|
| 11828 | + 'Syntax Error: Token \'{0}\' {1} at column {2} of the expression [{3}] starting at [{4}].', |
|---|
| 11829 | + token.text, msg, (token.index + 1), this.text, this.text.substring(token.index)); |
|---|
| 11830 | + }, |
|---|
| 11831 | + |
|---|
| 11832 | + peekToken: function() { |
|---|
| 11833 | + if (this.tokens.length === 0) |
|---|
| 11834 | + throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text); |
|---|
| 11835 | + return this.tokens[0]; |
|---|
| 11836 | + }, |
|---|
| 11837 | + |
|---|
| 11838 | + peek: function(e1, e2, e3, e4) { |
|---|
| 11839 | + if (this.tokens.length > 0) { |
|---|
| 11840 | + var token = this.tokens[0]; |
|---|
| 11841 | + var t = token.text; |
|---|
| 11842 | + if (t === e1 || t === e2 || t === e3 || t === e4 || |
|---|
| 11843 | + (!e1 && !e2 && !e3 && !e4)) { |
|---|
| 11844 | + return token; |
|---|
| 11845 | + } |
|---|
| 11846 | + } |
|---|
| 11847 | + return false; |
|---|
| 11848 | + }, |
|---|
| 11849 | + |
|---|
| 11850 | + expect: function(e1, e2, e3, e4){ |
|---|
| 11851 | + var token = this.peek(e1, e2, e3, e4); |
|---|
| 11852 | + if (token) { |
|---|
| 11853 | + this.tokens.shift(); |
|---|
| 11854 | + return token; |
|---|
| 11855 | + } |
|---|
| 11856 | + return false; |
|---|
| 11857 | + }, |
|---|
| 11858 | + |
|---|
| 11859 | + consume: function(e1){ |
|---|
| 11860 | + if (!this.expect(e1)) { |
|---|
| 11861 | + this.throwError('is unexpected, expecting [' + e1 + ']', this.peek()); |
|---|
| 11862 | + } |
|---|
| 11863 | + }, |
|---|
| 11864 | + |
|---|
| 11865 | + unaryFn: function(fn, right) { |
|---|
| 11866 | + return extend(function $parseUnaryFn(self, locals) { |
|---|
| 11867 | + return fn(self, locals, right); |
|---|
| 11868 | + }, { |
|---|
| 11869 | + constant:right.constant, |
|---|
| 11870 | + inputs: [right] |
|---|
| 11871 | + }); |
|---|
| 11872 | + }, |
|---|
| 11873 | + |
|---|
| 11874 | + binaryFn: function(left, fn, right, isBranching) { |
|---|
| 11875 | + return extend(function $parseBinaryFn(self, locals) { |
|---|
| 11876 | + return fn(self, locals, left, right); |
|---|
| 11877 | + }, { |
|---|
| 11878 | + constant: left.constant && right.constant, |
|---|
| 11879 | + inputs: !isBranching && [left, right] |
|---|
| 11880 | + }); |
|---|
| 11881 | + }, |
|---|
| 11882 | + |
|---|
| 11883 | + statements: function() { |
|---|
| 11884 | + var statements = []; |
|---|
| 11885 | + while (true) { |
|---|
| 11886 | + if (this.tokens.length > 0 && !this.peek('}', ')', ';', ']')) |
|---|
| 11887 | + statements.push(this.filterChain()); |
|---|
| 11888 | + if (!this.expect(';')) { |
|---|
| 11889 | + // optimize for the common case where there is only one statement. |
|---|
| 11890 | + // TODO(size): maybe we should not support multiple statements? |
|---|
| 11891 | + return (statements.length === 1) |
|---|
| 11892 | + ? statements[0] |
|---|
| 11893 | + : function $parseStatements(self, locals) { |
|---|
| 11894 | + var value; |
|---|
| 11895 | + for (var i = 0, ii = statements.length; i < ii; i++) { |
|---|
| 11896 | + value = statements[i](self, locals); |
|---|
| 11897 | + } |
|---|
| 11898 | + return value; |
|---|
| 11899 | + }; |
|---|
| 11900 | + } |
|---|
| 11901 | + } |
|---|
| 11902 | + }, |
|---|
| 11903 | + |
|---|
| 11904 | + filterChain: function() { |
|---|
| 11905 | + var left = this.expression(); |
|---|
| 11906 | + var token; |
|---|
| 11907 | + while ((token = this.expect('|'))) { |
|---|
| 11908 | + left = this.filter(left); |
|---|
| 11909 | + } |
|---|
| 11910 | + return left; |
|---|
| 11911 | + }, |
|---|
| 11912 | + |
|---|
| 11913 | + filter: function(inputFn) { |
|---|
| 11914 | + var token = this.expect(); |
|---|
| 11915 | + var fn = this.$filter(token.text); |
|---|
| 11916 | + var argsFn; |
|---|
| 11917 | + var args; |
|---|
| 11918 | + |
|---|
| 11919 | + if (this.peek(':')) { |
|---|
| 11920 | + argsFn = []; |
|---|
| 11921 | + args = []; // we can safely reuse the array |
|---|
| 11922 | + while (this.expect(':')) { |
|---|
| 11923 | + argsFn.push(this.expression()); |
|---|
| 11924 | + } |
|---|
| 11925 | + } |
|---|
| 11926 | + |
|---|
| 11927 | + var inputs = [inputFn].concat(argsFn || []); |
|---|
| 11928 | + |
|---|
| 11929 | + return extend(function $parseFilter(self, locals) { |
|---|
| 11930 | + var input = inputFn(self, locals); |
|---|
| 11931 | + if (args) { |
|---|
| 11932 | + args[0] = input; |
|---|
| 11933 | + |
|---|
| 11934 | + var i = argsFn.length; |
|---|
| 11935 | + while (i--) { |
|---|
| 11936 | + args[i + 1] = argsFn[i](self, locals); |
|---|
| 11937 | + } |
|---|
| 11938 | + |
|---|
| 11939 | + return fn.apply(undefined, args); |
|---|
| 11940 | + } |
|---|
| 11941 | + |
|---|
| 11942 | + return fn(input); |
|---|
| 11943 | + }, { |
|---|
| 11944 | + constant: !fn.$stateful && inputs.every(isConstant), |
|---|
| 11945 | + inputs: !fn.$stateful && inputs |
|---|
| 11946 | + }); |
|---|
| 11947 | + }, |
|---|
| 11948 | + |
|---|
| 11949 | + expression: function() { |
|---|
| 11950 | + return this.assignment(); |
|---|
| 11951 | + }, |
|---|
| 11952 | + |
|---|
| 11953 | + assignment: function() { |
|---|
| 11954 | + var left = this.ternary(); |
|---|
| 11955 | + var right; |
|---|
| 11956 | + var token; |
|---|
| 11957 | + if ((token = this.expect('='))) { |
|---|
| 11958 | + if (!left.assign) { |
|---|
| 11959 | + this.throwError('implies assignment but [' + |
|---|
| 11960 | + this.text.substring(0, token.index) + '] can not be assigned to', token); |
|---|
| 11961 | + } |
|---|
| 11962 | + right = this.ternary(); |
|---|
| 11963 | + return extend(function $parseAssignment(scope, locals) { |
|---|
| 11964 | + return left.assign(scope, right(scope, locals), locals); |
|---|
| 11965 | + }, { |
|---|
| 11966 | + inputs: [left, right] |
|---|
| 11967 | + }); |
|---|
| 11968 | + } |
|---|
| 11969 | + return left; |
|---|
| 11970 | + }, |
|---|
| 11971 | + |
|---|
| 11972 | + ternary: function() { |
|---|
| 11973 | + var left = this.logicalOR(); |
|---|
| 11974 | + var middle; |
|---|
| 11975 | + var token; |
|---|
| 11976 | + if ((token = this.expect('?'))) { |
|---|
| 11977 | + middle = this.assignment(); |
|---|
| 11978 | + if ((token = this.expect(':'))) { |
|---|
| 11979 | + var right = this.assignment(); |
|---|
| 11980 | + |
|---|
| 11981 | + return extend(function $parseTernary(self, locals){ |
|---|
| 11982 | + return left(self, locals) ? middle(self, locals) : right(self, locals); |
|---|
| 11983 | + }, { |
|---|
| 11984 | + constant: left.constant && middle.constant && right.constant |
|---|
| 11985 | + }); |
|---|
| 11986 | + |
|---|
| 11987 | + } else { |
|---|
| 11988 | + this.throwError('expected :', token); |
|---|
| 11989 | + } |
|---|
| 11990 | + } |
|---|
| 11991 | + |
|---|
| 11992 | + return left; |
|---|
| 11993 | + }, |
|---|
| 11994 | + |
|---|
| 11995 | + logicalOR: function() { |
|---|
| 11996 | + var left = this.logicalAND(); |
|---|
| 11997 | + var token; |
|---|
| 11998 | + while ((token = this.expect('||'))) { |
|---|
| 11999 | + left = this.binaryFn(left, token.fn, this.logicalAND(), true); |
|---|
| 12000 | + } |
|---|
| 12001 | + return left; |
|---|
| 12002 | + }, |
|---|
| 12003 | + |
|---|
| 12004 | + logicalAND: function() { |
|---|
| 12005 | + var left = this.equality(); |
|---|
| 12006 | + var token; |
|---|
| 12007 | + if ((token = this.expect('&&'))) { |
|---|
| 12008 | + left = this.binaryFn(left, token.fn, this.logicalAND(), true); |
|---|
| 12009 | + } |
|---|
| 12010 | + return left; |
|---|
| 12011 | + }, |
|---|
| 12012 | + |
|---|
| 12013 | + equality: function() { |
|---|
| 12014 | + var left = this.relational(); |
|---|
| 12015 | + var token; |
|---|
| 12016 | + if ((token = this.expect('==','!=','===','!=='))) { |
|---|
| 12017 | + left = this.binaryFn(left, token.fn, this.equality()); |
|---|
| 12018 | + } |
|---|
| 12019 | + return left; |
|---|
| 12020 | + }, |
|---|
| 12021 | + |
|---|
| 12022 | + relational: function() { |
|---|
| 12023 | + var left = this.additive(); |
|---|
| 12024 | + var token; |
|---|
| 12025 | + if ((token = this.expect('<', '>', '<=', '>='))) { |
|---|
| 12026 | + left = this.binaryFn(left, token.fn, this.relational()); |
|---|
| 12027 | + } |
|---|
| 12028 | + return left; |
|---|
| 12029 | + }, |
|---|
| 12030 | + |
|---|
| 12031 | + additive: function() { |
|---|
| 12032 | + var left = this.multiplicative(); |
|---|
| 12033 | + var token; |
|---|
| 12034 | + while ((token = this.expect('+','-'))) { |
|---|
| 12035 | + left = this.binaryFn(left, token.fn, this.multiplicative()); |
|---|
| 12036 | + } |
|---|
| 12037 | + return left; |
|---|
| 12038 | + }, |
|---|
| 12039 | + |
|---|
| 12040 | + multiplicative: function() { |
|---|
| 12041 | + var left = this.unary(); |
|---|
| 12042 | + var token; |
|---|
| 12043 | + while ((token = this.expect('*','/','%'))) { |
|---|
| 12044 | + left = this.binaryFn(left, token.fn, this.unary()); |
|---|
| 12045 | + } |
|---|
| 12046 | + return left; |
|---|
| 12047 | + }, |
|---|
| 12048 | + |
|---|
| 12049 | + unary: function() { |
|---|
| 12050 | + var token; |
|---|
| 12051 | + if (this.expect('+')) { |
|---|
| 12052 | + return this.primary(); |
|---|
| 12053 | + } else if ((token = this.expect('-'))) { |
|---|
| 12054 | + return this.binaryFn(Parser.ZERO, token.fn, this.unary()); |
|---|
| 12055 | + } else if ((token = this.expect('!'))) { |
|---|
| 12056 | + return this.unaryFn(token.fn, this.unary()); |
|---|
| 12057 | + } else { |
|---|
| 12058 | + return this.primary(); |
|---|
| 12059 | + } |
|---|
| 12060 | + }, |
|---|
| 12061 | + |
|---|
| 12062 | + fieldAccess: function(object) { |
|---|
| 12063 | + var expression = this.text; |
|---|
| 12064 | + var field = this.expect().text; |
|---|
| 12065 | + var getter = getterFn(field, this.options, expression); |
|---|
| 12066 | + |
|---|
| 12067 | + return extend(function $parseFieldAccess(scope, locals, self) { |
|---|
| 12068 | + return getter(self || object(scope, locals)); |
|---|
| 12069 | + }, { |
|---|
| 12070 | + assign: function(scope, value, locals) { |
|---|
| 12071 | + var o = object(scope, locals); |
|---|
| 12072 | + if (!o) object.assign(scope, o = {}); |
|---|
| 12073 | + return setter(o, field, value, expression); |
|---|
| 12074 | + } |
|---|
| 12075 | + }); |
|---|
| 12076 | + }, |
|---|
| 12077 | + |
|---|
| 12078 | + objectIndex: function(obj) { |
|---|
| 12079 | + var expression = this.text; |
|---|
| 12080 | + |
|---|
| 12081 | + var indexFn = this.expression(); |
|---|
| 12082 | + this.consume(']'); |
|---|
| 12083 | + |
|---|
| 12084 | + return extend(function $parseObjectIndex(self, locals) { |
|---|
| 12085 | + var o = obj(self, locals), |
|---|
| 12086 | + i = indexFn(self, locals), |
|---|
| 12087 | + v; |
|---|
| 12088 | + |
|---|
| 12089 | + ensureSafeMemberName(i, expression); |
|---|
| 12090 | + if (!o) return undefined; |
|---|
| 12091 | + v = ensureSafeObject(o[i], expression); |
|---|
| 12092 | + return v; |
|---|
| 12093 | + }, { |
|---|
| 12094 | + assign: function(self, value, locals) { |
|---|
| 12095 | + var key = ensureSafeMemberName(indexFn(self, locals), expression); |
|---|
| 12096 | + // prevent overwriting of Function.constructor which would break ensureSafeObject check |
|---|
| 12097 | + var o = ensureSafeObject(obj(self, locals), expression); |
|---|
| 12098 | + if (!o) obj.assign(self, o = {}); |
|---|
| 12099 | + return o[key] = value; |
|---|
| 12100 | + } |
|---|
| 12101 | + }); |
|---|
| 12102 | + }, |
|---|
| 12103 | + |
|---|
| 12104 | + functionCall: function(fnGetter, contextGetter) { |
|---|
| 12105 | + var argsFn = []; |
|---|
| 12106 | + if (this.peekToken().text !== ')') { |
|---|
| 12107 | + do { |
|---|
| 12108 | + argsFn.push(this.expression()); |
|---|
| 12109 | + } while (this.expect(',')); |
|---|
| 12110 | + } |
|---|
| 12111 | + this.consume(')'); |
|---|
| 12112 | + |
|---|
| 12113 | + var expressionText = this.text; |
|---|
| 12114 | + // we can safely reuse the array across invocations |
|---|
| 12115 | + var args = argsFn.length ? [] : null; |
|---|
| 12116 | + |
|---|
| 12117 | + return function $parseFunctionCall(scope, locals) { |
|---|
| 12118 | + var context = contextGetter ? contextGetter(scope, locals) : scope; |
|---|
| 12119 | + var fn = fnGetter(scope, locals, context) || noop; |
|---|
| 12120 | + |
|---|
| 12121 | + if (args) { |
|---|
| 12122 | + var i = argsFn.length; |
|---|
| 12123 | + while (i--) { |
|---|
| 12124 | + args[i] = ensureSafeObject(argsFn[i](scope, locals), expressionText); |
|---|
| 12125 | + } |
|---|
| 12126 | + } |
|---|
| 12127 | + |
|---|
| 12128 | + ensureSafeObject(context, expressionText); |
|---|
| 12129 | + ensureSafeFunction(fn, expressionText); |
|---|
| 12130 | + |
|---|
| 12131 | + // IE stupidity! (IE doesn't have apply for some native functions) |
|---|
| 12132 | + var v = fn.apply |
|---|
| 12133 | + ? fn.apply(context, args) |
|---|
| 12134 | + : fn(args[0], args[1], args[2], args[3], args[4]); |
|---|
| 12135 | + |
|---|
| 12136 | + return ensureSafeObject(v, expressionText); |
|---|
| 12137 | + }; |
|---|
| 12138 | + }, |
|---|
| 12139 | + |
|---|
| 12140 | + // This is used with json array declaration |
|---|
| 12141 | + arrayDeclaration: function () { |
|---|
| 12142 | + var elementFns = []; |
|---|
| 12143 | + if (this.peekToken().text !== ']') { |
|---|
| 12144 | + do { |
|---|
| 12145 | + if (this.peek(']')) { |
|---|
| 12146 | + // Support trailing commas per ES5.1. |
|---|
| 12147 | + break; |
|---|
| 12148 | + } |
|---|
| 12149 | + var elementFn = this.expression(); |
|---|
| 12150 | + elementFns.push(elementFn); |
|---|
| 12151 | + } while (this.expect(',')); |
|---|
| 12152 | + } |
|---|
| 12153 | + this.consume(']'); |
|---|
| 12154 | + |
|---|
| 12155 | + return extend(function $parseArrayLiteral(self, locals) { |
|---|
| 12156 | + var array = []; |
|---|
| 12157 | + for (var i = 0, ii = elementFns.length; i < ii; i++) { |
|---|
| 12158 | + array.push(elementFns[i](self, locals)); |
|---|
| 12159 | + } |
|---|
| 12160 | + return array; |
|---|
| 12161 | + }, { |
|---|
| 12162 | + literal: true, |
|---|
| 12163 | + constant: elementFns.every(isConstant), |
|---|
| 12164 | + inputs: elementFns |
|---|
| 12165 | + }); |
|---|
| 12166 | + }, |
|---|
| 12167 | + |
|---|
| 12168 | + object: function () { |
|---|
| 12169 | + var keys = [], valueFns = []; |
|---|
| 12170 | + if (this.peekToken().text !== '}') { |
|---|
| 12171 | + do { |
|---|
| 12172 | + if (this.peek('}')) { |
|---|
| 12173 | + // Support trailing commas per ES5.1. |
|---|
| 12174 | + break; |
|---|
| 12175 | + } |
|---|
| 12176 | + var token = this.expect(); |
|---|
| 12177 | + keys.push(token.string || token.text); |
|---|
| 12178 | + this.consume(':'); |
|---|
| 12179 | + var value = this.expression(); |
|---|
| 12180 | + valueFns.push(value); |
|---|
| 12181 | + } while (this.expect(',')); |
|---|
| 12182 | + } |
|---|
| 12183 | + this.consume('}'); |
|---|
| 12184 | + |
|---|
| 12185 | + return extend(function $parseObjectLiteral(self, locals) { |
|---|
| 12186 | + var object = {}; |
|---|
| 12187 | + for (var i = 0, ii = valueFns.length; i < ii; i++) { |
|---|
| 12188 | + object[keys[i]] = valueFns[i](self, locals); |
|---|
| 12189 | + } |
|---|
| 12190 | + return object; |
|---|
| 12191 | + }, { |
|---|
| 12192 | + literal: true, |
|---|
| 12193 | + constant: valueFns.every(isConstant), |
|---|
| 12194 | + inputs: valueFns |
|---|
| 12195 | + }); |
|---|
| 12196 | + } |
|---|
| 12197 | +}; |
|---|
| 12198 | + |
|---|
| 12199 | + |
|---|
| 12200 | +////////////////////////////////////////////////// |
|---|
| 12201 | +// Parser helper functions |
|---|
| 12202 | +////////////////////////////////////////////////// |
|---|
| 12203 | + |
|---|
| 12204 | +function setter(obj, path, setValue, fullExp) { |
|---|
| 12205 | + ensureSafeObject(obj, fullExp); |
|---|
| 12206 | + |
|---|
| 12207 | + var element = path.split('.'), key; |
|---|
| 12208 | + for (var i = 0; element.length > 1; i++) { |
|---|
| 12209 | + key = ensureSafeMemberName(element.shift(), fullExp); |
|---|
| 12210 | + var propertyObj = ensureSafeObject(obj[key], fullExp); |
|---|
| 12211 | + if (!propertyObj) { |
|---|
| 12212 | + propertyObj = {}; |
|---|
| 12213 | + obj[key] = propertyObj; |
|---|
| 12214 | + } |
|---|
| 12215 | + obj = propertyObj; |
|---|
| 12216 | + } |
|---|
| 12217 | + key = ensureSafeMemberName(element.shift(), fullExp); |
|---|
| 12218 | + ensureSafeObject(obj[key], fullExp); |
|---|
| 12219 | + obj[key] = setValue; |
|---|
| 12220 | + return setValue; |
|---|
| 12221 | +} |
|---|
| 12222 | + |
|---|
| 12223 | +var getterFnCache = createMap(); |
|---|
| 12224 | + |
|---|
| 12225 | +/** |
|---|
| 12226 | + * Implementation of the "Black Hole" variant from: |
|---|
| 12227 | + * - http://jsperf.com/angularjs-parse-getter/4 |
|---|
| 12228 | + * - http://jsperf.com/path-evaluation-simplified/7 |
|---|
| 12229 | + */ |
|---|
| 12230 | +function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp) { |
|---|
| 12231 | + ensureSafeMemberName(key0, fullExp); |
|---|
| 12232 | + ensureSafeMemberName(key1, fullExp); |
|---|
| 12233 | + ensureSafeMemberName(key2, fullExp); |
|---|
| 12234 | + ensureSafeMemberName(key3, fullExp); |
|---|
| 12235 | + ensureSafeMemberName(key4, fullExp); |
|---|
| 12236 | + |
|---|
| 12237 | + return function cspSafeGetter(scope, locals) { |
|---|
| 12238 | + var pathVal = (locals && locals.hasOwnProperty(key0)) ? locals : scope; |
|---|
| 12239 | + |
|---|
| 12240 | + if (pathVal == null) return pathVal; |
|---|
| 12241 | + pathVal = pathVal[key0]; |
|---|
| 12242 | + |
|---|
| 12243 | + if (!key1) return pathVal; |
|---|
| 12244 | + if (pathVal == null) return undefined; |
|---|
| 12245 | + pathVal = pathVal[key1]; |
|---|
| 12246 | + |
|---|
| 12247 | + if (!key2) return pathVal; |
|---|
| 12248 | + if (pathVal == null) return undefined; |
|---|
| 12249 | + pathVal = pathVal[key2]; |
|---|
| 12250 | + |
|---|
| 12251 | + if (!key3) return pathVal; |
|---|
| 12252 | + if (pathVal == null) return undefined; |
|---|
| 12253 | + pathVal = pathVal[key3]; |
|---|
| 12254 | + |
|---|
| 12255 | + if (!key4) return pathVal; |
|---|
| 12256 | + if (pathVal == null) return undefined; |
|---|
| 12257 | + pathVal = pathVal[key4]; |
|---|
| 12258 | + |
|---|
| 12259 | + return pathVal; |
|---|
| 12260 | + }; |
|---|
| 12261 | +} |
|---|
| 12262 | + |
|---|
| 12263 | +function getterFn(path, options, fullExp) { |
|---|
| 12264 | + var fn = getterFnCache[path]; |
|---|
| 12265 | + |
|---|
| 12266 | + if (fn) return fn; |
|---|
| 12267 | + |
|---|
| 12268 | + var pathKeys = path.split('.'), |
|---|
| 12269 | + pathKeysLength = pathKeys.length; |
|---|
| 12270 | + |
|---|
| 12271 | + // http://jsperf.com/angularjs-parse-getter/6 |
|---|
| 12272 | + if (options.csp) { |
|---|
| 12273 | + if (pathKeysLength < 6) { |
|---|
| 12274 | + fn = cspSafeGetterFn(pathKeys[0], pathKeys[1], pathKeys[2], pathKeys[3], pathKeys[4], fullExp); |
|---|
| 12275 | + } else { |
|---|
| 12276 | + fn = function cspSafeGetter(scope, locals) { |
|---|
| 12277 | + var i = 0, val; |
|---|
| 12278 | + do { |
|---|
| 12279 | + val = cspSafeGetterFn(pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++], |
|---|
| 12280 | + pathKeys[i++], fullExp)(scope, locals); |
|---|
| 12281 | + |
|---|
| 12282 | + locals = undefined; // clear after first iteration |
|---|
| 12283 | + scope = val; |
|---|
| 12284 | + } while (i < pathKeysLength); |
|---|
| 12285 | + return val; |
|---|
| 12286 | + }; |
|---|
| 12287 | + } |
|---|
| 12288 | + } else { |
|---|
| 12289 | + var code = ''; |
|---|
| 12290 | + forEach(pathKeys, function(key, index) { |
|---|
| 12291 | + ensureSafeMemberName(key, fullExp); |
|---|
| 12292 | + code += 'if(s == null) return undefined;\n' + |
|---|
| 12293 | + 's='+ (index |
|---|
| 12294 | + // we simply dereference 's' on any .dot notation |
|---|
| 12295 | + ? 's' |
|---|
| 12296 | + // but if we are first then we check locals first, and if so read it first |
|---|
| 12297 | + : '((l&&l.hasOwnProperty("' + key + '"))?l:s)') + '.' + key + ';\n'; |
|---|
| 12298 | + }); |
|---|
| 12299 | + code += 'return s;'; |
|---|
| 12300 | + |
|---|
| 12301 | + /* jshint -W054 */ |
|---|
| 12302 | + var evaledFnGetter = new Function('s', 'l', code); // s=scope, l=locals |
|---|
| 12303 | + /* jshint +W054 */ |
|---|
| 12304 | + evaledFnGetter.toString = valueFn(code); |
|---|
| 12305 | + |
|---|
| 12306 | + fn = evaledFnGetter; |
|---|
| 12307 | + } |
|---|
| 12308 | + |
|---|
| 12309 | + fn.sharedGetter = true; |
|---|
| 12310 | + fn.assign = function(self, value) { |
|---|
| 12311 | + return setter(self, path, value, path); |
|---|
| 12312 | + }; |
|---|
| 12313 | + getterFnCache[path] = fn; |
|---|
| 12314 | + return fn; |
|---|
| 12315 | +} |
|---|
| 12316 | + |
|---|
| 12317 | +/////////////////////////////////// |
|---|
| 12318 | + |
|---|
| 12319 | +/** |
|---|
| 12320 | + * @ngdoc service |
|---|
| 12321 | + * @name $parse |
|---|
| 12322 | + * @kind function |
|---|
| 12323 | + * |
|---|
| 12324 | + * @description |
|---|
| 12325 | + * |
|---|
| 12326 | + * Converts Angular {@link guide/expression expression} into a function. |
|---|
| 12327 | + * |
|---|
| 12328 | + * ```js |
|---|
| 12329 | + * var getter = $parse('user.name'); |
|---|
| 12330 | + * var setter = getter.assign; |
|---|
| 12331 | + * var context = {user:{name:'angular'}}; |
|---|
| 12332 | + * var locals = {user:{name:'local'}}; |
|---|
| 12333 | + * |
|---|
| 12334 | + * expect(getter(context)).toEqual('angular'); |
|---|
| 12335 | + * setter(context, 'newValue'); |
|---|
| 12336 | + * expect(context.user.name).toEqual('newValue'); |
|---|
| 12337 | + * expect(getter(context, locals)).toEqual('local'); |
|---|
| 12338 | + * ``` |
|---|
| 12339 | + * |
|---|
| 12340 | + * |
|---|
| 12341 | + * @param {string} expression String expression to compile. |
|---|
| 12342 | + * @returns {function(context, locals)} a function which represents the compiled expression: |
|---|
| 12343 | + * |
|---|
| 12344 | + * * `context` – `{object}` – an object against which any expressions embedded in the strings |
|---|
| 12345 | + * are evaluated against (typically a scope object). |
|---|
| 12346 | + * * `locals` – `{object=}` – local variables context object, useful for overriding values in |
|---|
| 12347 | + * `context`. |
|---|
| 12348 | + * |
|---|
| 12349 | + * The returned function also has the following properties: |
|---|
| 12350 | + * * `literal` – `{boolean}` – whether the expression's top-level node is a JavaScript |
|---|
| 12351 | + * literal. |
|---|
| 12352 | + * * `constant` – `{boolean}` – whether the expression is made entirely of JavaScript |
|---|
| 12353 | + * constant literals. |
|---|
| 12354 | + * * `assign` – `{?function(context, value)}` – if the expression is assignable, this will be |
|---|
| 12355 | + * set to a function to change its value on the given context. |
|---|
| 12356 | + * |
|---|
| 12357 | + */ |
|---|
| 12358 | + |
|---|
| 12359 | + |
|---|
| 12360 | +/** |
|---|
| 12361 | + * @ngdoc provider |
|---|
| 12362 | + * @name $parseProvider |
|---|
| 12363 | + * |
|---|
| 12364 | + * @description |
|---|
| 12365 | + * `$parseProvider` can be used for configuring the default behavior of the {@link ng.$parse $parse} |
|---|
| 12366 | + * service. |
|---|
| 12367 | + */ |
|---|
| 12368 | +function $ParseProvider() { |
|---|
| 12369 | + var cache = createMap(); |
|---|
| 12370 | + |
|---|
| 12371 | + var $parseOptions = { |
|---|
| 12372 | + csp: false |
|---|
| 12373 | + }; |
|---|
| 12374 | + |
|---|
| 12375 | + |
|---|
| 12376 | + this.$get = ['$filter', '$sniffer', function($filter, $sniffer) { |
|---|
| 12377 | + $parseOptions.csp = $sniffer.csp; |
|---|
| 12378 | + |
|---|
| 12379 | + function wrapSharedExpression(exp) { |
|---|
| 12380 | + var wrapped = exp; |
|---|
| 12381 | + |
|---|
| 12382 | + if (exp.sharedGetter) { |
|---|
| 12383 | + wrapped = function $parseWrapper(self, locals) { |
|---|
| 12384 | + return exp(self, locals); |
|---|
| 12385 | + }; |
|---|
| 12386 | + wrapped.literal = exp.literal; |
|---|
| 12387 | + wrapped.constant = exp.constant; |
|---|
| 12388 | + wrapped.assign = exp.assign; |
|---|
| 12389 | + } |
|---|
| 12390 | + |
|---|
| 12391 | + return wrapped; |
|---|
| 12392 | + } |
|---|
| 12393 | + |
|---|
| 12394 | + return function $parse(exp, interceptorFn) { |
|---|
| 12395 | + var parsedExpression, oneTime, cacheKey; |
|---|
| 12396 | + |
|---|
| 12397 | + switch (typeof exp) { |
|---|
| 12398 | + case 'string': |
|---|
| 12399 | + cacheKey = exp = exp.trim(); |
|---|
| 12400 | + |
|---|
| 12401 | + parsedExpression = cache[cacheKey]; |
|---|
| 12402 | + |
|---|
| 12403 | + if (!parsedExpression) { |
|---|
| 12404 | + if (exp.charAt(0) === ':' && exp.charAt(1) === ':') { |
|---|
| 12405 | + oneTime = true; |
|---|
| 12406 | + exp = exp.substring(2); |
|---|
| 12407 | + } |
|---|
| 12408 | + |
|---|
| 12409 | + var lexer = new Lexer($parseOptions); |
|---|
| 12410 | + var parser = new Parser(lexer, $filter, $parseOptions); |
|---|
| 12411 | + parsedExpression = parser.parse(exp); |
|---|
| 12412 | + |
|---|
| 12413 | + if (parsedExpression.constant) { |
|---|
| 12414 | + parsedExpression.$$watchDelegate = constantWatchDelegate; |
|---|
| 12415 | + } else if (oneTime) { |
|---|
| 12416 | + //oneTime is not part of the exp passed to the Parser so we may have to |
|---|
| 12417 | + //wrap the parsedExpression before adding a $$watchDelegate |
|---|
| 12418 | + parsedExpression = wrapSharedExpression(parsedExpression); |
|---|
| 12419 | + parsedExpression.$$watchDelegate = parsedExpression.literal ? |
|---|
| 12420 | + oneTimeLiteralWatchDelegate : oneTimeWatchDelegate; |
|---|
| 12421 | + } else if (parsedExpression.inputs) { |
|---|
| 12422 | + parsedExpression.$$watchDelegate = inputsWatchDelegate; |
|---|
| 12423 | + } |
|---|
| 12424 | + |
|---|
| 12425 | + cache[cacheKey] = parsedExpression; |
|---|
| 12426 | + } |
|---|
| 12427 | + return addInterceptor(parsedExpression, interceptorFn); |
|---|
| 12428 | + |
|---|
| 12429 | + case 'function': |
|---|
| 12430 | + return addInterceptor(exp, interceptorFn); |
|---|
| 12431 | + |
|---|
| 12432 | + default: |
|---|
| 12433 | + return addInterceptor(noop, interceptorFn); |
|---|
| 12434 | + } |
|---|
| 12435 | + }; |
|---|
| 12436 | + |
|---|
| 12437 | + function collectExpressionInputs(inputs, list) { |
|---|
| 12438 | + for (var i = 0, ii = inputs.length; i < ii; i++) { |
|---|
| 12439 | + var input = inputs[i]; |
|---|
| 12440 | + if (!input.constant) { |
|---|
| 12441 | + if (input.inputs) { |
|---|
| 12442 | + collectExpressionInputs(input.inputs, list); |
|---|
| 12443 | + } else if (list.indexOf(input) === -1) { // TODO(perf) can we do better? |
|---|
| 12444 | + list.push(input); |
|---|
| 12445 | + } |
|---|
| 12446 | + } |
|---|
| 12447 | + } |
|---|
| 12448 | + |
|---|
| 12449 | + return list; |
|---|
| 12450 | + } |
|---|
| 12451 | + |
|---|
| 12452 | + function expressionInputDirtyCheck(newValue, oldValueOfValue) { |
|---|
| 12453 | + |
|---|
| 12454 | + if (newValue == null || oldValueOfValue == null) { // null/undefined |
|---|
| 12455 | + return newValue === oldValueOfValue; |
|---|
| 12456 | + } |
|---|
| 12457 | + |
|---|
| 12458 | + if (typeof newValue === 'object') { |
|---|
| 12459 | + |
|---|
| 12460 | + // attempt to convert the value to a primitive type |
|---|
| 12461 | + // TODO(docs): add a note to docs that by implementing valueOf even objects and arrays can |
|---|
| 12462 | + // be cheaply dirty-checked |
|---|
| 12463 | + newValue = newValue.valueOf(); |
|---|
| 12464 | + |
|---|
| 12465 | + if (typeof newValue === 'object') { |
|---|
| 12466 | + // objects/arrays are not supported - deep-watching them would be too expensive |
|---|
| 12467 | + return false; |
|---|
| 12468 | + } |
|---|
| 12469 | + |
|---|
| 12470 | + // fall-through to the primitive equality check |
|---|
| 12471 | + } |
|---|
| 12472 | + |
|---|
| 12473 | + //Primitive or NaN |
|---|
| 12474 | + return newValue === oldValueOfValue || (newValue !== newValue && oldValueOfValue !== oldValueOfValue); |
|---|
| 12475 | + } |
|---|
| 12476 | + |
|---|
| 12477 | + function inputsWatchDelegate(scope, listener, objectEquality, parsedExpression) { |
|---|
| 12478 | + var inputExpressions = parsedExpression.$$inputs || |
|---|
| 12479 | + (parsedExpression.$$inputs = collectExpressionInputs(parsedExpression.inputs, [])); |
|---|
| 12480 | + |
|---|
| 12481 | + var lastResult; |
|---|
| 12482 | + |
|---|
| 12483 | + if (inputExpressions.length === 1) { |
|---|
| 12484 | + var oldInputValue = expressionInputDirtyCheck; // init to something unique so that equals check fails |
|---|
| 12485 | + inputExpressions = inputExpressions[0]; |
|---|
| 12486 | + return scope.$watch(function expressionInputWatch(scope) { |
|---|
| 12487 | + var newInputValue = inputExpressions(scope); |
|---|
| 12488 | + if (!expressionInputDirtyCheck(newInputValue, oldInputValue)) { |
|---|
| 12489 | + lastResult = parsedExpression(scope); |
|---|
| 12490 | + oldInputValue = newInputValue && newInputValue.valueOf(); |
|---|
| 12491 | + } |
|---|
| 12492 | + return lastResult; |
|---|
| 12493 | + }, listener, objectEquality); |
|---|
| 12494 | + } |
|---|
| 12495 | + |
|---|
| 12496 | + var oldInputValueOfValues = []; |
|---|
| 12497 | + for (var i = 0, ii = inputExpressions.length; i < ii; i++) { |
|---|
| 12498 | + oldInputValueOfValues[i] = expressionInputDirtyCheck; // init to something unique so that equals check fails |
|---|
| 12499 | + } |
|---|
| 12500 | + |
|---|
| 12501 | + return scope.$watch(function expressionInputsWatch(scope) { |
|---|
| 12502 | + var changed = false; |
|---|
| 12503 | + |
|---|
| 12504 | + for (var i = 0, ii = inputExpressions.length; i < ii; i++) { |
|---|
| 12505 | + var newInputValue = inputExpressions[i](scope); |
|---|
| 12506 | + if (changed || (changed = !expressionInputDirtyCheck(newInputValue, oldInputValueOfValues[i]))) { |
|---|
| 12507 | + oldInputValueOfValues[i] = newInputValue && newInputValue.valueOf(); |
|---|
| 12508 | + } |
|---|
| 12509 | + } |
|---|
| 12510 | + |
|---|
| 12511 | + if (changed) { |
|---|
| 12512 | + lastResult = parsedExpression(scope); |
|---|
| 12513 | + } |
|---|
| 12514 | + |
|---|
| 12515 | + return lastResult; |
|---|
| 12516 | + }, listener, objectEquality); |
|---|
| 12517 | + } |
|---|
| 12518 | + |
|---|
| 12519 | + function oneTimeWatchDelegate(scope, listener, objectEquality, parsedExpression) { |
|---|
| 12520 | + var unwatch, lastValue; |
|---|
| 12521 | + return unwatch = scope.$watch(function oneTimeWatch(scope) { |
|---|
| 12522 | + return parsedExpression(scope); |
|---|
| 12523 | + }, function oneTimeListener(value, old, scope) { |
|---|
| 12524 | + lastValue = value; |
|---|
| 12525 | + if (isFunction(listener)) { |
|---|
| 12526 | + listener.apply(this, arguments); |
|---|
| 12527 | + } |
|---|
| 12528 | + if (isDefined(value)) { |
|---|
| 12529 | + scope.$$postDigest(function () { |
|---|
| 12530 | + if (isDefined(lastValue)) { |
|---|
| 12531 | + unwatch(); |
|---|
| 12532 | + } |
|---|
| 12533 | + }); |
|---|
| 12534 | + } |
|---|
| 12535 | + }, objectEquality); |
|---|
| 12536 | + } |
|---|
| 12537 | + |
|---|
| 12538 | + function oneTimeLiteralWatchDelegate(scope, listener, objectEquality, parsedExpression) { |
|---|
| 12539 | + var unwatch, lastValue; |
|---|
| 12540 | + return unwatch = scope.$watch(function oneTimeWatch(scope) { |
|---|
| 12541 | + return parsedExpression(scope); |
|---|
| 12542 | + }, function oneTimeListener(value, old, scope) { |
|---|
| 12543 | + lastValue = value; |
|---|
| 12544 | + if (isFunction(listener)) { |
|---|
| 12545 | + listener.call(this, value, old, scope); |
|---|
| 12546 | + } |
|---|
| 12547 | + if (isAllDefined(value)) { |
|---|
| 12548 | + scope.$$postDigest(function () { |
|---|
| 12549 | + if(isAllDefined(lastValue)) unwatch(); |
|---|
| 12550 | + }); |
|---|
| 12551 | + } |
|---|
| 12552 | + }, objectEquality); |
|---|
| 12553 | + |
|---|
| 12554 | + function isAllDefined(value) { |
|---|
| 12555 | + var allDefined = true; |
|---|
| 12556 | + forEach(value, function (val) { |
|---|
| 12557 | + if (!isDefined(val)) allDefined = false; |
|---|
| 12558 | + }); |
|---|
| 12559 | + return allDefined; |
|---|
| 12560 | + } |
|---|
| 12561 | + } |
|---|
| 12562 | + |
|---|
| 12563 | + function constantWatchDelegate(scope, listener, objectEquality, parsedExpression) { |
|---|
| 12564 | + var unwatch; |
|---|
| 12565 | + return unwatch = scope.$watch(function constantWatch(scope) { |
|---|
| 12566 | + return parsedExpression(scope); |
|---|
| 12567 | + }, function constantListener(value, old, scope) { |
|---|
| 12568 | + if (isFunction(listener)) { |
|---|
| 12569 | + listener.apply(this, arguments); |
|---|
| 12570 | + } |
|---|
| 12571 | + unwatch(); |
|---|
| 12572 | + }, objectEquality); |
|---|
| 12573 | + } |
|---|
| 12574 | + |
|---|
| 12575 | + function addInterceptor(parsedExpression, interceptorFn) { |
|---|
| 12576 | + if (!interceptorFn) return parsedExpression; |
|---|
| 12577 | + |
|---|
| 12578 | + var fn = function interceptedExpression(scope, locals) { |
|---|
| 12579 | + var value = parsedExpression(scope, locals); |
|---|
| 12580 | + var result = interceptorFn(value, scope, locals); |
|---|
| 12581 | + // we only return the interceptor's result if the |
|---|
| 12582 | + // initial value is defined (for bind-once) |
|---|
| 12583 | + return isDefined(value) ? result : value; |
|---|
| 12584 | + }; |
|---|
| 12585 | + |
|---|
| 12586 | + // Propagate $$watchDelegates other then inputsWatchDelegate |
|---|
| 12587 | + if (parsedExpression.$$watchDelegate && |
|---|
| 12588 | + parsedExpression.$$watchDelegate !== inputsWatchDelegate) { |
|---|
| 12589 | + fn.$$watchDelegate = parsedExpression.$$watchDelegate; |
|---|
| 12590 | + } else if (!interceptorFn.$stateful) { |
|---|
| 12591 | + // If there is an interceptor, but no watchDelegate then treat the interceptor like |
|---|
| 12592 | + // we treat filters - it is assumed to be a pure function unless flagged with $stateful |
|---|
| 12593 | + fn.$$watchDelegate = inputsWatchDelegate; |
|---|
| 12594 | + fn.inputs = [parsedExpression]; |
|---|
| 12595 | + } |
|---|
| 12596 | + |
|---|
| 12597 | + return fn; |
|---|
| 12598 | + } |
|---|
| 12599 | + }]; |
|---|
| 12600 | +} |
|---|
| 12601 | + |
|---|
| 12602 | +/** |
|---|
| 12603 | + * @ngdoc service |
|---|
| 12604 | + * @name $q |
|---|
| 12605 | + * @requires $rootScope |
|---|
| 12606 | + * |
|---|
| 12607 | + * @description |
|---|
| 12608 | + * A promise/deferred implementation inspired by [Kris Kowal's Q](https://github.com/kriskowal/q). |
|---|
| 12609 | + * |
|---|
| 12610 | + * $q can be used in two fashions --- one which is more similar to Kris Kowal's Q or jQuery's Deferred |
|---|
| 12611 | + * implementations, and the other which resembles ES6 promises to some degree. |
|---|
| 12612 | + * |
|---|
| 12613 | + * # $q constructor |
|---|
| 12614 | + * |
|---|
| 12615 | + * The streamlined ES6 style promise is essentially just using $q as a constructor which takes a `resolver` |
|---|
| 12616 | + * function as the first argument. This is similar to the native Promise implementation from ES6 Harmony, |
|---|
| 12617 | + * see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). |
|---|
| 12618 | + * |
|---|
| 12619 | + * While the constructor-style use is supported, not all of the supporting methods from ES6 Harmony promises are |
|---|
| 12620 | + * available yet. |
|---|
| 12621 | + * |
|---|
| 12622 | + * It can be used like so: |
|---|
| 12623 | + * |
|---|
| 12624 | + * ```js |
|---|
| 12625 | + * // for the purpose of this example let's assume that variables `$q` and `okToGreet` |
|---|
| 12626 | + * // are available in the current lexical scope (they could have been injected or passed in). |
|---|
| 12627 | + * |
|---|
| 12628 | + * function asyncGreet(name) { |
|---|
| 12629 | + * // perform some asynchronous operation, resolve or reject the promise when appropriate. |
|---|
| 12630 | + * return $q(function(resolve, reject) { |
|---|
| 12631 | + * setTimeout(function() { |
|---|
| 12632 | + * if (okToGreet(name)) { |
|---|
| 12633 | + * resolve('Hello, ' + name + '!'); |
|---|
| 12634 | + * } else { |
|---|
| 12635 | + * reject('Greeting ' + name + ' is not allowed.'); |
|---|
| 12636 | + * } |
|---|
| 12637 | + * }, 1000); |
|---|
| 12638 | + * }); |
|---|
| 12639 | + * } |
|---|
| 12640 | + * |
|---|
| 12641 | + * var promise = asyncGreet('Robin Hood'); |
|---|
| 12642 | + * promise.then(function(greeting) { |
|---|
| 12643 | + * alert('Success: ' + greeting); |
|---|
| 12644 | + * }, function(reason) { |
|---|
| 12645 | + * alert('Failed: ' + reason); |
|---|
| 12646 | + * }); |
|---|
| 12647 | + * ``` |
|---|
| 12648 | + * |
|---|
| 12649 | + * Note: progress/notify callbacks are not currently supported via the ES6-style interface. |
|---|
| 12650 | + * |
|---|
| 12651 | + * However, the more traditional CommonJS-style usage is still available, and documented below. |
|---|
| 12652 | + * |
|---|
| 12653 | + * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an |
|---|
| 12654 | + * interface for interacting with an object that represents the result of an action that is |
|---|
| 12655 | + * performed asynchronously, and may or may not be finished at any given point in time. |
|---|
| 12656 | + * |
|---|
| 12657 | + * From the perspective of dealing with error handling, deferred and promise APIs are to |
|---|
| 12658 | + * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming. |
|---|
| 12659 | + * |
|---|
| 12660 | + * ```js |
|---|
| 12661 | + * // for the purpose of this example let's assume that variables `$q` and `okToGreet` |
|---|
| 12662 | + * // are available in the current lexical scope (they could have been injected or passed in). |
|---|
| 12663 | + * |
|---|
| 12664 | + * function asyncGreet(name) { |
|---|
| 12665 | + * var deferred = $q.defer(); |
|---|
| 12666 | + * |
|---|
| 12667 | + * setTimeout(function() { |
|---|
| 12668 | + * deferred.notify('About to greet ' + name + '.'); |
|---|
| 12669 | + * |
|---|
| 12670 | + * if (okToGreet(name)) { |
|---|
| 12671 | + * deferred.resolve('Hello, ' + name + '!'); |
|---|
| 12672 | + * } else { |
|---|
| 12673 | + * deferred.reject('Greeting ' + name + ' is not allowed.'); |
|---|
| 12674 | + * } |
|---|
| 12675 | + * }, 1000); |
|---|
| 12676 | + * |
|---|
| 12677 | + * return deferred.promise; |
|---|
| 12678 | + * } |
|---|
| 12679 | + * |
|---|
| 12680 | + * var promise = asyncGreet('Robin Hood'); |
|---|
| 12681 | + * promise.then(function(greeting) { |
|---|
| 12682 | + * alert('Success: ' + greeting); |
|---|
| 12683 | + * }, function(reason) { |
|---|
| 12684 | + * alert('Failed: ' + reason); |
|---|
| 12685 | + * }, function(update) { |
|---|
| 12686 | + * alert('Got notification: ' + update); |
|---|
| 12687 | + * }); |
|---|
| 12688 | + * ``` |
|---|
| 12689 | + * |
|---|
| 12690 | + * At first it might not be obvious why this extra complexity is worth the trouble. The payoff |
|---|
| 12691 | + * comes in the way of guarantees that promise and deferred APIs make, see |
|---|
| 12692 | + * https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md. |
|---|
| 12693 | + * |
|---|
| 12694 | + * Additionally the promise api allows for composition that is very hard to do with the |
|---|
| 12695 | + * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach. |
|---|
| 12696 | + * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the |
|---|
| 12697 | + * section on serial or parallel joining of promises. |
|---|
| 12698 | + * |
|---|
| 12699 | + * # The Deferred API |
|---|
| 12700 | + * |
|---|
| 12701 | + * A new instance of deferred is constructed by calling `$q.defer()`. |
|---|
| 12702 | + * |
|---|
| 12703 | + * The purpose of the deferred object is to expose the associated Promise instance as well as APIs |
|---|
| 12704 | + * that can be used for signaling the successful or unsuccessful completion, as well as the status |
|---|
| 12705 | + * of the task. |
|---|
| 12706 | + * |
|---|
| 12707 | + * **Methods** |
|---|
| 12708 | + * |
|---|
| 12709 | + * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection |
|---|
| 12710 | + * constructed via `$q.reject`, the promise will be rejected instead. |
|---|
| 12711 | + * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to |
|---|
| 12712 | + * resolving it with a rejection constructed via `$q.reject`. |
|---|
| 12713 | + * - `notify(value)` - provides updates on the status of the promise's execution. This may be called |
|---|
| 12714 | + * multiple times before the promise is either resolved or rejected. |
|---|
| 12715 | + * |
|---|
| 12716 | + * **Properties** |
|---|
| 12717 | + * |
|---|
| 12718 | + * - promise – `{Promise}` – promise object associated with this deferred. |
|---|
| 12719 | + * |
|---|
| 12720 | + * |
|---|
| 12721 | + * # The Promise API |
|---|
| 12722 | + * |
|---|
| 12723 | + * A new promise instance is created when a deferred instance is created and can be retrieved by |
|---|
| 12724 | + * calling `deferred.promise`. |
|---|
| 12725 | + * |
|---|
| 12726 | + * The purpose of the promise object is to allow for interested parties to get access to the result |
|---|
| 12727 | + * of the deferred task when it completes. |
|---|
| 12728 | + * |
|---|
| 12729 | + * **Methods** |
|---|
| 12730 | + * |
|---|
| 12731 | + * - `then(successCallback, errorCallback, notifyCallback)` – regardless of when the promise was or |
|---|
| 12732 | + * will be resolved or rejected, `then` calls one of the success or error callbacks asynchronously |
|---|
| 12733 | + * as soon as the result is available. The callbacks are called with a single argument: the result |
|---|
| 12734 | + * or rejection reason. Additionally, the notify callback may be called zero or more times to |
|---|
| 12735 | + * provide a progress indication, before the promise is resolved or rejected. |
|---|
| 12736 | + * |
|---|
| 12737 | + * This method *returns a new promise* which is resolved or rejected via the return value of the |
|---|
| 12738 | + * `successCallback`, `errorCallback`. It also notifies via the return value of the |
|---|
| 12739 | + * `notifyCallback` method. The promise cannot be resolved or rejected from the notifyCallback |
|---|
| 12740 | + * method. |
|---|
| 12741 | + * |
|---|
| 12742 | + * - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)` |
|---|
| 12743 | + * |
|---|
| 12744 | + * - `finally(callback)` – allows you to observe either the fulfillment or rejection of a promise, |
|---|
| 12745 | + * but to do so without modifying the final value. This is useful to release resources or do some |
|---|
| 12746 | + * clean-up that needs to be done whether the promise was rejected or resolved. See the [full |
|---|
| 12747 | + * specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for |
|---|
| 12748 | + * more information. |
|---|
| 12749 | + * |
|---|
| 12750 | + * Because `finally` is a reserved word in JavaScript and reserved keywords are not supported as |
|---|
| 12751 | + * property names by ES3, you'll need to invoke the method like `promise['finally'](callback)` to |
|---|
| 12752 | + * make your code IE8 and Android 2.x compatible. |
|---|
| 12753 | + * |
|---|
| 12754 | + * # Chaining promises |
|---|
| 12755 | + * |
|---|
| 12756 | + * Because calling the `then` method of a promise returns a new derived promise, it is easily |
|---|
| 12757 | + * possible to create a chain of promises: |
|---|
| 12758 | + * |
|---|
| 12759 | + * ```js |
|---|
| 12760 | + * promiseB = promiseA.then(function(result) { |
|---|
| 12761 | + * return result + 1; |
|---|
| 12762 | + * }); |
|---|
| 12763 | + * |
|---|
| 12764 | + * // promiseB will be resolved immediately after promiseA is resolved and its value |
|---|
| 12765 | + * // will be the result of promiseA incremented by 1 |
|---|
| 12766 | + * ``` |
|---|
| 12767 | + * |
|---|
| 12768 | + * It is possible to create chains of any length and since a promise can be resolved with another |
|---|
| 12769 | + * promise (which will defer its resolution further), it is possible to pause/defer resolution of |
|---|
| 12770 | + * the promises at any point in the chain. This makes it possible to implement powerful APIs like |
|---|
| 12771 | + * $http's response interceptors. |
|---|
| 12772 | + * |
|---|
| 12773 | + * |
|---|
| 12774 | + * # Differences between Kris Kowal's Q and $q |
|---|
| 12775 | + * |
|---|
| 12776 | + * There are two main differences: |
|---|
| 12777 | + * |
|---|
| 12778 | + * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation |
|---|
| 12779 | + * mechanism in angular, which means faster propagation of resolution or rejection into your |
|---|
| 12780 | + * models and avoiding unnecessary browser repaints, which would result in flickering UI. |
|---|
| 12781 | + * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains |
|---|
| 12782 | + * all the important functionality needed for common async tasks. |
|---|
| 12783 | + * |
|---|
| 12784 | + * # Testing |
|---|
| 12785 | + * |
|---|
| 12786 | + * ```js |
|---|
| 12787 | + * it('should simulate promise', inject(function($q, $rootScope) { |
|---|
| 12788 | + * var deferred = $q.defer(); |
|---|
| 12789 | + * var promise = deferred.promise; |
|---|
| 12790 | + * var resolvedValue; |
|---|
| 12791 | + * |
|---|
| 12792 | + * promise.then(function(value) { resolvedValue = value; }); |
|---|
| 12793 | + * expect(resolvedValue).toBeUndefined(); |
|---|
| 12794 | + * |
|---|
| 12795 | + * // Simulate resolving of promise |
|---|
| 12796 | + * deferred.resolve(123); |
|---|
| 12797 | + * // Note that the 'then' function does not get called synchronously. |
|---|
| 12798 | + * // This is because we want the promise API to always be async, whether or not |
|---|
| 12799 | + * // it got called synchronously or asynchronously. |
|---|
| 12800 | + * expect(resolvedValue).toBeUndefined(); |
|---|
| 12801 | + * |
|---|
| 12802 | + * // Propagate promise resolution to 'then' functions using $apply(). |
|---|
| 12803 | + * $rootScope.$apply(); |
|---|
| 12804 | + * expect(resolvedValue).toEqual(123); |
|---|
| 12805 | + * })); |
|---|
| 12806 | + * ``` |
|---|
| 12807 | + * |
|---|
| 12808 | + * @param {function(function, function)} resolver Function which is responsible for resolving or |
|---|
| 12809 | + * rejecting the newly created promise. The first parameter is a function which resolves the |
|---|
| 12810 | + * promise, the second parameter is a function which rejects the promise. |
|---|
| 12811 | + * |
|---|
| 12812 | + * @returns {Promise} The newly created promise. |
|---|
| 12813 | + */ |
|---|
| 12814 | +function $QProvider() { |
|---|
| 12815 | + |
|---|
| 12816 | + this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) { |
|---|
| 12817 | + return qFactory(function(callback) { |
|---|
| 12818 | + $rootScope.$evalAsync(callback); |
|---|
| 12819 | + }, $exceptionHandler); |
|---|
| 12820 | + }]; |
|---|
| 12821 | +} |
|---|
| 12822 | + |
|---|
| 12823 | +function $$QProvider() { |
|---|
| 12824 | + this.$get = ['$browser', '$exceptionHandler', function($browser, $exceptionHandler) { |
|---|
| 12825 | + return qFactory(function(callback) { |
|---|
| 12826 | + $browser.defer(callback); |
|---|
| 12827 | + }, $exceptionHandler); |
|---|
| 12828 | + }]; |
|---|
| 12829 | +} |
|---|
| 12830 | + |
|---|
| 12831 | +/** |
|---|
| 12832 | + * Constructs a promise manager. |
|---|
| 12833 | + * |
|---|
| 12834 | + * @param {function(function)} nextTick Function for executing functions in the next turn. |
|---|
| 12835 | + * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for |
|---|
| 12836 | + * debugging purposes. |
|---|
| 12837 | + * @returns {object} Promise manager. |
|---|
| 12838 | + */ |
|---|
| 12839 | +function qFactory(nextTick, exceptionHandler) { |
|---|
| 12840 | + var $qMinErr = minErr('$q', TypeError); |
|---|
| 12841 | + function callOnce(self, resolveFn, rejectFn) { |
|---|
| 12842 | + var called = false; |
|---|
| 12843 | + function wrap(fn) { |
|---|
| 12844 | + return function(value) { |
|---|
| 12845 | + if (called) return; |
|---|
| 12846 | + called = true; |
|---|
| 12847 | + fn.call(self, value); |
|---|
| 12848 | + }; |
|---|
| 12849 | + } |
|---|
| 12850 | + |
|---|
| 12851 | + return [wrap(resolveFn), wrap(rejectFn)]; |
|---|
| 12852 | + } |
|---|
| 12853 | + |
|---|
| 12854 | + /** |
|---|
| 12855 | + * @ngdoc method |
|---|
| 12856 | + * @name ng.$q#defer |
|---|
| 12857 | + * @kind function |
|---|
| 12858 | + * |
|---|
| 12859 | + * @description |
|---|
| 12860 | + * Creates a `Deferred` object which represents a task which will finish in the future. |
|---|
| 12861 | + * |
|---|
| 12862 | + * @returns {Deferred} Returns a new instance of deferred. |
|---|
| 12863 | + */ |
|---|
| 12864 | + var defer = function() { |
|---|
| 12865 | + return new Deferred(); |
|---|
| 12866 | + }; |
|---|
| 12867 | + |
|---|
| 12868 | + function Promise() { |
|---|
| 12869 | + this.$$state = { status: 0 }; |
|---|
| 12870 | + } |
|---|
| 12871 | + |
|---|
| 12872 | + Promise.prototype = { |
|---|
| 12873 | + then: function(onFulfilled, onRejected, progressBack) { |
|---|
| 12874 | + var result = new Deferred(); |
|---|
| 12875 | + |
|---|
| 12876 | + this.$$state.pending = this.$$state.pending || []; |
|---|
| 12877 | + this.$$state.pending.push([result, onFulfilled, onRejected, progressBack]); |
|---|
| 12878 | + if (this.$$state.status > 0) scheduleProcessQueue(this.$$state); |
|---|
| 12879 | + |
|---|
| 12880 | + return result.promise; |
|---|
| 12881 | + }, |
|---|
| 12882 | + |
|---|
| 12883 | + "catch": function(callback) { |
|---|
| 12884 | + return this.then(null, callback); |
|---|
| 12885 | + }, |
|---|
| 12886 | + |
|---|
| 12887 | + "finally": function(callback, progressBack) { |
|---|
| 12888 | + return this.then(function(value) { |
|---|
| 12889 | + return handleCallback(value, true, callback); |
|---|
| 12890 | + }, function(error) { |
|---|
| 12891 | + return handleCallback(error, false, callback); |
|---|
| 12892 | + }, progressBack); |
|---|
| 12893 | + } |
|---|
| 12894 | + }; |
|---|
| 12895 | + |
|---|
| 12896 | + //Faster, more basic than angular.bind http://jsperf.com/angular-bind-vs-custom-vs-native |
|---|
| 12897 | + function simpleBind(context, fn) { |
|---|
| 12898 | + return function(value) { |
|---|
| 12899 | + fn.call(context, value); |
|---|
| 12900 | + }; |
|---|
| 12901 | + } |
|---|
| 12902 | + |
|---|
| 12903 | + function processQueue(state) { |
|---|
| 12904 | + var fn, promise, pending; |
|---|
| 12905 | + |
|---|
| 12906 | + pending = state.pending; |
|---|
| 12907 | + state.processScheduled = false; |
|---|
| 12908 | + state.pending = undefined; |
|---|
| 12909 | + for (var i = 0, ii = pending.length; i < ii; ++i) { |
|---|
| 12910 | + promise = pending[i][0]; |
|---|
| 12911 | + fn = pending[i][state.status]; |
|---|
| 12912 | + try { |
|---|
| 12913 | + if (isFunction(fn)) { |
|---|
| 12914 | + promise.resolve(fn(state.value)); |
|---|
| 12915 | + } else if (state.status === 1) { |
|---|
| 12916 | + promise.resolve(state.value); |
|---|
| 12917 | + } else { |
|---|
| 12918 | + promise.reject(state.value); |
|---|
| 12919 | + } |
|---|
| 12920 | + } catch(e) { |
|---|
| 12921 | + promise.reject(e); |
|---|
| 12922 | + exceptionHandler(e); |
|---|
| 12923 | + } |
|---|
| 12924 | + } |
|---|
| 12925 | + } |
|---|
| 12926 | + |
|---|
| 12927 | + function scheduleProcessQueue(state) { |
|---|
| 12928 | + if (state.processScheduled || !state.pending) return; |
|---|
| 12929 | + state.processScheduled = true; |
|---|
| 12930 | + nextTick(function() { processQueue(state); }); |
|---|
| 12931 | + } |
|---|
| 12932 | + |
|---|
| 12933 | + function Deferred() { |
|---|
| 12934 | + this.promise = new Promise(); |
|---|
| 12935 | + //Necessary to support unbound execution :/ |
|---|
| 12936 | + this.resolve = simpleBind(this, this.resolve); |
|---|
| 12937 | + this.reject = simpleBind(this, this.reject); |
|---|
| 12938 | + this.notify = simpleBind(this, this.notify); |
|---|
| 12939 | + } |
|---|
| 12940 | + |
|---|
| 12941 | + Deferred.prototype = { |
|---|
| 12942 | + resolve: function(val) { |
|---|
| 12943 | + if (this.promise.$$state.status) return; |
|---|
| 12944 | + if (val === this.promise) { |
|---|
| 12945 | + this.$$reject($qMinErr( |
|---|
| 12946 | + 'qcycle', |
|---|
| 12947 | + "Expected promise to be resolved with value other than itself '{0}'", |
|---|
| 12948 | + val)); |
|---|
| 12949 | + } |
|---|
| 12950 | + else { |
|---|
| 12951 | + this.$$resolve(val); |
|---|
| 12952 | + } |
|---|
| 12953 | + |
|---|
| 12954 | + }, |
|---|
| 12955 | + |
|---|
| 12956 | + $$resolve: function(val) { |
|---|
| 12957 | + var then, fns; |
|---|
| 12958 | + |
|---|
| 12959 | + fns = callOnce(this, this.$$resolve, this.$$reject); |
|---|
| 12960 | + try { |
|---|
| 12961 | + if ((isObject(val) || isFunction(val))) then = val && val.then; |
|---|
| 12962 | + if (isFunction(then)) { |
|---|
| 12963 | + this.promise.$$state.status = -1; |
|---|
| 12964 | + then.call(val, fns[0], fns[1], this.notify); |
|---|
| 12965 | + } else { |
|---|
| 12966 | + this.promise.$$state.value = val; |
|---|
| 12967 | + this.promise.$$state.status = 1; |
|---|
| 12968 | + scheduleProcessQueue(this.promise.$$state); |
|---|
| 12969 | + } |
|---|
| 12970 | + } catch(e) { |
|---|
| 12971 | + fns[1](e); |
|---|
| 12972 | + exceptionHandler(e); |
|---|
| 12973 | + } |
|---|
| 12974 | + }, |
|---|
| 12975 | + |
|---|
| 12976 | + reject: function(reason) { |
|---|
| 12977 | + if (this.promise.$$state.status) return; |
|---|
| 12978 | + this.$$reject(reason); |
|---|
| 12979 | + }, |
|---|
| 12980 | + |
|---|
| 12981 | + $$reject: function(reason) { |
|---|
| 12982 | + this.promise.$$state.value = reason; |
|---|
| 12983 | + this.promise.$$state.status = 2; |
|---|
| 12984 | + scheduleProcessQueue(this.promise.$$state); |
|---|
| 12985 | + }, |
|---|
| 12986 | + |
|---|
| 12987 | + notify: function(progress) { |
|---|
| 12988 | + var callbacks = this.promise.$$state.pending; |
|---|
| 12989 | + |
|---|
| 12990 | + if ((this.promise.$$state.status <= 0) && callbacks && callbacks.length) { |
|---|
| 12991 | + nextTick(function() { |
|---|
| 12992 | + var callback, result; |
|---|
| 12993 | + for (var i = 0, ii = callbacks.length; i < ii; i++) { |
|---|
| 12994 | + result = callbacks[i][0]; |
|---|
| 12995 | + callback = callbacks[i][3]; |
|---|
| 12996 | + try { |
|---|
| 12997 | + result.notify(isFunction(callback) ? callback(progress) : progress); |
|---|
| 12998 | + } catch(e) { |
|---|
| 12999 | + exceptionHandler(e); |
|---|
| 13000 | + } |
|---|
| 13001 | + } |
|---|
| 13002 | + }); |
|---|
| 13003 | + } |
|---|
| 13004 | + } |
|---|
| 13005 | + }; |
|---|
| 13006 | + |
|---|
| 13007 | + /** |
|---|
| 13008 | + * @ngdoc method |
|---|
| 13009 | + * @name $q#reject |
|---|
| 13010 | + * @kind function |
|---|
| 13011 | + * |
|---|
| 13012 | + * @description |
|---|
| 13013 | + * Creates a promise that is resolved as rejected with the specified `reason`. This api should be |
|---|
| 13014 | + * used to forward rejection in a chain of promises. If you are dealing with the last promise in |
|---|
| 13015 | + * a promise chain, you don't need to worry about it. |
|---|
| 13016 | + * |
|---|
| 13017 | + * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of |
|---|
| 13018 | + * `reject` as the `throw` keyword in JavaScript. This also means that if you "catch" an error via |
|---|
| 13019 | + * a promise error callback and you want to forward the error to the promise derived from the |
|---|
| 13020 | + * current promise, you have to "rethrow" the error by returning a rejection constructed via |
|---|
| 13021 | + * `reject`. |
|---|
| 13022 | + * |
|---|
| 13023 | + * ```js |
|---|
| 13024 | + * promiseB = promiseA.then(function(result) { |
|---|
| 13025 | + * // success: do something and resolve promiseB |
|---|
| 13026 | + * // with the old or a new result |
|---|
| 13027 | + * return result; |
|---|
| 13028 | + * }, function(reason) { |
|---|
| 13029 | + * // error: handle the error if possible and |
|---|
| 13030 | + * // resolve promiseB with newPromiseOrValue, |
|---|
| 13031 | + * // otherwise forward the rejection to promiseB |
|---|
| 13032 | + * if (canHandle(reason)) { |
|---|
| 13033 | + * // handle the error and recover |
|---|
| 13034 | + * return newPromiseOrValue; |
|---|
| 13035 | + * } |
|---|
| 13036 | + * return $q.reject(reason); |
|---|
| 13037 | + * }); |
|---|
| 13038 | + * ``` |
|---|
| 13039 | + * |
|---|
| 13040 | + * @param {*} reason Constant, message, exception or an object representing the rejection reason. |
|---|
| 13041 | + * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`. |
|---|
| 13042 | + */ |
|---|
| 13043 | + var reject = function(reason) { |
|---|
| 13044 | + var result = new Deferred(); |
|---|
| 13045 | + result.reject(reason); |
|---|
| 13046 | + return result.promise; |
|---|
| 13047 | + }; |
|---|
| 13048 | + |
|---|
| 13049 | + var makePromise = function makePromise(value, resolved) { |
|---|
| 13050 | + var result = new Deferred(); |
|---|
| 13051 | + if (resolved) { |
|---|
| 13052 | + result.resolve(value); |
|---|
| 13053 | + } else { |
|---|
| 13054 | + result.reject(value); |
|---|
| 13055 | + } |
|---|
| 13056 | + return result.promise; |
|---|
| 13057 | + }; |
|---|
| 13058 | + |
|---|
| 13059 | + var handleCallback = function handleCallback(value, isResolved, callback) { |
|---|
| 13060 | + var callbackOutput = null; |
|---|
| 13061 | + try { |
|---|
| 13062 | + if (isFunction(callback)) callbackOutput = callback(); |
|---|
| 13063 | + } catch(e) { |
|---|
| 13064 | + return makePromise(e, false); |
|---|
| 13065 | + } |
|---|
| 13066 | + if (isPromiseLike(callbackOutput)) { |
|---|
| 13067 | + return callbackOutput.then(function() { |
|---|
| 13068 | + return makePromise(value, isResolved); |
|---|
| 13069 | + }, function(error) { |
|---|
| 13070 | + return makePromise(error, false); |
|---|
| 13071 | + }); |
|---|
| 13072 | + } else { |
|---|
| 13073 | + return makePromise(value, isResolved); |
|---|
| 13074 | + } |
|---|
| 13075 | + }; |
|---|
| 13076 | + |
|---|
| 13077 | + /** |
|---|
| 13078 | + * @ngdoc method |
|---|
| 13079 | + * @name $q#when |
|---|
| 13080 | + * @kind function |
|---|
| 13081 | + * |
|---|
| 13082 | + * @description |
|---|
| 13083 | + * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise. |
|---|
| 13084 | + * This is useful when you are dealing with an object that might or might not be a promise, or if |
|---|
| 13085 | + * the promise comes from a source that can't be trusted. |
|---|
| 13086 | + * |
|---|
| 13087 | + * @param {*} value Value or a promise |
|---|
| 13088 | + * @returns {Promise} Returns a promise of the passed value or promise |
|---|
| 13089 | + */ |
|---|
| 13090 | + |
|---|
| 13091 | + |
|---|
| 13092 | + var when = function(value, callback, errback, progressBack) { |
|---|
| 13093 | + var result = new Deferred(); |
|---|
| 13094 | + result.resolve(value); |
|---|
| 13095 | + return result.promise.then(callback, errback, progressBack); |
|---|
| 13096 | + }; |
|---|
| 13097 | + |
|---|
| 13098 | + /** |
|---|
| 13099 | + * @ngdoc method |
|---|
| 13100 | + * @name $q#all |
|---|
| 13101 | + * @kind function |
|---|
| 13102 | + * |
|---|
| 13103 | + * @description |
|---|
| 13104 | + * Combines multiple promises into a single promise that is resolved when all of the input |
|---|
| 13105 | + * promises are resolved. |
|---|
| 13106 | + * |
|---|
| 13107 | + * @param {Array.<Promise>|Object.<Promise>} promises An array or hash of promises. |
|---|
| 13108 | + * @returns {Promise} Returns a single promise that will be resolved with an array/hash of values, |
|---|
| 13109 | + * each value corresponding to the promise at the same index/key in the `promises` array/hash. |
|---|
| 13110 | + * If any of the promises is resolved with a rejection, this resulting promise will be rejected |
|---|
| 13111 | + * with the same rejection value. |
|---|
| 13112 | + */ |
|---|
| 13113 | + |
|---|
| 13114 | + function all(promises) { |
|---|
| 13115 | + var deferred = new Deferred(), |
|---|
| 13116 | + counter = 0, |
|---|
| 13117 | + results = isArray(promises) ? [] : {}; |
|---|
| 13118 | + |
|---|
| 13119 | + forEach(promises, function(promise, key) { |
|---|
| 13120 | + counter++; |
|---|
| 13121 | + when(promise).then(function(value) { |
|---|
| 13122 | + if (results.hasOwnProperty(key)) return; |
|---|
| 13123 | + results[key] = value; |
|---|
| 13124 | + if (!(--counter)) deferred.resolve(results); |
|---|
| 13125 | + }, function(reason) { |
|---|
| 13126 | + if (results.hasOwnProperty(key)) return; |
|---|
| 13127 | + deferred.reject(reason); |
|---|
| 13128 | + }); |
|---|
| 13129 | + }); |
|---|
| 13130 | + |
|---|
| 13131 | + if (counter === 0) { |
|---|
| 13132 | + deferred.resolve(results); |
|---|
| 13133 | + } |
|---|
| 13134 | + |
|---|
| 13135 | + return deferred.promise; |
|---|
| 13136 | + } |
|---|
| 13137 | + |
|---|
| 13138 | + var $Q = function Q(resolver) { |
|---|
| 13139 | + if (!isFunction(resolver)) { |
|---|
| 13140 | + throw $qMinErr('norslvr', "Expected resolverFn, got '{0}'", resolver); |
|---|
| 13141 | + } |
|---|
| 13142 | + |
|---|
| 13143 | + if (!(this instanceof Q)) { |
|---|
| 13144 | + // More useful when $Q is the Promise itself. |
|---|
| 13145 | + return new Q(resolver); |
|---|
| 13146 | + } |
|---|
| 13147 | + |
|---|
| 13148 | + var deferred = new Deferred(); |
|---|
| 13149 | + |
|---|
| 13150 | + function resolveFn(value) { |
|---|
| 13151 | + deferred.resolve(value); |
|---|
| 13152 | + } |
|---|
| 13153 | + |
|---|
| 13154 | + function rejectFn(reason) { |
|---|
| 13155 | + deferred.reject(reason); |
|---|
| 13156 | + } |
|---|
| 13157 | + |
|---|
| 13158 | + resolver(resolveFn, rejectFn); |
|---|
| 13159 | + |
|---|
| 13160 | + return deferred.promise; |
|---|
| 13161 | + }; |
|---|
| 13162 | + |
|---|
| 13163 | + $Q.defer = defer; |
|---|
| 13164 | + $Q.reject = reject; |
|---|
| 13165 | + $Q.when = when; |
|---|
| 13166 | + $Q.all = all; |
|---|
| 13167 | + |
|---|
| 13168 | + return $Q; |
|---|
| 13169 | +} |
|---|
| 13170 | + |
|---|
| 13171 | +function $$RAFProvider(){ //rAF |
|---|
| 13172 | + this.$get = ['$window', '$timeout', function($window, $timeout) { |
|---|
| 13173 | + var requestAnimationFrame = $window.requestAnimationFrame || |
|---|
| 13174 | + $window.webkitRequestAnimationFrame || |
|---|
| 13175 | + $window.mozRequestAnimationFrame; |
|---|
| 13176 | + |
|---|
| 13177 | + var cancelAnimationFrame = $window.cancelAnimationFrame || |
|---|
| 13178 | + $window.webkitCancelAnimationFrame || |
|---|
| 13179 | + $window.mozCancelAnimationFrame || |
|---|
| 13180 | + $window.webkitCancelRequestAnimationFrame; |
|---|
| 13181 | + |
|---|
| 13182 | + var rafSupported = !!requestAnimationFrame; |
|---|
| 13183 | + var raf = rafSupported |
|---|
| 13184 | + ? function(fn) { |
|---|
| 13185 | + var id = requestAnimationFrame(fn); |
|---|
| 13186 | + return function() { |
|---|
| 13187 | + cancelAnimationFrame(id); |
|---|
| 13188 | + }; |
|---|
| 13189 | + } |
|---|
| 13190 | + : function(fn) { |
|---|
| 13191 | + var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666 |
|---|
| 13192 | + return function() { |
|---|
| 13193 | + $timeout.cancel(timer); |
|---|
| 13194 | + }; |
|---|
| 13195 | + }; |
|---|
| 13196 | + |
|---|
| 13197 | + raf.supported = rafSupported; |
|---|
| 13198 | + |
|---|
| 13199 | + return raf; |
|---|
| 13200 | + }]; |
|---|
| 13201 | +} |
|---|
| 13202 | + |
|---|
| 13203 | +/** |
|---|
| 13204 | + * DESIGN NOTES |
|---|
| 13205 | + * |
|---|
| 13206 | + * The design decisions behind the scope are heavily favored for speed and memory consumption. |
|---|
| 13207 | + * |
|---|
| 13208 | + * The typical use of scope is to watch the expressions, which most of the time return the same |
|---|
| 13209 | + * value as last time so we optimize the operation. |
|---|
| 13210 | + * |
|---|
| 13211 | + * Closures construction is expensive in terms of speed as well as memory: |
|---|
| 13212 | + * - No closures, instead use prototypical inheritance for API |
|---|
| 13213 | + * - Internal state needs to be stored on scope directly, which means that private state is |
|---|
| 13214 | + * exposed as $$____ properties |
|---|
| 13215 | + * |
|---|
| 13216 | + * Loop operations are optimized by using while(count--) { ... } |
|---|
| 13217 | + * - this means that in order to keep the same order of execution as addition we have to add |
|---|
| 13218 | + * items to the array at the beginning (unshift) instead of at the end (push) |
|---|
| 13219 | + * |
|---|
| 13220 | + * Child scopes are created and removed often |
|---|
| 13221 | + * - Using an array would be slow since inserts in middle are expensive so we use linked list |
|---|
| 13222 | + * |
|---|
| 13223 | + * There are few watches then a lot of observers. This is why you don't want the observer to be |
|---|
| 13224 | + * implemented in the same way as watch. Watch requires return of initialization function which |
|---|
| 13225 | + * are expensive to construct. |
|---|
| 13226 | + */ |
|---|
| 13227 | + |
|---|
| 13228 | + |
|---|
| 13229 | +/** |
|---|
| 13230 | + * @ngdoc provider |
|---|
| 13231 | + * @name $rootScopeProvider |
|---|
| 13232 | + * @description |
|---|
| 13233 | + * |
|---|
| 13234 | + * Provider for the $rootScope service. |
|---|
| 13235 | + */ |
|---|
| 13236 | + |
|---|
| 13237 | +/** |
|---|
| 13238 | + * @ngdoc method |
|---|
| 13239 | + * @name $rootScopeProvider#digestTtl |
|---|
| 13240 | + * @description |
|---|
| 13241 | + * |
|---|
| 13242 | + * Sets the number of `$digest` iterations the scope should attempt to execute before giving up and |
|---|
| 13243 | + * assuming that the model is unstable. |
|---|
| 13244 | + * |
|---|
| 13245 | + * The current default is 10 iterations. |
|---|
| 13246 | + * |
|---|
| 13247 | + * In complex applications it's possible that the dependencies between `$watch`s will result in |
|---|
| 13248 | + * several digest iterations. However if an application needs more than the default 10 digest |
|---|
| 13249 | + * iterations for its model to stabilize then you should investigate what is causing the model to |
|---|
| 13250 | + * continuously change during the digest. |
|---|
| 13251 | + * |
|---|
| 13252 | + * Increasing the TTL could have performance implications, so you should not change it without |
|---|
| 13253 | + * proper justification. |
|---|
| 13254 | + * |
|---|
| 13255 | + * @param {number} limit The number of digest iterations. |
|---|
| 13256 | + */ |
|---|
| 13257 | + |
|---|
| 13258 | + |
|---|
| 13259 | +/** |
|---|
| 13260 | + * @ngdoc service |
|---|
| 13261 | + * @name $rootScope |
|---|
| 13262 | + * @description |
|---|
| 13263 | + * |
|---|
| 13264 | + * Every application has a single root {@link ng.$rootScope.Scope scope}. |
|---|
| 13265 | + * All other scopes are descendant scopes of the root scope. Scopes provide separation |
|---|
| 13266 | + * between the model and the view, via a mechanism for watching the model for changes. |
|---|
| 13267 | + * They also provide an event emission/broadcast and subscription facility. See the |
|---|
| 13268 | + * {@link guide/scope developer guide on scopes}. |
|---|
| 13269 | + */ |
|---|
| 13270 | +function $RootScopeProvider(){ |
|---|
| 13271 | + var TTL = 10; |
|---|
| 13272 | + var $rootScopeMinErr = minErr('$rootScope'); |
|---|
| 13273 | + var lastDirtyWatch = null; |
|---|
| 13274 | + var applyAsyncId = null; |
|---|
| 13275 | + |
|---|
| 13276 | + this.digestTtl = function(value) { |
|---|
| 13277 | + if (arguments.length) { |
|---|
| 13278 | + TTL = value; |
|---|
| 13279 | + } |
|---|
| 13280 | + return TTL; |
|---|
| 13281 | + }; |
|---|
| 13282 | + |
|---|
| 13283 | + this.$get = ['$injector', '$exceptionHandler', '$parse', '$browser', |
|---|
| 13284 | + function( $injector, $exceptionHandler, $parse, $browser) { |
|---|
| 13285 | + |
|---|
| 13286 | + /** |
|---|
| 13287 | + * @ngdoc type |
|---|
| 13288 | + * @name $rootScope.Scope |
|---|
| 13289 | + * |
|---|
| 13290 | + * @description |
|---|
| 13291 | + * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the |
|---|
| 13292 | + * {@link auto.$injector $injector}. Child scopes are created using the |
|---|
| 13293 | + * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when |
|---|
| 13294 | + * compiled HTML template is executed.) |
|---|
| 13295 | + * |
|---|
| 13296 | + * Here is a simple scope snippet to show how you can interact with the scope. |
|---|
| 13297 | + * ```html |
|---|
| 13298 | + * <file src="./test/ng/rootScopeSpec.js" tag="docs1" /> |
|---|
| 13299 | + * ``` |
|---|
| 13300 | + * |
|---|
| 13301 | + * # Inheritance |
|---|
| 13302 | + * A scope can inherit from a parent scope, as in this example: |
|---|
| 13303 | + * ```js |
|---|
| 13304 | + var parent = $rootScope; |
|---|
| 13305 | + var child = parent.$new(); |
|---|
| 13306 | + |
|---|
| 13307 | + parent.salutation = "Hello"; |
|---|
| 13308 | + child.name = "World"; |
|---|
| 13309 | + expect(child.salutation).toEqual('Hello'); |
|---|
| 13310 | + |
|---|
| 13311 | + child.salutation = "Welcome"; |
|---|
| 13312 | + expect(child.salutation).toEqual('Welcome'); |
|---|
| 13313 | + expect(parent.salutation).toEqual('Hello'); |
|---|
| 13314 | + * ``` |
|---|
| 13315 | + * |
|---|
| 13316 | + * |
|---|
| 13317 | + * @param {Object.<string, function()>=} providers Map of service factory which need to be |
|---|
| 13318 | + * provided for the current scope. Defaults to {@link ng}. |
|---|
| 13319 | + * @param {Object.<string, *>=} instanceCache Provides pre-instantiated services which should |
|---|
| 13320 | + * append/override services provided by `providers`. This is handy |
|---|
| 13321 | + * when unit-testing and having the need to override a default |
|---|
| 13322 | + * service. |
|---|
| 13323 | + * @returns {Object} Newly created scope. |
|---|
| 13324 | + * |
|---|
| 13325 | + */ |
|---|
| 13326 | + function Scope() { |
|---|
| 13327 | + this.$id = nextUid(); |
|---|
| 13328 | + this.$$phase = this.$parent = this.$$watchers = |
|---|
| 13329 | + this.$$nextSibling = this.$$prevSibling = |
|---|
| 13330 | + this.$$childHead = this.$$childTail = null; |
|---|
| 13331 | + this.$root = this; |
|---|
| 13332 | + this.$$destroyed = false; |
|---|
| 13333 | + this.$$listeners = {}; |
|---|
| 13334 | + this.$$listenerCount = {}; |
|---|
| 13335 | + this.$$isolateBindings = null; |
|---|
| 13336 | + } |
|---|
| 13337 | + |
|---|
| 13338 | + /** |
|---|
| 13339 | + * @ngdoc property |
|---|
| 13340 | + * @name $rootScope.Scope#$id |
|---|
| 13341 | + * |
|---|
| 13342 | + * @description |
|---|
| 13343 | + * Unique scope ID (monotonically increasing) useful for debugging. |
|---|
| 13344 | + */ |
|---|
| 13345 | + |
|---|
| 13346 | + /** |
|---|
| 13347 | + * @ngdoc property |
|---|
| 13348 | + * @name $rootScope.Scope#$parent |
|---|
| 13349 | + * |
|---|
| 13350 | + * @description |
|---|
| 13351 | + * Reference to the parent scope. |
|---|
| 13352 | + */ |
|---|
| 13353 | + |
|---|
| 13354 | + /** |
|---|
| 13355 | + * @ngdoc property |
|---|
| 13356 | + * @name $rootScope.Scope#$root |
|---|
| 13357 | + * |
|---|
| 13358 | + * @description |
|---|
| 13359 | + * Reference to the root scope. |
|---|
| 13360 | + */ |
|---|
| 13361 | + |
|---|
| 13362 | + Scope.prototype = { |
|---|
| 13363 | + constructor: Scope, |
|---|
| 13364 | + /** |
|---|
| 13365 | + * @ngdoc method |
|---|
| 13366 | + * @name $rootScope.Scope#$new |
|---|
| 13367 | + * @kind function |
|---|
| 13368 | + * |
|---|
| 13369 | + * @description |
|---|
| 13370 | + * Creates a new child {@link ng.$rootScope.Scope scope}. |
|---|
| 13371 | + * |
|---|
| 13372 | + * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} event. |
|---|
| 13373 | + * The scope can be removed from the scope hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}. |
|---|
| 13374 | + * |
|---|
| 13375 | + * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is |
|---|
| 13376 | + * desired for the scope and its child scopes to be permanently detached from the parent and |
|---|
| 13377 | + * thus stop participating in model change detection and listener notification by invoking. |
|---|
| 13378 | + * |
|---|
| 13379 | + * @param {boolean} isolate If true, then the scope does not prototypically inherit from the |
|---|
| 13380 | + * parent scope. The scope is isolated, as it can not see parent scope properties. |
|---|
| 13381 | + * When creating widgets, it is useful for the widget to not accidentally read parent |
|---|
| 13382 | + * state. |
|---|
| 13383 | + * |
|---|
| 13384 | + * @param {Scope} [parent=this] The {@link ng.$rootScope.Scope `Scope`} that will be the `$parent` |
|---|
| 13385 | + * of the newly created scope. Defaults to `this` scope if not provided. |
|---|
| 13386 | + * This is used when creating a transclude scope to correctly place it |
|---|
| 13387 | + * in the scope hierarchy while maintaining the correct prototypical |
|---|
| 13388 | + * inheritance. |
|---|
| 13389 | + * |
|---|
| 13390 | + * @returns {Object} The newly created child scope. |
|---|
| 13391 | + * |
|---|
| 13392 | + */ |
|---|
| 13393 | + $new: function(isolate, parent) { |
|---|
| 13394 | + var child; |
|---|
| 13395 | + |
|---|
| 13396 | + parent = parent || this; |
|---|
| 13397 | + |
|---|
| 13398 | + if (isolate) { |
|---|
| 13399 | + child = new Scope(); |
|---|
| 13400 | + child.$root = this.$root; |
|---|
| 13401 | + } else { |
|---|
| 13402 | + // Only create a child scope class if somebody asks for one, |
|---|
| 13403 | + // but cache it to allow the VM to optimize lookups. |
|---|
| 13404 | + if (!this.$$ChildScope) { |
|---|
| 13405 | + this.$$ChildScope = function ChildScope() { |
|---|
| 13406 | + this.$$watchers = this.$$nextSibling = |
|---|
| 13407 | + this.$$childHead = this.$$childTail = null; |
|---|
| 13408 | + this.$$listeners = {}; |
|---|
| 13409 | + this.$$listenerCount = {}; |
|---|
| 13410 | + this.$id = nextUid(); |
|---|
| 13411 | + this.$$ChildScope = null; |
|---|
| 13412 | + }; |
|---|
| 13413 | + this.$$ChildScope.prototype = this; |
|---|
| 13414 | + } |
|---|
| 13415 | + child = new this.$$ChildScope(); |
|---|
| 13416 | + } |
|---|
| 13417 | + child.$parent = parent; |
|---|
| 13418 | + child.$$prevSibling = parent.$$childTail; |
|---|
| 13419 | + if (parent.$$childHead) { |
|---|
| 13420 | + parent.$$childTail.$$nextSibling = child; |
|---|
| 13421 | + parent.$$childTail = child; |
|---|
| 13422 | + } else { |
|---|
| 13423 | + parent.$$childHead = parent.$$childTail = child; |
|---|
| 13424 | + } |
|---|
| 13425 | + |
|---|
| 13426 | + // When the new scope is not isolated or we inherit from `this`, and |
|---|
| 13427 | + // the parent scope is destroyed, the property `$$destroyed` is inherited |
|---|
| 13428 | + // prototypically. In all other cases, this property needs to be set |
|---|
| 13429 | + // when the parent scope is destroyed. |
|---|
| 13430 | + // The listener needs to be added after the parent is set |
|---|
| 13431 | + if (isolate || parent != this) child.$on('$destroy', destroyChild); |
|---|
| 13432 | + |
|---|
| 13433 | + return child; |
|---|
| 13434 | + |
|---|
| 13435 | + function destroyChild() { |
|---|
| 13436 | + child.$$destroyed = true; |
|---|
| 13437 | + } |
|---|
| 13438 | + }, |
|---|
| 13439 | + |
|---|
| 13440 | + /** |
|---|
| 13441 | + * @ngdoc method |
|---|
| 13442 | + * @name $rootScope.Scope#$watch |
|---|
| 13443 | + * @kind function |
|---|
| 13444 | + * |
|---|
| 13445 | + * @description |
|---|
| 13446 | + * Registers a `listener` callback to be executed whenever the `watchExpression` changes. |
|---|
| 13447 | + * |
|---|
| 13448 | + * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest |
|---|
| 13449 | + * $digest()} and should return the value that will be watched. (Since |
|---|
| 13450 | + * {@link ng.$rootScope.Scope#$digest $digest()} reruns when it detects changes the |
|---|
| 13451 | + * `watchExpression` can execute multiple times per |
|---|
| 13452 | + * {@link ng.$rootScope.Scope#$digest $digest()} and should be idempotent.) |
|---|
| 13453 | + * - The `listener` is called only when the value from the current `watchExpression` and the |
|---|
| 13454 | + * previous call to `watchExpression` are not equal (with the exception of the initial run, |
|---|
| 13455 | + * see below). Inequality is determined according to reference inequality, |
|---|
| 13456 | + * [strict comparison](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators) |
|---|
| 13457 | + * via the `!==` Javascript operator, unless `objectEquality == true` |
|---|
| 13458 | + * (see next point) |
|---|
| 13459 | + * - When `objectEquality == true`, inequality of the `watchExpression` is determined |
|---|
| 13460 | + * according to the {@link angular.equals} function. To save the value of the object for |
|---|
| 13461 | + * later comparison, the {@link angular.copy} function is used. This therefore means that |
|---|
| 13462 | + * watching complex objects will have adverse memory and performance implications. |
|---|
| 13463 | + * - The watch `listener` may change the model, which may trigger other `listener`s to fire. |
|---|
| 13464 | + * This is achieved by rerunning the watchers until no changes are detected. The rerun |
|---|
| 13465 | + * iteration limit is 10 to prevent an infinite loop deadlock. |
|---|
| 13466 | + * |
|---|
| 13467 | + * |
|---|
| 13468 | + * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called, |
|---|
| 13469 | + * you can register a `watchExpression` function with no `listener`. (Since `watchExpression` |
|---|
| 13470 | + * can execute multiple times per {@link ng.$rootScope.Scope#$digest $digest} cycle when a |
|---|
| 13471 | + * change is detected, be prepared for multiple calls to your listener.) |
|---|
| 13472 | + * |
|---|
| 13473 | + * After a watcher is registered with the scope, the `listener` fn is called asynchronously |
|---|
| 13474 | + * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the |
|---|
| 13475 | + * watcher. In rare cases, this is undesirable because the listener is called when the result |
|---|
| 13476 | + * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you |
|---|
| 13477 | + * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the |
|---|
| 13478 | + * listener was called due to initialization. |
|---|
| 13479 | + * |
|---|
| 13480 | + * |
|---|
| 13481 | + * |
|---|
| 13482 | + * # Example |
|---|
| 13483 | + * ```js |
|---|
| 13484 | + // let's assume that scope was dependency injected as the $rootScope |
|---|
| 13485 | + var scope = $rootScope; |
|---|
| 13486 | + scope.name = 'misko'; |
|---|
| 13487 | + scope.counter = 0; |
|---|
| 13488 | + |
|---|
| 13489 | + expect(scope.counter).toEqual(0); |
|---|
| 13490 | + scope.$watch('name', function(newValue, oldValue) { |
|---|
| 13491 | + scope.counter = scope.counter + 1; |
|---|
| 13492 | + }); |
|---|
| 13493 | + expect(scope.counter).toEqual(0); |
|---|
| 13494 | + |
|---|
| 13495 | + scope.$digest(); |
|---|
| 13496 | + // the listener is always called during the first $digest loop after it was registered |
|---|
| 13497 | + expect(scope.counter).toEqual(1); |
|---|
| 13498 | + |
|---|
| 13499 | + scope.$digest(); |
|---|
| 13500 | + // but now it will not be called unless the value changes |
|---|
| 13501 | + expect(scope.counter).toEqual(1); |
|---|
| 13502 | + |
|---|
| 13503 | + scope.name = 'adam'; |
|---|
| 13504 | + scope.$digest(); |
|---|
| 13505 | + expect(scope.counter).toEqual(2); |
|---|
| 13506 | + |
|---|
| 13507 | + |
|---|
| 13508 | + |
|---|
| 13509 | + // Using a function as a watchExpression |
|---|
| 13510 | + var food; |
|---|
| 13511 | + scope.foodCounter = 0; |
|---|
| 13512 | + expect(scope.foodCounter).toEqual(0); |
|---|
| 13513 | + scope.$watch( |
|---|
| 13514 | + // This function returns the value being watched. It is called for each turn of the $digest loop |
|---|
| 13515 | + function() { return food; }, |
|---|
| 13516 | + // This is the change listener, called when the value returned from the above function changes |
|---|
| 13517 | + function(newValue, oldValue) { |
|---|
| 13518 | + if ( newValue !== oldValue ) { |
|---|
| 13519 | + // Only increment the counter if the value changed |
|---|
| 13520 | + scope.foodCounter = scope.foodCounter + 1; |
|---|
| 13521 | + } |
|---|
| 13522 | + } |
|---|
| 13523 | + ); |
|---|
| 13524 | + // No digest has been run so the counter will be zero |
|---|
| 13525 | + expect(scope.foodCounter).toEqual(0); |
|---|
| 13526 | + |
|---|
| 13527 | + // Run the digest but since food has not changed count will still be zero |
|---|
| 13528 | + scope.$digest(); |
|---|
| 13529 | + expect(scope.foodCounter).toEqual(0); |
|---|
| 13530 | + |
|---|
| 13531 | + // Update food and run digest. Now the counter will increment |
|---|
| 13532 | + food = 'cheeseburger'; |
|---|
| 13533 | + scope.$digest(); |
|---|
| 13534 | + expect(scope.foodCounter).toEqual(1); |
|---|
| 13535 | + |
|---|
| 13536 | + * ``` |
|---|
| 13537 | + * |
|---|
| 13538 | + * |
|---|
| 13539 | + * |
|---|
| 13540 | + * @param {(function()|string)} watchExpression Expression that is evaluated on each |
|---|
| 13541 | + * {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers |
|---|
| 13542 | + * a call to the `listener`. |
|---|
| 13543 | + * |
|---|
| 13544 | + * - `string`: Evaluated as {@link guide/expression expression} |
|---|
| 13545 | + * - `function(scope)`: called with current `scope` as a parameter. |
|---|
| 13546 | + * @param {function(newVal, oldVal, scope)} listener Callback called whenever the value |
|---|
| 13547 | + * of `watchExpression` changes. |
|---|
| 13548 | + * |
|---|
| 13549 | + * - `newVal` contains the current value of the `watchExpression` |
|---|
| 13550 | + * - `oldVal` contains the previous value of the `watchExpression` |
|---|
| 13551 | + * - `scope` refers to the current scope |
|---|
| 13552 | + * @param {boolean=} objectEquality Compare for object equality using {@link angular.equals} instead of |
|---|
| 13553 | + * comparing for reference equality. |
|---|
| 13554 | + * @returns {function()} Returns a deregistration function for this listener. |
|---|
| 13555 | + */ |
|---|
| 13556 | + $watch: function(watchExp, listener, objectEquality) { |
|---|
| 13557 | + var get = $parse(watchExp); |
|---|
| 13558 | + |
|---|
| 13559 | + if (get.$$watchDelegate) { |
|---|
| 13560 | + return get.$$watchDelegate(this, listener, objectEquality, get); |
|---|
| 13561 | + } |
|---|
| 13562 | + var scope = this, |
|---|
| 13563 | + array = scope.$$watchers, |
|---|
| 13564 | + watcher = { |
|---|
| 13565 | + fn: listener, |
|---|
| 13566 | + last: initWatchVal, |
|---|
| 13567 | + get: get, |
|---|
| 13568 | + exp: watchExp, |
|---|
| 13569 | + eq: !!objectEquality |
|---|
| 13570 | + }; |
|---|
| 13571 | + |
|---|
| 13572 | + lastDirtyWatch = null; |
|---|
| 13573 | + |
|---|
| 13574 | + if (!isFunction(listener)) { |
|---|
| 13575 | + watcher.fn = noop; |
|---|
| 13576 | + } |
|---|
| 13577 | + |
|---|
| 13578 | + if (!array) { |
|---|
| 13579 | + array = scope.$$watchers = []; |
|---|
| 13580 | + } |
|---|
| 13581 | + // we use unshift since we use a while loop in $digest for speed. |
|---|
| 13582 | + // the while loop reads in reverse order. |
|---|
| 13583 | + array.unshift(watcher); |
|---|
| 13584 | + |
|---|
| 13585 | + return function deregisterWatch() { |
|---|
| 13586 | + arrayRemove(array, watcher); |
|---|
| 13587 | + lastDirtyWatch = null; |
|---|
| 13588 | + }; |
|---|
| 13589 | + }, |
|---|
| 13590 | + |
|---|
| 13591 | + /** |
|---|
| 13592 | + * @ngdoc method |
|---|
| 13593 | + * @name $rootScope.Scope#$watchGroup |
|---|
| 13594 | + * @kind function |
|---|
| 13595 | + * |
|---|
| 13596 | + * @description |
|---|
| 13597 | + * A variant of {@link ng.$rootScope.Scope#$watch $watch()} where it watches an array of `watchExpressions`. |
|---|
| 13598 | + * If any one expression in the collection changes the `listener` is executed. |
|---|
| 13599 | + * |
|---|
| 13600 | + * - The items in the `watchExpressions` array are observed via standard $watch operation and are examined on every |
|---|
| 13601 | + * call to $digest() to see if any items changes. |
|---|
| 13602 | + * - The `listener` is called whenever any expression in the `watchExpressions` array changes. |
|---|
| 13603 | + * |
|---|
| 13604 | + * @param {Array.<string|Function(scope)>} watchExpressions Array of expressions that will be individually |
|---|
| 13605 | + * watched using {@link ng.$rootScope.Scope#$watch $watch()} |
|---|
| 13606 | + * |
|---|
| 13607 | + * @param {function(newValues, oldValues, scope)} listener Callback called whenever the return value of any |
|---|
| 13608 | + * expression in `watchExpressions` changes |
|---|
| 13609 | + * The `newValues` array contains the current values of the `watchExpressions`, with the indexes matching |
|---|
| 13610 | + * those of `watchExpression` |
|---|
| 13611 | + * and the `oldValues` array contains the previous values of the `watchExpressions`, with the indexes matching |
|---|
| 13612 | + * those of `watchExpression` |
|---|
| 13613 | + * The `scope` refers to the current scope. |
|---|
| 13614 | + * @returns {function()} Returns a de-registration function for all listeners. |
|---|
| 13615 | + */ |
|---|
| 13616 | + $watchGroup: function(watchExpressions, listener) { |
|---|
| 13617 | + var oldValues = new Array(watchExpressions.length); |
|---|
| 13618 | + var newValues = new Array(watchExpressions.length); |
|---|
| 13619 | + var deregisterFns = []; |
|---|
| 13620 | + var self = this; |
|---|
| 13621 | + var changeReactionScheduled = false; |
|---|
| 13622 | + var firstRun = true; |
|---|
| 13623 | + |
|---|
| 13624 | + if (!watchExpressions.length) { |
|---|
| 13625 | + // No expressions means we call the listener ASAP |
|---|
| 13626 | + var shouldCall = true; |
|---|
| 13627 | + self.$evalAsync(function () { |
|---|
| 13628 | + if (shouldCall) listener(newValues, newValues, self); |
|---|
| 13629 | + }); |
|---|
| 13630 | + return function deregisterWatchGroup() { |
|---|
| 13631 | + shouldCall = false; |
|---|
| 13632 | + }; |
|---|
| 13633 | + } |
|---|
| 13634 | + |
|---|
| 13635 | + if (watchExpressions.length === 1) { |
|---|
| 13636 | + // Special case size of one |
|---|
| 13637 | + return this.$watch(watchExpressions[0], function watchGroupAction(value, oldValue, scope) { |
|---|
| 13638 | + newValues[0] = value; |
|---|
| 13639 | + oldValues[0] = oldValue; |
|---|
| 13640 | + listener(newValues, (value === oldValue) ? newValues : oldValues, scope); |
|---|
| 13641 | + }); |
|---|
| 13642 | + } |
|---|
| 13643 | + |
|---|
| 13644 | + forEach(watchExpressions, function (expr, i) { |
|---|
| 13645 | + var unwatchFn = self.$watch(expr, function watchGroupSubAction(value, oldValue) { |
|---|
| 13646 | + newValues[i] = value; |
|---|
| 13647 | + oldValues[i] = oldValue; |
|---|
| 13648 | + if (!changeReactionScheduled) { |
|---|
| 13649 | + changeReactionScheduled = true; |
|---|
| 13650 | + self.$evalAsync(watchGroupAction); |
|---|
| 13651 | + } |
|---|
| 13652 | + }); |
|---|
| 13653 | + deregisterFns.push(unwatchFn); |
|---|
| 13654 | + }); |
|---|
| 13655 | + |
|---|
| 13656 | + function watchGroupAction() { |
|---|
| 13657 | + changeReactionScheduled = false; |
|---|
| 13658 | + |
|---|
| 13659 | + if (firstRun) { |
|---|
| 13660 | + firstRun = false; |
|---|
| 13661 | + listener(newValues, newValues, self); |
|---|
| 13662 | + } else { |
|---|
| 13663 | + listener(newValues, oldValues, self); |
|---|
| 13664 | + } |
|---|
| 13665 | + } |
|---|
| 13666 | + |
|---|
| 13667 | + return function deregisterWatchGroup() { |
|---|
| 13668 | + while (deregisterFns.length) { |
|---|
| 13669 | + deregisterFns.shift()(); |
|---|
| 13670 | + } |
|---|
| 13671 | + }; |
|---|
| 13672 | + }, |
|---|
| 13673 | + |
|---|
| 13674 | + |
|---|
| 13675 | + /** |
|---|
| 13676 | + * @ngdoc method |
|---|
| 13677 | + * @name $rootScope.Scope#$watchCollection |
|---|
| 13678 | + * @kind function |
|---|
| 13679 | + * |
|---|
| 13680 | + * @description |
|---|
| 13681 | + * Shallow watches the properties of an object and fires whenever any of the properties change |
|---|
| 13682 | + * (for arrays, this implies watching the array items; for object maps, this implies watching |
|---|
| 13683 | + * the properties). If a change is detected, the `listener` callback is fired. |
|---|
| 13684 | + * |
|---|
| 13685 | + * - The `obj` collection is observed via standard $watch operation and is examined on every |
|---|
| 13686 | + * call to $digest() to see if any items have been added, removed, or moved. |
|---|
| 13687 | + * - The `listener` is called whenever anything within the `obj` has changed. Examples include |
|---|
| 13688 | + * adding, removing, and moving items belonging to an object or array. |
|---|
| 13689 | + * |
|---|
| 13690 | + * |
|---|
| 13691 | + * # Example |
|---|
| 13692 | + * ```js |
|---|
| 13693 | + $scope.names = ['igor', 'matias', 'misko', 'james']; |
|---|
| 13694 | + $scope.dataCount = 4; |
|---|
| 13695 | + |
|---|
| 13696 | + $scope.$watchCollection('names', function(newNames, oldNames) { |
|---|
| 13697 | + $scope.dataCount = newNames.length; |
|---|
| 13698 | + }); |
|---|
| 13699 | + |
|---|
| 13700 | + expect($scope.dataCount).toEqual(4); |
|---|
| 13701 | + $scope.$digest(); |
|---|
| 13702 | + |
|---|
| 13703 | + //still at 4 ... no changes |
|---|
| 13704 | + expect($scope.dataCount).toEqual(4); |
|---|
| 13705 | + |
|---|
| 13706 | + $scope.names.pop(); |
|---|
| 13707 | + $scope.$digest(); |
|---|
| 13708 | + |
|---|
| 13709 | + //now there's been a change |
|---|
| 13710 | + expect($scope.dataCount).toEqual(3); |
|---|
| 13711 | + * ``` |
|---|
| 13712 | + * |
|---|
| 13713 | + * |
|---|
| 13714 | + * @param {string|function(scope)} obj Evaluated as {@link guide/expression expression}. The |
|---|
| 13715 | + * expression value should evaluate to an object or an array which is observed on each |
|---|
| 13716 | + * {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the |
|---|
| 13717 | + * collection will trigger a call to the `listener`. |
|---|
| 13718 | + * |
|---|
| 13719 | + * @param {function(newCollection, oldCollection, scope)} listener a callback function called |
|---|
| 13720 | + * when a change is detected. |
|---|
| 13721 | + * - The `newCollection` object is the newly modified data obtained from the `obj` expression |
|---|
| 13722 | + * - The `oldCollection` object is a copy of the former collection data. |
|---|
| 13723 | + * Due to performance considerations, the`oldCollection` value is computed only if the |
|---|
| 13724 | + * `listener` function declares two or more arguments. |
|---|
| 13725 | + * - The `scope` argument refers to the current scope. |
|---|
| 13726 | + * |
|---|
| 13727 | + * @returns {function()} Returns a de-registration function for this listener. When the |
|---|
| 13728 | + * de-registration function is executed, the internal watch operation is terminated. |
|---|
| 13729 | + */ |
|---|
| 13730 | + $watchCollection: function(obj, listener) { |
|---|
| 13731 | + $watchCollectionInterceptor.$stateful = true; |
|---|
| 13732 | + |
|---|
| 13733 | + var self = this; |
|---|
| 13734 | + // the current value, updated on each dirty-check run |
|---|
| 13735 | + var newValue; |
|---|
| 13736 | + // a shallow copy of the newValue from the last dirty-check run, |
|---|
| 13737 | + // updated to match newValue during dirty-check run |
|---|
| 13738 | + var oldValue; |
|---|
| 13739 | + // a shallow copy of the newValue from when the last change happened |
|---|
| 13740 | + var veryOldValue; |
|---|
| 13741 | + // only track veryOldValue if the listener is asking for it |
|---|
| 13742 | + var trackVeryOldValue = (listener.length > 1); |
|---|
| 13743 | + var changeDetected = 0; |
|---|
| 13744 | + var changeDetector = $parse(obj, $watchCollectionInterceptor); |
|---|
| 13745 | + var internalArray = []; |
|---|
| 13746 | + var internalObject = {}; |
|---|
| 13747 | + var initRun = true; |
|---|
| 13748 | + var oldLength = 0; |
|---|
| 13749 | + |
|---|
| 13750 | + function $watchCollectionInterceptor(_value) { |
|---|
| 13751 | + newValue = _value; |
|---|
| 13752 | + var newLength, key, bothNaN, newItem, oldItem; |
|---|
| 13753 | + |
|---|
| 13754 | + if (!isObject(newValue)) { // if primitive |
|---|
| 13755 | + if (oldValue !== newValue) { |
|---|
| 13756 | + oldValue = newValue; |
|---|
| 13757 | + changeDetected++; |
|---|
| 13758 | + } |
|---|
| 13759 | + } else if (isArrayLike(newValue)) { |
|---|
| 13760 | + if (oldValue !== internalArray) { |
|---|
| 13761 | + // we are transitioning from something which was not an array into array. |
|---|
| 13762 | + oldValue = internalArray; |
|---|
| 13763 | + oldLength = oldValue.length = 0; |
|---|
| 13764 | + changeDetected++; |
|---|
| 13765 | + } |
|---|
| 13766 | + |
|---|
| 13767 | + newLength = newValue.length; |
|---|
| 13768 | + |
|---|
| 13769 | + if (oldLength !== newLength) { |
|---|
| 13770 | + // if lengths do not match we need to trigger change notification |
|---|
| 13771 | + changeDetected++; |
|---|
| 13772 | + oldValue.length = oldLength = newLength; |
|---|
| 13773 | + } |
|---|
| 13774 | + // copy the items to oldValue and look for changes. |
|---|
| 13775 | + for (var i = 0; i < newLength; i++) { |
|---|
| 13776 | + oldItem = oldValue[i]; |
|---|
| 13777 | + newItem = newValue[i]; |
|---|
| 13778 | + |
|---|
| 13779 | + bothNaN = (oldItem !== oldItem) && (newItem !== newItem); |
|---|
| 13780 | + if (!bothNaN && (oldItem !== newItem)) { |
|---|
| 13781 | + changeDetected++; |
|---|
| 13782 | + oldValue[i] = newItem; |
|---|
| 13783 | + } |
|---|
| 13784 | + } |
|---|
| 13785 | + } else { |
|---|
| 13786 | + if (oldValue !== internalObject) { |
|---|
| 13787 | + // we are transitioning from something which was not an object into object. |
|---|
| 13788 | + oldValue = internalObject = {}; |
|---|
| 13789 | + oldLength = 0; |
|---|
| 13790 | + changeDetected++; |
|---|
| 13791 | + } |
|---|
| 13792 | + // copy the items to oldValue and look for changes. |
|---|
| 13793 | + newLength = 0; |
|---|
| 13794 | + for (key in newValue) { |
|---|
| 13795 | + if (newValue.hasOwnProperty(key)) { |
|---|
| 13796 | + newLength++; |
|---|
| 13797 | + newItem = newValue[key]; |
|---|
| 13798 | + oldItem = oldValue[key]; |
|---|
| 13799 | + |
|---|
| 13800 | + if (key in oldValue) { |
|---|
| 13801 | + bothNaN = (oldItem !== oldItem) && (newItem !== newItem); |
|---|
| 13802 | + if (!bothNaN && (oldItem !== newItem)) { |
|---|
| 13803 | + changeDetected++; |
|---|
| 13804 | + oldValue[key] = newItem; |
|---|
| 13805 | + } |
|---|
| 13806 | + } else { |
|---|
| 13807 | + oldLength++; |
|---|
| 13808 | + oldValue[key] = newItem; |
|---|
| 13809 | + changeDetected++; |
|---|
| 13810 | + } |
|---|
| 13811 | + } |
|---|
| 13812 | + } |
|---|
| 13813 | + if (oldLength > newLength) { |
|---|
| 13814 | + // we used to have more keys, need to find them and destroy them. |
|---|
| 13815 | + changeDetected++; |
|---|
| 13816 | + for(key in oldValue) { |
|---|
| 13817 | + if (!newValue.hasOwnProperty(key)) { |
|---|
| 13818 | + oldLength--; |
|---|
| 13819 | + delete oldValue[key]; |
|---|
| 13820 | + } |
|---|
| 13821 | + } |
|---|
| 13822 | + } |
|---|
| 13823 | + } |
|---|
| 13824 | + return changeDetected; |
|---|
| 13825 | + } |
|---|
| 13826 | + |
|---|
| 13827 | + function $watchCollectionAction() { |
|---|
| 13828 | + if (initRun) { |
|---|
| 13829 | + initRun = false; |
|---|
| 13830 | + listener(newValue, newValue, self); |
|---|
| 13831 | + } else { |
|---|
| 13832 | + listener(newValue, veryOldValue, self); |
|---|
| 13833 | + } |
|---|
| 13834 | + |
|---|
| 13835 | + // make a copy for the next time a collection is changed |
|---|
| 13836 | + if (trackVeryOldValue) { |
|---|
| 13837 | + if (!isObject(newValue)) { |
|---|
| 13838 | + //primitive |
|---|
| 13839 | + veryOldValue = newValue; |
|---|
| 13840 | + } else if (isArrayLike(newValue)) { |
|---|
| 13841 | + veryOldValue = new Array(newValue.length); |
|---|
| 13842 | + for (var i = 0; i < newValue.length; i++) { |
|---|
| 13843 | + veryOldValue[i] = newValue[i]; |
|---|
| 13844 | + } |
|---|
| 13845 | + } else { // if object |
|---|
| 13846 | + veryOldValue = {}; |
|---|
| 13847 | + for (var key in newValue) { |
|---|
| 13848 | + if (hasOwnProperty.call(newValue, key)) { |
|---|
| 13849 | + veryOldValue[key] = newValue[key]; |
|---|
| 13850 | + } |
|---|
| 13851 | + } |
|---|
| 13852 | + } |
|---|
| 13853 | + } |
|---|
| 13854 | + } |
|---|
| 13855 | + |
|---|
| 13856 | + return this.$watch(changeDetector, $watchCollectionAction); |
|---|
| 13857 | + }, |
|---|
| 13858 | + |
|---|
| 13859 | + /** |
|---|
| 13860 | + * @ngdoc method |
|---|
| 13861 | + * @name $rootScope.Scope#$digest |
|---|
| 13862 | + * @kind function |
|---|
| 13863 | + * |
|---|
| 13864 | + * @description |
|---|
| 13865 | + * Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and |
|---|
| 13866 | + * its children. Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change |
|---|
| 13867 | + * the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers} |
|---|
| 13868 | + * until no more listeners are firing. This means that it is possible to get into an infinite |
|---|
| 13869 | + * loop. This function will throw `'Maximum iteration limit exceeded.'` if the number of |
|---|
| 13870 | + * iterations exceeds 10. |
|---|
| 13871 | + * |
|---|
| 13872 | + * Usually, you don't call `$digest()` directly in |
|---|
| 13873 | + * {@link ng.directive:ngController controllers} or in |
|---|
| 13874 | + * {@link ng.$compileProvider#directive directives}. |
|---|
| 13875 | + * Instead, you should call {@link ng.$rootScope.Scope#$apply $apply()} (typically from within |
|---|
| 13876 | + * a {@link ng.$compileProvider#directive directive}), which will force a `$digest()`. |
|---|
| 13877 | + * |
|---|
| 13878 | + * If you want to be notified whenever `$digest()` is called, |
|---|
| 13879 | + * you can register a `watchExpression` function with |
|---|
| 13880 | + * {@link ng.$rootScope.Scope#$watch $watch()} with no `listener`. |
|---|
| 13881 | + * |
|---|
| 13882 | + * In unit tests, you may need to call `$digest()` to simulate the scope life cycle. |
|---|
| 13883 | + * |
|---|
| 13884 | + * # Example |
|---|
| 13885 | + * ```js |
|---|
| 13886 | + var scope = ...; |
|---|
| 13887 | + scope.name = 'misko'; |
|---|
| 13888 | + scope.counter = 0; |
|---|
| 13889 | + |
|---|
| 13890 | + expect(scope.counter).toEqual(0); |
|---|
| 13891 | + scope.$watch('name', function(newValue, oldValue) { |
|---|
| 13892 | + scope.counter = scope.counter + 1; |
|---|
| 13893 | + }); |
|---|
| 13894 | + expect(scope.counter).toEqual(0); |
|---|
| 13895 | + |
|---|
| 13896 | + scope.$digest(); |
|---|
| 13897 | + // the listener is always called during the first $digest loop after it was registered |
|---|
| 13898 | + expect(scope.counter).toEqual(1); |
|---|
| 13899 | + |
|---|
| 13900 | + scope.$digest(); |
|---|
| 13901 | + // but now it will not be called unless the value changes |
|---|
| 13902 | + expect(scope.counter).toEqual(1); |
|---|
| 13903 | + |
|---|
| 13904 | + scope.name = 'adam'; |
|---|
| 13905 | + scope.$digest(); |
|---|
| 13906 | + expect(scope.counter).toEqual(2); |
|---|
| 13907 | + * ``` |
|---|
| 13908 | + * |
|---|
| 13909 | + */ |
|---|
| 13910 | + $digest: function() { |
|---|
| 13911 | + var watch, value, last, |
|---|
| 13912 | + watchers, |
|---|
| 13913 | + length, |
|---|
| 13914 | + dirty, ttl = TTL, |
|---|
| 13915 | + next, current, target = this, |
|---|
| 13916 | + watchLog = [], |
|---|
| 13917 | + logIdx, logMsg, asyncTask; |
|---|
| 13918 | + |
|---|
| 13919 | + beginPhase('$digest'); |
|---|
| 13920 | + // Check for changes to browser url that happened in sync before the call to $digest |
|---|
| 13921 | + $browser.$$checkUrlChange(); |
|---|
| 13922 | + |
|---|
| 13923 | + if (this === $rootScope && applyAsyncId !== null) { |
|---|
| 13924 | + // If this is the root scope, and $applyAsync has scheduled a deferred $apply(), then |
|---|
| 13925 | + // cancel the scheduled $apply and flush the queue of expressions to be evaluated. |
|---|
| 13926 | + $browser.defer.cancel(applyAsyncId); |
|---|
| 13927 | + flushApplyAsync(); |
|---|
| 13928 | + } |
|---|
| 13929 | + |
|---|
| 13930 | + lastDirtyWatch = null; |
|---|
| 13931 | + |
|---|
| 13932 | + do { // "while dirty" loop |
|---|
| 13933 | + dirty = false; |
|---|
| 13934 | + current = target; |
|---|
| 13935 | + |
|---|
| 13936 | + while(asyncQueue.length) { |
|---|
| 13937 | + try { |
|---|
| 13938 | + asyncTask = asyncQueue.shift(); |
|---|
| 13939 | + asyncTask.scope.$eval(asyncTask.expression); |
|---|
| 13940 | + } catch (e) { |
|---|
| 13941 | + $exceptionHandler(e); |
|---|
| 13942 | + } |
|---|
| 13943 | + lastDirtyWatch = null; |
|---|
| 13944 | + } |
|---|
| 13945 | + |
|---|
| 13946 | + traverseScopesLoop: |
|---|
| 13947 | + do { // "traverse the scopes" loop |
|---|
| 13948 | + if ((watchers = current.$$watchers)) { |
|---|
| 13949 | + // process our watches |
|---|
| 13950 | + length = watchers.length; |
|---|
| 13951 | + while (length--) { |
|---|
| 13952 | + try { |
|---|
| 13953 | + watch = watchers[length]; |
|---|
| 13954 | + // Most common watches are on primitives, in which case we can short |
|---|
| 13955 | + // circuit it with === operator, only when === fails do we use .equals |
|---|
| 13956 | + if (watch) { |
|---|
| 13957 | + if ((value = watch.get(current)) !== (last = watch.last) && |
|---|
| 13958 | + !(watch.eq |
|---|
| 13959 | + ? equals(value, last) |
|---|
| 13960 | + : (typeof value === 'number' && typeof last === 'number' |
|---|
| 13961 | + && isNaN(value) && isNaN(last)))) { |
|---|
| 13962 | + dirty = true; |
|---|
| 13963 | + lastDirtyWatch = watch; |
|---|
| 13964 | + watch.last = watch.eq ? copy(value, null) : value; |
|---|
| 13965 | + watch.fn(value, ((last === initWatchVal) ? value : last), current); |
|---|
| 13966 | + if (ttl < 5) { |
|---|
| 13967 | + logIdx = 4 - ttl; |
|---|
| 13968 | + if (!watchLog[logIdx]) watchLog[logIdx] = []; |
|---|
| 13969 | + logMsg = (isFunction(watch.exp)) |
|---|
| 13970 | + ? 'fn: ' + (watch.exp.name || watch.exp.toString()) |
|---|
| 13971 | + : watch.exp; |
|---|
| 13972 | + logMsg += '; newVal: ' + toJson(value) + '; oldVal: ' + toJson(last); |
|---|
| 13973 | + watchLog[logIdx].push(logMsg); |
|---|
| 13974 | + } |
|---|
| 13975 | + } else if (watch === lastDirtyWatch) { |
|---|
| 13976 | + // If the most recently dirty watcher is now clean, short circuit since the remaining watchers |
|---|
| 13977 | + // have already been tested. |
|---|
| 13978 | + dirty = false; |
|---|
| 13979 | + break traverseScopesLoop; |
|---|
| 13980 | + } |
|---|
| 13981 | + } |
|---|
| 13982 | + } catch (e) { |
|---|
| 13983 | + $exceptionHandler(e); |
|---|
| 13984 | + } |
|---|
| 13985 | + } |
|---|
| 13986 | + } |
|---|
| 13987 | + |
|---|
| 13988 | + // Insanity Warning: scope depth-first traversal |
|---|
| 13989 | + // yes, this code is a bit crazy, but it works and we have tests to prove it! |
|---|
| 13990 | + // this piece should be kept in sync with the traversal in $broadcast |
|---|
| 13991 | + if (!(next = (current.$$childHead || |
|---|
| 13992 | + (current !== target && current.$$nextSibling)))) { |
|---|
| 13993 | + while(current !== target && !(next = current.$$nextSibling)) { |
|---|
| 13994 | + current = current.$parent; |
|---|
| 13995 | + } |
|---|
| 13996 | + } |
|---|
| 13997 | + } while ((current = next)); |
|---|
| 13998 | + |
|---|
| 13999 | + // `break traverseScopesLoop;` takes us to here |
|---|
| 14000 | + |
|---|
| 14001 | + if((dirty || asyncQueue.length) && !(ttl--)) { |
|---|
| 14002 | + clearPhase(); |
|---|
| 14003 | + throw $rootScopeMinErr('infdig', |
|---|
| 14004 | + '{0} $digest() iterations reached. Aborting!\n' + |
|---|
| 14005 | + 'Watchers fired in the last 5 iterations: {1}', |
|---|
| 14006 | + TTL, toJson(watchLog)); |
|---|
| 14007 | + } |
|---|
| 14008 | + |
|---|
| 14009 | + } while (dirty || asyncQueue.length); |
|---|
| 14010 | + |
|---|
| 14011 | + clearPhase(); |
|---|
| 14012 | + |
|---|
| 14013 | + while(postDigestQueue.length) { |
|---|
| 14014 | + try { |
|---|
| 14015 | + postDigestQueue.shift()(); |
|---|
| 14016 | + } catch (e) { |
|---|
| 14017 | + $exceptionHandler(e); |
|---|
| 14018 | + } |
|---|
| 14019 | + } |
|---|
| 14020 | + }, |
|---|
| 14021 | + |
|---|
| 14022 | + |
|---|
| 14023 | + /** |
|---|
| 14024 | + * @ngdoc event |
|---|
| 14025 | + * @name $rootScope.Scope#$destroy |
|---|
| 14026 | + * @eventType broadcast on scope being destroyed |
|---|
| 14027 | + * |
|---|
| 14028 | + * @description |
|---|
| 14029 | + * Broadcasted when a scope and its children are being destroyed. |
|---|
| 14030 | + * |
|---|
| 14031 | + * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to |
|---|
| 14032 | + * clean up DOM bindings before an element is removed from the DOM. |
|---|
| 14033 | + */ |
|---|
| 14034 | + |
|---|
| 14035 | + /** |
|---|
| 14036 | + * @ngdoc method |
|---|
| 14037 | + * @name $rootScope.Scope#$destroy |
|---|
| 14038 | + * @kind function |
|---|
| 14039 | + * |
|---|
| 14040 | + * @description |
|---|
| 14041 | + * Removes the current scope (and all of its children) from the parent scope. Removal implies |
|---|
| 14042 | + * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer |
|---|
| 14043 | + * propagate to the current scope and its children. Removal also implies that the current |
|---|
| 14044 | + * scope is eligible for garbage collection. |
|---|
| 14045 | + * |
|---|
| 14046 | + * The `$destroy()` is usually used by directives such as |
|---|
| 14047 | + * {@link ng.directive:ngRepeat ngRepeat} for managing the |
|---|
| 14048 | + * unrolling of the loop. |
|---|
| 14049 | + * |
|---|
| 14050 | + * Just before a scope is destroyed, a `$destroy` event is broadcasted on this scope. |
|---|
| 14051 | + * Application code can register a `$destroy` event handler that will give it a chance to |
|---|
| 14052 | + * perform any necessary cleanup. |
|---|
| 14053 | + * |
|---|
| 14054 | + * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to |
|---|
| 14055 | + * clean up DOM bindings before an element is removed from the DOM. |
|---|
| 14056 | + */ |
|---|
| 14057 | + $destroy: function() { |
|---|
| 14058 | + // we can't destroy the root scope or a scope that has been already destroyed |
|---|
| 14059 | + if (this.$$destroyed) return; |
|---|
| 14060 | + var parent = this.$parent; |
|---|
| 14061 | + |
|---|
| 14062 | + this.$broadcast('$destroy'); |
|---|
| 14063 | + this.$$destroyed = true; |
|---|
| 14064 | + if (this === $rootScope) return; |
|---|
| 14065 | + |
|---|
| 14066 | + for (var eventName in this.$$listenerCount) { |
|---|
| 14067 | + decrementListenerCount(this, this.$$listenerCount[eventName], eventName); |
|---|
| 14068 | + } |
|---|
| 14069 | + |
|---|
| 14070 | + // sever all the references to parent scopes (after this cleanup, the current scope should |
|---|
| 14071 | + // not be retained by any of our references and should be eligible for garbage collection) |
|---|
| 14072 | + if (parent.$$childHead == this) parent.$$childHead = this.$$nextSibling; |
|---|
| 14073 | + if (parent.$$childTail == this) parent.$$childTail = this.$$prevSibling; |
|---|
| 14074 | + if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling; |
|---|
| 14075 | + if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling; |
|---|
| 14076 | + |
|---|
| 14077 | + // Disable listeners, watchers and apply/digest methods |
|---|
| 14078 | + this.$destroy = this.$digest = this.$apply = this.$evalAsync = this.$applyAsync = noop; |
|---|
| 14079 | + this.$on = this.$watch = this.$watchGroup = function() { return noop; }; |
|---|
| 14080 | + this.$$listeners = {}; |
|---|
| 14081 | + |
|---|
| 14082 | + // All of the code below is bogus code that works around V8's memory leak via optimized code |
|---|
| 14083 | + // and inline caches. |
|---|
| 14084 | + // |
|---|
| 14085 | + // see: |
|---|
| 14086 | + // - https://code.google.com/p/v8/issues/detail?id=2073#c26 |
|---|
| 14087 | + // - https://github.com/angular/angular.js/issues/6794#issuecomment-38648909 |
|---|
| 14088 | + // - https://github.com/angular/angular.js/issues/1313#issuecomment-10378451 |
|---|
| 14089 | + |
|---|
| 14090 | + this.$parent = this.$$nextSibling = this.$$prevSibling = this.$$childHead = |
|---|
| 14091 | + this.$$childTail = this.$root = this.$$watchers = null; |
|---|
| 14092 | + }, |
|---|
| 14093 | + |
|---|
| 14094 | + /** |
|---|
| 14095 | + * @ngdoc method |
|---|
| 14096 | + * @name $rootScope.Scope#$eval |
|---|
| 14097 | + * @kind function |
|---|
| 14098 | + * |
|---|
| 14099 | + * @description |
|---|
| 14100 | + * Executes the `expression` on the current scope and returns the result. Any exceptions in |
|---|
| 14101 | + * the expression are propagated (uncaught). This is useful when evaluating Angular |
|---|
| 14102 | + * expressions. |
|---|
| 14103 | + * |
|---|
| 14104 | + * # Example |
|---|
| 14105 | + * ```js |
|---|
| 14106 | + var scope = ng.$rootScope.Scope(); |
|---|
| 14107 | + scope.a = 1; |
|---|
| 14108 | + scope.b = 2; |
|---|
| 14109 | + |
|---|
| 14110 | + expect(scope.$eval('a+b')).toEqual(3); |
|---|
| 14111 | + expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3); |
|---|
| 14112 | + * ``` |
|---|
| 14113 | + * |
|---|
| 14114 | + * @param {(string|function())=} expression An angular expression to be executed. |
|---|
| 14115 | + * |
|---|
| 14116 | + * - `string`: execute using the rules as defined in {@link guide/expression expression}. |
|---|
| 14117 | + * - `function(scope)`: execute the function with the current `scope` parameter. |
|---|
| 14118 | + * |
|---|
| 14119 | + * @param {(object)=} locals Local variables object, useful for overriding values in scope. |
|---|
| 14120 | + * @returns {*} The result of evaluating the expression. |
|---|
| 14121 | + */ |
|---|
| 14122 | + $eval: function(expr, locals) { |
|---|
| 14123 | + return $parse(expr)(this, locals); |
|---|
| 14124 | + }, |
|---|
| 14125 | + |
|---|
| 14126 | + /** |
|---|
| 14127 | + * @ngdoc method |
|---|
| 14128 | + * @name $rootScope.Scope#$evalAsync |
|---|
| 14129 | + * @kind function |
|---|
| 14130 | + * |
|---|
| 14131 | + * @description |
|---|
| 14132 | + * Executes the expression on the current scope at a later point in time. |
|---|
| 14133 | + * |
|---|
| 14134 | + * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only |
|---|
| 14135 | + * that: |
|---|
| 14136 | + * |
|---|
| 14137 | + * - it will execute after the function that scheduled the evaluation (preferably before DOM |
|---|
| 14138 | + * rendering). |
|---|
| 14139 | + * - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after |
|---|
| 14140 | + * `expression` execution. |
|---|
| 14141 | + * |
|---|
| 14142 | + * Any exceptions from the execution of the expression are forwarded to the |
|---|
| 14143 | + * {@link ng.$exceptionHandler $exceptionHandler} service. |
|---|
| 14144 | + * |
|---|
| 14145 | + * __Note:__ if this function is called outside of a `$digest` cycle, a new `$digest` cycle |
|---|
| 14146 | + * will be scheduled. However, it is encouraged to always call code that changes the model |
|---|
| 14147 | + * from within an `$apply` call. That includes code evaluated via `$evalAsync`. |
|---|
| 14148 | + * |
|---|
| 14149 | + * @param {(string|function())=} expression An angular expression to be executed. |
|---|
| 14150 | + * |
|---|
| 14151 | + * - `string`: execute using the rules as defined in {@link guide/expression expression}. |
|---|
| 14152 | + * - `function(scope)`: execute the function with the current `scope` parameter. |
|---|
| 14153 | + * |
|---|
| 14154 | + */ |
|---|
| 14155 | + $evalAsync: function(expr) { |
|---|
| 14156 | + // if we are outside of an $digest loop and this is the first time we are scheduling async |
|---|
| 14157 | + // task also schedule async auto-flush |
|---|
| 14158 | + if (!$rootScope.$$phase && !asyncQueue.length) { |
|---|
| 14159 | + $browser.defer(function() { |
|---|
| 14160 | + if (asyncQueue.length) { |
|---|
| 14161 | + $rootScope.$digest(); |
|---|
| 14162 | + } |
|---|
| 14163 | + }); |
|---|
| 14164 | + } |
|---|
| 14165 | + |
|---|
| 14166 | + asyncQueue.push({scope: this, expression: expr}); |
|---|
| 14167 | + }, |
|---|
| 14168 | + |
|---|
| 14169 | + $$postDigest : function(fn) { |
|---|
| 14170 | + postDigestQueue.push(fn); |
|---|
| 14171 | + }, |
|---|
| 14172 | + |
|---|
| 14173 | + /** |
|---|
| 14174 | + * @ngdoc method |
|---|
| 14175 | + * @name $rootScope.Scope#$apply |
|---|
| 14176 | + * @kind function |
|---|
| 14177 | + * |
|---|
| 14178 | + * @description |
|---|
| 14179 | + * `$apply()` is used to execute an expression in angular from outside of the angular |
|---|
| 14180 | + * framework. (For example from browser DOM events, setTimeout, XHR or third party libraries). |
|---|
| 14181 | + * Because we are calling into the angular framework we need to perform proper scope life |
|---|
| 14182 | + * cycle of {@link ng.$exceptionHandler exception handling}, |
|---|
| 14183 | + * {@link ng.$rootScope.Scope#$digest executing watches}. |
|---|
| 14184 | + * |
|---|
| 14185 | + * ## Life cycle |
|---|
| 14186 | + * |
|---|
| 14187 | + * # Pseudo-Code of `$apply()` |
|---|
| 14188 | + * ```js |
|---|
| 14189 | + function $apply(expr) { |
|---|
| 14190 | + try { |
|---|
| 14191 | + return $eval(expr); |
|---|
| 14192 | + } catch (e) { |
|---|
| 14193 | + $exceptionHandler(e); |
|---|
| 14194 | + } finally { |
|---|
| 14195 | + $root.$digest(); |
|---|
| 14196 | + } |
|---|
| 14197 | + } |
|---|
| 14198 | + * ``` |
|---|
| 14199 | + * |
|---|
| 14200 | + * |
|---|
| 14201 | + * Scope's `$apply()` method transitions through the following stages: |
|---|
| 14202 | + * |
|---|
| 14203 | + * 1. The {@link guide/expression expression} is executed using the |
|---|
| 14204 | + * {@link ng.$rootScope.Scope#$eval $eval()} method. |
|---|
| 14205 | + * 2. Any exceptions from the execution of the expression are forwarded to the |
|---|
| 14206 | + * {@link ng.$exceptionHandler $exceptionHandler} service. |
|---|
| 14207 | + * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the |
|---|
| 14208 | + * expression was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method. |
|---|
| 14209 | + * |
|---|
| 14210 | + * |
|---|
| 14211 | + * @param {(string|function())=} exp An angular expression to be executed. |
|---|
| 14212 | + * |
|---|
| 14213 | + * - `string`: execute using the rules as defined in {@link guide/expression expression}. |
|---|
| 14214 | + * - `function(scope)`: execute the function with current `scope` parameter. |
|---|
| 14215 | + * |
|---|
| 14216 | + * @returns {*} The result of evaluating the expression. |
|---|
| 14217 | + */ |
|---|
| 14218 | + $apply: function(expr) { |
|---|
| 14219 | + try { |
|---|
| 14220 | + beginPhase('$apply'); |
|---|
| 14221 | + return this.$eval(expr); |
|---|
| 14222 | + } catch (e) { |
|---|
| 14223 | + $exceptionHandler(e); |
|---|
| 14224 | + } finally { |
|---|
| 14225 | + clearPhase(); |
|---|
| 14226 | + try { |
|---|
| 14227 | + $rootScope.$digest(); |
|---|
| 14228 | + } catch (e) { |
|---|
| 14229 | + $exceptionHandler(e); |
|---|
| 14230 | + throw e; |
|---|
| 14231 | + } |
|---|
| 14232 | + } |
|---|
| 14233 | + }, |
|---|
| 14234 | + |
|---|
| 14235 | + /** |
|---|
| 14236 | + * @ngdoc method |
|---|
| 14237 | + * @name $rootScope.Scope#$applyAsync |
|---|
| 14238 | + * @kind function |
|---|
| 14239 | + * |
|---|
| 14240 | + * @description |
|---|
| 14241 | + * Schedule the invokation of $apply to occur at a later time. The actual time difference |
|---|
| 14242 | + * varies across browsers, but is typically around ~10 milliseconds. |
|---|
| 14243 | + * |
|---|
| 14244 | + * This can be used to queue up multiple expressions which need to be evaluated in the same |
|---|
| 14245 | + * digest. |
|---|
| 14246 | + * |
|---|
| 14247 | + * @param {(string|function())=} exp An angular expression to be executed. |
|---|
| 14248 | + * |
|---|
| 14249 | + * - `string`: execute using the rules as defined in {@link guide/expression expression}. |
|---|
| 14250 | + * - `function(scope)`: execute the function with current `scope` parameter. |
|---|
| 14251 | + */ |
|---|
| 14252 | + $applyAsync: function(expr) { |
|---|
| 14253 | + var scope = this; |
|---|
| 14254 | + expr && applyAsyncQueue.push($applyAsyncExpression); |
|---|
| 14255 | + scheduleApplyAsync(); |
|---|
| 14256 | + |
|---|
| 14257 | + function $applyAsyncExpression() { |
|---|
| 14258 | + scope.$eval(expr); |
|---|
| 14259 | + } |
|---|
| 14260 | + }, |
|---|
| 14261 | + |
|---|
| 14262 | + /** |
|---|
| 14263 | + * @ngdoc method |
|---|
| 14264 | + * @name $rootScope.Scope#$on |
|---|
| 14265 | + * @kind function |
|---|
| 14266 | + * |
|---|
| 14267 | + * @description |
|---|
| 14268 | + * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for |
|---|
| 14269 | + * discussion of event life cycle. |
|---|
| 14270 | + * |
|---|
| 14271 | + * The event listener function format is: `function(event, args...)`. The `event` object |
|---|
| 14272 | + * passed into the listener has the following attributes: |
|---|
| 14273 | + * |
|---|
| 14274 | + * - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or |
|---|
| 14275 | + * `$broadcast`-ed. |
|---|
| 14276 | + * - `currentScope` - `{Scope}`: the scope that is currently handling the event. Once the |
|---|
| 14277 | + * event propagates through the scope hierarchy, this property is set to null. |
|---|
| 14278 | + * - `name` - `{string}`: name of the event. |
|---|
| 14279 | + * - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel |
|---|
| 14280 | + * further event propagation (available only for events that were `$emit`-ed). |
|---|
| 14281 | + * - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag |
|---|
| 14282 | + * to true. |
|---|
| 14283 | + * - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called. |
|---|
| 14284 | + * |
|---|
| 14285 | + * @param {string} name Event name to listen on. |
|---|
| 14286 | + * @param {function(event, ...args)} listener Function to call when the event is emitted. |
|---|
| 14287 | + * @returns {function()} Returns a deregistration function for this listener. |
|---|
| 14288 | + */ |
|---|
| 14289 | + $on: function(name, listener) { |
|---|
| 14290 | + var namedListeners = this.$$listeners[name]; |
|---|
| 14291 | + if (!namedListeners) { |
|---|
| 14292 | + this.$$listeners[name] = namedListeners = []; |
|---|
| 14293 | + } |
|---|
| 14294 | + namedListeners.push(listener); |
|---|
| 14295 | + |
|---|
| 14296 | + var current = this; |
|---|
| 14297 | + do { |
|---|
| 14298 | + if (!current.$$listenerCount[name]) { |
|---|
| 14299 | + current.$$listenerCount[name] = 0; |
|---|
| 14300 | + } |
|---|
| 14301 | + current.$$listenerCount[name]++; |
|---|
| 14302 | + } while ((current = current.$parent)); |
|---|
| 14303 | + |
|---|
| 14304 | + var self = this; |
|---|
| 14305 | + return function() { |
|---|
| 14306 | + namedListeners[namedListeners.indexOf(listener)] = null; |
|---|
| 14307 | + decrementListenerCount(self, 1, name); |
|---|
| 14308 | + }; |
|---|
| 14309 | + }, |
|---|
| 14310 | + |
|---|
| 14311 | + |
|---|
| 14312 | + /** |
|---|
| 14313 | + * @ngdoc method |
|---|
| 14314 | + * @name $rootScope.Scope#$emit |
|---|
| 14315 | + * @kind function |
|---|
| 14316 | + * |
|---|
| 14317 | + * @description |
|---|
| 14318 | + * Dispatches an event `name` upwards through the scope hierarchy notifying the |
|---|
| 14319 | + * registered {@link ng.$rootScope.Scope#$on} listeners. |
|---|
| 14320 | + * |
|---|
| 14321 | + * The event life cycle starts at the scope on which `$emit` was called. All |
|---|
| 14322 | + * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get |
|---|
| 14323 | + * notified. Afterwards, the event traverses upwards toward the root scope and calls all |
|---|
| 14324 | + * registered listeners along the way. The event will stop propagating if one of the listeners |
|---|
| 14325 | + * cancels it. |
|---|
| 14326 | + * |
|---|
| 14327 | + * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed |
|---|
| 14328 | + * onto the {@link ng.$exceptionHandler $exceptionHandler} service. |
|---|
| 14329 | + * |
|---|
| 14330 | + * @param {string} name Event name to emit. |
|---|
| 14331 | + * @param {...*} args Optional one or more arguments which will be passed onto the event listeners. |
|---|
| 14332 | + * @return {Object} Event object (see {@link ng.$rootScope.Scope#$on}). |
|---|
| 14333 | + */ |
|---|
| 14334 | + $emit: function(name, args) { |
|---|
| 14335 | + var empty = [], |
|---|
| 14336 | + namedListeners, |
|---|
| 14337 | + scope = this, |
|---|
| 14338 | + stopPropagation = false, |
|---|
| 14339 | + event = { |
|---|
| 14340 | + name: name, |
|---|
| 14341 | + targetScope: scope, |
|---|
| 14342 | + stopPropagation: function() {stopPropagation = true;}, |
|---|
| 14343 | + preventDefault: function() { |
|---|
| 14344 | + event.defaultPrevented = true; |
|---|
| 14345 | + }, |
|---|
| 14346 | + defaultPrevented: false |
|---|
| 14347 | + }, |
|---|
| 14348 | + listenerArgs = concat([event], arguments, 1), |
|---|
| 14349 | + i, length; |
|---|
| 14350 | + |
|---|
| 14351 | + do { |
|---|
| 14352 | + namedListeners = scope.$$listeners[name] || empty; |
|---|
| 14353 | + event.currentScope = scope; |
|---|
| 14354 | + for (i=0, length=namedListeners.length; i<length; i++) { |
|---|
| 14355 | + |
|---|
| 14356 | + // if listeners were deregistered, defragment the array |
|---|
| 14357 | + if (!namedListeners[i]) { |
|---|
| 14358 | + namedListeners.splice(i, 1); |
|---|
| 14359 | + i--; |
|---|
| 14360 | + length--; |
|---|
| 14361 | + continue; |
|---|
| 14362 | + } |
|---|
| 14363 | + try { |
|---|
| 14364 | + //allow all listeners attached to the current scope to run |
|---|
| 14365 | + namedListeners[i].apply(null, listenerArgs); |
|---|
| 14366 | + } catch (e) { |
|---|
| 14367 | + $exceptionHandler(e); |
|---|
| 14368 | + } |
|---|
| 14369 | + } |
|---|
| 14370 | + //if any listener on the current scope stops propagation, prevent bubbling |
|---|
| 14371 | + if (stopPropagation) { |
|---|
| 14372 | + event.currentScope = null; |
|---|
| 14373 | + return event; |
|---|
| 14374 | + } |
|---|
| 14375 | + //traverse upwards |
|---|
| 14376 | + scope = scope.$parent; |
|---|
| 14377 | + } while (scope); |
|---|
| 14378 | + |
|---|
| 14379 | + event.currentScope = null; |
|---|
| 14380 | + |
|---|
| 14381 | + return event; |
|---|
| 14382 | + }, |
|---|
| 14383 | + |
|---|
| 14384 | + |
|---|
| 14385 | + /** |
|---|
| 14386 | + * @ngdoc method |
|---|
| 14387 | + * @name $rootScope.Scope#$broadcast |
|---|
| 14388 | + * @kind function |
|---|
| 14389 | + * |
|---|
| 14390 | + * @description |
|---|
| 14391 | + * Dispatches an event `name` downwards to all child scopes (and their children) notifying the |
|---|
| 14392 | + * registered {@link ng.$rootScope.Scope#$on} listeners. |
|---|
| 14393 | + * |
|---|
| 14394 | + * The event life cycle starts at the scope on which `$broadcast` was called. All |
|---|
| 14395 | + * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get |
|---|
| 14396 | + * notified. Afterwards, the event propagates to all direct and indirect scopes of the current |
|---|
| 14397 | + * scope and calls all registered listeners along the way. The event cannot be canceled. |
|---|
| 14398 | + * |
|---|
| 14399 | + * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed |
|---|
| 14400 | + * onto the {@link ng.$exceptionHandler $exceptionHandler} service. |
|---|
| 14401 | + * |
|---|
| 14402 | + * @param {string} name Event name to broadcast. |
|---|
| 14403 | + * @param {...*} args Optional one or more arguments which will be passed onto the event listeners. |
|---|
| 14404 | + * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on} |
|---|
| 14405 | + */ |
|---|
| 14406 | + $broadcast: function(name, args) { |
|---|
| 14407 | + var target = this, |
|---|
| 14408 | + current = target, |
|---|
| 14409 | + next = target, |
|---|
| 14410 | + event = { |
|---|
| 14411 | + name: name, |
|---|
| 14412 | + targetScope: target, |
|---|
| 14413 | + preventDefault: function() { |
|---|
| 14414 | + event.defaultPrevented = true; |
|---|
| 14415 | + }, |
|---|
| 14416 | + defaultPrevented: false |
|---|
| 14417 | + }; |
|---|
| 14418 | + |
|---|
| 14419 | + if (!target.$$listenerCount[name]) return event; |
|---|
| 14420 | + |
|---|
| 14421 | + var listenerArgs = concat([event], arguments, 1), |
|---|
| 14422 | + listeners, i, length; |
|---|
| 14423 | + |
|---|
| 14424 | + //down while you can, then up and next sibling or up and next sibling until back at root |
|---|
| 14425 | + while ((current = next)) { |
|---|
| 14426 | + event.currentScope = current; |
|---|
| 14427 | + listeners = current.$$listeners[name] || []; |
|---|
| 14428 | + for (i=0, length = listeners.length; i<length; i++) { |
|---|
| 14429 | + // if listeners were deregistered, defragment the array |
|---|
| 14430 | + if (!listeners[i]) { |
|---|
| 14431 | + listeners.splice(i, 1); |
|---|
| 14432 | + i--; |
|---|
| 14433 | + length--; |
|---|
| 14434 | + continue; |
|---|
| 14435 | + } |
|---|
| 14436 | + |
|---|
| 14437 | + try { |
|---|
| 14438 | + listeners[i].apply(null, listenerArgs); |
|---|
| 14439 | + } catch(e) { |
|---|
| 14440 | + $exceptionHandler(e); |
|---|
| 14441 | + } |
|---|
| 14442 | + } |
|---|
| 14443 | + |
|---|
| 14444 | + // Insanity Warning: scope depth-first traversal |
|---|
| 14445 | + // yes, this code is a bit crazy, but it works and we have tests to prove it! |
|---|
| 14446 | + // this piece should be kept in sync with the traversal in $digest |
|---|
| 14447 | + // (though it differs due to having the extra check for $$listenerCount) |
|---|
| 14448 | + if (!(next = ((current.$$listenerCount[name] && current.$$childHead) || |
|---|
| 14449 | + (current !== target && current.$$nextSibling)))) { |
|---|
| 14450 | + while(current !== target && !(next = current.$$nextSibling)) { |
|---|
| 14451 | + current = current.$parent; |
|---|
| 14452 | + } |
|---|
| 14453 | + } |
|---|
| 14454 | + } |
|---|
| 14455 | + |
|---|
| 14456 | + event.currentScope = null; |
|---|
| 14457 | + return event; |
|---|
| 14458 | + } |
|---|
| 14459 | + }; |
|---|
| 14460 | + |
|---|
| 14461 | + var $rootScope = new Scope(); |
|---|
| 14462 | + |
|---|
| 14463 | + //The internal queues. Expose them on the $rootScope for debugging/testing purposes. |
|---|
| 14464 | + var asyncQueue = $rootScope.$$asyncQueue = []; |
|---|
| 14465 | + var postDigestQueue = $rootScope.$$postDigestQueue = []; |
|---|
| 14466 | + var applyAsyncQueue = $rootScope.$$applyAsyncQueue = []; |
|---|
| 14467 | + |
|---|
| 14468 | + return $rootScope; |
|---|
| 14469 | + |
|---|
| 14470 | + |
|---|
| 14471 | + function beginPhase(phase) { |
|---|
| 14472 | + if ($rootScope.$$phase) { |
|---|
| 14473 | + throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase); |
|---|
| 14474 | + } |
|---|
| 14475 | + |
|---|
| 14476 | + $rootScope.$$phase = phase; |
|---|
| 14477 | + } |
|---|
| 14478 | + |
|---|
| 14479 | + function clearPhase() { |
|---|
| 14480 | + $rootScope.$$phase = null; |
|---|
| 14481 | + } |
|---|
| 14482 | + |
|---|
| 14483 | + |
|---|
| 14484 | + function decrementListenerCount(current, count, name) { |
|---|
| 14485 | + do { |
|---|
| 14486 | + current.$$listenerCount[name] -= count; |
|---|
| 14487 | + |
|---|
| 14488 | + if (current.$$listenerCount[name] === 0) { |
|---|
| 14489 | + delete current.$$listenerCount[name]; |
|---|
| 14490 | + } |
|---|
| 14491 | + } while ((current = current.$parent)); |
|---|
| 14492 | + } |
|---|
| 14493 | + |
|---|
| 14494 | + /** |
|---|
| 14495 | + * function used as an initial value for watchers. |
|---|
| 14496 | + * because it's unique we can easily tell it apart from other values |
|---|
| 14497 | + */ |
|---|
| 14498 | + function initWatchVal() {} |
|---|
| 14499 | + |
|---|
| 14500 | + function flushApplyAsync() { |
|---|
| 14501 | + while (applyAsyncQueue.length) { |
|---|
| 14502 | + try { |
|---|
| 14503 | + applyAsyncQueue.shift()(); |
|---|
| 14504 | + } catch(e) { |
|---|
| 14505 | + $exceptionHandler(e); |
|---|
| 14506 | + } |
|---|
| 14507 | + } |
|---|
| 14508 | + applyAsyncId = null; |
|---|
| 14509 | + } |
|---|
| 14510 | + |
|---|
| 14511 | + function scheduleApplyAsync() { |
|---|
| 14512 | + if (applyAsyncId === null) { |
|---|
| 14513 | + applyAsyncId = $browser.defer(function() { |
|---|
| 14514 | + $rootScope.$apply(flushApplyAsync); |
|---|
| 14515 | + }); |
|---|
| 14516 | + } |
|---|
| 14517 | + } |
|---|
| 14518 | + }]; |
|---|
| 14519 | +} |
|---|
| 14520 | + |
|---|
| 14521 | +/** |
|---|
| 14522 | + * @description |
|---|
| 14523 | + * Private service to sanitize uris for links and images. Used by $compile and $sanitize. |
|---|
| 14524 | + */ |
|---|
| 14525 | +function $$SanitizeUriProvider() { |
|---|
| 14526 | + var aHrefSanitizationWhitelist = /^\s*(https?|ftp|mailto|tel|file):/, |
|---|
| 14527 | + imgSrcSanitizationWhitelist = /^\s*((https?|ftp|file|blob):|data:image\/)/; |
|---|
| 14528 | + |
|---|
| 14529 | + /** |
|---|
| 14530 | + * @description |
|---|
| 14531 | + * Retrieves or overrides the default regular expression that is used for whitelisting of safe |
|---|
| 14532 | + * urls during a[href] sanitization. |
|---|
| 14533 | + * |
|---|
| 14534 | + * The sanitization is a security measure aimed at prevent XSS attacks via html links. |
|---|
| 14535 | + * |
|---|
| 14536 | + * Any url about to be assigned to a[href] via data-binding is first normalized and turned into |
|---|
| 14537 | + * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist` |
|---|
| 14538 | + * regular expression. If a match is found, the original url is written into the dom. Otherwise, |
|---|
| 14539 | + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. |
|---|
| 14540 | + * |
|---|
| 14541 | + * @param {RegExp=} regexp New regexp to whitelist urls with. |
|---|
| 14542 | + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for |
|---|
| 14543 | + * chaining otherwise. |
|---|
| 14544 | + */ |
|---|
| 14545 | + this.aHrefSanitizationWhitelist = function(regexp) { |
|---|
| 14546 | + if (isDefined(regexp)) { |
|---|
| 14547 | + aHrefSanitizationWhitelist = regexp; |
|---|
| 14548 | + return this; |
|---|
| 14549 | + } |
|---|
| 14550 | + return aHrefSanitizationWhitelist; |
|---|
| 14551 | + }; |
|---|
| 14552 | + |
|---|
| 14553 | + |
|---|
| 14554 | + /** |
|---|
| 14555 | + * @description |
|---|
| 14556 | + * Retrieves or overrides the default regular expression that is used for whitelisting of safe |
|---|
| 14557 | + * urls during img[src] sanitization. |
|---|
| 14558 | + * |
|---|
| 14559 | + * The sanitization is a security measure aimed at prevent XSS attacks via html links. |
|---|
| 14560 | + * |
|---|
| 14561 | + * Any url about to be assigned to img[src] via data-binding is first normalized and turned into |
|---|
| 14562 | + * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist` |
|---|
| 14563 | + * regular expression. If a match is found, the original url is written into the dom. Otherwise, |
|---|
| 14564 | + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. |
|---|
| 14565 | + * |
|---|
| 14566 | + * @param {RegExp=} regexp New regexp to whitelist urls with. |
|---|
| 14567 | + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for |
|---|
| 14568 | + * chaining otherwise. |
|---|
| 14569 | + */ |
|---|
| 14570 | + this.imgSrcSanitizationWhitelist = function(regexp) { |
|---|
| 14571 | + if (isDefined(regexp)) { |
|---|
| 14572 | + imgSrcSanitizationWhitelist = regexp; |
|---|
| 14573 | + return this; |
|---|
| 14574 | + } |
|---|
| 14575 | + return imgSrcSanitizationWhitelist; |
|---|
| 14576 | + }; |
|---|
| 14577 | + |
|---|
| 14578 | + this.$get = function() { |
|---|
| 14579 | + return function sanitizeUri(uri, isImage) { |
|---|
| 14580 | + var regex = isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist; |
|---|
| 14581 | + var normalizedVal; |
|---|
| 14582 | + normalizedVal = urlResolve(uri).href; |
|---|
| 14583 | + if (normalizedVal !== '' && !normalizedVal.match(regex)) { |
|---|
| 14584 | + return 'unsafe:'+normalizedVal; |
|---|
| 14585 | + } |
|---|
| 14586 | + return uri; |
|---|
| 14587 | + }; |
|---|
| 14588 | + }; |
|---|
| 14589 | +} |
|---|
| 14590 | + |
|---|
| 14591 | +var $sceMinErr = minErr('$sce'); |
|---|
| 14592 | + |
|---|
| 14593 | +var SCE_CONTEXTS = { |
|---|
| 14594 | + HTML: 'html', |
|---|
| 14595 | + CSS: 'css', |
|---|
| 14596 | + URL: 'url', |
|---|
| 14597 | + // RESOURCE_URL is a subtype of URL used in contexts where a privileged resource is sourced from a |
|---|
| 14598 | + // url. (e.g. ng-include, script src, templateUrl) |
|---|
| 14599 | + RESOURCE_URL: 'resourceUrl', |
|---|
| 14600 | + JS: 'js' |
|---|
| 14601 | +}; |
|---|
| 14602 | + |
|---|
| 14603 | +// Helper functions follow. |
|---|
| 14604 | + |
|---|
| 14605 | +// Copied from: |
|---|
| 14606 | +// http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962 |
|---|
| 14607 | +// Prereq: s is a string. |
|---|
| 14608 | +function escapeForRegexp(s) { |
|---|
| 14609 | + return s.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g, '\\$1'). |
|---|
| 14610 | + replace(/\x08/g, '\\x08'); |
|---|
| 14611 | +} |
|---|
| 14612 | + |
|---|
| 14613 | + |
|---|
| 14614 | +function adjustMatcher(matcher) { |
|---|
| 14615 | + if (matcher === 'self') { |
|---|
| 14616 | + return matcher; |
|---|
| 14617 | + } else if (isString(matcher)) { |
|---|
| 14618 | + // Strings match exactly except for 2 wildcards - '*' and '**'. |
|---|
| 14619 | + // '*' matches any character except those from the set ':/.?&'. |
|---|
| 14620 | + // '**' matches any character (like .* in a RegExp). |
|---|
| 14621 | + // More than 2 *'s raises an error as it's ill defined. |
|---|
| 14622 | + if (matcher.indexOf('***') > -1) { |
|---|
| 14623 | + throw $sceMinErr('iwcard', |
|---|
| 14624 | + 'Illegal sequence *** in string matcher. String: {0}', matcher); |
|---|
| 14625 | + } |
|---|
| 14626 | + matcher = escapeForRegexp(matcher). |
|---|
| 14627 | + replace('\\*\\*', '.*'). |
|---|
| 14628 | + replace('\\*', '[^:/.?&;]*'); |
|---|
| 14629 | + return new RegExp('^' + matcher + '$'); |
|---|
| 14630 | + } else if (isRegExp(matcher)) { |
|---|
| 14631 | + // The only other type of matcher allowed is a Regexp. |
|---|
| 14632 | + // Match entire URL / disallow partial matches. |
|---|
| 14633 | + // Flags are reset (i.e. no global, ignoreCase or multiline) |
|---|
| 14634 | + return new RegExp('^' + matcher.source + '$'); |
|---|
| 14635 | + } else { |
|---|
| 14636 | + throw $sceMinErr('imatcher', |
|---|
| 14637 | + 'Matchers may only be "self", string patterns or RegExp objects'); |
|---|
| 14638 | + } |
|---|
| 14639 | +} |
|---|
| 14640 | + |
|---|
| 14641 | + |
|---|
| 14642 | +function adjustMatchers(matchers) { |
|---|
| 14643 | + var adjustedMatchers = []; |
|---|
| 14644 | + if (isDefined(matchers)) { |
|---|
| 14645 | + forEach(matchers, function(matcher) { |
|---|
| 14646 | + adjustedMatchers.push(adjustMatcher(matcher)); |
|---|
| 14647 | + }); |
|---|
| 14648 | + } |
|---|
| 14649 | + return adjustedMatchers; |
|---|
| 14650 | +} |
|---|
| 14651 | + |
|---|
| 14652 | + |
|---|
| 14653 | +/** |
|---|
| 14654 | + * @ngdoc service |
|---|
| 14655 | + * @name $sceDelegate |
|---|
| 14656 | + * @kind function |
|---|
| 14657 | + * |
|---|
| 14658 | + * @description |
|---|
| 14659 | + * |
|---|
| 14660 | + * `$sceDelegate` is a service that is used by the `$sce` service to provide {@link ng.$sce Strict |
|---|
| 14661 | + * Contextual Escaping (SCE)} services to AngularJS. |
|---|
| 14662 | + * |
|---|
| 14663 | + * Typically, you would configure or override the {@link ng.$sceDelegate $sceDelegate} instead of |
|---|
| 14664 | + * the `$sce` service to customize the way Strict Contextual Escaping works in AngularJS. This is |
|---|
| 14665 | + * because, while the `$sce` provides numerous shorthand methods, etc., you really only need to |
|---|
| 14666 | + * override 3 core functions (`trustAs`, `getTrusted` and `valueOf`) to replace the way things |
|---|
| 14667 | + * work because `$sce` delegates to `$sceDelegate` for these operations. |
|---|
| 14668 | + * |
|---|
| 14669 | + * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} to configure this service. |
|---|
| 14670 | + * |
|---|
| 14671 | + * The default instance of `$sceDelegate` should work out of the box with little pain. While you |
|---|
| 14672 | + * can override it completely to change the behavior of `$sce`, the common case would |
|---|
| 14673 | + * involve configuring the {@link ng.$sceDelegateProvider $sceDelegateProvider} instead by setting |
|---|
| 14674 | + * your own whitelists and blacklists for trusting URLs used for loading AngularJS resources such as |
|---|
| 14675 | + * templates. Refer {@link ng.$sceDelegateProvider#resourceUrlWhitelist |
|---|
| 14676 | + * $sceDelegateProvider.resourceUrlWhitelist} and {@link |
|---|
| 14677 | + * ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist} |
|---|
| 14678 | + */ |
|---|
| 14679 | + |
|---|
| 14680 | +/** |
|---|
| 14681 | + * @ngdoc provider |
|---|
| 14682 | + * @name $sceDelegateProvider |
|---|
| 14683 | + * @description |
|---|
| 14684 | + * |
|---|
| 14685 | + * The `$sceDelegateProvider` provider allows developers to configure the {@link ng.$sceDelegate |
|---|
| 14686 | + * $sceDelegate} service. This allows one to get/set the whitelists and blacklists used to ensure |
|---|
| 14687 | + * that the URLs used for sourcing Angular templates are safe. Refer {@link |
|---|
| 14688 | + * ng.$sceDelegateProvider#resourceUrlWhitelist $sceDelegateProvider.resourceUrlWhitelist} and |
|---|
| 14689 | + * {@link ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist} |
|---|
| 14690 | + * |
|---|
| 14691 | + * For the general details about this service in Angular, read the main page for {@link ng.$sce |
|---|
| 14692 | + * Strict Contextual Escaping (SCE)}. |
|---|
| 14693 | + * |
|---|
| 14694 | + * **Example**: Consider the following case. <a name="example"></a> |
|---|
| 14695 | + * |
|---|
| 14696 | + * - your app is hosted at url `http://myapp.example.com/` |
|---|
| 14697 | + * - but some of your templates are hosted on other domains you control such as |
|---|
| 14698 | + * `http://srv01.assets.example.com/`, `http://srv02.assets.example.com/`, etc. |
|---|
| 14699 | + * - and you have an open redirect at `http://myapp.example.com/clickThru?...`. |
|---|
| 14700 | + * |
|---|
| 14701 | + * Here is what a secure configuration for this scenario might look like: |
|---|
| 14702 | + * |
|---|
| 14703 | + * ``` |
|---|
| 14704 | + * angular.module('myApp', []).config(function($sceDelegateProvider) { |
|---|
| 14705 | + * $sceDelegateProvider.resourceUrlWhitelist([ |
|---|
| 14706 | + * // Allow same origin resource loads. |
|---|
| 14707 | + * 'self', |
|---|
| 14708 | + * // Allow loading from our assets domain. Notice the difference between * and **. |
|---|
| 14709 | + * 'http://srv*.assets.example.com/**' |
|---|
| 14710 | + * ]); |
|---|
| 14711 | + * |
|---|
| 14712 | + * // The blacklist overrides the whitelist so the open redirect here is blocked. |
|---|
| 14713 | + * $sceDelegateProvider.resourceUrlBlacklist([ |
|---|
| 14714 | + * 'http://myapp.example.com/clickThru**' |
|---|
| 14715 | + * ]); |
|---|
| 14716 | + * }); |
|---|
| 14717 | + * ``` |
|---|
| 14718 | + */ |
|---|
| 14719 | + |
|---|
| 14720 | +function $SceDelegateProvider() { |
|---|
| 14721 | + this.SCE_CONTEXTS = SCE_CONTEXTS; |
|---|
| 14722 | + |
|---|
| 14723 | + // Resource URLs can also be trusted by policy. |
|---|
| 14724 | + var resourceUrlWhitelist = ['self'], |
|---|
| 14725 | + resourceUrlBlacklist = []; |
|---|
| 14726 | + |
|---|
| 14727 | + /** |
|---|
| 14728 | + * @ngdoc method |
|---|
| 14729 | + * @name $sceDelegateProvider#resourceUrlWhitelist |
|---|
| 14730 | + * @kind function |
|---|
| 14731 | + * |
|---|
| 14732 | + * @param {Array=} whitelist When provided, replaces the resourceUrlWhitelist with the value |
|---|
| 14733 | + * provided. This must be an array or null. A snapshot of this array is used so further |
|---|
| 14734 | + * changes to the array are ignored. |
|---|
| 14735 | + * |
|---|
| 14736 | + * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items |
|---|
| 14737 | + * allowed in this array. |
|---|
| 14738 | + * |
|---|
| 14739 | + * Note: **an empty whitelist array will block all URLs**! |
|---|
| 14740 | + * |
|---|
| 14741 | + * @return {Array} the currently set whitelist array. |
|---|
| 14742 | + * |
|---|
| 14743 | + * The **default value** when no whitelist has been explicitly set is `['self']` allowing only |
|---|
| 14744 | + * same origin resource requests. |
|---|
| 14745 | + * |
|---|
| 14746 | + * @description |
|---|
| 14747 | + * Sets/Gets the whitelist of trusted resource URLs. |
|---|
| 14748 | + */ |
|---|
| 14749 | + this.resourceUrlWhitelist = function (value) { |
|---|
| 14750 | + if (arguments.length) { |
|---|
| 14751 | + resourceUrlWhitelist = adjustMatchers(value); |
|---|
| 14752 | + } |
|---|
| 14753 | + return resourceUrlWhitelist; |
|---|
| 14754 | + }; |
|---|
| 14755 | + |
|---|
| 14756 | + /** |
|---|
| 14757 | + * @ngdoc method |
|---|
| 14758 | + * @name $sceDelegateProvider#resourceUrlBlacklist |
|---|
| 14759 | + * @kind function |
|---|
| 14760 | + * |
|---|
| 14761 | + * @param {Array=} blacklist When provided, replaces the resourceUrlBlacklist with the value |
|---|
| 14762 | + * provided. This must be an array or null. A snapshot of this array is used so further |
|---|
| 14763 | + * changes to the array are ignored. |
|---|
| 14764 | + * |
|---|
| 14765 | + * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items |
|---|
| 14766 | + * allowed in this array. |
|---|
| 14767 | + * |
|---|
| 14768 | + * The typical usage for the blacklist is to **block |
|---|
| 14769 | + * [open redirects](http://cwe.mitre.org/data/definitions/601.html)** served by your domain as |
|---|
| 14770 | + * these would otherwise be trusted but actually return content from the redirected domain. |
|---|
| 14771 | + * |
|---|
| 14772 | + * Finally, **the blacklist overrides the whitelist** and has the final say. |
|---|
| 14773 | + * |
|---|
| 14774 | + * @return {Array} the currently set blacklist array. |
|---|
| 14775 | + * |
|---|
| 14776 | + * The **default value** when no whitelist has been explicitly set is the empty array (i.e. there |
|---|
| 14777 | + * is no blacklist.) |
|---|
| 14778 | + * |
|---|
| 14779 | + * @description |
|---|
| 14780 | + * Sets/Gets the blacklist of trusted resource URLs. |
|---|
| 14781 | + */ |
|---|
| 14782 | + |
|---|
| 14783 | + this.resourceUrlBlacklist = function (value) { |
|---|
| 14784 | + if (arguments.length) { |
|---|
| 14785 | + resourceUrlBlacklist = adjustMatchers(value); |
|---|
| 14786 | + } |
|---|
| 14787 | + return resourceUrlBlacklist; |
|---|
| 14788 | + }; |
|---|
| 14789 | + |
|---|
| 14790 | + this.$get = ['$injector', function($injector) { |
|---|
| 14791 | + |
|---|
| 14792 | + var htmlSanitizer = function htmlSanitizer(html) { |
|---|
| 14793 | + throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.'); |
|---|
| 14794 | + }; |
|---|
| 14795 | + |
|---|
| 14796 | + if ($injector.has('$sanitize')) { |
|---|
| 14797 | + htmlSanitizer = $injector.get('$sanitize'); |
|---|
| 14798 | + } |
|---|
| 14799 | + |
|---|
| 14800 | + |
|---|
| 14801 | + function matchUrl(matcher, parsedUrl) { |
|---|
| 14802 | + if (matcher === 'self') { |
|---|
| 14803 | + return urlIsSameOrigin(parsedUrl); |
|---|
| 14804 | + } else { |
|---|
| 14805 | + // definitely a regex. See adjustMatchers() |
|---|
| 14806 | + return !!matcher.exec(parsedUrl.href); |
|---|
| 14807 | + } |
|---|
| 14808 | + } |
|---|
| 14809 | + |
|---|
| 14810 | + function isResourceUrlAllowedByPolicy(url) { |
|---|
| 14811 | + var parsedUrl = urlResolve(url.toString()); |
|---|
| 14812 | + var i, n, allowed = false; |
|---|
| 14813 | + // Ensure that at least one item from the whitelist allows this url. |
|---|
| 14814 | + for (i = 0, n = resourceUrlWhitelist.length; i < n; i++) { |
|---|
| 14815 | + if (matchUrl(resourceUrlWhitelist[i], parsedUrl)) { |
|---|
| 14816 | + allowed = true; |
|---|
| 14817 | + break; |
|---|
| 14818 | + } |
|---|
| 14819 | + } |
|---|
| 14820 | + if (allowed) { |
|---|
| 14821 | + // Ensure that no item from the blacklist blocked this url. |
|---|
| 14822 | + for (i = 0, n = resourceUrlBlacklist.length; i < n; i++) { |
|---|
| 14823 | + if (matchUrl(resourceUrlBlacklist[i], parsedUrl)) { |
|---|
| 14824 | + allowed = false; |
|---|
| 14825 | + break; |
|---|
| 14826 | + } |
|---|
| 14827 | + } |
|---|
| 14828 | + } |
|---|
| 14829 | + return allowed; |
|---|
| 14830 | + } |
|---|
| 14831 | + |
|---|
| 14832 | + function generateHolderType(Base) { |
|---|
| 14833 | + var holderType = function TrustedValueHolderType(trustedValue) { |
|---|
| 14834 | + this.$$unwrapTrustedValue = function() { |
|---|
| 14835 | + return trustedValue; |
|---|
| 14836 | + }; |
|---|
| 14837 | + }; |
|---|
| 14838 | + if (Base) { |
|---|
| 14839 | + holderType.prototype = new Base(); |
|---|
| 14840 | + } |
|---|
| 14841 | + holderType.prototype.valueOf = function sceValueOf() { |
|---|
| 14842 | + return this.$$unwrapTrustedValue(); |
|---|
| 14843 | + }; |
|---|
| 14844 | + holderType.prototype.toString = function sceToString() { |
|---|
| 14845 | + return this.$$unwrapTrustedValue().toString(); |
|---|
| 14846 | + }; |
|---|
| 14847 | + return holderType; |
|---|
| 14848 | + } |
|---|
| 14849 | + |
|---|
| 14850 | + var trustedValueHolderBase = generateHolderType(), |
|---|
| 14851 | + byType = {}; |
|---|
| 14852 | + |
|---|
| 14853 | + byType[SCE_CONTEXTS.HTML] = generateHolderType(trustedValueHolderBase); |
|---|
| 14854 | + byType[SCE_CONTEXTS.CSS] = generateHolderType(trustedValueHolderBase); |
|---|
| 14855 | + byType[SCE_CONTEXTS.URL] = generateHolderType(trustedValueHolderBase); |
|---|
| 14856 | + byType[SCE_CONTEXTS.JS] = generateHolderType(trustedValueHolderBase); |
|---|
| 14857 | + byType[SCE_CONTEXTS.RESOURCE_URL] = generateHolderType(byType[SCE_CONTEXTS.URL]); |
|---|
| 14858 | + |
|---|
| 14859 | + /** |
|---|
| 14860 | + * @ngdoc method |
|---|
| 14861 | + * @name $sceDelegate#trustAs |
|---|
| 14862 | + * |
|---|
| 14863 | + * @description |
|---|
| 14864 | + * Returns an object that is trusted by angular for use in specified strict |
|---|
| 14865 | + * contextual escaping contexts (such as ng-bind-html, ng-include, any src |
|---|
| 14866 | + * attribute interpolation, any dom event binding attribute interpolation |
|---|
| 14867 | + * such as for onclick, etc.) that uses the provided value. |
|---|
| 14868 | + * See {@link ng.$sce $sce} for enabling strict contextual escaping. |
|---|
| 14869 | + * |
|---|
| 14870 | + * @param {string} type The kind of context in which this value is safe for use. e.g. url, |
|---|
| 14871 | + * resourceUrl, html, js and css. |
|---|
| 14872 | + * @param {*} value The value that that should be considered trusted/safe. |
|---|
| 14873 | + * @returns {*} A value that can be used to stand in for the provided `value` in places |
|---|
| 14874 | + * where Angular expects a $sce.trustAs() return value. |
|---|
| 14875 | + */ |
|---|
| 14876 | + function trustAs(type, trustedValue) { |
|---|
| 14877 | + var Constructor = (byType.hasOwnProperty(type) ? byType[type] : null); |
|---|
| 14878 | + if (!Constructor) { |
|---|
| 14879 | + throw $sceMinErr('icontext', |
|---|
| 14880 | + 'Attempted to trust a value in invalid context. Context: {0}; Value: {1}', |
|---|
| 14881 | + type, trustedValue); |
|---|
| 14882 | + } |
|---|
| 14883 | + if (trustedValue === null || trustedValue === undefined || trustedValue === '') { |
|---|
| 14884 | + return trustedValue; |
|---|
| 14885 | + } |
|---|
| 14886 | + // All the current contexts in SCE_CONTEXTS happen to be strings. In order to avoid trusting |
|---|
| 14887 | + // mutable objects, we ensure here that the value passed in is actually a string. |
|---|
| 14888 | + if (typeof trustedValue !== 'string') { |
|---|
| 14889 | + throw $sceMinErr('itype', |
|---|
| 14890 | + 'Attempted to trust a non-string value in a content requiring a string: Context: {0}', |
|---|
| 14891 | + type); |
|---|
| 14892 | + } |
|---|
| 14893 | + return new Constructor(trustedValue); |
|---|
| 14894 | + } |
|---|
| 14895 | + |
|---|
| 14896 | + /** |
|---|
| 14897 | + * @ngdoc method |
|---|
| 14898 | + * @name $sceDelegate#valueOf |
|---|
| 14899 | + * |
|---|
| 14900 | + * @description |
|---|
| 14901 | + * If the passed parameter had been returned by a prior call to {@link ng.$sceDelegate#trustAs |
|---|
| 14902 | + * `$sceDelegate.trustAs`}, returns the value that had been passed to {@link |
|---|
| 14903 | + * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}. |
|---|
| 14904 | + * |
|---|
| 14905 | + * If the passed parameter is not a value that had been returned by {@link |
|---|
| 14906 | + * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}, returns it as-is. |
|---|
| 14907 | + * |
|---|
| 14908 | + * @param {*} value The result of a prior {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} |
|---|
| 14909 | + * call or anything else. |
|---|
| 14910 | + * @returns {*} The `value` that was originally provided to {@link ng.$sceDelegate#trustAs |
|---|
| 14911 | + * `$sceDelegate.trustAs`} if `value` is the result of such a call. Otherwise, returns |
|---|
| 14912 | + * `value` unchanged. |
|---|
| 14913 | + */ |
|---|
| 14914 | + function valueOf(maybeTrusted) { |
|---|
| 14915 | + if (maybeTrusted instanceof trustedValueHolderBase) { |
|---|
| 14916 | + return maybeTrusted.$$unwrapTrustedValue(); |
|---|
| 14917 | + } else { |
|---|
| 14918 | + return maybeTrusted; |
|---|
| 14919 | + } |
|---|
| 14920 | + } |
|---|
| 14921 | + |
|---|
| 14922 | + /** |
|---|
| 14923 | + * @ngdoc method |
|---|
| 14924 | + * @name $sceDelegate#getTrusted |
|---|
| 14925 | + * |
|---|
| 14926 | + * @description |
|---|
| 14927 | + * Takes the result of a {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} call and |
|---|
| 14928 | + * returns the originally supplied value if the queried context type is a supertype of the |
|---|
| 14929 | + * created type. If this condition isn't satisfied, throws an exception. |
|---|
| 14930 | + * |
|---|
| 14931 | + * @param {string} type The kind of context in which this value is to be used. |
|---|
| 14932 | + * @param {*} maybeTrusted The result of a prior {@link ng.$sceDelegate#trustAs |
|---|
| 14933 | + * `$sceDelegate.trustAs`} call. |
|---|
| 14934 | + * @returns {*} The value the was originally provided to {@link ng.$sceDelegate#trustAs |
|---|
| 14935 | + * `$sceDelegate.trustAs`} if valid in this context. Otherwise, throws an exception. |
|---|
| 14936 | + */ |
|---|
| 14937 | + function getTrusted(type, maybeTrusted) { |
|---|
| 14938 | + if (maybeTrusted === null || maybeTrusted === undefined || maybeTrusted === '') { |
|---|
| 14939 | + return maybeTrusted; |
|---|
| 14940 | + } |
|---|
| 14941 | + var constructor = (byType.hasOwnProperty(type) ? byType[type] : null); |
|---|
| 14942 | + if (constructor && maybeTrusted instanceof constructor) { |
|---|
| 14943 | + return maybeTrusted.$$unwrapTrustedValue(); |
|---|
| 14944 | + } |
|---|
| 14945 | + // If we get here, then we may only take one of two actions. |
|---|
| 14946 | + // 1. sanitize the value for the requested type, or |
|---|
| 14947 | + // 2. throw an exception. |
|---|
| 14948 | + if (type === SCE_CONTEXTS.RESOURCE_URL) { |
|---|
| 14949 | + if (isResourceUrlAllowedByPolicy(maybeTrusted)) { |
|---|
| 14950 | + return maybeTrusted; |
|---|
| 14951 | + } else { |
|---|
| 14952 | + throw $sceMinErr('insecurl', |
|---|
| 14953 | + 'Blocked loading resource from url not allowed by $sceDelegate policy. URL: {0}', |
|---|
| 14954 | + maybeTrusted.toString()); |
|---|
| 14955 | + } |
|---|
| 14956 | + } else if (type === SCE_CONTEXTS.HTML) { |
|---|
| 14957 | + return htmlSanitizer(maybeTrusted); |
|---|
| 14958 | + } |
|---|
| 14959 | + throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.'); |
|---|
| 14960 | + } |
|---|
| 14961 | + |
|---|
| 14962 | + return { trustAs: trustAs, |
|---|
| 14963 | + getTrusted: getTrusted, |
|---|
| 14964 | + valueOf: valueOf }; |
|---|
| 14965 | + }]; |
|---|
| 14966 | +} |
|---|
| 14967 | + |
|---|
| 14968 | + |
|---|
| 14969 | +/** |
|---|
| 14970 | + * @ngdoc provider |
|---|
| 14971 | + * @name $sceProvider |
|---|
| 14972 | + * @description |
|---|
| 14973 | + * |
|---|
| 14974 | + * The $sceProvider provider allows developers to configure the {@link ng.$sce $sce} service. |
|---|
| 14975 | + * - enable/disable Strict Contextual Escaping (SCE) in a module |
|---|
| 14976 | + * - override the default implementation with a custom delegate |
|---|
| 14977 | + * |
|---|
| 14978 | + * Read more about {@link ng.$sce Strict Contextual Escaping (SCE)}. |
|---|
| 14979 | + */ |
|---|
| 14980 | + |
|---|
| 14981 | +/* jshint maxlen: false*/ |
|---|
| 14982 | + |
|---|
| 14983 | +/** |
|---|
| 14984 | + * @ngdoc service |
|---|
| 14985 | + * @name $sce |
|---|
| 14986 | + * @kind function |
|---|
| 14987 | + * |
|---|
| 14988 | + * @description |
|---|
| 14989 | + * |
|---|
| 14990 | + * `$sce` is a service that provides Strict Contextual Escaping services to AngularJS. |
|---|
| 14991 | + * |
|---|
| 14992 | + * # Strict Contextual Escaping |
|---|
| 14993 | + * |
|---|
| 14994 | + * Strict Contextual Escaping (SCE) is a mode in which AngularJS requires bindings in certain |
|---|
| 14995 | + * contexts to result in a value that is marked as safe to use for that context. One example of |
|---|
| 14996 | + * such a context is binding arbitrary html controlled by the user via `ng-bind-html`. We refer |
|---|
| 14997 | + * to these contexts as privileged or SCE contexts. |
|---|
| 14998 | + * |
|---|
| 14999 | + * As of version 1.2, Angular ships with SCE enabled by default. |
|---|
| 15000 | + * |
|---|
| 15001 | + * Note: When enabled (the default), IE<11 in quirks mode is not supported. In this mode, IE<11 allow |
|---|
| 15002 | + * one to execute arbitrary javascript by the use of the expression() syntax. Refer |
|---|
| 15003 | + * <http://blogs.msdn.com/b/ie/archive/2008/10/16/ending-expressions.aspx> to learn more about them. |
|---|
| 15004 | + * You can ensure your document is in standards mode and not quirks mode by adding `<!doctype html>` |
|---|
| 15005 | + * to the top of your HTML document. |
|---|
| 15006 | + * |
|---|
| 15007 | + * SCE assists in writing code in way that (a) is secure by default and (b) makes auditing for |
|---|
| 15008 | + * security vulnerabilities such as XSS, clickjacking, etc. a lot easier. |
|---|
| 15009 | + * |
|---|
| 15010 | + * Here's an example of a binding in a privileged context: |
|---|
| 15011 | + * |
|---|
| 15012 | + * ``` |
|---|
| 15013 | + * <input ng-model="userHtml"> |
|---|
| 15014 | + * <div ng-bind-html="userHtml"></div> |
|---|
| 15015 | + * ``` |
|---|
| 15016 | + * |
|---|
| 15017 | + * Notice that `ng-bind-html` is bound to `userHtml` controlled by the user. With SCE |
|---|
| 15018 | + * disabled, this application allows the user to render arbitrary HTML into the DIV. |
|---|
| 15019 | + * In a more realistic example, one may be rendering user comments, blog articles, etc. via |
|---|
| 15020 | + * bindings. (HTML is just one example of a context where rendering user controlled input creates |
|---|
| 15021 | + * security vulnerabilities.) |
|---|
| 15022 | + * |
|---|
| 15023 | + * For the case of HTML, you might use a library, either on the client side, or on the server side, |
|---|
| 15024 | + * to sanitize unsafe HTML before binding to the value and rendering it in the document. |
|---|
| 15025 | + * |
|---|
| 15026 | + * How would you ensure that every place that used these types of bindings was bound to a value that |
|---|
| 15027 | + * was sanitized by your library (or returned as safe for rendering by your server?) How can you |
|---|
| 15028 | + * ensure that you didn't accidentally delete the line that sanitized the value, or renamed some |
|---|
| 15029 | + * properties/fields and forgot to update the binding to the sanitized value? |
|---|
| 15030 | + * |
|---|
| 15031 | + * To be secure by default, you want to ensure that any such bindings are disallowed unless you can |
|---|
| 15032 | + * determine that something explicitly says it's safe to use a value for binding in that |
|---|
| 15033 | + * context. You can then audit your code (a simple grep would do) to ensure that this is only done |
|---|
| 15034 | + * for those values that you can easily tell are safe - because they were received from your server, |
|---|
| 15035 | + * sanitized by your library, etc. You can organize your codebase to help with this - perhaps |
|---|
| 15036 | + * allowing only the files in a specific directory to do this. Ensuring that the internal API |
|---|
| 15037 | + * exposed by that code doesn't markup arbitrary values as safe then becomes a more manageable task. |
|---|
| 15038 | + * |
|---|
| 15039 | + * In the case of AngularJS' SCE service, one uses {@link ng.$sce#trustAs $sce.trustAs} |
|---|
| 15040 | + * (and shorthand methods such as {@link ng.$sce#trustAsHtml $sce.trustAsHtml}, etc.) to |
|---|
| 15041 | + * obtain values that will be accepted by SCE / privileged contexts. |
|---|
| 15042 | + * |
|---|
| 15043 | + * |
|---|
| 15044 | + * ## How does it work? |
|---|
| 15045 | + * |
|---|
| 15046 | + * In privileged contexts, directives and code will bind to the result of {@link ng.$sce#getTrusted |
|---|
| 15047 | + * $sce.getTrusted(context, value)} rather than to the value directly. Directives use {@link |
|---|
| 15048 | + * ng.$sce#parseAs $sce.parseAs} rather than `$parse` to watch attribute bindings, which performs the |
|---|
| 15049 | + * {@link ng.$sce#getTrusted $sce.getTrusted} behind the scenes on non-constant literals. |
|---|
| 15050 | + * |
|---|
| 15051 | + * As an example, {@link ng.directive:ngBindHtml ngBindHtml} uses {@link |
|---|
| 15052 | + * ng.$sce#parseAsHtml $sce.parseAsHtml(binding expression)}. Here's the actual code (slightly |
|---|
| 15053 | + * simplified): |
|---|
| 15054 | + * |
|---|
| 15055 | + * ``` |
|---|
| 15056 | + * var ngBindHtmlDirective = ['$sce', function($sce) { |
|---|
| 15057 | + * return function(scope, element, attr) { |
|---|
| 15058 | + * scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) { |
|---|
| 15059 | + * element.html(value || ''); |
|---|
| 15060 | + * }); |
|---|
| 15061 | + * }; |
|---|
| 15062 | + * }]; |
|---|
| 15063 | + * ``` |
|---|
| 15064 | + * |
|---|
| 15065 | + * ## Impact on loading templates |
|---|
| 15066 | + * |
|---|
| 15067 | + * This applies both to the {@link ng.directive:ngInclude `ng-include`} directive as well as |
|---|
| 15068 | + * `templateUrl`'s specified by {@link guide/directive directives}. |
|---|
| 15069 | + * |
|---|
| 15070 | + * By default, Angular only loads templates from the same domain and protocol as the application |
|---|
| 15071 | + * document. This is done by calling {@link ng.$sce#getTrustedResourceUrl |
|---|
| 15072 | + * $sce.getTrustedResourceUrl} on the template URL. To load templates from other domains and/or |
|---|
| 15073 | + * protocols, you may either either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist |
|---|
| 15074 | + * them} or {@link ng.$sce#trustAsResourceUrl wrap it} into a trusted value. |
|---|
| 15075 | + * |
|---|
| 15076 | + * *Please note*: |
|---|
| 15077 | + * The browser's |
|---|
| 15078 | + * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest) |
|---|
| 15079 | + * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/) |
|---|
| 15080 | + * policy apply in addition to this and may further restrict whether the template is successfully |
|---|
| 15081 | + * loaded. This means that without the right CORS policy, loading templates from a different domain |
|---|
| 15082 | + * won't work on all browsers. Also, loading templates from `file://` URL does not work on some |
|---|
| 15083 | + * browsers. |
|---|
| 15084 | + * |
|---|
| 15085 | + * ## This feels like too much overhead |
|---|
| 15086 | + * |
|---|
| 15087 | + * It's important to remember that SCE only applies to interpolation expressions. |
|---|
| 15088 | + * |
|---|
| 15089 | + * If your expressions are constant literals, they're automatically trusted and you don't need to |
|---|
| 15090 | + * call `$sce.trustAs` on them (remember to include the `ngSanitize` module) (e.g. |
|---|
| 15091 | + * `<div ng-bind-html="'<b>implicitly trusted</b>'"></div>`) just works. |
|---|
| 15092 | + * |
|---|
| 15093 | + * Additionally, `a[href]` and `img[src]` automatically sanitize their URLs and do not pass them |
|---|
| 15094 | + * through {@link ng.$sce#getTrusted $sce.getTrusted}. SCE doesn't play a role here. |
|---|
| 15095 | + * |
|---|
| 15096 | + * The included {@link ng.$sceDelegate $sceDelegate} comes with sane defaults to allow you to load |
|---|
| 15097 | + * templates in `ng-include` from your application's domain without having to even know about SCE. |
|---|
| 15098 | + * It blocks loading templates from other domains or loading templates over http from an https |
|---|
| 15099 | + * served document. You can change these by setting your own custom {@link |
|---|
| 15100 | + * ng.$sceDelegateProvider#resourceUrlWhitelist whitelists} and {@link |
|---|
| 15101 | + * ng.$sceDelegateProvider#resourceUrlBlacklist blacklists} for matching such URLs. |
|---|
| 15102 | + * |
|---|
| 15103 | + * This significantly reduces the overhead. It is far easier to pay the small overhead and have an |
|---|
| 15104 | + * application that's secure and can be audited to verify that with much more ease than bolting |
|---|
| 15105 | + * security onto an application later. |
|---|
| 15106 | + * |
|---|
| 15107 | + * <a name="contexts"></a> |
|---|
| 15108 | + * ## What trusted context types are supported? |
|---|
| 15109 | + * |
|---|
| 15110 | + * | Context | Notes | |
|---|
| 15111 | + * |---------------------|----------------| |
|---|
| 15112 | + * | `$sce.HTML` | For HTML that's safe to source into the application. The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered and the {@link ngSanitize $sanitize} module is present this will sanitize the value instead of throwing an error. | |
|---|
| 15113 | + * | `$sce.CSS` | For CSS that's safe to source into the application. Currently unused. Feel free to use it in your own directives. | |
|---|
| 15114 | + * | `$sce.URL` | For URLs that are safe to follow as links. Currently unused (`<a href=` and `<img src=` sanitize their urls and don't constitute an SCE context. | |
|---|
| 15115 | + * | `$sce.RESOURCE_URL` | For URLs that are not only safe to follow as links, but whose contents are also safe to include in your application. Examples include `ng-include`, `src` / `ngSrc` bindings for tags other than `IMG` (e.g. `IFRAME`, `OBJECT`, etc.) <br><br>Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. | |
|---|
| 15116 | + * | `$sce.JS` | For JavaScript that is safe to execute in your application's context. Currently unused. Feel free to use it in your own directives. | |
|---|
| 15117 | + * |
|---|
| 15118 | + * ## Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist} <a name="resourceUrlPatternItem"></a> |
|---|
| 15119 | + * |
|---|
| 15120 | + * Each element in these arrays must be one of the following: |
|---|
| 15121 | + * |
|---|
| 15122 | + * - **'self'** |
|---|
| 15123 | + * - The special **string**, `'self'`, can be used to match against all URLs of the **same |
|---|
| 15124 | + * domain** as the application document using the **same protocol**. |
|---|
| 15125 | + * - **String** (except the special value `'self'`) |
|---|
| 15126 | + * - The string is matched against the full *normalized / absolute URL* of the resource |
|---|
| 15127 | + * being tested (substring matches are not good enough.) |
|---|
| 15128 | + * - There are exactly **two wildcard sequences** - `*` and `**`. All other characters |
|---|
| 15129 | + * match themselves. |
|---|
| 15130 | + * - `*`: matches zero or more occurrences of any character other than one of the following 6 |
|---|
| 15131 | + * characters: '`:`', '`/`', '`.`', '`?`', '`&`' and ';'. It's a useful wildcard for use |
|---|
| 15132 | + * in a whitelist. |
|---|
| 15133 | + * - `**`: matches zero or more occurrences of *any* character. As such, it's not |
|---|
| 15134 | + * not appropriate to use in for a scheme, domain, etc. as it would match too much. (e.g. |
|---|
| 15135 | + * http://**.example.com/ would match http://evil.com/?ignore=.example.com/ and that might |
|---|
| 15136 | + * not have been the intention.) Its usage at the very end of the path is ok. (e.g. |
|---|
| 15137 | + * http://foo.example.com/templates/**). |
|---|
| 15138 | + * - **RegExp** (*see caveat below*) |
|---|
| 15139 | + * - *Caveat*: While regular expressions are powerful and offer great flexibility, their syntax |
|---|
| 15140 | + * (and all the inevitable escaping) makes them *harder to maintain*. It's easy to |
|---|
| 15141 | + * accidentally introduce a bug when one updates a complex expression (imho, all regexes should |
|---|
| 15142 | + * have good test coverage.). For instance, the use of `.` in the regex is correct only in a |
|---|
| 15143 | + * small number of cases. A `.` character in the regex used when matching the scheme or a |
|---|
| 15144 | + * subdomain could be matched against a `:` or literal `.` that was likely not intended. It |
|---|
| 15145 | + * is highly recommended to use the string patterns and only fall back to regular expressions |
|---|
| 15146 | + * if they as a last resort. |
|---|
| 15147 | + * - The regular expression must be an instance of RegExp (i.e. not a string.) It is |
|---|
| 15148 | + * matched against the **entire** *normalized / absolute URL* of the resource being tested |
|---|
| 15149 | + * (even when the RegExp did not have the `^` and `$` codes.) In addition, any flags |
|---|
| 15150 | + * present on the RegExp (such as multiline, global, ignoreCase) are ignored. |
|---|
| 15151 | + * - If you are generating your JavaScript from some other templating engine (not |
|---|
| 15152 | + * recommended, e.g. in issue [#4006](https://github.com/angular/angular.js/issues/4006)), |
|---|
| 15153 | + * remember to escape your regular expression (and be aware that you might need more than |
|---|
| 15154 | + * one level of escaping depending on your templating engine and the way you interpolated |
|---|
| 15155 | + * the value.) Do make use of your platform's escaping mechanism as it might be good |
|---|
| 15156 | + * enough before coding your own. e.g. Ruby has |
|---|
| 15157 | + * [Regexp.escape(str)](http://www.ruby-doc.org/core-2.0.0/Regexp.html#method-c-escape) |
|---|
| 15158 | + * and Python has [re.escape](http://docs.python.org/library/re.html#re.escape). |
|---|
| 15159 | + * Javascript lacks a similar built in function for escaping. Take a look at Google |
|---|
| 15160 | + * Closure library's [goog.string.regExpEscape(s)]( |
|---|
| 15161 | + * http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962). |
|---|
| 15162 | + * |
|---|
| 15163 | + * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} for an example. |
|---|
| 15164 | + * |
|---|
| 15165 | + * ## Show me an example using SCE. |
|---|
| 15166 | + * |
|---|
| 15167 | + * <example module="mySceApp" deps="angular-sanitize.js"> |
|---|
| 15168 | + * <file name="index.html"> |
|---|
| 15169 | + * <div ng-controller="AppController as myCtrl"> |
|---|
| 15170 | + * <i ng-bind-html="myCtrl.explicitlyTrustedHtml" id="explicitlyTrustedHtml"></i><br><br> |
|---|
| 15171 | + * <b>User comments</b><br> |
|---|
| 15172 | + * By default, HTML that isn't explicitly trusted (e.g. Alice's comment) is sanitized when |
|---|
| 15173 | + * $sanitize is available. If $sanitize isn't available, this results in an error instead of an |
|---|
| 15174 | + * exploit. |
|---|
| 15175 | + * <div class="well"> |
|---|
| 15176 | + * <div ng-repeat="userComment in myCtrl.userComments"> |
|---|
| 15177 | + * <b>{{userComment.name}}</b>: |
|---|
| 15178 | + * <span ng-bind-html="userComment.htmlComment" class="htmlComment"></span> |
|---|
| 15179 | + * <br> |
|---|
| 15180 | + * </div> |
|---|
| 15181 | + * </div> |
|---|
| 15182 | + * </div> |
|---|
| 15183 | + * </file> |
|---|
| 15184 | + * |
|---|
| 15185 | + * <file name="script.js"> |
|---|
| 15186 | + * angular.module('mySceApp', ['ngSanitize']) |
|---|
| 15187 | + * .controller('AppController', ['$http', '$templateCache', '$sce', |
|---|
| 15188 | + * function($http, $templateCache, $sce) { |
|---|
| 15189 | + * var self = this; |
|---|
| 15190 | + * $http.get("test_data.json", {cache: $templateCache}).success(function(userComments) { |
|---|
| 15191 | + * self.userComments = userComments; |
|---|
| 15192 | + * }); |
|---|
| 15193 | + * self.explicitlyTrustedHtml = $sce.trustAsHtml( |
|---|
| 15194 | + * '<span onmouseover="this.textContent="Explicitly trusted HTML bypasses ' + |
|---|
| 15195 | + * 'sanitization."">Hover over this text.</span>'); |
|---|
| 15196 | + * }]); |
|---|
| 15197 | + * </file> |
|---|
| 15198 | + * |
|---|
| 15199 | + * <file name="test_data.json"> |
|---|
| 15200 | + * [ |
|---|
| 15201 | + * { "name": "Alice", |
|---|
| 15202 | + * "htmlComment": |
|---|
| 15203 | + * "<span onmouseover='this.textContent=\"PWN3D!\"'>Is <i>anyone</i> reading this?</span>" |
|---|
| 15204 | + * }, |
|---|
| 15205 | + * { "name": "Bob", |
|---|
| 15206 | + * "htmlComment": "<i>Yes!</i> Am I the only other one?" |
|---|
| 15207 | + * } |
|---|
| 15208 | + * ] |
|---|
| 15209 | + * </file> |
|---|
| 15210 | + * |
|---|
| 15211 | + * <file name="protractor.js" type="protractor"> |
|---|
| 15212 | + * describe('SCE doc demo', function() { |
|---|
| 15213 | + * it('should sanitize untrusted values', function() { |
|---|
| 15214 | + * expect(element.all(by.css('.htmlComment')).first().getInnerHtml()) |
|---|
| 15215 | + * .toBe('<span>Is <i>anyone</i> reading this?</span>'); |
|---|
| 15216 | + * }); |
|---|
| 15217 | + * |
|---|
| 15218 | + * it('should NOT sanitize explicitly trusted values', function() { |
|---|
| 15219 | + * expect(element(by.id('explicitlyTrustedHtml')).getInnerHtml()).toBe( |
|---|
| 15220 | + * '<span onmouseover="this.textContent="Explicitly trusted HTML bypasses ' + |
|---|
| 15221 | + * 'sanitization."">Hover over this text.</span>'); |
|---|
| 15222 | + * }); |
|---|
| 15223 | + * }); |
|---|
| 15224 | + * </file> |
|---|
| 15225 | + * </example> |
|---|
| 15226 | + * |
|---|
| 15227 | + * |
|---|
| 15228 | + * |
|---|
| 15229 | + * ## Can I disable SCE completely? |
|---|
| 15230 | + * |
|---|
| 15231 | + * Yes, you can. However, this is strongly discouraged. SCE gives you a lot of security benefits |
|---|
| 15232 | + * for little coding overhead. It will be much harder to take an SCE disabled application and |
|---|
| 15233 | + * either secure it on your own or enable SCE at a later stage. It might make sense to disable SCE |
|---|
| 15234 | + * for cases where you have a lot of existing code that was written before SCE was introduced and |
|---|
| 15235 | + * you're migrating them a module at a time. |
|---|
| 15236 | + * |
|---|
| 15237 | + * That said, here's how you can completely disable SCE: |
|---|
| 15238 | + * |
|---|
| 15239 | + * ``` |
|---|
| 15240 | + * angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) { |
|---|
| 15241 | + * // Completely disable SCE. For demonstration purposes only! |
|---|
| 15242 | + * // Do not use in new projects. |
|---|
| 15243 | + * $sceProvider.enabled(false); |
|---|
| 15244 | + * }); |
|---|
| 15245 | + * ``` |
|---|
| 15246 | + * |
|---|
| 15247 | + */ |
|---|
| 15248 | +/* jshint maxlen: 100 */ |
|---|
| 15249 | + |
|---|
| 15250 | +function $SceProvider() { |
|---|
| 15251 | + var enabled = true; |
|---|
| 15252 | + |
|---|
| 15253 | + /** |
|---|
| 15254 | + * @ngdoc method |
|---|
| 15255 | + * @name $sceProvider#enabled |
|---|
| 15256 | + * @kind function |
|---|
| 15257 | + * |
|---|
| 15258 | + * @param {boolean=} value If provided, then enables/disables SCE. |
|---|
| 15259 | + * @return {boolean} true if SCE is enabled, false otherwise. |
|---|
| 15260 | + * |
|---|
| 15261 | + * @description |
|---|
| 15262 | + * Enables/disables SCE and returns the current value. |
|---|
| 15263 | + */ |
|---|
| 15264 | + this.enabled = function (value) { |
|---|
| 15265 | + if (arguments.length) { |
|---|
| 15266 | + enabled = !!value; |
|---|
| 15267 | + } |
|---|
| 15268 | + return enabled; |
|---|
| 15269 | + }; |
|---|
| 15270 | + |
|---|
| 15271 | + |
|---|
| 15272 | + /* Design notes on the default implementation for SCE. |
|---|
| 15273 | + * |
|---|
| 15274 | + * The API contract for the SCE delegate |
|---|
| 15275 | + * ------------------------------------- |
|---|
| 15276 | + * The SCE delegate object must provide the following 3 methods: |
|---|
| 15277 | + * |
|---|
| 15278 | + * - trustAs(contextEnum, value) |
|---|
| 15279 | + * This method is used to tell the SCE service that the provided value is OK to use in the |
|---|
| 15280 | + * contexts specified by contextEnum. It must return an object that will be accepted by |
|---|
| 15281 | + * getTrusted() for a compatible contextEnum and return this value. |
|---|
| 15282 | + * |
|---|
| 15283 | + * - valueOf(value) |
|---|
| 15284 | + * For values that were not produced by trustAs(), return them as is. For values that were |
|---|
| 15285 | + * produced by trustAs(), return the corresponding input value to trustAs. Basically, if |
|---|
| 15286 | + * trustAs is wrapping the given values into some type, this operation unwraps it when given |
|---|
| 15287 | + * such a value. |
|---|
| 15288 | + * |
|---|
| 15289 | + * - getTrusted(contextEnum, value) |
|---|
| 15290 | + * This function should return the a value that is safe to use in the context specified by |
|---|
| 15291 | + * contextEnum or throw and exception otherwise. |
|---|
| 15292 | + * |
|---|
| 15293 | + * NOTE: This contract deliberately does NOT state that values returned by trustAs() must be |
|---|
| 15294 | + * opaque or wrapped in some holder object. That happens to be an implementation detail. For |
|---|
| 15295 | + * instance, an implementation could maintain a registry of all trusted objects by context. In |
|---|
| 15296 | + * such a case, trustAs() would return the same object that was passed in. getTrusted() would |
|---|
| 15297 | + * return the same object passed in if it was found in the registry under a compatible context or |
|---|
| 15298 | + * throw an exception otherwise. An implementation might only wrap values some of the time based |
|---|
| 15299 | + * on some criteria. getTrusted() might return a value and not throw an exception for special |
|---|
| 15300 | + * constants or objects even if not wrapped. All such implementations fulfill this contract. |
|---|
| 15301 | + * |
|---|
| 15302 | + * |
|---|
| 15303 | + * A note on the inheritance model for SCE contexts |
|---|
| 15304 | + * ------------------------------------------------ |
|---|
| 15305 | + * I've used inheritance and made RESOURCE_URL wrapped types a subtype of URL wrapped types. This |
|---|
| 15306 | + * is purely an implementation details. |
|---|
| 15307 | + * |
|---|
| 15308 | + * The contract is simply this: |
|---|
| 15309 | + * |
|---|
| 15310 | + * getTrusted($sce.RESOURCE_URL, value) succeeding implies that getTrusted($sce.URL, value) |
|---|
| 15311 | + * will also succeed. |
|---|
| 15312 | + * |
|---|
| 15313 | + * Inheritance happens to capture this in a natural way. In some future, we |
|---|
| 15314 | + * may not use inheritance anymore. That is OK because no code outside of |
|---|
| 15315 | + * sce.js and sceSpecs.js would need to be aware of this detail. |
|---|
| 15316 | + */ |
|---|
| 15317 | + |
|---|
| 15318 | + this.$get = ['$document', '$parse', '$sceDelegate', function( |
|---|
| 15319 | + $document, $parse, $sceDelegate) { |
|---|
| 15320 | + // Prereq: Ensure that we're not running in IE<11 quirks mode. In that mode, IE < 11 allow |
|---|
| 15321 | + // the "expression(javascript expression)" syntax which is insecure. |
|---|
| 15322 | + if (enabled && $document[0].documentMode < 8) { |
|---|
| 15323 | + throw $sceMinErr('iequirks', |
|---|
| 15324 | + 'Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks ' + |
|---|
| 15325 | + 'mode. You can fix this by adding the text <!doctype html> to the top of your HTML ' + |
|---|
| 15326 | + 'document. See http://docs.angularjs.org/api/ng.$sce for more information.'); |
|---|
| 15327 | + } |
|---|
| 15328 | + |
|---|
| 15329 | + var sce = shallowCopy(SCE_CONTEXTS); |
|---|
| 15330 | + |
|---|
| 15331 | + /** |
|---|
| 15332 | + * @ngdoc method |
|---|
| 15333 | + * @name $sce#isEnabled |
|---|
| 15334 | + * @kind function |
|---|
| 15335 | + * |
|---|
| 15336 | + * @return {Boolean} true if SCE is enabled, false otherwise. If you want to set the value, you |
|---|
| 15337 | + * have to do it at module config time on {@link ng.$sceProvider $sceProvider}. |
|---|
| 15338 | + * |
|---|
| 15339 | + * @description |
|---|
| 15340 | + * Returns a boolean indicating if SCE is enabled. |
|---|
| 15341 | + */ |
|---|
| 15342 | + sce.isEnabled = function () { |
|---|
| 15343 | + return enabled; |
|---|
| 15344 | + }; |
|---|
| 15345 | + sce.trustAs = $sceDelegate.trustAs; |
|---|
| 15346 | + sce.getTrusted = $sceDelegate.getTrusted; |
|---|
| 15347 | + sce.valueOf = $sceDelegate.valueOf; |
|---|
| 15348 | + |
|---|
| 15349 | + if (!enabled) { |
|---|
| 15350 | + sce.trustAs = sce.getTrusted = function(type, value) { return value; }; |
|---|
| 15351 | + sce.valueOf = identity; |
|---|
| 15352 | + } |
|---|
| 15353 | + |
|---|
| 15354 | + /** |
|---|
| 15355 | + * @ngdoc method |
|---|
| 15356 | + * @name $sce#parseAs |
|---|
| 15357 | + * |
|---|
| 15358 | + * @description |
|---|
| 15359 | + * Converts Angular {@link guide/expression expression} into a function. This is like {@link |
|---|
| 15360 | + * ng.$parse $parse} and is identical when the expression is a literal constant. Otherwise, it |
|---|
| 15361 | + * wraps the expression in a call to {@link ng.$sce#getTrusted $sce.getTrusted(*type*, |
|---|
| 15362 | + * *result*)} |
|---|
| 15363 | + * |
|---|
| 15364 | + * @param {string} type The kind of SCE context in which this result will be used. |
|---|
| 15365 | + * @param {string} expression String expression to compile. |
|---|
| 15366 | + * @returns {function(context, locals)} a function which represents the compiled expression: |
|---|
| 15367 | + * |
|---|
| 15368 | + * * `context` – `{object}` – an object against which any expressions embedded in the strings |
|---|
| 15369 | + * are evaluated against (typically a scope object). |
|---|
| 15370 | + * * `locals` – `{object=}` – local variables context object, useful for overriding values in |
|---|
| 15371 | + * `context`. |
|---|
| 15372 | + */ |
|---|
| 15373 | + sce.parseAs = function sceParseAs(type, expr) { |
|---|
| 15374 | + var parsed = $parse(expr); |
|---|
| 15375 | + if (parsed.literal && parsed.constant) { |
|---|
| 15376 | + return parsed; |
|---|
| 15377 | + } else { |
|---|
| 15378 | + return $parse(expr, function (value) { |
|---|
| 15379 | + return sce.getTrusted(type, value); |
|---|
| 15380 | + }); |
|---|
| 15381 | + } |
|---|
| 15382 | + }; |
|---|
| 15383 | + |
|---|
| 15384 | + /** |
|---|
| 15385 | + * @ngdoc method |
|---|
| 15386 | + * @name $sce#trustAs |
|---|
| 15387 | + * |
|---|
| 15388 | + * @description |
|---|
| 15389 | + * Delegates to {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}. As such, |
|---|
| 15390 | + * returns an object that is trusted by angular for use in specified strict contextual |
|---|
| 15391 | + * escaping contexts (such as ng-bind-html, ng-include, any src attribute |
|---|
| 15392 | + * interpolation, any dom event binding attribute interpolation such as for onclick, etc.) |
|---|
| 15393 | + * that uses the provided value. See * {@link ng.$sce $sce} for enabling strict contextual |
|---|
| 15394 | + * escaping. |
|---|
| 15395 | + * |
|---|
| 15396 | + * @param {string} type The kind of context in which this value is safe for use. e.g. url, |
|---|
| 15397 | + * resource_url, html, js and css. |
|---|
| 15398 | + * @param {*} value The value that that should be considered trusted/safe. |
|---|
| 15399 | + * @returns {*} A value that can be used to stand in for the provided `value` in places |
|---|
| 15400 | + * where Angular expects a $sce.trustAs() return value. |
|---|
| 15401 | + */ |
|---|
| 15402 | + |
|---|
| 15403 | + /** |
|---|
| 15404 | + * @ngdoc method |
|---|
| 15405 | + * @name $sce#trustAsHtml |
|---|
| 15406 | + * |
|---|
| 15407 | + * @description |
|---|
| 15408 | + * Shorthand method. `$sce.trustAsHtml(value)` → |
|---|
| 15409 | + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.HTML, value)`} |
|---|
| 15410 | + * |
|---|
| 15411 | + * @param {*} value The value to trustAs. |
|---|
| 15412 | + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedHtml |
|---|
| 15413 | + * $sce.getTrustedHtml(value)} to obtain the original value. (privileged directives |
|---|
| 15414 | + * only accept expressions that are either literal constants or are the |
|---|
| 15415 | + * return value of {@link ng.$sce#trustAs $sce.trustAs}.) |
|---|
| 15416 | + */ |
|---|
| 15417 | + |
|---|
| 15418 | + /** |
|---|
| 15419 | + * @ngdoc method |
|---|
| 15420 | + * @name $sce#trustAsUrl |
|---|
| 15421 | + * |
|---|
| 15422 | + * @description |
|---|
| 15423 | + * Shorthand method. `$sce.trustAsUrl(value)` → |
|---|
| 15424 | + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.URL, value)`} |
|---|
| 15425 | + * |
|---|
| 15426 | + * @param {*} value The value to trustAs. |
|---|
| 15427 | + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedUrl |
|---|
| 15428 | + * $sce.getTrustedUrl(value)} to obtain the original value. (privileged directives |
|---|
| 15429 | + * only accept expressions that are either literal constants or are the |
|---|
| 15430 | + * return value of {@link ng.$sce#trustAs $sce.trustAs}.) |
|---|
| 15431 | + */ |
|---|
| 15432 | + |
|---|
| 15433 | + /** |
|---|
| 15434 | + * @ngdoc method |
|---|
| 15435 | + * @name $sce#trustAsResourceUrl |
|---|
| 15436 | + * |
|---|
| 15437 | + * @description |
|---|
| 15438 | + * Shorthand method. `$sce.trustAsResourceUrl(value)` → |
|---|
| 15439 | + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.RESOURCE_URL, value)`} |
|---|
| 15440 | + * |
|---|
| 15441 | + * @param {*} value The value to trustAs. |
|---|
| 15442 | + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedResourceUrl |
|---|
| 15443 | + * $sce.getTrustedResourceUrl(value)} to obtain the original value. (privileged directives |
|---|
| 15444 | + * only accept expressions that are either literal constants or are the return |
|---|
| 15445 | + * value of {@link ng.$sce#trustAs $sce.trustAs}.) |
|---|
| 15446 | + */ |
|---|
| 15447 | + |
|---|
| 15448 | + /** |
|---|
| 15449 | + * @ngdoc method |
|---|
| 15450 | + * @name $sce#trustAsJs |
|---|
| 15451 | + * |
|---|
| 15452 | + * @description |
|---|
| 15453 | + * Shorthand method. `$sce.trustAsJs(value)` → |
|---|
| 15454 | + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.JS, value)`} |
|---|
| 15455 | + * |
|---|
| 15456 | + * @param {*} value The value to trustAs. |
|---|
| 15457 | + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedJs |
|---|
| 15458 | + * $sce.getTrustedJs(value)} to obtain the original value. (privileged directives |
|---|
| 15459 | + * only accept expressions that are either literal constants or are the |
|---|
| 15460 | + * return value of {@link ng.$sce#trustAs $sce.trustAs}.) |
|---|
| 15461 | + */ |
|---|
| 15462 | + |
|---|
| 15463 | + /** |
|---|
| 15464 | + * @ngdoc method |
|---|
| 15465 | + * @name $sce#getTrusted |
|---|
| 15466 | + * |
|---|
| 15467 | + * @description |
|---|
| 15468 | + * Delegates to {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted`}. As such, |
|---|
| 15469 | + * takes the result of a {@link ng.$sce#trustAs `$sce.trustAs`}() call and returns the |
|---|
| 15470 | + * originally supplied value if the queried context type is a supertype of the created type. |
|---|
| 15471 | + * If this condition isn't satisfied, throws an exception. |
|---|
| 15472 | + * |
|---|
| 15473 | + * @param {string} type The kind of context in which this value is to be used. |
|---|
| 15474 | + * @param {*} maybeTrusted The result of a prior {@link ng.$sce#trustAs `$sce.trustAs`} |
|---|
| 15475 | + * call. |
|---|
| 15476 | + * @returns {*} The value the was originally provided to |
|---|
| 15477 | + * {@link ng.$sce#trustAs `$sce.trustAs`} if valid in this context. |
|---|
| 15478 | + * Otherwise, throws an exception. |
|---|
| 15479 | + */ |
|---|
| 15480 | + |
|---|
| 15481 | + /** |
|---|
| 15482 | + * @ngdoc method |
|---|
| 15483 | + * @name $sce#getTrustedHtml |
|---|
| 15484 | + * |
|---|
| 15485 | + * @description |
|---|
| 15486 | + * Shorthand method. `$sce.getTrustedHtml(value)` → |
|---|
| 15487 | + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.HTML, value)`} |
|---|
| 15488 | + * |
|---|
| 15489 | + * @param {*} value The value to pass to `$sce.getTrusted`. |
|---|
| 15490 | + * @returns {*} The return value of `$sce.getTrusted($sce.HTML, value)` |
|---|
| 15491 | + */ |
|---|
| 15492 | + |
|---|
| 15493 | + /** |
|---|
| 15494 | + * @ngdoc method |
|---|
| 15495 | + * @name $sce#getTrustedCss |
|---|
| 15496 | + * |
|---|
| 15497 | + * @description |
|---|
| 15498 | + * Shorthand method. `$sce.getTrustedCss(value)` → |
|---|
| 15499 | + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.CSS, value)`} |
|---|
| 15500 | + * |
|---|
| 15501 | + * @param {*} value The value to pass to `$sce.getTrusted`. |
|---|
| 15502 | + * @returns {*} The return value of `$sce.getTrusted($sce.CSS, value)` |
|---|
| 15503 | + */ |
|---|
| 15504 | + |
|---|
| 15505 | + /** |
|---|
| 15506 | + * @ngdoc method |
|---|
| 15507 | + * @name $sce#getTrustedUrl |
|---|
| 15508 | + * |
|---|
| 15509 | + * @description |
|---|
| 15510 | + * Shorthand method. `$sce.getTrustedUrl(value)` → |
|---|
| 15511 | + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.URL, value)`} |
|---|
| 15512 | + * |
|---|
| 15513 | + * @param {*} value The value to pass to `$sce.getTrusted`. |
|---|
| 15514 | + * @returns {*} The return value of `$sce.getTrusted($sce.URL, value)` |
|---|
| 15515 | + */ |
|---|
| 15516 | + |
|---|
| 15517 | + /** |
|---|
| 15518 | + * @ngdoc method |
|---|
| 15519 | + * @name $sce#getTrustedResourceUrl |
|---|
| 15520 | + * |
|---|
| 15521 | + * @description |
|---|
| 15522 | + * Shorthand method. `$sce.getTrustedResourceUrl(value)` → |
|---|
| 15523 | + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.RESOURCE_URL, value)`} |
|---|
| 15524 | + * |
|---|
| 15525 | + * @param {*} value The value to pass to `$sceDelegate.getTrusted`. |
|---|
| 15526 | + * @returns {*} The return value of `$sce.getTrusted($sce.RESOURCE_URL, value)` |
|---|
| 15527 | + */ |
|---|
| 15528 | + |
|---|
| 15529 | + /** |
|---|
| 15530 | + * @ngdoc method |
|---|
| 15531 | + * @name $sce#getTrustedJs |
|---|
| 15532 | + * |
|---|
| 15533 | + * @description |
|---|
| 15534 | + * Shorthand method. `$sce.getTrustedJs(value)` → |
|---|
| 15535 | + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.JS, value)`} |
|---|
| 15536 | + * |
|---|
| 15537 | + * @param {*} value The value to pass to `$sce.getTrusted`. |
|---|
| 15538 | + * @returns {*} The return value of `$sce.getTrusted($sce.JS, value)` |
|---|
| 15539 | + */ |
|---|
| 15540 | + |
|---|
| 15541 | + /** |
|---|
| 15542 | + * @ngdoc method |
|---|
| 15543 | + * @name $sce#parseAsHtml |
|---|
| 15544 | + * |
|---|
| 15545 | + * @description |
|---|
| 15546 | + * Shorthand method. `$sce.parseAsHtml(expression string)` → |
|---|
| 15547 | + * {@link ng.$sce#parseAs `$sce.parseAs($sce.HTML, value)`} |
|---|
| 15548 | + * |
|---|
| 15549 | + * @param {string} expression String expression to compile. |
|---|
| 15550 | + * @returns {function(context, locals)} a function which represents the compiled expression: |
|---|
| 15551 | + * |
|---|
| 15552 | + * * `context` – `{object}` – an object against which any expressions embedded in the strings |
|---|
| 15553 | + * are evaluated against (typically a scope object). |
|---|
| 15554 | + * * `locals` – `{object=}` – local variables context object, useful for overriding values in |
|---|
| 15555 | + * `context`. |
|---|
| 15556 | + */ |
|---|
| 15557 | + |
|---|
| 15558 | + /** |
|---|
| 15559 | + * @ngdoc method |
|---|
| 15560 | + * @name $sce#parseAsCss |
|---|
| 15561 | + * |
|---|
| 15562 | + * @description |
|---|
| 15563 | + * Shorthand method. `$sce.parseAsCss(value)` → |
|---|
| 15564 | + * {@link ng.$sce#parseAs `$sce.parseAs($sce.CSS, value)`} |
|---|
| 15565 | + * |
|---|
| 15566 | + * @param {string} expression String expression to compile. |
|---|
| 15567 | + * @returns {function(context, locals)} a function which represents the compiled expression: |
|---|
| 15568 | + * |
|---|
| 15569 | + * * `context` – `{object}` – an object against which any expressions embedded in the strings |
|---|
| 15570 | + * are evaluated against (typically a scope object). |
|---|
| 15571 | + * * `locals` – `{object=}` – local variables context object, useful for overriding values in |
|---|
| 15572 | + * `context`. |
|---|
| 15573 | + */ |
|---|
| 15574 | + |
|---|
| 15575 | + /** |
|---|
| 15576 | + * @ngdoc method |
|---|
| 15577 | + * @name $sce#parseAsUrl |
|---|
| 15578 | + * |
|---|
| 15579 | + * @description |
|---|
| 15580 | + * Shorthand method. `$sce.parseAsUrl(value)` → |
|---|
| 15581 | + * {@link ng.$sce#parseAs `$sce.parseAs($sce.URL, value)`} |
|---|
| 15582 | + * |
|---|
| 15583 | + * @param {string} expression String expression to compile. |
|---|
| 15584 | + * @returns {function(context, locals)} a function which represents the compiled expression: |
|---|
| 15585 | + * |
|---|
| 15586 | + * * `context` – `{object}` – an object against which any expressions embedded in the strings |
|---|
| 15587 | + * are evaluated against (typically a scope object). |
|---|
| 15588 | + * * `locals` – `{object=}` – local variables context object, useful for overriding values in |
|---|
| 15589 | + * `context`. |
|---|
| 15590 | + */ |
|---|
| 15591 | + |
|---|
| 15592 | + /** |
|---|
| 15593 | + * @ngdoc method |
|---|
| 15594 | + * @name $sce#parseAsResourceUrl |
|---|
| 15595 | + * |
|---|
| 15596 | + * @description |
|---|
| 15597 | + * Shorthand method. `$sce.parseAsResourceUrl(value)` → |
|---|
| 15598 | + * {@link ng.$sce#parseAs `$sce.parseAs($sce.RESOURCE_URL, value)`} |
|---|
| 15599 | + * |
|---|
| 15600 | + * @param {string} expression String expression to compile. |
|---|
| 15601 | + * @returns {function(context, locals)} a function which represents the compiled expression: |
|---|
| 15602 | + * |
|---|
| 15603 | + * * `context` – `{object}` – an object against which any expressions embedded in the strings |
|---|
| 15604 | + * are evaluated against (typically a scope object). |
|---|
| 15605 | + * * `locals` – `{object=}` – local variables context object, useful for overriding values in |
|---|
| 15606 | + * `context`. |
|---|
| 15607 | + */ |
|---|
| 15608 | + |
|---|
| 15609 | + /** |
|---|
| 15610 | + * @ngdoc method |
|---|
| 15611 | + * @name $sce#parseAsJs |
|---|
| 15612 | + * |
|---|
| 15613 | + * @description |
|---|
| 15614 | + * Shorthand method. `$sce.parseAsJs(value)` → |
|---|
| 15615 | + * {@link ng.$sce#parseAs `$sce.parseAs($sce.JS, value)`} |
|---|
| 15616 | + * |
|---|
| 15617 | + * @param {string} expression String expression to compile. |
|---|
| 15618 | + * @returns {function(context, locals)} a function which represents the compiled expression: |
|---|
| 15619 | + * |
|---|
| 15620 | + * * `context` – `{object}` – an object against which any expressions embedded in the strings |
|---|
| 15621 | + * are evaluated against (typically a scope object). |
|---|
| 15622 | + * * `locals` – `{object=}` – local variables context object, useful for overriding values in |
|---|
| 15623 | + * `context`. |
|---|
| 15624 | + */ |
|---|
| 15625 | + |
|---|
| 15626 | + // Shorthand delegations. |
|---|
| 15627 | + var parse = sce.parseAs, |
|---|
| 15628 | + getTrusted = sce.getTrusted, |
|---|
| 15629 | + trustAs = sce.trustAs; |
|---|
| 15630 | + |
|---|
| 15631 | + forEach(SCE_CONTEXTS, function (enumValue, name) { |
|---|
| 15632 | + var lName = lowercase(name); |
|---|
| 15633 | + sce[camelCase("parse_as_" + lName)] = function (expr) { |
|---|
| 15634 | + return parse(enumValue, expr); |
|---|
| 15635 | + }; |
|---|
| 15636 | + sce[camelCase("get_trusted_" + lName)] = function (value) { |
|---|
| 15637 | + return getTrusted(enumValue, value); |
|---|
| 15638 | + }; |
|---|
| 15639 | + sce[camelCase("trust_as_" + lName)] = function (value) { |
|---|
| 15640 | + return trustAs(enumValue, value); |
|---|
| 15641 | + }; |
|---|
| 15642 | + }); |
|---|
| 15643 | + |
|---|
| 15644 | + return sce; |
|---|
| 15645 | + }]; |
|---|
| 15646 | +} |
|---|
| 15647 | + |
|---|
| 15648 | +/** |
|---|
| 15649 | + * !!! This is an undocumented "private" service !!! |
|---|
| 15650 | + * |
|---|
| 15651 | + * @name $sniffer |
|---|
| 15652 | + * @requires $window |
|---|
| 15653 | + * @requires $document |
|---|
| 15654 | + * |
|---|
| 15655 | + * @property {boolean} history Does the browser support html5 history api ? |
|---|
| 15656 | + * @property {boolean} transitions Does the browser support CSS transition events ? |
|---|
| 15657 | + * @property {boolean} animations Does the browser support CSS animation events ? |
|---|
| 15658 | + * |
|---|
| 15659 | + * @description |
|---|
| 15660 | + * This is very simple implementation of testing browser's features. |
|---|
| 15661 | + */ |
|---|
| 15662 | +function $SnifferProvider() { |
|---|
| 15663 | + this.$get = ['$window', '$document', function($window, $document) { |
|---|
| 15664 | + var eventSupport = {}, |
|---|
| 15665 | + android = |
|---|
| 15666 | + int((/android (\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]), |
|---|
| 15667 | + boxee = /Boxee/i.test(($window.navigator || {}).userAgent), |
|---|
| 15668 | + document = $document[0] || {}, |
|---|
| 15669 | + vendorPrefix, |
|---|
| 15670 | + vendorRegex = /^(Moz|webkit|O|ms)(?=[A-Z])/, |
|---|
| 15671 | + bodyStyle = document.body && document.body.style, |
|---|
| 15672 | + transitions = false, |
|---|
| 15673 | + animations = false, |
|---|
| 15674 | + match; |
|---|
| 15675 | + |
|---|
| 15676 | + if (bodyStyle) { |
|---|
| 15677 | + for(var prop in bodyStyle) { |
|---|
| 15678 | + if(match = vendorRegex.exec(prop)) { |
|---|
| 15679 | + vendorPrefix = match[0]; |
|---|
| 15680 | + vendorPrefix = vendorPrefix.substr(0, 1).toUpperCase() + vendorPrefix.substr(1); |
|---|
| 15681 | + break; |
|---|
| 15682 | + } |
|---|
| 15683 | + } |
|---|
| 15684 | + |
|---|
| 15685 | + if(!vendorPrefix) { |
|---|
| 15686 | + vendorPrefix = ('WebkitOpacity' in bodyStyle) && 'webkit'; |
|---|
| 15687 | + } |
|---|
| 15688 | + |
|---|
| 15689 | + transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle)); |
|---|
| 15690 | + animations = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle)); |
|---|
| 15691 | + |
|---|
| 15692 | + if (android && (!transitions||!animations)) { |
|---|
| 15693 | + transitions = isString(document.body.style.webkitTransition); |
|---|
| 15694 | + animations = isString(document.body.style.webkitAnimation); |
|---|
| 15695 | + } |
|---|
| 15696 | + } |
|---|
| 15697 | + |
|---|
| 15698 | + |
|---|
| 15699 | + return { |
|---|
| 15700 | + // Android has history.pushState, but it does not update location correctly |
|---|
| 15701 | + // so let's not use the history API at all. |
|---|
| 15702 | + // http://code.google.com/p/android/issues/detail?id=17471 |
|---|
| 15703 | + // https://github.com/angular/angular.js/issues/904 |
|---|
| 15704 | + |
|---|
| 15705 | + // older webkit browser (533.9) on Boxee box has exactly the same problem as Android has |
|---|
| 15706 | + // so let's not use the history API also |
|---|
| 15707 | + // We are purposefully using `!(android < 4)` to cover the case when `android` is undefined |
|---|
| 15708 | + // jshint -W018 |
|---|
| 15709 | + history: !!($window.history && $window.history.pushState && !(android < 4) && !boxee), |
|---|
| 15710 | + // jshint +W018 |
|---|
| 15711 | + hasEvent: function(event) { |
|---|
| 15712 | + // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have |
|---|
| 15713 | + // it. In particular the event is not fired when backspace or delete key are pressed or |
|---|
| 15714 | + // when cut operation is performed. |
|---|
| 15715 | + if (event == 'input' && msie == 9) return false; |
|---|
| 15716 | + |
|---|
| 15717 | + if (isUndefined(eventSupport[event])) { |
|---|
| 15718 | + var divElm = document.createElement('div'); |
|---|
| 15719 | + eventSupport[event] = 'on' + event in divElm; |
|---|
| 15720 | + } |
|---|
| 15721 | + |
|---|
| 15722 | + return eventSupport[event]; |
|---|
| 15723 | + }, |
|---|
| 15724 | + csp: csp(), |
|---|
| 15725 | + vendorPrefix: vendorPrefix, |
|---|
| 15726 | + transitions : transitions, |
|---|
| 15727 | + animations : animations, |
|---|
| 15728 | + android: android |
|---|
| 15729 | + }; |
|---|
| 15730 | + }]; |
|---|
| 15731 | +} |
|---|
| 15732 | + |
|---|
| 15733 | +var $compileMinErr = minErr('$compile'); |
|---|
| 15734 | + |
|---|
| 15735 | +/** |
|---|
| 15736 | + * @ngdoc service |
|---|
| 15737 | + * @name $templateRequest |
|---|
| 15738 | + * |
|---|
| 15739 | + * @description |
|---|
| 15740 | + * The `$templateRequest` service downloads the provided template using `$http` and, upon success, |
|---|
| 15741 | + * stores the contents inside of `$templateCache`. If the HTTP request fails or the response data |
|---|
| 15742 | + * of the HTTP request is empty then a `$compile` error will be thrown (the exception can be thwarted |
|---|
| 15743 | + * by setting the 2nd parameter of the function to true). |
|---|
| 15744 | + * |
|---|
| 15745 | + * @param {string} tpl The HTTP request template URL |
|---|
| 15746 | + * @param {boolean=} ignoreRequestError Whether or not to ignore the exception when the request fails or the template is empty |
|---|
| 15747 | + * |
|---|
| 15748 | + * @return {Promise} the HTTP Promise for the given. |
|---|
| 15749 | + * |
|---|
| 15750 | + * @property {number} totalPendingRequests total amount of pending template requests being downloaded. |
|---|
| 15751 | + */ |
|---|
| 15752 | +function $TemplateRequestProvider() { |
|---|
| 15753 | + this.$get = ['$templateCache', '$http', '$q', function($templateCache, $http, $q) { |
|---|
| 15754 | + function handleRequestFn(tpl, ignoreRequestError) { |
|---|
| 15755 | + var self = handleRequestFn; |
|---|
| 15756 | + self.totalPendingRequests++; |
|---|
| 15757 | + |
|---|
| 15758 | + return $http.get(tpl, { cache : $templateCache }) |
|---|
| 15759 | + .then(function(response) { |
|---|
| 15760 | + var html = response.data; |
|---|
| 15761 | + if(!html || html.length === 0) { |
|---|
| 15762 | + return handleError(); |
|---|
| 15763 | + } |
|---|
| 15764 | + |
|---|
| 15765 | + self.totalPendingRequests--; |
|---|
| 15766 | + $templateCache.put(tpl, html); |
|---|
| 15767 | + return html; |
|---|
| 15768 | + }, handleError); |
|---|
| 15769 | + |
|---|
| 15770 | + function handleError() { |
|---|
| 15771 | + self.totalPendingRequests--; |
|---|
| 15772 | + if (!ignoreRequestError) { |
|---|
| 15773 | + throw $compileMinErr('tpload', 'Failed to load template: {0}', tpl); |
|---|
| 15774 | + } |
|---|
| 15775 | + return $q.reject(); |
|---|
| 15776 | + } |
|---|
| 15777 | + } |
|---|
| 15778 | + |
|---|
| 15779 | + handleRequestFn.totalPendingRequests = 0; |
|---|
| 15780 | + |
|---|
| 15781 | + return handleRequestFn; |
|---|
| 15782 | + }]; |
|---|
| 15783 | +} |
|---|
| 15784 | + |
|---|
| 15785 | +function $$TestabilityProvider() { |
|---|
| 15786 | + this.$get = ['$rootScope', '$browser', '$location', |
|---|
| 15787 | + function($rootScope, $browser, $location) { |
|---|
| 15788 | + |
|---|
| 15789 | + /** |
|---|
| 15790 | + * @name $testability |
|---|
| 15791 | + * |
|---|
| 15792 | + * @description |
|---|
| 15793 | + * The private $$testability service provides a collection of methods for use when debugging |
|---|
| 15794 | + * or by automated test and debugging tools. |
|---|
| 15795 | + */ |
|---|
| 15796 | + var testability = {}; |
|---|
| 15797 | + |
|---|
| 15798 | + /** |
|---|
| 15799 | + * @name $$testability#findBindings |
|---|
| 15800 | + * |
|---|
| 15801 | + * @description |
|---|
| 15802 | + * Returns an array of elements that are bound (via ng-bind or {{}}) |
|---|
| 15803 | + * to expressions matching the input. |
|---|
| 15804 | + * |
|---|
| 15805 | + * @param {Element} element The element root to search from. |
|---|
| 15806 | + * @param {string} expression The binding expression to match. |
|---|
| 15807 | + * @param {boolean} opt_exactMatch If true, only returns exact matches |
|---|
| 15808 | + * for the expression. Filters and whitespace are ignored. |
|---|
| 15809 | + */ |
|---|
| 15810 | + testability.findBindings = function(element, expression, opt_exactMatch) { |
|---|
| 15811 | + var bindings = element.getElementsByClassName('ng-binding'); |
|---|
| 15812 | + var matches = []; |
|---|
| 15813 | + forEach(bindings, function(binding) { |
|---|
| 15814 | + var dataBinding = angular.element(binding).data('$binding'); |
|---|
| 15815 | + if (dataBinding) { |
|---|
| 15816 | + forEach(dataBinding, function(bindingName) { |
|---|
| 15817 | + if (opt_exactMatch) { |
|---|
| 15818 | + var matcher = new RegExp('(^|\\s)' + expression + '(\\s|\\||$)'); |
|---|
| 15819 | + if (matcher.test(bindingName)) { |
|---|
| 15820 | + matches.push(binding); |
|---|
| 15821 | + } |
|---|
| 15822 | + } else { |
|---|
| 15823 | + if (bindingName.indexOf(expression) != -1) { |
|---|
| 15824 | + matches.push(binding); |
|---|
| 15825 | + } |
|---|
| 15826 | + } |
|---|
| 15827 | + }); |
|---|
| 15828 | + } |
|---|
| 15829 | + }); |
|---|
| 15830 | + return matches; |
|---|
| 15831 | + }; |
|---|
| 15832 | + |
|---|
| 15833 | + /** |
|---|
| 15834 | + * @name $$testability#findModels |
|---|
| 15835 | + * |
|---|
| 15836 | + * @description |
|---|
| 15837 | + * Returns an array of elements that are two-way found via ng-model to |
|---|
| 15838 | + * expressions matching the input. |
|---|
| 15839 | + * |
|---|
| 15840 | + * @param {Element} element The element root to search from. |
|---|
| 15841 | + * @param {string} expression The model expression to match. |
|---|
| 15842 | + * @param {boolean} opt_exactMatch If true, only returns exact matches |
|---|
| 15843 | + * for the expression. |
|---|
| 15844 | + */ |
|---|
| 15845 | + testability.findModels = function(element, expression, opt_exactMatch) { |
|---|
| 15846 | + var prefixes = ['ng-', 'data-ng-', 'ng\\:']; |
|---|
| 15847 | + for (var p = 0; p < prefixes.length; ++p) { |
|---|
| 15848 | + var attributeEquals = opt_exactMatch ? '=' : '*='; |
|---|
| 15849 | + var selector = '[' + prefixes[p] + 'model' + attributeEquals + '"' + expression + '"]'; |
|---|
| 15850 | + var elements = element.querySelectorAll(selector); |
|---|
| 15851 | + if (elements.length) { |
|---|
| 15852 | + return elements; |
|---|
| 15853 | + } |
|---|
| 15854 | + } |
|---|
| 15855 | + }; |
|---|
| 15856 | + |
|---|
| 15857 | + /** |
|---|
| 15858 | + * @name $$testability#getLocation |
|---|
| 15859 | + * |
|---|
| 15860 | + * @description |
|---|
| 15861 | + * Shortcut for getting the location in a browser agnostic way. Returns |
|---|
| 15862 | + * the path, search, and hash. (e.g. /path?a=b#hash) |
|---|
| 15863 | + */ |
|---|
| 15864 | + testability.getLocation = function() { |
|---|
| 15865 | + return $location.url(); |
|---|
| 15866 | + }; |
|---|
| 15867 | + |
|---|
| 15868 | + /** |
|---|
| 15869 | + * @name $$testability#setLocation |
|---|
| 15870 | + * |
|---|
| 15871 | + * @description |
|---|
| 15872 | + * Shortcut for navigating to a location without doing a full page reload. |
|---|
| 15873 | + * |
|---|
| 15874 | + * @param {string} url The location url (path, search and hash, |
|---|
| 15875 | + * e.g. /path?a=b#hash) to go to. |
|---|
| 15876 | + */ |
|---|
| 15877 | + testability.setLocation = function(url) { |
|---|
| 15878 | + if (url !== $location.url()) { |
|---|
| 15879 | + $location.url(url); |
|---|
| 15880 | + $rootScope.$digest(); |
|---|
| 15881 | + } |
|---|
| 15882 | + }; |
|---|
| 15883 | + |
|---|
| 15884 | + /** |
|---|
| 15885 | + * @name $$testability#whenStable |
|---|
| 15886 | + * |
|---|
| 15887 | + * @description |
|---|
| 15888 | + * Calls the callback when $timeout and $http requests are completed. |
|---|
| 15889 | + * |
|---|
| 15890 | + * @param {function} callback |
|---|
| 15891 | + */ |
|---|
| 15892 | + testability.whenStable = function(callback) { |
|---|
| 15893 | + $browser.notifyWhenNoOutstandingRequests(callback); |
|---|
| 15894 | + }; |
|---|
| 15895 | + |
|---|
| 15896 | + return testability; |
|---|
| 15897 | + }]; |
|---|
| 15898 | +} |
|---|
| 15899 | + |
|---|
| 15900 | +function $TimeoutProvider() { |
|---|
| 15901 | + this.$get = ['$rootScope', '$browser', '$q', '$$q', '$exceptionHandler', |
|---|
| 15902 | + function($rootScope, $browser, $q, $$q, $exceptionHandler) { |
|---|
| 15903 | + var deferreds = {}; |
|---|
| 15904 | + |
|---|
| 15905 | + |
|---|
| 15906 | + /** |
|---|
| 15907 | + * @ngdoc service |
|---|
| 15908 | + * @name $timeout |
|---|
| 15909 | + * |
|---|
| 15910 | + * @description |
|---|
| 15911 | + * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch |
|---|
| 15912 | + * block and delegates any exceptions to |
|---|
| 15913 | + * {@link ng.$exceptionHandler $exceptionHandler} service. |
|---|
| 15914 | + * |
|---|
| 15915 | + * The return value of registering a timeout function is a promise, which will be resolved when |
|---|
| 15916 | + * the timeout is reached and the timeout function is executed. |
|---|
| 15917 | + * |
|---|
| 15918 | + * To cancel a timeout request, call `$timeout.cancel(promise)`. |
|---|
| 15919 | + * |
|---|
| 15920 | + * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to |
|---|
| 15921 | + * synchronously flush the queue of deferred functions. |
|---|
| 15922 | + * |
|---|
| 15923 | + * @param {function()} fn A function, whose execution should be delayed. |
|---|
| 15924 | + * @param {number=} [delay=0] Delay in milliseconds. |
|---|
| 15925 | + * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise |
|---|
| 15926 | + * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block. |
|---|
| 15927 | + * @returns {Promise} Promise that will be resolved when the timeout is reached. The value this |
|---|
| 15928 | + * promise will be resolved with is the return value of the `fn` function. |
|---|
| 15929 | + * |
|---|
| 15930 | + */ |
|---|
| 15931 | + function timeout(fn, delay, invokeApply) { |
|---|
| 15932 | + var skipApply = (isDefined(invokeApply) && !invokeApply), |
|---|
| 15933 | + deferred = (skipApply ? $$q : $q).defer(), |
|---|
| 15934 | + promise = deferred.promise, |
|---|
| 15935 | + timeoutId; |
|---|
| 15936 | + |
|---|
| 15937 | + timeoutId = $browser.defer(function() { |
|---|
| 15938 | + try { |
|---|
| 15939 | + deferred.resolve(fn()); |
|---|
| 15940 | + } catch(e) { |
|---|
| 15941 | + deferred.reject(e); |
|---|
| 15942 | + $exceptionHandler(e); |
|---|
| 15943 | + } |
|---|
| 15944 | + finally { |
|---|
| 15945 | + delete deferreds[promise.$$timeoutId]; |
|---|
| 15946 | + } |
|---|
| 15947 | + |
|---|
| 15948 | + if (!skipApply) $rootScope.$apply(); |
|---|
| 15949 | + }, delay); |
|---|
| 15950 | + |
|---|
| 15951 | + promise.$$timeoutId = timeoutId; |
|---|
| 15952 | + deferreds[timeoutId] = deferred; |
|---|
| 15953 | + |
|---|
| 15954 | + return promise; |
|---|
| 15955 | + } |
|---|
| 15956 | + |
|---|
| 15957 | + |
|---|
| 15958 | + /** |
|---|
| 15959 | + * @ngdoc method |
|---|
| 15960 | + * @name $timeout#cancel |
|---|
| 15961 | + * |
|---|
| 15962 | + * @description |
|---|
| 15963 | + * Cancels a task associated with the `promise`. As a result of this, the promise will be |
|---|
| 15964 | + * resolved with a rejection. |
|---|
| 15965 | + * |
|---|
| 15966 | + * @param {Promise=} promise Promise returned by the `$timeout` function. |
|---|
| 15967 | + * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully |
|---|
| 15968 | + * canceled. |
|---|
| 15969 | + */ |
|---|
| 15970 | + timeout.cancel = function(promise) { |
|---|
| 15971 | + if (promise && promise.$$timeoutId in deferreds) { |
|---|
| 15972 | + deferreds[promise.$$timeoutId].reject('canceled'); |
|---|
| 15973 | + delete deferreds[promise.$$timeoutId]; |
|---|
| 15974 | + return $browser.defer.cancel(promise.$$timeoutId); |
|---|
| 15975 | + } |
|---|
| 15976 | + return false; |
|---|
| 15977 | + }; |
|---|
| 15978 | + |
|---|
| 15979 | + return timeout; |
|---|
| 15980 | + }]; |
|---|
| 15981 | +} |
|---|
| 15982 | + |
|---|
| 15983 | +// NOTE: The usage of window and document instead of $window and $document here is |
|---|
| 15984 | +// deliberate. This service depends on the specific behavior of anchor nodes created by the |
|---|
| 15985 | +// browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and |
|---|
| 15986 | +// cause us to break tests. In addition, when the browser resolves a URL for XHR, it |
|---|
| 15987 | +// doesn't know about mocked locations and resolves URLs to the real document - which is |
|---|
| 15988 | +// exactly the behavior needed here. There is little value is mocking these out for this |
|---|
| 15989 | +// service. |
|---|
| 15990 | +var urlParsingNode = document.createElement("a"); |
|---|
| 15991 | +var originUrl = urlResolve(window.location.href, true); |
|---|
| 15992 | + |
|---|
| 15993 | + |
|---|
| 15994 | +/** |
|---|
| 15995 | + * |
|---|
| 15996 | + * Implementation Notes for non-IE browsers |
|---|
| 15997 | + * ---------------------------------------- |
|---|
| 15998 | + * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM, |
|---|
| 15999 | + * results both in the normalizing and parsing of the URL. Normalizing means that a relative |
|---|
| 16000 | + * URL will be resolved into an absolute URL in the context of the application document. |
|---|
| 16001 | + * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related |
|---|
| 16002 | + * properties are all populated to reflect the normalized URL. This approach has wide |
|---|
| 16003 | + * compatibility - Safari 1+, Mozilla 1+, Opera 7+,e etc. See |
|---|
| 16004 | + * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html |
|---|
| 16005 | + * |
|---|
| 16006 | + * Implementation Notes for IE |
|---|
| 16007 | + * --------------------------- |
|---|
| 16008 | + * IE >= 8 and <= 10 normalizes the URL when assigned to the anchor node similar to the other |
|---|
| 16009 | + * browsers. However, the parsed components will not be set if the URL assigned did not specify |
|---|
| 16010 | + * them. (e.g. if you assign a.href = "foo", then a.protocol, a.host, etc. will be empty.) We |
|---|
| 16011 | + * work around that by performing the parsing in a 2nd step by taking a previously normalized |
|---|
| 16012 | + * URL (e.g. by assigning to a.href) and assigning it a.href again. This correctly populates the |
|---|
| 16013 | + * properties such as protocol, hostname, port, etc. |
|---|
| 16014 | + * |
|---|
| 16015 | + * IE7 does not normalize the URL when assigned to an anchor node. (Apparently, it does, if one |
|---|
| 16016 | + * uses the inner HTML approach to assign the URL as part of an HTML snippet - |
|---|
| 16017 | + * http://stackoverflow.com/a/472729) However, setting img[src] does normalize the URL. |
|---|
| 16018 | + * Unfortunately, setting img[src] to something like "javascript:foo" on IE throws an exception. |
|---|
| 16019 | + * Since the primary usage for normalizing URLs is to sanitize such URLs, we can't use that |
|---|
| 16020 | + * method and IE < 8 is unsupported. |
|---|
| 16021 | + * |
|---|
| 16022 | + * References: |
|---|
| 16023 | + * http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement |
|---|
| 16024 | + * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html |
|---|
| 16025 | + * http://url.spec.whatwg.org/#urlutils |
|---|
| 16026 | + * https://github.com/angular/angular.js/pull/2902 |
|---|
| 16027 | + * http://james.padolsey.com/javascript/parsing-urls-with-the-dom/ |
|---|
| 16028 | + * |
|---|
| 16029 | + * @kind function |
|---|
| 16030 | + * @param {string} url The URL to be parsed. |
|---|
| 16031 | + * @description Normalizes and parses a URL. |
|---|
| 16032 | + * @returns {object} Returns the normalized URL as a dictionary. |
|---|
| 16033 | + * |
|---|
| 16034 | + * | member name | Description | |
|---|
| 16035 | + * |---------------|----------------| |
|---|
| 16036 | + * | href | A normalized version of the provided URL if it was not an absolute URL | |
|---|
| 16037 | + * | protocol | The protocol including the trailing colon | |
|---|
| 16038 | + * | host | The host and port (if the port is non-default) of the normalizedUrl | |
|---|
| 16039 | + * | search | The search params, minus the question mark | |
|---|
| 16040 | + * | hash | The hash string, minus the hash symbol |
|---|
| 16041 | + * | hostname | The hostname |
|---|
| 16042 | + * | port | The port, without ":" |
|---|
| 16043 | + * | pathname | The pathname, beginning with "/" |
|---|
| 16044 | + * |
|---|
| 16045 | + */ |
|---|
| 16046 | +function urlResolve(url, base) { |
|---|
| 16047 | + var href = url; |
|---|
| 16048 | + |
|---|
| 16049 | + if (msie) { |
|---|
| 16050 | + // Normalize before parse. Refer Implementation Notes on why this is |
|---|
| 16051 | + // done in two steps on IE. |
|---|
| 16052 | + urlParsingNode.setAttribute("href", href); |
|---|
| 16053 | + href = urlParsingNode.href; |
|---|
| 16054 | + } |
|---|
| 16055 | + |
|---|
| 16056 | + urlParsingNode.setAttribute('href', href); |
|---|
| 16057 | + |
|---|
| 16058 | + // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils |
|---|
| 16059 | + return { |
|---|
| 16060 | + href: urlParsingNode.href, |
|---|
| 16061 | + protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', |
|---|
| 16062 | + host: urlParsingNode.host, |
|---|
| 16063 | + search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', |
|---|
| 16064 | + hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', |
|---|
| 16065 | + hostname: urlParsingNode.hostname, |
|---|
| 16066 | + port: urlParsingNode.port, |
|---|
| 16067 | + pathname: (urlParsingNode.pathname.charAt(0) === '/') |
|---|
| 16068 | + ? urlParsingNode.pathname |
|---|
| 16069 | + : '/' + urlParsingNode.pathname |
|---|
| 16070 | + }; |
|---|
| 16071 | +} |
|---|
| 16072 | + |
|---|
| 16073 | +/** |
|---|
| 16074 | + * Parse a request URL and determine whether this is a same-origin request as the application document. |
|---|
| 16075 | + * |
|---|
| 16076 | + * @param {string|object} requestUrl The url of the request as a string that will be resolved |
|---|
| 16077 | + * or a parsed URL object. |
|---|
| 16078 | + * @returns {boolean} Whether the request is for the same origin as the application document. |
|---|
| 16079 | + */ |
|---|
| 16080 | +function urlIsSameOrigin(requestUrl) { |
|---|
| 16081 | + var parsed = (isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl; |
|---|
| 16082 | + return (parsed.protocol === originUrl.protocol && |
|---|
| 16083 | + parsed.host === originUrl.host); |
|---|
| 16084 | +} |
|---|
| 16085 | + |
|---|
| 16086 | +/** |
|---|
| 16087 | + * @ngdoc service |
|---|
| 16088 | + * @name $window |
|---|
| 16089 | + * |
|---|
| 16090 | + * @description |
|---|
| 16091 | + * A reference to the browser's `window` object. While `window` |
|---|
| 16092 | + * is globally available in JavaScript, it causes testability problems, because |
|---|
| 16093 | + * it is a global variable. In angular we always refer to it through the |
|---|
| 16094 | + * `$window` service, so it may be overridden, removed or mocked for testing. |
|---|
| 16095 | + * |
|---|
| 16096 | + * Expressions, like the one defined for the `ngClick` directive in the example |
|---|
| 16097 | + * below, are evaluated with respect to the current scope. Therefore, there is |
|---|
| 16098 | + * no risk of inadvertently coding in a dependency on a global value in such an |
|---|
| 16099 | + * expression. |
|---|
| 16100 | + * |
|---|
| 16101 | + * @example |
|---|
| 16102 | + <example module="windowExample"> |
|---|
| 16103 | + <file name="index.html"> |
|---|
| 16104 | + <script> |
|---|
| 16105 | + angular.module('windowExample', []) |
|---|
| 16106 | + .controller('ExampleController', ['$scope', '$window', function ($scope, $window) { |
|---|
| 16107 | + $scope.greeting = 'Hello, World!'; |
|---|
| 16108 | + $scope.doGreeting = function(greeting) { |
|---|
| 16109 | + $window.alert(greeting); |
|---|
| 16110 | + }; |
|---|
| 16111 | + }]); |
|---|
| 16112 | + </script> |
|---|
| 16113 | + <div ng-controller="ExampleController"> |
|---|
| 16114 | + <input type="text" ng-model="greeting" /> |
|---|
| 16115 | + <button ng-click="doGreeting(greeting)">ALERT</button> |
|---|
| 16116 | + </div> |
|---|
| 16117 | + </file> |
|---|
| 16118 | + <file name="protractor.js" type="protractor"> |
|---|
| 16119 | + it('should display the greeting in the input box', function() { |
|---|
| 16120 | + element(by.model('greeting')).sendKeys('Hello, E2E Tests'); |
|---|
| 16121 | + // If we click the button it will block the test runner |
|---|
| 16122 | + // element(':button').click(); |
|---|
| 16123 | + }); |
|---|
| 16124 | + </file> |
|---|
| 16125 | + </example> |
|---|
| 16126 | + */ |
|---|
| 16127 | +function $WindowProvider(){ |
|---|
| 16128 | + this.$get = valueFn(window); |
|---|
| 16129 | +} |
|---|
| 16130 | + |
|---|
| 16131 | +/* global currencyFilter: true, |
|---|
| 16132 | + dateFilter: true, |
|---|
| 16133 | + filterFilter: true, |
|---|
| 16134 | + jsonFilter: true, |
|---|
| 16135 | + limitToFilter: true, |
|---|
| 16136 | + lowercaseFilter: true, |
|---|
| 16137 | + numberFilter: true, |
|---|
| 16138 | + orderByFilter: true, |
|---|
| 16139 | + uppercaseFilter: true, |
|---|
| 16140 | + */ |
|---|
| 16141 | + |
|---|
| 16142 | +/** |
|---|
| 16143 | + * @ngdoc provider |
|---|
| 16144 | + * @name $filterProvider |
|---|
| 16145 | + * @description |
|---|
| 16146 | + * |
|---|
| 16147 | + * Filters are just functions which transform input to an output. However filters need to be |
|---|
| 16148 | + * Dependency Injected. To achieve this a filter definition consists of a factory function which is |
|---|
| 16149 | + * annotated with dependencies and is responsible for creating a filter function. |
|---|
| 16150 | + * |
|---|
| 16151 | + * ```js |
|---|
| 16152 | + * // Filter registration |
|---|
| 16153 | + * function MyModule($provide, $filterProvider) { |
|---|
| 16154 | + * // create a service to demonstrate injection (not always needed) |
|---|
| 16155 | + * $provide.value('greet', function(name){ |
|---|
| 16156 | + * return 'Hello ' + name + '!'; |
|---|
| 16157 | + * }); |
|---|
| 16158 | + * |
|---|
| 16159 | + * // register a filter factory which uses the |
|---|
| 16160 | + * // greet service to demonstrate DI. |
|---|
| 16161 | + * $filterProvider.register('greet', function(greet){ |
|---|
| 16162 | + * // return the filter function which uses the greet service |
|---|
| 16163 | + * // to generate salutation |
|---|
| 16164 | + * return function(text) { |
|---|
| 16165 | + * // filters need to be forgiving so check input validity |
|---|
| 16166 | + * return text && greet(text) || text; |
|---|
| 16167 | + * }; |
|---|
| 16168 | + * }); |
|---|
| 16169 | + * } |
|---|
| 16170 | + * ``` |
|---|
| 16171 | + * |
|---|
| 16172 | + * The filter function is registered with the `$injector` under the filter name suffix with |
|---|
| 16173 | + * `Filter`. |
|---|
| 16174 | + * |
|---|
| 16175 | + * ```js |
|---|
| 16176 | + * it('should be the same instance', inject( |
|---|
| 16177 | + * function($filterProvider) { |
|---|
| 16178 | + * $filterProvider.register('reverse', function(){ |
|---|
| 16179 | + * return ...; |
|---|
| 16180 | + * }); |
|---|
| 16181 | + * }, |
|---|
| 16182 | + * function($filter, reverseFilter) { |
|---|
| 16183 | + * expect($filter('reverse')).toBe(reverseFilter); |
|---|
| 16184 | + * }); |
|---|
| 16185 | + * ``` |
|---|
| 16186 | + * |
|---|
| 16187 | + * |
|---|
| 16188 | + * For more information about how angular filters work, and how to create your own filters, see |
|---|
| 16189 | + * {@link guide/filter Filters} in the Angular Developer Guide. |
|---|
| 16190 | + */ |
|---|
| 16191 | + |
|---|
| 16192 | +/** |
|---|
| 16193 | + * @ngdoc service |
|---|
| 16194 | + * @name $filter |
|---|
| 16195 | + * @kind function |
|---|
| 16196 | + * @description |
|---|
| 16197 | + * Filters are used for formatting data displayed to the user. |
|---|
| 16198 | + * |
|---|
| 16199 | + * The general syntax in templates is as follows: |
|---|
| 16200 | + * |
|---|
| 16201 | + * {{ expression [| filter_name[:parameter_value] ... ] }} |
|---|
| 16202 | + * |
|---|
| 16203 | + * @param {String} name Name of the filter function to retrieve |
|---|
| 16204 | + * @return {Function} the filter function |
|---|
| 16205 | + * @example |
|---|
| 16206 | + <example name="$filter" module="filterExample"> |
|---|
| 16207 | + <file name="index.html"> |
|---|
| 16208 | + <div ng-controller="MainCtrl"> |
|---|
| 16209 | + <h3>{{ originalText }}</h3> |
|---|
| 16210 | + <h3>{{ filteredText }}</h3> |
|---|
| 16211 | + </div> |
|---|
| 16212 | + </file> |
|---|
| 16213 | + |
|---|
| 16214 | + <file name="script.js"> |
|---|
| 16215 | + angular.module('filterExample', []) |
|---|
| 16216 | + .controller('MainCtrl', function($scope, $filter) { |
|---|
| 16217 | + $scope.originalText = 'hello'; |
|---|
| 16218 | + $scope.filteredText = $filter('uppercase')($scope.originalText); |
|---|
| 16219 | + }); |
|---|
| 16220 | + </file> |
|---|
| 16221 | + </example> |
|---|
| 16222 | + */ |
|---|
| 16223 | +$FilterProvider.$inject = ['$provide']; |
|---|
| 16224 | +function $FilterProvider($provide) { |
|---|
| 16225 | + var suffix = 'Filter'; |
|---|
| 16226 | + |
|---|
| 16227 | + /** |
|---|
| 16228 | + * @ngdoc method |
|---|
| 16229 | + * @name $filterProvider#register |
|---|
| 16230 | + * @param {string|Object} name Name of the filter function, or an object map of filters where |
|---|
| 16231 | + * the keys are the filter names and the values are the filter factories. |
|---|
| 16232 | + * @returns {Object} Registered filter instance, or if a map of filters was provided then a map |
|---|
| 16233 | + * of the registered filter instances. |
|---|
| 16234 | + */ |
|---|
| 16235 | + function register(name, factory) { |
|---|
| 16236 | + if(isObject(name)) { |
|---|
| 16237 | + var filters = {}; |
|---|
| 16238 | + forEach(name, function(filter, key) { |
|---|
| 16239 | + filters[key] = register(key, filter); |
|---|
| 16240 | + }); |
|---|
| 16241 | + return filters; |
|---|
| 16242 | + } else { |
|---|
| 16243 | + return $provide.factory(name + suffix, factory); |
|---|
| 16244 | + } |
|---|
| 16245 | + } |
|---|
| 16246 | + this.register = register; |
|---|
| 16247 | + |
|---|
| 16248 | + this.$get = ['$injector', function($injector) { |
|---|
| 16249 | + return function(name) { |
|---|
| 16250 | + return $injector.get(name + suffix); |
|---|
| 16251 | + }; |
|---|
| 16252 | + }]; |
|---|
| 16253 | + |
|---|
| 16254 | + //////////////////////////////////////// |
|---|
| 16255 | + |
|---|
| 16256 | + /* global |
|---|
| 16257 | + currencyFilter: false, |
|---|
| 16258 | + dateFilter: false, |
|---|
| 16259 | + filterFilter: false, |
|---|
| 16260 | + jsonFilter: false, |
|---|
| 16261 | + limitToFilter: false, |
|---|
| 16262 | + lowercaseFilter: false, |
|---|
| 16263 | + numberFilter: false, |
|---|
| 16264 | + orderByFilter: false, |
|---|
| 16265 | + uppercaseFilter: false, |
|---|
| 16266 | + */ |
|---|
| 16267 | + |
|---|
| 16268 | + register('currency', currencyFilter); |
|---|
| 16269 | + register('date', dateFilter); |
|---|
| 16270 | + register('filter', filterFilter); |
|---|
| 16271 | + register('json', jsonFilter); |
|---|
| 16272 | + register('limitTo', limitToFilter); |
|---|
| 16273 | + register('lowercase', lowercaseFilter); |
|---|
| 16274 | + register('number', numberFilter); |
|---|
| 16275 | + register('orderBy', orderByFilter); |
|---|
| 16276 | + register('uppercase', uppercaseFilter); |
|---|
| 16277 | +} |
|---|
| 16278 | + |
|---|
| 16279 | +/** |
|---|
| 16280 | + * @ngdoc filter |
|---|
| 16281 | + * @name filter |
|---|
| 16282 | + * @kind function |
|---|
| 16283 | + * |
|---|
| 16284 | + * @description |
|---|
| 16285 | + * Selects a subset of items from `array` and returns it as a new array. |
|---|
| 16286 | + * |
|---|
| 16287 | + * @param {Array} array The source array. |
|---|
| 16288 | + * @param {string|Object|function()} expression The predicate to be used for selecting items from |
|---|
| 16289 | + * `array`. |
|---|
| 16290 | + * |
|---|
| 16291 | + * Can be one of: |
|---|
| 16292 | + * |
|---|
| 16293 | + * - `string`: The string is evaluated as an expression and the resulting value is used for substring match against |
|---|
| 16294 | + * the contents of the `array`. All strings or objects with string properties in `array` that contain this string |
|---|
| 16295 | + * will be returned. The predicate can be negated by prefixing the string with `!`. |
|---|
| 16296 | + * |
|---|
| 16297 | + * - `Object`: A pattern object can be used to filter specific properties on objects contained |
|---|
| 16298 | + * by `array`. For example `{name:"M", phone:"1"}` predicate will return an array of items |
|---|
| 16299 | + * which have property `name` containing "M" and property `phone` containing "1". A special |
|---|
| 16300 | + * property name `$` can be used (as in `{$:"text"}`) to accept a match against any |
|---|
| 16301 | + * property of the object. That's equivalent to the simple substring match with a `string` |
|---|
| 16302 | + * as described above. The predicate can be negated by prefixing the string with `!`. |
|---|
| 16303 | + * For Example `{name: "!M"}` predicate will return an array of items which have property `name` |
|---|
| 16304 | + * not containing "M". |
|---|
| 16305 | + * |
|---|
| 16306 | + * - `function(value, index)`: A predicate function can be used to write arbitrary filters. The |
|---|
| 16307 | + * function is called for each element of `array`. The final result is an array of those |
|---|
| 16308 | + * elements that the predicate returned true for. |
|---|
| 16309 | + * |
|---|
| 16310 | + * @param {function(actual, expected)|true|undefined} comparator Comparator which is used in |
|---|
| 16311 | + * determining if the expected value (from the filter expression) and actual value (from |
|---|
| 16312 | + * the object in the array) should be considered a match. |
|---|
| 16313 | + * |
|---|
| 16314 | + * Can be one of: |
|---|
| 16315 | + * |
|---|
| 16316 | + * - `function(actual, expected)`: |
|---|
| 16317 | + * The function will be given the object value and the predicate value to compare and |
|---|
| 16318 | + * should return true if the item should be included in filtered result. |
|---|
| 16319 | + * |
|---|
| 16320 | + * - `true`: A shorthand for `function(actual, expected) { return angular.equals(expected, actual)}`. |
|---|
| 16321 | + * this is essentially strict comparison of expected and actual. |
|---|
| 16322 | + * |
|---|
| 16323 | + * - `false|undefined`: A short hand for a function which will look for a substring match in case |
|---|
| 16324 | + * insensitive way. |
|---|
| 16325 | + * |
|---|
| 16326 | + * @example |
|---|
| 16327 | + <example> |
|---|
| 16328 | + <file name="index.html"> |
|---|
| 16329 | + <div ng-init="friends = [{name:'John', phone:'555-1276'}, |
|---|
| 16330 | + {name:'Mary', phone:'800-BIG-MARY'}, |
|---|
| 16331 | + {name:'Mike', phone:'555-4321'}, |
|---|
| 16332 | + {name:'Adam', phone:'555-5678'}, |
|---|
| 16333 | + {name:'Julie', phone:'555-8765'}, |
|---|
| 16334 | + {name:'Juliette', phone:'555-5678'}]"></div> |
|---|
| 16335 | + |
|---|
| 16336 | + Search: <input ng-model="searchText"> |
|---|
| 16337 | + <table id="searchTextResults"> |
|---|
| 16338 | + <tr><th>Name</th><th>Phone</th></tr> |
|---|
| 16339 | + <tr ng-repeat="friend in friends | filter:searchText"> |
|---|
| 16340 | + <td>{{friend.name}}</td> |
|---|
| 16341 | + <td>{{friend.phone}}</td> |
|---|
| 16342 | + </tr> |
|---|
| 16343 | + </table> |
|---|
| 16344 | + <hr> |
|---|
| 16345 | + Any: <input ng-model="search.$"> <br> |
|---|
| 16346 | + Name only <input ng-model="search.name"><br> |
|---|
| 16347 | + Phone only <input ng-model="search.phone"><br> |
|---|
| 16348 | + Equality <input type="checkbox" ng-model="strict"><br> |
|---|
| 16349 | + <table id="searchObjResults"> |
|---|
| 16350 | + <tr><th>Name</th><th>Phone</th></tr> |
|---|
| 16351 | + <tr ng-repeat="friendObj in friends | filter:search:strict"> |
|---|
| 16352 | + <td>{{friendObj.name}}</td> |
|---|
| 16353 | + <td>{{friendObj.phone}}</td> |
|---|
| 16354 | + </tr> |
|---|
| 16355 | + </table> |
|---|
| 16356 | + </file> |
|---|
| 16357 | + <file name="protractor.js" type="protractor"> |
|---|
| 16358 | + var expectFriendNames = function(expectedNames, key) { |
|---|
| 16359 | + element.all(by.repeater(key + ' in friends').column(key + '.name')).then(function(arr) { |
|---|
| 16360 | + arr.forEach(function(wd, i) { |
|---|
| 16361 | + expect(wd.getText()).toMatch(expectedNames[i]); |
|---|
| 16362 | + }); |
|---|
| 16363 | + }); |
|---|
| 16364 | + }; |
|---|
| 16365 | + |
|---|
| 16366 | + it('should search across all fields when filtering with a string', function() { |
|---|
| 16367 | + var searchText = element(by.model('searchText')); |
|---|
| 16368 | + searchText.clear(); |
|---|
| 16369 | + searchText.sendKeys('m'); |
|---|
| 16370 | + expectFriendNames(['Mary', 'Mike', 'Adam'], 'friend'); |
|---|
| 16371 | + |
|---|
| 16372 | + searchText.clear(); |
|---|
| 16373 | + searchText.sendKeys('76'); |
|---|
| 16374 | + expectFriendNames(['John', 'Julie'], 'friend'); |
|---|
| 16375 | + }); |
|---|
| 16376 | + |
|---|
| 16377 | + it('should search in specific fields when filtering with a predicate object', function() { |
|---|
| 16378 | + var searchAny = element(by.model('search.$')); |
|---|
| 16379 | + searchAny.clear(); |
|---|
| 16380 | + searchAny.sendKeys('i'); |
|---|
| 16381 | + expectFriendNames(['Mary', 'Mike', 'Julie', 'Juliette'], 'friendObj'); |
|---|
| 16382 | + }); |
|---|
| 16383 | + it('should use a equal comparison when comparator is true', function() { |
|---|
| 16384 | + var searchName = element(by.model('search.name')); |
|---|
| 16385 | + var strict = element(by.model('strict')); |
|---|
| 16386 | + searchName.clear(); |
|---|
| 16387 | + searchName.sendKeys('Julie'); |
|---|
| 16388 | + strict.click(); |
|---|
| 16389 | + expectFriendNames(['Julie'], 'friendObj'); |
|---|
| 16390 | + }); |
|---|
| 16391 | + </file> |
|---|
| 16392 | + </example> |
|---|
| 16393 | + */ |
|---|
| 16394 | +function filterFilter() { |
|---|
| 16395 | + return function(array, expression, comparator) { |
|---|
| 16396 | + if (!isArray(array)) return array; |
|---|
| 16397 | + |
|---|
| 16398 | + var comparatorType = typeof(comparator), |
|---|
| 16399 | + predicates = []; |
|---|
| 16400 | + |
|---|
| 16401 | + predicates.check = function(value, index) { |
|---|
| 16402 | + for (var j = 0; j < predicates.length; j++) { |
|---|
| 16403 | + if(!predicates[j](value, index)) { |
|---|
| 16404 | + return false; |
|---|
| 16405 | + } |
|---|
| 16406 | + } |
|---|
| 16407 | + return true; |
|---|
| 16408 | + }; |
|---|
| 16409 | + |
|---|
| 16410 | + if (comparatorType !== 'function') { |
|---|
| 16411 | + if (comparatorType === 'boolean' && comparator) { |
|---|
| 16412 | + comparator = function(obj, text) { |
|---|
| 16413 | + return angular.equals(obj, text); |
|---|
| 16414 | + }; |
|---|
| 16415 | + } else { |
|---|
| 16416 | + comparator = function(obj, text) { |
|---|
| 16417 | + if (obj && text && typeof obj === 'object' && typeof text === 'object') { |
|---|
| 16418 | + for (var objKey in obj) { |
|---|
| 16419 | + if (objKey.charAt(0) !== '$' && hasOwnProperty.call(obj, objKey) && |
|---|
| 16420 | + comparator(obj[objKey], text[objKey])) { |
|---|
| 16421 | + return true; |
|---|
| 16422 | + } |
|---|
| 16423 | + } |
|---|
| 16424 | + return false; |
|---|
| 16425 | + } |
|---|
| 16426 | + text = (''+text).toLowerCase(); |
|---|
| 16427 | + return (''+obj).toLowerCase().indexOf(text) > -1; |
|---|
| 16428 | + }; |
|---|
| 16429 | + } |
|---|
| 16430 | + } |
|---|
| 16431 | + |
|---|
| 16432 | + var search = function(obj, text){ |
|---|
| 16433 | + if (typeof text === 'string' && text.charAt(0) === '!') { |
|---|
| 16434 | + return !search(obj, text.substr(1)); |
|---|
| 16435 | + } |
|---|
| 16436 | + switch (typeof obj) { |
|---|
| 16437 | + case 'boolean': |
|---|
| 16438 | + case 'number': |
|---|
| 16439 | + case 'string': |
|---|
| 16440 | + return comparator(obj, text); |
|---|
| 16441 | + case 'object': |
|---|
| 16442 | + switch (typeof text) { |
|---|
| 16443 | + case 'object': |
|---|
| 16444 | + return comparator(obj, text); |
|---|
| 16445 | + default: |
|---|
| 16446 | + for ( var objKey in obj) { |
|---|
| 16447 | + if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) { |
|---|
| 16448 | + return true; |
|---|
| 16449 | + } |
|---|
| 16450 | + } |
|---|
| 16451 | + break; |
|---|
| 16452 | + } |
|---|
| 16453 | + return false; |
|---|
| 16454 | + case 'array': |
|---|
| 16455 | + for ( var i = 0; i < obj.length; i++) { |
|---|
| 16456 | + if (search(obj[i], text)) { |
|---|
| 16457 | + return true; |
|---|
| 16458 | + } |
|---|
| 16459 | + } |
|---|
| 16460 | + return false; |
|---|
| 16461 | + default: |
|---|
| 16462 | + return false; |
|---|
| 16463 | + } |
|---|
| 16464 | + }; |
|---|
| 16465 | + switch (typeof expression) { |
|---|
| 16466 | + case 'boolean': |
|---|
| 16467 | + case 'number': |
|---|
| 16468 | + case 'string': |
|---|
| 16469 | + // Set up expression object and fall through |
|---|
| 16470 | + expression = {$:expression}; |
|---|
| 16471 | + // jshint -W086 |
|---|
| 16472 | + case 'object': |
|---|
| 16473 | + // jshint +W086 |
|---|
| 16474 | + for (var key in expression) { |
|---|
| 16475 | + (function(path) { |
|---|
| 16476 | + if (typeof expression[path] === 'undefined') return; |
|---|
| 16477 | + predicates.push(function(value) { |
|---|
| 16478 | + return search(path == '$' ? value : (value && value[path]), expression[path]); |
|---|
| 16479 | + }); |
|---|
| 16480 | + })(key); |
|---|
| 16481 | + } |
|---|
| 16482 | + break; |
|---|
| 16483 | + case 'function': |
|---|
| 16484 | + predicates.push(expression); |
|---|
| 16485 | + break; |
|---|
| 16486 | + default: |
|---|
| 16487 | + return array; |
|---|
| 16488 | + } |
|---|
| 16489 | + var filtered = []; |
|---|
| 16490 | + for ( var j = 0; j < array.length; j++) { |
|---|
| 16491 | + var value = array[j]; |
|---|
| 16492 | + if (predicates.check(value, j)) { |
|---|
| 16493 | + filtered.push(value); |
|---|
| 16494 | + } |
|---|
| 16495 | + } |
|---|
| 16496 | + return filtered; |
|---|
| 16497 | + }; |
|---|
| 16498 | +} |
|---|
| 16499 | + |
|---|
| 16500 | +/** |
|---|
| 16501 | + * @ngdoc filter |
|---|
| 16502 | + * @name currency |
|---|
| 16503 | + * @kind function |
|---|
| 16504 | + * |
|---|
| 16505 | + * @description |
|---|
| 16506 | + * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default |
|---|
| 16507 | + * symbol for current locale is used. |
|---|
| 16508 | + * |
|---|
| 16509 | + * @param {number} amount Input to filter. |
|---|
| 16510 | + * @param {string=} symbol Currency symbol or identifier to be displayed. |
|---|
| 16511 | + * @param {number=} fractionSize Number of decimal places to round the amount to. |
|---|
| 16512 | + * @returns {string} Formatted number. |
|---|
| 16513 | + * |
|---|
| 16514 | + * |
|---|
| 16515 | + * @example |
|---|
| 16516 | + <example module="currencyExample"> |
|---|
| 16517 | + <file name="index.html"> |
|---|
| 16518 | + <script> |
|---|
| 16519 | + angular.module('currencyExample', []) |
|---|
| 16520 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 16521 | + $scope.amount = 1234.56; |
|---|
| 16522 | + }]); |
|---|
| 16523 | + </script> |
|---|
| 16524 | + <div ng-controller="ExampleController"> |
|---|
| 16525 | + <input type="number" ng-model="amount"> <br> |
|---|
| 16526 | + default currency symbol ($): <span id="currency-default">{{amount | currency}}</span><br> |
|---|
| 16527 | + custom currency identifier (USD$): <span id="currency-custom">{{amount | currency:"USD$"}}</span> |
|---|
| 16528 | + no fractions (0): <span id="currency-no-fractions">{{amount | currency:"USD$":0}}</span> |
|---|
| 16529 | + </div> |
|---|
| 16530 | + </file> |
|---|
| 16531 | + <file name="protractor.js" type="protractor"> |
|---|
| 16532 | + it('should init with 1234.56', function() { |
|---|
| 16533 | + expect(element(by.id('currency-default')).getText()).toBe('$1,234.56'); |
|---|
| 16534 | + expect(element(by.id('currency-custom')).getText()).toBe('USD$1,234.56'); |
|---|
| 16535 | + expect(element(by.id('currency-no-fractions')).getText()).toBe('USD$1,235'); |
|---|
| 16536 | + }); |
|---|
| 16537 | + it('should update', function() { |
|---|
| 16538 | + if (browser.params.browser == 'safari') { |
|---|
| 16539 | + // Safari does not understand the minus key. See |
|---|
| 16540 | + // https://github.com/angular/protractor/issues/481 |
|---|
| 16541 | + return; |
|---|
| 16542 | + } |
|---|
| 16543 | + element(by.model('amount')).clear(); |
|---|
| 16544 | + element(by.model('amount')).sendKeys('-1234'); |
|---|
| 16545 | + expect(element(by.id('currency-default')).getText()).toBe('($1,234.00)'); |
|---|
| 16546 | + expect(element(by.id('currency-custom')).getText()).toBe('(USD$1,234.00)'); |
|---|
| 16547 | + expect(element(by.id('currency-no-fractions')).getText()).toBe('(USD$1,234)'); |
|---|
| 16548 | + }); |
|---|
| 16549 | + </file> |
|---|
| 16550 | + </example> |
|---|
| 16551 | + */ |
|---|
| 16552 | +currencyFilter.$inject = ['$locale']; |
|---|
| 16553 | +function currencyFilter($locale) { |
|---|
| 16554 | + var formats = $locale.NUMBER_FORMATS; |
|---|
| 16555 | + return function(amount, currencySymbol, fractionSize){ |
|---|
| 16556 | + if (isUndefined(currencySymbol)) { |
|---|
| 16557 | + currencySymbol = formats.CURRENCY_SYM; |
|---|
| 16558 | + } |
|---|
| 16559 | + |
|---|
| 16560 | + if (isUndefined(fractionSize)) { |
|---|
| 16561 | + // TODO: read the default value from the locale file |
|---|
| 16562 | + fractionSize = 2; |
|---|
| 16563 | + } |
|---|
| 16564 | + |
|---|
| 16565 | + // if null or undefined pass it through |
|---|
| 16566 | + return (amount == null) |
|---|
| 16567 | + ? amount |
|---|
| 16568 | + : formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, fractionSize). |
|---|
| 16569 | + replace(/\u00A4/g, currencySymbol); |
|---|
| 16570 | + }; |
|---|
| 16571 | +} |
|---|
| 16572 | + |
|---|
| 16573 | +/** |
|---|
| 16574 | + * @ngdoc filter |
|---|
| 16575 | + * @name number |
|---|
| 16576 | + * @kind function |
|---|
| 16577 | + * |
|---|
| 16578 | + * @description |
|---|
| 16579 | + * Formats a number as text. |
|---|
| 16580 | + * |
|---|
| 16581 | + * If the input is not a number an empty string is returned. |
|---|
| 16582 | + * |
|---|
| 16583 | + * @param {number|string} number Number to format. |
|---|
| 16584 | + * @param {(number|string)=} fractionSize Number of decimal places to round the number to. |
|---|
| 16585 | + * If this is not provided then the fraction size is computed from the current locale's number |
|---|
| 16586 | + * formatting pattern. In the case of the default locale, it will be 3. |
|---|
| 16587 | + * @returns {string} Number rounded to decimalPlaces and places a “,” after each third digit. |
|---|
| 16588 | + * |
|---|
| 16589 | + * @example |
|---|
| 16590 | + <example module="numberFilterExample"> |
|---|
| 16591 | + <file name="index.html"> |
|---|
| 16592 | + <script> |
|---|
| 16593 | + angular.module('numberFilterExample', []) |
|---|
| 16594 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 16595 | + $scope.val = 1234.56789; |
|---|
| 16596 | + }]); |
|---|
| 16597 | + </script> |
|---|
| 16598 | + <div ng-controller="ExampleController"> |
|---|
| 16599 | + Enter number: <input ng-model='val'><br> |
|---|
| 16600 | + Default formatting: <span id='number-default'>{{val | number}}</span><br> |
|---|
| 16601 | + No fractions: <span>{{val | number:0}}</span><br> |
|---|
| 16602 | + Negative number: <span>{{-val | number:4}}</span> |
|---|
| 16603 | + </div> |
|---|
| 16604 | + </file> |
|---|
| 16605 | + <file name="protractor.js" type="protractor"> |
|---|
| 16606 | + it('should format numbers', function() { |
|---|
| 16607 | + expect(element(by.id('number-default')).getText()).toBe('1,234.568'); |
|---|
| 16608 | + expect(element(by.binding('val | number:0')).getText()).toBe('1,235'); |
|---|
| 16609 | + expect(element(by.binding('-val | number:4')).getText()).toBe('-1,234.5679'); |
|---|
| 16610 | + }); |
|---|
| 16611 | + |
|---|
| 16612 | + it('should update', function() { |
|---|
| 16613 | + element(by.model('val')).clear(); |
|---|
| 16614 | + element(by.model('val')).sendKeys('3374.333'); |
|---|
| 16615 | + expect(element(by.id('number-default')).getText()).toBe('3,374.333'); |
|---|
| 16616 | + expect(element(by.binding('val | number:0')).getText()).toBe('3,374'); |
|---|
| 16617 | + expect(element(by.binding('-val | number:4')).getText()).toBe('-3,374.3330'); |
|---|
| 16618 | + }); |
|---|
| 16619 | + </file> |
|---|
| 16620 | + </example> |
|---|
| 16621 | + */ |
|---|
| 16622 | + |
|---|
| 16623 | + |
|---|
| 16624 | +numberFilter.$inject = ['$locale']; |
|---|
| 16625 | +function numberFilter($locale) { |
|---|
| 16626 | + var formats = $locale.NUMBER_FORMATS; |
|---|
| 16627 | + return function(number, fractionSize) { |
|---|
| 16628 | + |
|---|
| 16629 | + // if null or undefined pass it through |
|---|
| 16630 | + return (number == null) |
|---|
| 16631 | + ? number |
|---|
| 16632 | + : formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP, |
|---|
| 16633 | + fractionSize); |
|---|
| 16634 | + }; |
|---|
| 16635 | +} |
|---|
| 16636 | + |
|---|
| 16637 | +var DECIMAL_SEP = '.'; |
|---|
| 16638 | +function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) { |
|---|
| 16639 | + if (!isFinite(number) || isObject(number)) return ''; |
|---|
| 16640 | + |
|---|
| 16641 | + var isNegative = number < 0; |
|---|
| 16642 | + number = Math.abs(number); |
|---|
| 16643 | + var numStr = number + '', |
|---|
| 16644 | + formatedText = '', |
|---|
| 16645 | + parts = []; |
|---|
| 16646 | + |
|---|
| 16647 | + var hasExponent = false; |
|---|
| 16648 | + if (numStr.indexOf('e') !== -1) { |
|---|
| 16649 | + var match = numStr.match(/([\d\.]+)e(-?)(\d+)/); |
|---|
| 16650 | + if (match && match[2] == '-' && match[3] > fractionSize + 1) { |
|---|
| 16651 | + numStr = '0'; |
|---|
| 16652 | + number = 0; |
|---|
| 16653 | + } else { |
|---|
| 16654 | + formatedText = numStr; |
|---|
| 16655 | + hasExponent = true; |
|---|
| 16656 | + } |
|---|
| 16657 | + } |
|---|
| 16658 | + |
|---|
| 16659 | + if (!hasExponent) { |
|---|
| 16660 | + var fractionLen = (numStr.split(DECIMAL_SEP)[1] || '').length; |
|---|
| 16661 | + |
|---|
| 16662 | + // determine fractionSize if it is not specified |
|---|
| 16663 | + if (isUndefined(fractionSize)) { |
|---|
| 16664 | + fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac); |
|---|
| 16665 | + } |
|---|
| 16666 | + |
|---|
| 16667 | + // safely round numbers in JS without hitting imprecisions of floating-point arithmetics |
|---|
| 16668 | + // inspired by: |
|---|
| 16669 | + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round |
|---|
| 16670 | + number = +(Math.round(+(number.toString() + 'e' + fractionSize)).toString() + 'e' + -fractionSize); |
|---|
| 16671 | + |
|---|
| 16672 | + if (number === 0) { |
|---|
| 16673 | + isNegative = false; |
|---|
| 16674 | + } |
|---|
| 16675 | + |
|---|
| 16676 | + var fraction = ('' + number).split(DECIMAL_SEP); |
|---|
| 16677 | + var whole = fraction[0]; |
|---|
| 16678 | + fraction = fraction[1] || ''; |
|---|
| 16679 | + |
|---|
| 16680 | + var i, pos = 0, |
|---|
| 16681 | + lgroup = pattern.lgSize, |
|---|
| 16682 | + group = pattern.gSize; |
|---|
| 16683 | + |
|---|
| 16684 | + if (whole.length >= (lgroup + group)) { |
|---|
| 16685 | + pos = whole.length - lgroup; |
|---|
| 16686 | + for (i = 0; i < pos; i++) { |
|---|
| 16687 | + if ((pos - i)%group === 0 && i !== 0) { |
|---|
| 16688 | + formatedText += groupSep; |
|---|
| 16689 | + } |
|---|
| 16690 | + formatedText += whole.charAt(i); |
|---|
| 16691 | + } |
|---|
| 16692 | + } |
|---|
| 16693 | + |
|---|
| 16694 | + for (i = pos; i < whole.length; i++) { |
|---|
| 16695 | + if ((whole.length - i)%lgroup === 0 && i !== 0) { |
|---|
| 16696 | + formatedText += groupSep; |
|---|
| 16697 | + } |
|---|
| 16698 | + formatedText += whole.charAt(i); |
|---|
| 16699 | + } |
|---|
| 16700 | + |
|---|
| 16701 | + // format fraction part. |
|---|
| 16702 | + while(fraction.length < fractionSize) { |
|---|
| 16703 | + fraction += '0'; |
|---|
| 16704 | + } |
|---|
| 16705 | + |
|---|
| 16706 | + if (fractionSize && fractionSize !== "0") formatedText += decimalSep + fraction.substr(0, fractionSize); |
|---|
| 16707 | + } else { |
|---|
| 16708 | + |
|---|
| 16709 | + if (fractionSize > 0 && number > -1 && number < 1) { |
|---|
| 16710 | + formatedText = number.toFixed(fractionSize); |
|---|
| 16711 | + } |
|---|
| 16712 | + } |
|---|
| 16713 | + |
|---|
| 16714 | + parts.push(isNegative ? pattern.negPre : pattern.posPre); |
|---|
| 16715 | + parts.push(formatedText); |
|---|
| 16716 | + parts.push(isNegative ? pattern.negSuf : pattern.posSuf); |
|---|
| 16717 | + return parts.join(''); |
|---|
| 16718 | +} |
|---|
| 16719 | + |
|---|
| 16720 | +function padNumber(num, digits, trim) { |
|---|
| 16721 | + var neg = ''; |
|---|
| 16722 | + if (num < 0) { |
|---|
| 16723 | + neg = '-'; |
|---|
| 16724 | + num = -num; |
|---|
| 16725 | + } |
|---|
| 16726 | + num = '' + num; |
|---|
| 16727 | + while(num.length < digits) num = '0' + num; |
|---|
| 16728 | + if (trim) |
|---|
| 16729 | + num = num.substr(num.length - digits); |
|---|
| 16730 | + return neg + num; |
|---|
| 16731 | +} |
|---|
| 16732 | + |
|---|
| 16733 | + |
|---|
| 16734 | +function dateGetter(name, size, offset, trim) { |
|---|
| 16735 | + offset = offset || 0; |
|---|
| 16736 | + return function(date) { |
|---|
| 16737 | + var value = date['get' + name](); |
|---|
| 16738 | + if (offset > 0 || value > -offset) |
|---|
| 16739 | + value += offset; |
|---|
| 16740 | + if (value === 0 && offset == -12 ) value = 12; |
|---|
| 16741 | + return padNumber(value, size, trim); |
|---|
| 16742 | + }; |
|---|
| 16743 | +} |
|---|
| 16744 | + |
|---|
| 16745 | +function dateStrGetter(name, shortForm) { |
|---|
| 16746 | + return function(date, formats) { |
|---|
| 16747 | + var value = date['get' + name](); |
|---|
| 16748 | + var get = uppercase(shortForm ? ('SHORT' + name) : name); |
|---|
| 16749 | + |
|---|
| 16750 | + return formats[get][value]; |
|---|
| 16751 | + }; |
|---|
| 16752 | +} |
|---|
| 16753 | + |
|---|
| 16754 | +function timeZoneGetter(date) { |
|---|
| 16755 | + var zone = -1 * date.getTimezoneOffset(); |
|---|
| 16756 | + var paddedZone = (zone >= 0) ? "+" : ""; |
|---|
| 16757 | + |
|---|
| 16758 | + paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) + |
|---|
| 16759 | + padNumber(Math.abs(zone % 60), 2); |
|---|
| 16760 | + |
|---|
| 16761 | + return paddedZone; |
|---|
| 16762 | +} |
|---|
| 16763 | + |
|---|
| 16764 | +function getFirstThursdayOfYear(year) { |
|---|
| 16765 | + // 0 = index of January |
|---|
| 16766 | + var dayOfWeekOnFirst = (new Date(year, 0, 1)).getDay(); |
|---|
| 16767 | + // 4 = index of Thursday (+1 to account for 1st = 5) |
|---|
| 16768 | + // 11 = index of *next* Thursday (+1 account for 1st = 12) |
|---|
| 16769 | + return new Date(year, 0, ((dayOfWeekOnFirst <= 4) ? 5 : 12) - dayOfWeekOnFirst); |
|---|
| 16770 | +} |
|---|
| 16771 | + |
|---|
| 16772 | +function getThursdayThisWeek(datetime) { |
|---|
| 16773 | + return new Date(datetime.getFullYear(), datetime.getMonth(), |
|---|
| 16774 | + // 4 = index of Thursday |
|---|
| 16775 | + datetime.getDate() + (4 - datetime.getDay())); |
|---|
| 16776 | +} |
|---|
| 16777 | + |
|---|
| 16778 | +function weekGetter(size) { |
|---|
| 16779 | + return function(date) { |
|---|
| 16780 | + var firstThurs = getFirstThursdayOfYear(date.getFullYear()), |
|---|
| 16781 | + thisThurs = getThursdayThisWeek(date); |
|---|
| 16782 | + |
|---|
| 16783 | + var diff = +thisThurs - +firstThurs, |
|---|
| 16784 | + result = 1 + Math.round(diff / 6.048e8); // 6.048e8 ms per week |
|---|
| 16785 | + |
|---|
| 16786 | + return padNumber(result, size); |
|---|
| 16787 | + }; |
|---|
| 16788 | +} |
|---|
| 16789 | + |
|---|
| 16790 | +function ampmGetter(date, formats) { |
|---|
| 16791 | + return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1]; |
|---|
| 16792 | +} |
|---|
| 16793 | + |
|---|
| 16794 | +var DATE_FORMATS = { |
|---|
| 16795 | + yyyy: dateGetter('FullYear', 4), |
|---|
| 16796 | + yy: dateGetter('FullYear', 2, 0, true), |
|---|
| 16797 | + y: dateGetter('FullYear', 1), |
|---|
| 16798 | + MMMM: dateStrGetter('Month'), |
|---|
| 16799 | + MMM: dateStrGetter('Month', true), |
|---|
| 16800 | + MM: dateGetter('Month', 2, 1), |
|---|
| 16801 | + M: dateGetter('Month', 1, 1), |
|---|
| 16802 | + dd: dateGetter('Date', 2), |
|---|
| 16803 | + d: dateGetter('Date', 1), |
|---|
| 16804 | + HH: dateGetter('Hours', 2), |
|---|
| 16805 | + H: dateGetter('Hours', 1), |
|---|
| 16806 | + hh: dateGetter('Hours', 2, -12), |
|---|
| 16807 | + h: dateGetter('Hours', 1, -12), |
|---|
| 16808 | + mm: dateGetter('Minutes', 2), |
|---|
| 16809 | + m: dateGetter('Minutes', 1), |
|---|
| 16810 | + ss: dateGetter('Seconds', 2), |
|---|
| 16811 | + s: dateGetter('Seconds', 1), |
|---|
| 16812 | + // while ISO 8601 requires fractions to be prefixed with `.` or `,` |
|---|
| 16813 | + // we can be just safely rely on using `sss` since we currently don't support single or two digit fractions |
|---|
| 16814 | + sss: dateGetter('Milliseconds', 3), |
|---|
| 16815 | + EEEE: dateStrGetter('Day'), |
|---|
| 16816 | + EEE: dateStrGetter('Day', true), |
|---|
| 16817 | + a: ampmGetter, |
|---|
| 16818 | + Z: timeZoneGetter, |
|---|
| 16819 | + ww: weekGetter(2), |
|---|
| 16820 | + w: weekGetter(1) |
|---|
| 16821 | +}; |
|---|
| 16822 | + |
|---|
| 16823 | +var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZEw']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|w+))(.*)/, |
|---|
| 16824 | + NUMBER_STRING = /^\-?\d+$/; |
|---|
| 16825 | + |
|---|
| 16826 | +/** |
|---|
| 16827 | + * @ngdoc filter |
|---|
| 16828 | + * @name date |
|---|
| 16829 | + * @kind function |
|---|
| 16830 | + * |
|---|
| 16831 | + * @description |
|---|
| 16832 | + * Formats `date` to a string based on the requested `format`. |
|---|
| 16833 | + * |
|---|
| 16834 | + * `format` string can be composed of the following elements: |
|---|
| 16835 | + * |
|---|
| 16836 | + * * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010) |
|---|
| 16837 | + * * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10) |
|---|
| 16838 | + * * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199) |
|---|
| 16839 | + * * `'MMMM'`: Month in year (January-December) |
|---|
| 16840 | + * * `'MMM'`: Month in year (Jan-Dec) |
|---|
| 16841 | + * * `'MM'`: Month in year, padded (01-12) |
|---|
| 16842 | + * * `'M'`: Month in year (1-12) |
|---|
| 16843 | + * * `'dd'`: Day in month, padded (01-31) |
|---|
| 16844 | + * * `'d'`: Day in month (1-31) |
|---|
| 16845 | + * * `'EEEE'`: Day in Week,(Sunday-Saturday) |
|---|
| 16846 | + * * `'EEE'`: Day in Week, (Sun-Sat) |
|---|
| 16847 | + * * `'HH'`: Hour in day, padded (00-23) |
|---|
| 16848 | + * * `'H'`: Hour in day (0-23) |
|---|
| 16849 | + * * `'hh'`: Hour in AM/PM, padded (01-12) |
|---|
| 16850 | + * * `'h'`: Hour in AM/PM, (1-12) |
|---|
| 16851 | + * * `'mm'`: Minute in hour, padded (00-59) |
|---|
| 16852 | + * * `'m'`: Minute in hour (0-59) |
|---|
| 16853 | + * * `'ss'`: Second in minute, padded (00-59) |
|---|
| 16854 | + * * `'s'`: Second in minute (0-59) |
|---|
| 16855 | + * * `'.sss' or ',sss'`: Millisecond in second, padded (000-999) |
|---|
| 16856 | + * * `'a'`: AM/PM marker |
|---|
| 16857 | + * * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200) |
|---|
| 16858 | + * * `'ww'`: ISO-8601 week of year (00-53) |
|---|
| 16859 | + * * `'w'`: ISO-8601 week of year (0-53) |
|---|
| 16860 | + * |
|---|
| 16861 | + * `format` string can also be one of the following predefined |
|---|
| 16862 | + * {@link guide/i18n localizable formats}: |
|---|
| 16863 | + * |
|---|
| 16864 | + * * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale |
|---|
| 16865 | + * (e.g. Sep 3, 2010 12:05:08 PM) |
|---|
| 16866 | + * * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US locale (e.g. 9/3/10 12:05 PM) |
|---|
| 16867 | + * * `'fullDate'`: equivalent to `'EEEE, MMMM d, y'` for en_US locale |
|---|
| 16868 | + * (e.g. Friday, September 3, 2010) |
|---|
| 16869 | + * * `'longDate'`: equivalent to `'MMMM d, y'` for en_US locale (e.g. September 3, 2010) |
|---|
| 16870 | + * * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US locale (e.g. Sep 3, 2010) |
|---|
| 16871 | + * * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10) |
|---|
| 16872 | + * * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 PM) |
|---|
| 16873 | + * * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 PM) |
|---|
| 16874 | + * |
|---|
| 16875 | + * `format` string can contain literal values. These need to be escaped by surrounding with single quotes (e.g. |
|---|
| 16876 | + * `"h 'in the morning'"`). In order to output a single quote, escape it - i.e., two single quotes in a sequence |
|---|
| 16877 | + * (e.g. `"h 'o''clock'"`). |
|---|
| 16878 | + * |
|---|
| 16879 | + * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or |
|---|
| 16880 | + * number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.sssZ and its |
|---|
| 16881 | + * shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is |
|---|
| 16882 | + * specified in the string input, the time is considered to be in the local timezone. |
|---|
| 16883 | + * @param {string=} format Formatting rules (see Description). If not specified, |
|---|
| 16884 | + * `mediumDate` is used. |
|---|
| 16885 | + * @param {string=} timezone Timezone to be used for formatting. Right now, only `'UTC'` is supported. |
|---|
| 16886 | + * If not specified, the timezone of the browser will be used. |
|---|
| 16887 | + * @returns {string} Formatted string or the input if input is not recognized as date/millis. |
|---|
| 16888 | + * |
|---|
| 16889 | + * @example |
|---|
| 16890 | + <example> |
|---|
| 16891 | + <file name="index.html"> |
|---|
| 16892 | + <span ng-non-bindable>{{1288323623006 | date:'medium'}}</span>: |
|---|
| 16893 | + <span>{{1288323623006 | date:'medium'}}</span><br> |
|---|
| 16894 | + <span ng-non-bindable>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span>: |
|---|
| 16895 | + <span>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span><br> |
|---|
| 16896 | + <span ng-non-bindable>{{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}</span>: |
|---|
| 16897 | + <span>{{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}</span><br> |
|---|
| 16898 | + <span ng-non-bindable>{{1288323623006 | date:"MM/dd/yyyy 'at' h:mma"}}</span>: |
|---|
| 16899 | + <span>{{'1288323623006' | date:"MM/dd/yyyy 'at' h:mma"}}</span><br> |
|---|
| 16900 | + </file> |
|---|
| 16901 | + <file name="protractor.js" type="protractor"> |
|---|
| 16902 | + it('should format date', function() { |
|---|
| 16903 | + expect(element(by.binding("1288323623006 | date:'medium'")).getText()). |
|---|
| 16904 | + toMatch(/Oct 2\d, 2010 \d{1,2}:\d{2}:\d{2} (AM|PM)/); |
|---|
| 16905 | + expect(element(by.binding("1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'")).getText()). |
|---|
| 16906 | + toMatch(/2010\-10\-2\d \d{2}:\d{2}:\d{2} (\-|\+)?\d{4}/); |
|---|
| 16907 | + expect(element(by.binding("'1288323623006' | date:'MM/dd/yyyy @ h:mma'")).getText()). |
|---|
| 16908 | + toMatch(/10\/2\d\/2010 @ \d{1,2}:\d{2}(AM|PM)/); |
|---|
| 16909 | + expect(element(by.binding("'1288323623006' | date:\"MM/dd/yyyy 'at' h:mma\"")).getText()). |
|---|
| 16910 | + toMatch(/10\/2\d\/2010 at \d{1,2}:\d{2}(AM|PM)/); |
|---|
| 16911 | + }); |
|---|
| 16912 | + </file> |
|---|
| 16913 | + </example> |
|---|
| 16914 | + */ |
|---|
| 16915 | +dateFilter.$inject = ['$locale']; |
|---|
| 16916 | +function dateFilter($locale) { |
|---|
| 16917 | + |
|---|
| 16918 | + |
|---|
| 16919 | + var R_ISO8601_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/; |
|---|
| 16920 | + // 1 2 3 4 5 6 7 8 9 10 11 |
|---|
| 16921 | + function jsonStringToDate(string) { |
|---|
| 16922 | + var match; |
|---|
| 16923 | + if (match = string.match(R_ISO8601_STR)) { |
|---|
| 16924 | + var date = new Date(0), |
|---|
| 16925 | + tzHour = 0, |
|---|
| 16926 | + tzMin = 0, |
|---|
| 16927 | + dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear, |
|---|
| 16928 | + timeSetter = match[8] ? date.setUTCHours : date.setHours; |
|---|
| 16929 | + |
|---|
| 16930 | + if (match[9]) { |
|---|
| 16931 | + tzHour = int(match[9] + match[10]); |
|---|
| 16932 | + tzMin = int(match[9] + match[11]); |
|---|
| 16933 | + } |
|---|
| 16934 | + dateSetter.call(date, int(match[1]), int(match[2]) - 1, int(match[3])); |
|---|
| 16935 | + var h = int(match[4]||0) - tzHour; |
|---|
| 16936 | + var m = int(match[5]||0) - tzMin; |
|---|
| 16937 | + var s = int(match[6]||0); |
|---|
| 16938 | + var ms = Math.round(parseFloat('0.' + (match[7]||0)) * 1000); |
|---|
| 16939 | + timeSetter.call(date, h, m, s, ms); |
|---|
| 16940 | + return date; |
|---|
| 16941 | + } |
|---|
| 16942 | + return string; |
|---|
| 16943 | + } |
|---|
| 16944 | + |
|---|
| 16945 | + |
|---|
| 16946 | + return function(date, format, timezone) { |
|---|
| 16947 | + var text = '', |
|---|
| 16948 | + parts = [], |
|---|
| 16949 | + fn, match; |
|---|
| 16950 | + |
|---|
| 16951 | + format = format || 'mediumDate'; |
|---|
| 16952 | + format = $locale.DATETIME_FORMATS[format] || format; |
|---|
| 16953 | + if (isString(date)) { |
|---|
| 16954 | + date = NUMBER_STRING.test(date) ? int(date) : jsonStringToDate(date); |
|---|
| 16955 | + } |
|---|
| 16956 | + |
|---|
| 16957 | + if (isNumber(date)) { |
|---|
| 16958 | + date = new Date(date); |
|---|
| 16959 | + } |
|---|
| 16960 | + |
|---|
| 16961 | + if (!isDate(date)) { |
|---|
| 16962 | + return date; |
|---|
| 16963 | + } |
|---|
| 16964 | + |
|---|
| 16965 | + while(format) { |
|---|
| 16966 | + match = DATE_FORMATS_SPLIT.exec(format); |
|---|
| 16967 | + if (match) { |
|---|
| 16968 | + parts = concat(parts, match, 1); |
|---|
| 16969 | + format = parts.pop(); |
|---|
| 16970 | + } else { |
|---|
| 16971 | + parts.push(format); |
|---|
| 16972 | + format = null; |
|---|
| 16973 | + } |
|---|
| 16974 | + } |
|---|
| 16975 | + |
|---|
| 16976 | + if (timezone && timezone === 'UTC') { |
|---|
| 16977 | + date = new Date(date.getTime()); |
|---|
| 16978 | + date.setMinutes(date.getMinutes() + date.getTimezoneOffset()); |
|---|
| 16979 | + } |
|---|
| 16980 | + forEach(parts, function(value){ |
|---|
| 16981 | + fn = DATE_FORMATS[value]; |
|---|
| 16982 | + text += fn ? fn(date, $locale.DATETIME_FORMATS) |
|---|
| 16983 | + : value.replace(/(^'|'$)/g, '').replace(/''/g, "'"); |
|---|
| 16984 | + }); |
|---|
| 16985 | + |
|---|
| 16986 | + return text; |
|---|
| 16987 | + }; |
|---|
| 16988 | +} |
|---|
| 16989 | + |
|---|
| 16990 | + |
|---|
| 16991 | +/** |
|---|
| 16992 | + * @ngdoc filter |
|---|
| 16993 | + * @name json |
|---|
| 16994 | + * @kind function |
|---|
| 16995 | + * |
|---|
| 16996 | + * @description |
|---|
| 16997 | + * Allows you to convert a JavaScript object into JSON string. |
|---|
| 16998 | + * |
|---|
| 16999 | + * This filter is mostly useful for debugging. When using the double curly {{value}} notation |
|---|
| 17000 | + * the binding is automatically converted to JSON. |
|---|
| 17001 | + * |
|---|
| 17002 | + * @param {*} object Any JavaScript object (including arrays and primitive types) to filter. |
|---|
| 17003 | + * @returns {string} JSON string. |
|---|
| 17004 | + * |
|---|
| 17005 | + * |
|---|
| 17006 | + * @example |
|---|
| 17007 | + <example> |
|---|
| 17008 | + <file name="index.html"> |
|---|
| 17009 | + <pre>{{ {'name':'value'} | json }}</pre> |
|---|
| 17010 | + </file> |
|---|
| 17011 | + <file name="protractor.js" type="protractor"> |
|---|
| 17012 | + it('should jsonify filtered objects', function() { |
|---|
| 17013 | + expect(element(by.binding("{'name':'value'}")).getText()).toMatch(/\{\n "name": ?"value"\n}/); |
|---|
| 17014 | + }); |
|---|
| 17015 | + </file> |
|---|
| 17016 | + </example> |
|---|
| 17017 | + * |
|---|
| 17018 | + */ |
|---|
| 17019 | +function jsonFilter() { |
|---|
| 17020 | + return function(object) { |
|---|
| 17021 | + return toJson(object, true); |
|---|
| 17022 | + }; |
|---|
| 17023 | +} |
|---|
| 17024 | + |
|---|
| 17025 | + |
|---|
| 17026 | +/** |
|---|
| 17027 | + * @ngdoc filter |
|---|
| 17028 | + * @name lowercase |
|---|
| 17029 | + * @kind function |
|---|
| 17030 | + * @description |
|---|
| 17031 | + * Converts string to lowercase. |
|---|
| 17032 | + * @see angular.lowercase |
|---|
| 17033 | + */ |
|---|
| 17034 | +var lowercaseFilter = valueFn(lowercase); |
|---|
| 17035 | + |
|---|
| 17036 | + |
|---|
| 17037 | +/** |
|---|
| 17038 | + * @ngdoc filter |
|---|
| 17039 | + * @name uppercase |
|---|
| 17040 | + * @kind function |
|---|
| 17041 | + * @description |
|---|
| 17042 | + * Converts string to uppercase. |
|---|
| 17043 | + * @see angular.uppercase |
|---|
| 17044 | + */ |
|---|
| 17045 | +var uppercaseFilter = valueFn(uppercase); |
|---|
| 17046 | + |
|---|
| 17047 | +/** |
|---|
| 17048 | + * @ngdoc filter |
|---|
| 17049 | + * @name limitTo |
|---|
| 17050 | + * @kind function |
|---|
| 17051 | + * |
|---|
| 17052 | + * @description |
|---|
| 17053 | + * Creates a new array or string containing only a specified number of elements. The elements |
|---|
| 17054 | + * are taken from either the beginning or the end of the source array, string or number, as specified by |
|---|
| 17055 | + * the value and sign (positive or negative) of `limit`. If a number is used as input, it is |
|---|
| 17056 | + * converted to a string. |
|---|
| 17057 | + * |
|---|
| 17058 | + * @param {Array|string|number} input Source array, string or number to be limited. |
|---|
| 17059 | + * @param {string|number} limit The length of the returned array or string. If the `limit` number |
|---|
| 17060 | + * is positive, `limit` number of items from the beginning of the source array/string are copied. |
|---|
| 17061 | + * If the number is negative, `limit` number of items from the end of the source array/string |
|---|
| 17062 | + * are copied. The `limit` will be trimmed if it exceeds `array.length` |
|---|
| 17063 | + * @returns {Array|string} A new sub-array or substring of length `limit` or less if input array |
|---|
| 17064 | + * had less than `limit` elements. |
|---|
| 17065 | + * |
|---|
| 17066 | + * @example |
|---|
| 17067 | + <example module="limitToExample"> |
|---|
| 17068 | + <file name="index.html"> |
|---|
| 17069 | + <script> |
|---|
| 17070 | + angular.module('limitToExample', []) |
|---|
| 17071 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 17072 | + $scope.numbers = [1,2,3,4,5,6,7,8,9]; |
|---|
| 17073 | + $scope.letters = "abcdefghi"; |
|---|
| 17074 | + $scope.longNumber = 2345432342; |
|---|
| 17075 | + $scope.numLimit = 3; |
|---|
| 17076 | + $scope.letterLimit = 3; |
|---|
| 17077 | + $scope.longNumberLimit = 3; |
|---|
| 17078 | + }]); |
|---|
| 17079 | + </script> |
|---|
| 17080 | + <div ng-controller="ExampleController"> |
|---|
| 17081 | + Limit {{numbers}} to: <input type="number" step="1" ng-model="numLimit"> |
|---|
| 17082 | + <p>Output numbers: {{ numbers | limitTo:numLimit }}</p> |
|---|
| 17083 | + Limit {{letters}} to: <input type="number" step="1" ng-model="letterLimit"> |
|---|
| 17084 | + <p>Output letters: {{ letters | limitTo:letterLimit }}</p> |
|---|
| 17085 | + Limit {{longNumber}} to: <input type="number" step="1" ng-model="longNumberLimit"> |
|---|
| 17086 | + <p>Output long number: {{ longNumber | limitTo:longNumberLimit }}</p> |
|---|
| 17087 | + </div> |
|---|
| 17088 | + </file> |
|---|
| 17089 | + <file name="protractor.js" type="protractor"> |
|---|
| 17090 | + var numLimitInput = element(by.model('numLimit')); |
|---|
| 17091 | + var letterLimitInput = element(by.model('letterLimit')); |
|---|
| 17092 | + var longNumberLimitInput = element(by.model('longNumberLimit')); |
|---|
| 17093 | + var limitedNumbers = element(by.binding('numbers | limitTo:numLimit')); |
|---|
| 17094 | + var limitedLetters = element(by.binding('letters | limitTo:letterLimit')); |
|---|
| 17095 | + var limitedLongNumber = element(by.binding('longNumber | limitTo:longNumberLimit')); |
|---|
| 17096 | + |
|---|
| 17097 | + it('should limit the number array to first three items', function() { |
|---|
| 17098 | + expect(numLimitInput.getAttribute('value')).toBe('3'); |
|---|
| 17099 | + expect(letterLimitInput.getAttribute('value')).toBe('3'); |
|---|
| 17100 | + expect(longNumberLimitInput.getAttribute('value')).toBe('3'); |
|---|
| 17101 | + expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3]'); |
|---|
| 17102 | + expect(limitedLetters.getText()).toEqual('Output letters: abc'); |
|---|
| 17103 | + expect(limitedLongNumber.getText()).toEqual('Output long number: 234'); |
|---|
| 17104 | + }); |
|---|
| 17105 | + |
|---|
| 17106 | + // There is a bug in safari and protractor that doesn't like the minus key |
|---|
| 17107 | + // it('should update the output when -3 is entered', function() { |
|---|
| 17108 | + // numLimitInput.clear(); |
|---|
| 17109 | + // numLimitInput.sendKeys('-3'); |
|---|
| 17110 | + // letterLimitInput.clear(); |
|---|
| 17111 | + // letterLimitInput.sendKeys('-3'); |
|---|
| 17112 | + // longNumberLimitInput.clear(); |
|---|
| 17113 | + // longNumberLimitInput.sendKeys('-3'); |
|---|
| 17114 | + // expect(limitedNumbers.getText()).toEqual('Output numbers: [7,8,9]'); |
|---|
| 17115 | + // expect(limitedLetters.getText()).toEqual('Output letters: ghi'); |
|---|
| 17116 | + // expect(limitedLongNumber.getText()).toEqual('Output long number: 342'); |
|---|
| 17117 | + // }); |
|---|
| 17118 | + |
|---|
| 17119 | + it('should not exceed the maximum size of input array', function() { |
|---|
| 17120 | + numLimitInput.clear(); |
|---|
| 17121 | + numLimitInput.sendKeys('100'); |
|---|
| 17122 | + letterLimitInput.clear(); |
|---|
| 17123 | + letterLimitInput.sendKeys('100'); |
|---|
| 17124 | + longNumberLimitInput.clear(); |
|---|
| 17125 | + longNumberLimitInput.sendKeys('100'); |
|---|
| 17126 | + expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3,4,5,6,7,8,9]'); |
|---|
| 17127 | + expect(limitedLetters.getText()).toEqual('Output letters: abcdefghi'); |
|---|
| 17128 | + expect(limitedLongNumber.getText()).toEqual('Output long number: 2345432342'); |
|---|
| 17129 | + }); |
|---|
| 17130 | + </file> |
|---|
| 17131 | + </example> |
|---|
| 17132 | +*/ |
|---|
| 17133 | +function limitToFilter(){ |
|---|
| 17134 | + return function(input, limit) { |
|---|
| 17135 | + if (isNumber(input)) input = input.toString(); |
|---|
| 17136 | + if (!isArray(input) && !isString(input)) return input; |
|---|
| 17137 | + |
|---|
| 17138 | + if (Math.abs(Number(limit)) === Infinity) { |
|---|
| 17139 | + limit = Number(limit); |
|---|
| 17140 | + } else { |
|---|
| 17141 | + limit = int(limit); |
|---|
| 17142 | + } |
|---|
| 17143 | + |
|---|
| 17144 | + if (isString(input)) { |
|---|
| 17145 | + //NaN check on limit |
|---|
| 17146 | + if (limit) { |
|---|
| 17147 | + return limit >= 0 ? input.slice(0, limit) : input.slice(limit, input.length); |
|---|
| 17148 | + } else { |
|---|
| 17149 | + return ""; |
|---|
| 17150 | + } |
|---|
| 17151 | + } |
|---|
| 17152 | + |
|---|
| 17153 | + var out = [], |
|---|
| 17154 | + i, n; |
|---|
| 17155 | + |
|---|
| 17156 | + // if abs(limit) exceeds maximum length, trim it |
|---|
| 17157 | + if (limit > input.length) |
|---|
| 17158 | + limit = input.length; |
|---|
| 17159 | + else if (limit < -input.length) |
|---|
| 17160 | + limit = -input.length; |
|---|
| 17161 | + |
|---|
| 17162 | + if (limit > 0) { |
|---|
| 17163 | + i = 0; |
|---|
| 17164 | + n = limit; |
|---|
| 17165 | + } else { |
|---|
| 17166 | + i = input.length + limit; |
|---|
| 17167 | + n = input.length; |
|---|
| 17168 | + } |
|---|
| 17169 | + |
|---|
| 17170 | + for (; i<n; i++) { |
|---|
| 17171 | + out.push(input[i]); |
|---|
| 17172 | + } |
|---|
| 17173 | + |
|---|
| 17174 | + return out; |
|---|
| 17175 | + }; |
|---|
| 17176 | +} |
|---|
| 17177 | + |
|---|
| 17178 | +/** |
|---|
| 17179 | + * @ngdoc filter |
|---|
| 17180 | + * @name orderBy |
|---|
| 17181 | + * @kind function |
|---|
| 17182 | + * |
|---|
| 17183 | + * @description |
|---|
| 17184 | + * Orders a specified `array` by the `expression` predicate. It is ordered alphabetically |
|---|
| 17185 | + * for strings and numerically for numbers. Note: if you notice numbers are not being sorted |
|---|
| 17186 | + * correctly, make sure they are actually being saved as numbers and not strings. |
|---|
| 17187 | + * |
|---|
| 17188 | + * @param {Array} array The array to sort. |
|---|
| 17189 | + * @param {function(*)|string|Array.<(function(*)|string)>=} expression A predicate to be |
|---|
| 17190 | + * used by the comparator to determine the order of elements. |
|---|
| 17191 | + * |
|---|
| 17192 | + * Can be one of: |
|---|
| 17193 | + * |
|---|
| 17194 | + * - `function`: Getter function. The result of this function will be sorted using the |
|---|
| 17195 | + * `<`, `=`, `>` operator. |
|---|
| 17196 | + * - `string`: An Angular expression. The result of this expression is used to compare elements |
|---|
| 17197 | + * (for example `name` to sort by a property called `name` or `name.substr(0, 3)` to sort by |
|---|
| 17198 | + * 3 first characters of a property called `name`). The result of a constant expression |
|---|
| 17199 | + * is interpreted as a property name to be used in comparisons (for example `"special name"` |
|---|
| 17200 | + * to sort object by the value of their `special name` property). An expression can be |
|---|
| 17201 | + * optionally prefixed with `+` or `-` to control ascending or descending sort order |
|---|
| 17202 | + * (for example, `+name` or `-name`). If no property is provided, (e.g. `'+'`) then the array |
|---|
| 17203 | + * element itself is used to compare where sorting. |
|---|
| 17204 | + * - `Array`: An array of function or string predicates. The first predicate in the array |
|---|
| 17205 | + * is used for sorting, but when two items are equivalent, the next predicate is used. |
|---|
| 17206 | + * |
|---|
| 17207 | + * If the predicate is missing or empty then it defaults to `'+'`. |
|---|
| 17208 | + * |
|---|
| 17209 | + * @param {boolean=} reverse Reverse the order of the array. |
|---|
| 17210 | + * @returns {Array} Sorted copy of the source array. |
|---|
| 17211 | + * |
|---|
| 17212 | + * @example |
|---|
| 17213 | + <example module="orderByExample"> |
|---|
| 17214 | + <file name="index.html"> |
|---|
| 17215 | + <script> |
|---|
| 17216 | + angular.module('orderByExample', []) |
|---|
| 17217 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 17218 | + $scope.friends = |
|---|
| 17219 | + [{name:'John', phone:'555-1212', age:10}, |
|---|
| 17220 | + {name:'Mary', phone:'555-9876', age:19}, |
|---|
| 17221 | + {name:'Mike', phone:'555-4321', age:21}, |
|---|
| 17222 | + {name:'Adam', phone:'555-5678', age:35}, |
|---|
| 17223 | + {name:'Julie', phone:'555-8765', age:29}]; |
|---|
| 17224 | + $scope.predicate = '-age'; |
|---|
| 17225 | + }]); |
|---|
| 17226 | + </script> |
|---|
| 17227 | + <div ng-controller="ExampleController"> |
|---|
| 17228 | + <pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre> |
|---|
| 17229 | + <hr/> |
|---|
| 17230 | + [ <a href="" ng-click="predicate=''">unsorted</a> ] |
|---|
| 17231 | + <table class="friend"> |
|---|
| 17232 | + <tr> |
|---|
| 17233 | + <th><a href="" ng-click="predicate = 'name'; reverse=false">Name</a> |
|---|
| 17234 | + (<a href="" ng-click="predicate = '-name'; reverse=false">^</a>)</th> |
|---|
| 17235 | + <th><a href="" ng-click="predicate = 'phone'; reverse=!reverse">Phone Number</a></th> |
|---|
| 17236 | + <th><a href="" ng-click="predicate = 'age'; reverse=!reverse">Age</a></th> |
|---|
| 17237 | + </tr> |
|---|
| 17238 | + <tr ng-repeat="friend in friends | orderBy:predicate:reverse"> |
|---|
| 17239 | + <td>{{friend.name}}</td> |
|---|
| 17240 | + <td>{{friend.phone}}</td> |
|---|
| 17241 | + <td>{{friend.age}}</td> |
|---|
| 17242 | + </tr> |
|---|
| 17243 | + </table> |
|---|
| 17244 | + </div> |
|---|
| 17245 | + </file> |
|---|
| 17246 | + </example> |
|---|
| 17247 | + * |
|---|
| 17248 | + * It's also possible to call the orderBy filter manually, by injecting `$filter`, retrieving the |
|---|
| 17249 | + * filter routine with `$filter('orderBy')`, and calling the returned filter routine with the |
|---|
| 17250 | + * desired parameters. |
|---|
| 17251 | + * |
|---|
| 17252 | + * Example: |
|---|
| 17253 | + * |
|---|
| 17254 | + * @example |
|---|
| 17255 | + <example module="orderByExample"> |
|---|
| 17256 | + <file name="index.html"> |
|---|
| 17257 | + <div ng-controller="ExampleController"> |
|---|
| 17258 | + <table class="friend"> |
|---|
| 17259 | + <tr> |
|---|
| 17260 | + <th><a href="" ng-click="reverse=false;order('name', false)">Name</a> |
|---|
| 17261 | + (<a href="" ng-click="order('-name',false)">^</a>)</th> |
|---|
| 17262 | + <th><a href="" ng-click="reverse=!reverse;order('phone', reverse)">Phone Number</a></th> |
|---|
| 17263 | + <th><a href="" ng-click="reverse=!reverse;order('age',reverse)">Age</a></th> |
|---|
| 17264 | + </tr> |
|---|
| 17265 | + <tr ng-repeat="friend in friends"> |
|---|
| 17266 | + <td>{{friend.name}}</td> |
|---|
| 17267 | + <td>{{friend.phone}}</td> |
|---|
| 17268 | + <td>{{friend.age}}</td> |
|---|
| 17269 | + </tr> |
|---|
| 17270 | + </table> |
|---|
| 17271 | + </div> |
|---|
| 17272 | + </file> |
|---|
| 17273 | + |
|---|
| 17274 | + <file name="script.js"> |
|---|
| 17275 | + angular.module('orderByExample', []) |
|---|
| 17276 | + .controller('ExampleController', ['$scope', '$filter', function($scope, $filter) { |
|---|
| 17277 | + var orderBy = $filter('orderBy'); |
|---|
| 17278 | + $scope.friends = [ |
|---|
| 17279 | + { name: 'John', phone: '555-1212', age: 10 }, |
|---|
| 17280 | + { name: 'Mary', phone: '555-9876', age: 19 }, |
|---|
| 17281 | + { name: 'Mike', phone: '555-4321', age: 21 }, |
|---|
| 17282 | + { name: 'Adam', phone: '555-5678', age: 35 }, |
|---|
| 17283 | + { name: 'Julie', phone: '555-8765', age: 29 } |
|---|
| 17284 | + ]; |
|---|
| 17285 | + $scope.order = function(predicate, reverse) { |
|---|
| 17286 | + $scope.friends = orderBy($scope.friends, predicate, reverse); |
|---|
| 17287 | + }; |
|---|
| 17288 | + $scope.order('-age',false); |
|---|
| 17289 | + }]); |
|---|
| 17290 | + </file> |
|---|
| 17291 | +</example> |
|---|
| 17292 | + */ |
|---|
| 17293 | +orderByFilter.$inject = ['$parse']; |
|---|
| 17294 | +function orderByFilter($parse){ |
|---|
| 17295 | + return function(array, sortPredicate, reverseOrder) { |
|---|
| 17296 | + if (!(isArrayLike(array))) return array; |
|---|
| 17297 | + sortPredicate = isArray(sortPredicate) ? sortPredicate: [sortPredicate]; |
|---|
| 17298 | + if (sortPredicate.length === 0) { sortPredicate = ['+']; } |
|---|
| 17299 | + sortPredicate = sortPredicate.map(function(predicate){ |
|---|
| 17300 | + var descending = false, get = predicate || identity; |
|---|
| 17301 | + if (isString(predicate)) { |
|---|
| 17302 | + if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) { |
|---|
| 17303 | + descending = predicate.charAt(0) == '-'; |
|---|
| 17304 | + predicate = predicate.substring(1); |
|---|
| 17305 | + } |
|---|
| 17306 | + if ( predicate === '' ) { |
|---|
| 17307 | + // Effectively no predicate was passed so we compare identity |
|---|
| 17308 | + return reverseComparator(function(a,b) { |
|---|
| 17309 | + return compare(a, b); |
|---|
| 17310 | + }, descending); |
|---|
| 17311 | + } |
|---|
| 17312 | + get = $parse(predicate); |
|---|
| 17313 | + if (get.constant) { |
|---|
| 17314 | + var key = get(); |
|---|
| 17315 | + return reverseComparator(function(a,b) { |
|---|
| 17316 | + return compare(a[key], b[key]); |
|---|
| 17317 | + }, descending); |
|---|
| 17318 | + } |
|---|
| 17319 | + } |
|---|
| 17320 | + return reverseComparator(function(a,b){ |
|---|
| 17321 | + return compare(get(a),get(b)); |
|---|
| 17322 | + }, descending); |
|---|
| 17323 | + }); |
|---|
| 17324 | + var arrayCopy = []; |
|---|
| 17325 | + for ( var i = 0; i < array.length; i++) { arrayCopy.push(array[i]); } |
|---|
| 17326 | + return arrayCopy.sort(reverseComparator(comparator, reverseOrder)); |
|---|
| 17327 | + |
|---|
| 17328 | + function comparator(o1, o2){ |
|---|
| 17329 | + for ( var i = 0; i < sortPredicate.length; i++) { |
|---|
| 17330 | + var comp = sortPredicate[i](o1, o2); |
|---|
| 17331 | + if (comp !== 0) return comp; |
|---|
| 17332 | + } |
|---|
| 17333 | + return 0; |
|---|
| 17334 | + } |
|---|
| 17335 | + function reverseComparator(comp, descending) { |
|---|
| 17336 | + return descending |
|---|
| 17337 | + ? function(a,b){return comp(b,a);} |
|---|
| 17338 | + : comp; |
|---|
| 17339 | + } |
|---|
| 17340 | + function compare(v1, v2){ |
|---|
| 17341 | + var t1 = typeof v1; |
|---|
| 17342 | + var t2 = typeof v2; |
|---|
| 17343 | + if (t1 == t2) { |
|---|
| 17344 | + if (isDate(v1) && isDate(v2)) { |
|---|
| 17345 | + v1 = v1.valueOf(); |
|---|
| 17346 | + v2 = v2.valueOf(); |
|---|
| 17347 | + } |
|---|
| 17348 | + if (t1 == "string") { |
|---|
| 17349 | + v1 = v1.toLowerCase(); |
|---|
| 17350 | + v2 = v2.toLowerCase(); |
|---|
| 17351 | + } |
|---|
| 17352 | + if (v1 === v2) return 0; |
|---|
| 17353 | + return v1 < v2 ? -1 : 1; |
|---|
| 17354 | + } else { |
|---|
| 17355 | + return t1 < t2 ? -1 : 1; |
|---|
| 17356 | + } |
|---|
| 17357 | + } |
|---|
| 17358 | + }; |
|---|
| 17359 | +} |
|---|
| 17360 | + |
|---|
| 17361 | +function ngDirective(directive) { |
|---|
| 17362 | + if (isFunction(directive)) { |
|---|
| 17363 | + directive = { |
|---|
| 17364 | + link: directive |
|---|
| 17365 | + }; |
|---|
| 17366 | + } |
|---|
| 17367 | + directive.restrict = directive.restrict || 'AC'; |
|---|
| 17368 | + return valueFn(directive); |
|---|
| 17369 | +} |
|---|
| 17370 | + |
|---|
| 17371 | +/** |
|---|
| 17372 | + * @ngdoc directive |
|---|
| 17373 | + * @name a |
|---|
| 17374 | + * @restrict E |
|---|
| 17375 | + * |
|---|
| 17376 | + * @description |
|---|
| 17377 | + * Modifies the default behavior of the html A tag so that the default action is prevented when |
|---|
| 17378 | + * the href attribute is empty. |
|---|
| 17379 | + * |
|---|
| 17380 | + * This change permits the easy creation of action links with the `ngClick` directive |
|---|
| 17381 | + * without changing the location or causing page reloads, e.g.: |
|---|
| 17382 | + * `<a href="" ng-click="list.addItem()">Add Item</a>` |
|---|
| 17383 | + */ |
|---|
| 17384 | +var htmlAnchorDirective = valueFn({ |
|---|
| 17385 | + restrict: 'E', |
|---|
| 17386 | + compile: function(element, attr) { |
|---|
| 17387 | + if (!attr.href && !attr.xlinkHref && !attr.name) { |
|---|
| 17388 | + return function(scope, element) { |
|---|
| 17389 | + // SVGAElement does not use the href attribute, but rather the 'xlinkHref' attribute. |
|---|
| 17390 | + var href = toString.call(element.prop('href')) === '[object SVGAnimatedString]' ? |
|---|
| 17391 | + 'xlink:href' : 'href'; |
|---|
| 17392 | + element.on('click', function(event){ |
|---|
| 17393 | + // if we have no href url, then don't navigate anywhere. |
|---|
| 17394 | + if (!element.attr(href)) { |
|---|
| 17395 | + event.preventDefault(); |
|---|
| 17396 | + } |
|---|
| 17397 | + }); |
|---|
| 17398 | + }; |
|---|
| 17399 | + } |
|---|
| 17400 | + } |
|---|
| 17401 | +}); |
|---|
| 17402 | + |
|---|
| 17403 | +/** |
|---|
| 17404 | + * @ngdoc directive |
|---|
| 17405 | + * @name ngHref |
|---|
| 17406 | + * @restrict A |
|---|
| 17407 | + * @priority 99 |
|---|
| 17408 | + * |
|---|
| 17409 | + * @description |
|---|
| 17410 | + * Using Angular markup like `{{hash}}` in an href attribute will |
|---|
| 17411 | + * make the link go to the wrong URL if the user clicks it before |
|---|
| 17412 | + * Angular has a chance to replace the `{{hash}}` markup with its |
|---|
| 17413 | + * value. Until Angular replaces the markup the link will be broken |
|---|
| 17414 | + * and will most likely return a 404 error. |
|---|
| 17415 | + * |
|---|
| 17416 | + * The `ngHref` directive solves this problem. |
|---|
| 17417 | + * |
|---|
| 17418 | + * The wrong way to write it: |
|---|
| 17419 | + * ```html |
|---|
| 17420 | + * <a href="http://www.gravatar.com/avatar/{{hash}}">link1</a> |
|---|
| 17421 | + * ``` |
|---|
| 17422 | + * |
|---|
| 17423 | + * The correct way to write it: |
|---|
| 17424 | + * ```html |
|---|
| 17425 | + * <a ng-href="http://www.gravatar.com/avatar/{{hash}}">link1</a> |
|---|
| 17426 | + * ``` |
|---|
| 17427 | + * |
|---|
| 17428 | + * @element A |
|---|
| 17429 | + * @param {template} ngHref any string which can contain `{{}}` markup. |
|---|
| 17430 | + * |
|---|
| 17431 | + * @example |
|---|
| 17432 | + * This example shows various combinations of `href`, `ng-href` and `ng-click` attributes |
|---|
| 17433 | + * in links and their different behaviors: |
|---|
| 17434 | + <example> |
|---|
| 17435 | + <file name="index.html"> |
|---|
| 17436 | + <input ng-model="value" /><br /> |
|---|
| 17437 | + <a id="link-1" href ng-click="value = 1">link 1</a> (link, don't reload)<br /> |
|---|
| 17438 | + <a id="link-2" href="" ng-click="value = 2">link 2</a> (link, don't reload)<br /> |
|---|
| 17439 | + <a id="link-3" ng-href="/{{'123'}}">link 3</a> (link, reload!)<br /> |
|---|
| 17440 | + <a id="link-4" href="" name="xx" ng-click="value = 4">anchor</a> (link, don't reload)<br /> |
|---|
| 17441 | + <a id="link-5" name="xxx" ng-click="value = 5">anchor</a> (no link)<br /> |
|---|
| 17442 | + <a id="link-6" ng-href="{{value}}">link</a> (link, change location) |
|---|
| 17443 | + </file> |
|---|
| 17444 | + <file name="protractor.js" type="protractor"> |
|---|
| 17445 | + it('should execute ng-click but not reload when href without value', function() { |
|---|
| 17446 | + element(by.id('link-1')).click(); |
|---|
| 17447 | + expect(element(by.model('value')).getAttribute('value')).toEqual('1'); |
|---|
| 17448 | + expect(element(by.id('link-1')).getAttribute('href')).toBe(''); |
|---|
| 17449 | + }); |
|---|
| 17450 | + |
|---|
| 17451 | + it('should execute ng-click but not reload when href empty string', function() { |
|---|
| 17452 | + element(by.id('link-2')).click(); |
|---|
| 17453 | + expect(element(by.model('value')).getAttribute('value')).toEqual('2'); |
|---|
| 17454 | + expect(element(by.id('link-2')).getAttribute('href')).toBe(''); |
|---|
| 17455 | + }); |
|---|
| 17456 | + |
|---|
| 17457 | + it('should execute ng-click and change url when ng-href specified', function() { |
|---|
| 17458 | + expect(element(by.id('link-3')).getAttribute('href')).toMatch(/\/123$/); |
|---|
| 17459 | + |
|---|
| 17460 | + element(by.id('link-3')).click(); |
|---|
| 17461 | + |
|---|
| 17462 | + // At this point, we navigate away from an Angular page, so we need |
|---|
| 17463 | + // to use browser.driver to get the base webdriver. |
|---|
| 17464 | + |
|---|
| 17465 | + browser.wait(function() { |
|---|
| 17466 | + return browser.driver.getCurrentUrl().then(function(url) { |
|---|
| 17467 | + return url.match(/\/123$/); |
|---|
| 17468 | + }); |
|---|
| 17469 | + }, 5000, 'page should navigate to /123'); |
|---|
| 17470 | + }); |
|---|
| 17471 | + |
|---|
| 17472 | + xit('should execute ng-click but not reload when href empty string and name specified', function() { |
|---|
| 17473 | + element(by.id('link-4')).click(); |
|---|
| 17474 | + expect(element(by.model('value')).getAttribute('value')).toEqual('4'); |
|---|
| 17475 | + expect(element(by.id('link-4')).getAttribute('href')).toBe(''); |
|---|
| 17476 | + }); |
|---|
| 17477 | + |
|---|
| 17478 | + it('should execute ng-click but not reload when no href but name specified', function() { |
|---|
| 17479 | + element(by.id('link-5')).click(); |
|---|
| 17480 | + expect(element(by.model('value')).getAttribute('value')).toEqual('5'); |
|---|
| 17481 | + expect(element(by.id('link-5')).getAttribute('href')).toBe(null); |
|---|
| 17482 | + }); |
|---|
| 17483 | + |
|---|
| 17484 | + it('should only change url when only ng-href', function() { |
|---|
| 17485 | + element(by.model('value')).clear(); |
|---|
| 17486 | + element(by.model('value')).sendKeys('6'); |
|---|
| 17487 | + expect(element(by.id('link-6')).getAttribute('href')).toMatch(/\/6$/); |
|---|
| 17488 | + |
|---|
| 17489 | + element(by.id('link-6')).click(); |
|---|
| 17490 | + |
|---|
| 17491 | + // At this point, we navigate away from an Angular page, so we need |
|---|
| 17492 | + // to use browser.driver to get the base webdriver. |
|---|
| 17493 | + browser.wait(function() { |
|---|
| 17494 | + return browser.driver.getCurrentUrl().then(function(url) { |
|---|
| 17495 | + return url.match(/\/6$/); |
|---|
| 17496 | + }); |
|---|
| 17497 | + }, 5000, 'page should navigate to /6'); |
|---|
| 17498 | + }); |
|---|
| 17499 | + </file> |
|---|
| 17500 | + </example> |
|---|
| 17501 | + */ |
|---|
| 17502 | + |
|---|
| 17503 | +/** |
|---|
| 17504 | + * @ngdoc directive |
|---|
| 17505 | + * @name ngSrc |
|---|
| 17506 | + * @restrict A |
|---|
| 17507 | + * @priority 99 |
|---|
| 17508 | + * |
|---|
| 17509 | + * @description |
|---|
| 17510 | + * Using Angular markup like `{{hash}}` in a `src` attribute doesn't |
|---|
| 17511 | + * work right: The browser will fetch from the URL with the literal |
|---|
| 17512 | + * text `{{hash}}` until Angular replaces the expression inside |
|---|
| 17513 | + * `{{hash}}`. The `ngSrc` directive solves this problem. |
|---|
| 17514 | + * |
|---|
| 17515 | + * The buggy way to write it: |
|---|
| 17516 | + * ```html |
|---|
| 17517 | + * <img src="http://www.gravatar.com/avatar/{{hash}}"/> |
|---|
| 17518 | + * ``` |
|---|
| 17519 | + * |
|---|
| 17520 | + * The correct way to write it: |
|---|
| 17521 | + * ```html |
|---|
| 17522 | + * <img ng-src="http://www.gravatar.com/avatar/{{hash}}"/> |
|---|
| 17523 | + * ``` |
|---|
| 17524 | + * |
|---|
| 17525 | + * @element IMG |
|---|
| 17526 | + * @param {template} ngSrc any string which can contain `{{}}` markup. |
|---|
| 17527 | + */ |
|---|
| 17528 | + |
|---|
| 17529 | +/** |
|---|
| 17530 | + * @ngdoc directive |
|---|
| 17531 | + * @name ngSrcset |
|---|
| 17532 | + * @restrict A |
|---|
| 17533 | + * @priority 99 |
|---|
| 17534 | + * |
|---|
| 17535 | + * @description |
|---|
| 17536 | + * Using Angular markup like `{{hash}}` in a `srcset` attribute doesn't |
|---|
| 17537 | + * work right: The browser will fetch from the URL with the literal |
|---|
| 17538 | + * text `{{hash}}` until Angular replaces the expression inside |
|---|
| 17539 | + * `{{hash}}`. The `ngSrcset` directive solves this problem. |
|---|
| 17540 | + * |
|---|
| 17541 | + * The buggy way to write it: |
|---|
| 17542 | + * ```html |
|---|
| 17543 | + * <img srcset="http://www.gravatar.com/avatar/{{hash}} 2x"/> |
|---|
| 17544 | + * ``` |
|---|
| 17545 | + * |
|---|
| 17546 | + * The correct way to write it: |
|---|
| 17547 | + * ```html |
|---|
| 17548 | + * <img ng-srcset="http://www.gravatar.com/avatar/{{hash}} 2x"/> |
|---|
| 17549 | + * ``` |
|---|
| 17550 | + * |
|---|
| 17551 | + * @element IMG |
|---|
| 17552 | + * @param {template} ngSrcset any string which can contain `{{}}` markup. |
|---|
| 17553 | + */ |
|---|
| 17554 | + |
|---|
| 17555 | +/** |
|---|
| 17556 | + * @ngdoc directive |
|---|
| 17557 | + * @name ngDisabled |
|---|
| 17558 | + * @restrict A |
|---|
| 17559 | + * @priority 100 |
|---|
| 17560 | + * |
|---|
| 17561 | + * @description |
|---|
| 17562 | + * |
|---|
| 17563 | + * We shouldn't do this, because it will make the button enabled on Chrome/Firefox but not on IE8 and older IEs: |
|---|
| 17564 | + * ```html |
|---|
| 17565 | + * <div ng-init="scope = { isDisabled: false }"> |
|---|
| 17566 | + * <button disabled="{{scope.isDisabled}}">Disabled</button> |
|---|
| 17567 | + * </div> |
|---|
| 17568 | + * ``` |
|---|
| 17569 | + * |
|---|
| 17570 | + * The HTML specification does not require browsers to preserve the values of boolean attributes |
|---|
| 17571 | + * such as disabled. (Their presence means true and their absence means false.) |
|---|
| 17572 | + * If we put an Angular interpolation expression into such an attribute then the |
|---|
| 17573 | + * binding information would be lost when the browser removes the attribute. |
|---|
| 17574 | + * The `ngDisabled` directive solves this problem for the `disabled` attribute. |
|---|
| 17575 | + * This complementary directive is not removed by the browser and so provides |
|---|
| 17576 | + * a permanent reliable place to store the binding information. |
|---|
| 17577 | + * |
|---|
| 17578 | + * @example |
|---|
| 17579 | + <example> |
|---|
| 17580 | + <file name="index.html"> |
|---|
| 17581 | + Click me to toggle: <input type="checkbox" ng-model="checked"><br/> |
|---|
| 17582 | + <button ng-model="button" ng-disabled="checked">Button</button> |
|---|
| 17583 | + </file> |
|---|
| 17584 | + <file name="protractor.js" type="protractor"> |
|---|
| 17585 | + it('should toggle button', function() { |
|---|
| 17586 | + expect(element(by.css('button')).getAttribute('disabled')).toBeFalsy(); |
|---|
| 17587 | + element(by.model('checked')).click(); |
|---|
| 17588 | + expect(element(by.css('button')).getAttribute('disabled')).toBeTruthy(); |
|---|
| 17589 | + }); |
|---|
| 17590 | + </file> |
|---|
| 17591 | + </example> |
|---|
| 17592 | + * |
|---|
| 17593 | + * @element INPUT |
|---|
| 17594 | + * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy, |
|---|
| 17595 | + * then special attribute "disabled" will be set on the element |
|---|
| 17596 | + */ |
|---|
| 17597 | + |
|---|
| 17598 | + |
|---|
| 17599 | +/** |
|---|
| 17600 | + * @ngdoc directive |
|---|
| 17601 | + * @name ngChecked |
|---|
| 17602 | + * @restrict A |
|---|
| 17603 | + * @priority 100 |
|---|
| 17604 | + * |
|---|
| 17605 | + * @description |
|---|
| 17606 | + * The HTML specification does not require browsers to preserve the values of boolean attributes |
|---|
| 17607 | + * such as checked. (Their presence means true and their absence means false.) |
|---|
| 17608 | + * If we put an Angular interpolation expression into such an attribute then the |
|---|
| 17609 | + * binding information would be lost when the browser removes the attribute. |
|---|
| 17610 | + * The `ngChecked` directive solves this problem for the `checked` attribute. |
|---|
| 17611 | + * This complementary directive is not removed by the browser and so provides |
|---|
| 17612 | + * a permanent reliable place to store the binding information. |
|---|
| 17613 | + * @example |
|---|
| 17614 | + <example> |
|---|
| 17615 | + <file name="index.html"> |
|---|
| 17616 | + Check me to check both: <input type="checkbox" ng-model="master"><br/> |
|---|
| 17617 | + <input id="checkSlave" type="checkbox" ng-checked="master"> |
|---|
| 17618 | + </file> |
|---|
| 17619 | + <file name="protractor.js" type="protractor"> |
|---|
| 17620 | + it('should check both checkBoxes', function() { |
|---|
| 17621 | + expect(element(by.id('checkSlave')).getAttribute('checked')).toBeFalsy(); |
|---|
| 17622 | + element(by.model('master')).click(); |
|---|
| 17623 | + expect(element(by.id('checkSlave')).getAttribute('checked')).toBeTruthy(); |
|---|
| 17624 | + }); |
|---|
| 17625 | + </file> |
|---|
| 17626 | + </example> |
|---|
| 17627 | + * |
|---|
| 17628 | + * @element INPUT |
|---|
| 17629 | + * @param {expression} ngChecked If the {@link guide/expression expression} is truthy, |
|---|
| 17630 | + * then special attribute "checked" will be set on the element |
|---|
| 17631 | + */ |
|---|
| 17632 | + |
|---|
| 17633 | + |
|---|
| 17634 | +/** |
|---|
| 17635 | + * @ngdoc directive |
|---|
| 17636 | + * @name ngReadonly |
|---|
| 17637 | + * @restrict A |
|---|
| 17638 | + * @priority 100 |
|---|
| 17639 | + * |
|---|
| 17640 | + * @description |
|---|
| 17641 | + * The HTML specification does not require browsers to preserve the values of boolean attributes |
|---|
| 17642 | + * such as readonly. (Their presence means true and their absence means false.) |
|---|
| 17643 | + * If we put an Angular interpolation expression into such an attribute then the |
|---|
| 17644 | + * binding information would be lost when the browser removes the attribute. |
|---|
| 17645 | + * The `ngReadonly` directive solves this problem for the `readonly` attribute. |
|---|
| 17646 | + * This complementary directive is not removed by the browser and so provides |
|---|
| 17647 | + * a permanent reliable place to store the binding information. |
|---|
| 17648 | + * @example |
|---|
| 17649 | + <example> |
|---|
| 17650 | + <file name="index.html"> |
|---|
| 17651 | + Check me to make text readonly: <input type="checkbox" ng-model="checked"><br/> |
|---|
| 17652 | + <input type="text" ng-readonly="checked" value="I'm Angular"/> |
|---|
| 17653 | + </file> |
|---|
| 17654 | + <file name="protractor.js" type="protractor"> |
|---|
| 17655 | + it('should toggle readonly attr', function() { |
|---|
| 17656 | + expect(element(by.css('[type="text"]')).getAttribute('readonly')).toBeFalsy(); |
|---|
| 17657 | + element(by.model('checked')).click(); |
|---|
| 17658 | + expect(element(by.css('[type="text"]')).getAttribute('readonly')).toBeTruthy(); |
|---|
| 17659 | + }); |
|---|
| 17660 | + </file> |
|---|
| 17661 | + </example> |
|---|
| 17662 | + * |
|---|
| 17663 | + * @element INPUT |
|---|
| 17664 | + * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy, |
|---|
| 17665 | + * then special attribute "readonly" will be set on the element |
|---|
| 17666 | + */ |
|---|
| 17667 | + |
|---|
| 17668 | + |
|---|
| 17669 | +/** |
|---|
| 17670 | + * @ngdoc directive |
|---|
| 17671 | + * @name ngSelected |
|---|
| 17672 | + * @restrict A |
|---|
| 17673 | + * @priority 100 |
|---|
| 17674 | + * |
|---|
| 17675 | + * @description |
|---|
| 17676 | + * The HTML specification does not require browsers to preserve the values of boolean attributes |
|---|
| 17677 | + * such as selected. (Their presence means true and their absence means false.) |
|---|
| 17678 | + * If we put an Angular interpolation expression into such an attribute then the |
|---|
| 17679 | + * binding information would be lost when the browser removes the attribute. |
|---|
| 17680 | + * The `ngSelected` directive solves this problem for the `selected` attribute. |
|---|
| 17681 | + * This complementary directive is not removed by the browser and so provides |
|---|
| 17682 | + * a permanent reliable place to store the binding information. |
|---|
| 17683 | + * |
|---|
| 17684 | + * @example |
|---|
| 17685 | + <example> |
|---|
| 17686 | + <file name="index.html"> |
|---|
| 17687 | + Check me to select: <input type="checkbox" ng-model="selected"><br/> |
|---|
| 17688 | + <select> |
|---|
| 17689 | + <option>Hello!</option> |
|---|
| 17690 | + <option id="greet" ng-selected="selected">Greetings!</option> |
|---|
| 17691 | + </select> |
|---|
| 17692 | + </file> |
|---|
| 17693 | + <file name="protractor.js" type="protractor"> |
|---|
| 17694 | + it('should select Greetings!', function() { |
|---|
| 17695 | + expect(element(by.id('greet')).getAttribute('selected')).toBeFalsy(); |
|---|
| 17696 | + element(by.model('selected')).click(); |
|---|
| 17697 | + expect(element(by.id('greet')).getAttribute('selected')).toBeTruthy(); |
|---|
| 17698 | + }); |
|---|
| 17699 | + </file> |
|---|
| 17700 | + </example> |
|---|
| 17701 | + * |
|---|
| 17702 | + * @element OPTION |
|---|
| 17703 | + * @param {expression} ngSelected If the {@link guide/expression expression} is truthy, |
|---|
| 17704 | + * then special attribute "selected" will be set on the element |
|---|
| 17705 | + */ |
|---|
| 17706 | + |
|---|
| 17707 | +/** |
|---|
| 17708 | + * @ngdoc directive |
|---|
| 17709 | + * @name ngOpen |
|---|
| 17710 | + * @restrict A |
|---|
| 17711 | + * @priority 100 |
|---|
| 17712 | + * |
|---|
| 17713 | + * @description |
|---|
| 17714 | + * The HTML specification does not require browsers to preserve the values of boolean attributes |
|---|
| 17715 | + * such as open. (Their presence means true and their absence means false.) |
|---|
| 17716 | + * If we put an Angular interpolation expression into such an attribute then the |
|---|
| 17717 | + * binding information would be lost when the browser removes the attribute. |
|---|
| 17718 | + * The `ngOpen` directive solves this problem for the `open` attribute. |
|---|
| 17719 | + * This complementary directive is not removed by the browser and so provides |
|---|
| 17720 | + * a permanent reliable place to store the binding information. |
|---|
| 17721 | + * @example |
|---|
| 17722 | + <example> |
|---|
| 17723 | + <file name="index.html"> |
|---|
| 17724 | + Check me check multiple: <input type="checkbox" ng-model="open"><br/> |
|---|
| 17725 | + <details id="details" ng-open="open"> |
|---|
| 17726 | + <summary>Show/Hide me</summary> |
|---|
| 17727 | + </details> |
|---|
| 17728 | + </file> |
|---|
| 17729 | + <file name="protractor.js" type="protractor"> |
|---|
| 17730 | + it('should toggle open', function() { |
|---|
| 17731 | + expect(element(by.id('details')).getAttribute('open')).toBeFalsy(); |
|---|
| 17732 | + element(by.model('open')).click(); |
|---|
| 17733 | + expect(element(by.id('details')).getAttribute('open')).toBeTruthy(); |
|---|
| 17734 | + }); |
|---|
| 17735 | + </file> |
|---|
| 17736 | + </example> |
|---|
| 17737 | + * |
|---|
| 17738 | + * @element DETAILS |
|---|
| 17739 | + * @param {expression} ngOpen If the {@link guide/expression expression} is truthy, |
|---|
| 17740 | + * then special attribute "open" will be set on the element |
|---|
| 17741 | + */ |
|---|
| 17742 | + |
|---|
| 17743 | +var ngAttributeAliasDirectives = {}; |
|---|
| 17744 | + |
|---|
| 17745 | + |
|---|
| 17746 | +// boolean attrs are evaluated |
|---|
| 17747 | +forEach(BOOLEAN_ATTR, function(propName, attrName) { |
|---|
| 17748 | + // binding to multiple is not supported |
|---|
| 17749 | + if (propName == "multiple") return; |
|---|
| 17750 | + |
|---|
| 17751 | + var normalized = directiveNormalize('ng-' + attrName); |
|---|
| 17752 | + ngAttributeAliasDirectives[normalized] = function() { |
|---|
| 17753 | + return { |
|---|
| 17754 | + restrict: 'A', |
|---|
| 17755 | + priority: 100, |
|---|
| 17756 | + link: function(scope, element, attr) { |
|---|
| 17757 | + scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) { |
|---|
| 17758 | + attr.$set(attrName, !!value); |
|---|
| 17759 | + }); |
|---|
| 17760 | + } |
|---|
| 17761 | + }; |
|---|
| 17762 | + }; |
|---|
| 17763 | +}); |
|---|
| 17764 | + |
|---|
| 17765 | +// aliased input attrs are evaluated |
|---|
| 17766 | +forEach(ALIASED_ATTR, function(htmlAttr, ngAttr) { |
|---|
| 17767 | + ngAttributeAliasDirectives[ngAttr] = function() { |
|---|
| 17768 | + return { |
|---|
| 17769 | + priority: 100, |
|---|
| 17770 | + link: function(scope, element, attr) { |
|---|
| 17771 | + //special case ngPattern when a literal regular expression value |
|---|
| 17772 | + //is used as the expression (this way we don't have to watch anything). |
|---|
| 17773 | + if (ngAttr === "ngPattern" && attr.ngPattern.charAt(0) == "/") { |
|---|
| 17774 | + var match = attr.ngPattern.match(REGEX_STRING_REGEXP); |
|---|
| 17775 | + if (match) { |
|---|
| 17776 | + attr.$set("ngPattern", new RegExp(match[1], match[2])); |
|---|
| 17777 | + return; |
|---|
| 17778 | + } |
|---|
| 17779 | + } |
|---|
| 17780 | + |
|---|
| 17781 | + scope.$watch(attr[ngAttr], function ngAttrAliasWatchAction(value) { |
|---|
| 17782 | + attr.$set(ngAttr, value); |
|---|
| 17783 | + }); |
|---|
| 17784 | + } |
|---|
| 17785 | + }; |
|---|
| 17786 | + }; |
|---|
| 17787 | +}); |
|---|
| 17788 | + |
|---|
| 17789 | +// ng-src, ng-srcset, ng-href are interpolated |
|---|
| 17790 | +forEach(['src', 'srcset', 'href'], function(attrName) { |
|---|
| 17791 | + var normalized = directiveNormalize('ng-' + attrName); |
|---|
| 17792 | + ngAttributeAliasDirectives[normalized] = function() { |
|---|
| 17793 | + return { |
|---|
| 17794 | + priority: 99, // it needs to run after the attributes are interpolated |
|---|
| 17795 | + link: function(scope, element, attr) { |
|---|
| 17796 | + var propName = attrName, |
|---|
| 17797 | + name = attrName; |
|---|
| 17798 | + |
|---|
| 17799 | + if (attrName === 'href' && |
|---|
| 17800 | + toString.call(element.prop('href')) === '[object SVGAnimatedString]') { |
|---|
| 17801 | + name = 'xlinkHref'; |
|---|
| 17802 | + attr.$attr[name] = 'xlink:href'; |
|---|
| 17803 | + propName = null; |
|---|
| 17804 | + } |
|---|
| 17805 | + |
|---|
| 17806 | + attr.$observe(normalized, function(value) { |
|---|
| 17807 | + if (!value) { |
|---|
| 17808 | + if (attrName === 'href') { |
|---|
| 17809 | + attr.$set(name, null); |
|---|
| 17810 | + } |
|---|
| 17811 | + return; |
|---|
| 17812 | + } |
|---|
| 17813 | + |
|---|
| 17814 | + attr.$set(name, value); |
|---|
| 17815 | + |
|---|
| 17816 | + // on IE, if "ng:src" directive declaration is used and "src" attribute doesn't exist |
|---|
| 17817 | + // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need |
|---|
| 17818 | + // to set the property as well to achieve the desired effect. |
|---|
| 17819 | + // we use attr[attrName] value since $set can sanitize the url. |
|---|
| 17820 | + if (msie && propName) element.prop(propName, attr[name]); |
|---|
| 17821 | + }); |
|---|
| 17822 | + } |
|---|
| 17823 | + }; |
|---|
| 17824 | + }; |
|---|
| 17825 | +}); |
|---|
| 17826 | + |
|---|
| 17827 | +/* global -nullFormCtrl, -SUBMITTED_CLASS, addSetValidityMethod: true |
|---|
| 17828 | + */ |
|---|
| 17829 | +var nullFormCtrl = { |
|---|
| 17830 | + $addControl: noop, |
|---|
| 17831 | + $$renameControl: nullFormRenameControl, |
|---|
| 17832 | + $removeControl: noop, |
|---|
| 17833 | + $setValidity: noop, |
|---|
| 17834 | + $setDirty: noop, |
|---|
| 17835 | + $setPristine: noop, |
|---|
| 17836 | + $setSubmitted: noop |
|---|
| 17837 | +}, |
|---|
| 17838 | +SUBMITTED_CLASS = 'ng-submitted'; |
|---|
| 17839 | + |
|---|
| 17840 | +function nullFormRenameControl(control, name) { |
|---|
| 17841 | + control.$name = name; |
|---|
| 17842 | +} |
|---|
| 17843 | + |
|---|
| 17844 | +/** |
|---|
| 17845 | + * @ngdoc type |
|---|
| 17846 | + * @name form.FormController |
|---|
| 17847 | + * |
|---|
| 17848 | + * @property {boolean} $pristine True if user has not interacted with the form yet. |
|---|
| 17849 | + * @property {boolean} $dirty True if user has already interacted with the form. |
|---|
| 17850 | + * @property {boolean} $valid True if all of the containing forms and controls are valid. |
|---|
| 17851 | + * @property {boolean} $invalid True if at least one containing control or form is invalid. |
|---|
| 17852 | + * @property {boolean} $submitted True if user has submitted the form even if its invalid. |
|---|
| 17853 | + * |
|---|
| 17854 | + * @property {Object} $error Is an object hash, containing references to controls or |
|---|
| 17855 | + * forms with failing validators, where: |
|---|
| 17856 | + * |
|---|
| 17857 | + * - keys are validation tokens (error names), |
|---|
| 17858 | + * - values are arrays of controls or forms that have a failing validator for given error name. |
|---|
| 17859 | + * |
|---|
| 17860 | + * Built-in validation tokens: |
|---|
| 17861 | + * |
|---|
| 17862 | + * - `email` |
|---|
| 17863 | + * - `max` |
|---|
| 17864 | + * - `maxlength` |
|---|
| 17865 | + * - `min` |
|---|
| 17866 | + * - `minlength` |
|---|
| 17867 | + * - `number` |
|---|
| 17868 | + * - `pattern` |
|---|
| 17869 | + * - `required` |
|---|
| 17870 | + * - `url` |
|---|
| 17871 | + * |
|---|
| 17872 | + * @description |
|---|
| 17873 | + * `FormController` keeps track of all its controls and nested forms as well as the state of them, |
|---|
| 17874 | + * such as being valid/invalid or dirty/pristine. |
|---|
| 17875 | + * |
|---|
| 17876 | + * Each {@link ng.directive:form form} directive creates an instance |
|---|
| 17877 | + * of `FormController`. |
|---|
| 17878 | + * |
|---|
| 17879 | + */ |
|---|
| 17880 | +//asks for $scope to fool the BC controller module |
|---|
| 17881 | +FormController.$inject = ['$element', '$attrs', '$scope', '$animate', '$interpolate']; |
|---|
| 17882 | +function FormController(element, attrs, $scope, $animate, $interpolate) { |
|---|
| 17883 | + var form = this, |
|---|
| 17884 | + controls = []; |
|---|
| 17885 | + |
|---|
| 17886 | + var parentForm = form.$$parentForm = element.parent().controller('form') || nullFormCtrl; |
|---|
| 17887 | + |
|---|
| 17888 | + // init state |
|---|
| 17889 | + form.$error = {}; |
|---|
| 17890 | + form.$$success = {}; |
|---|
| 17891 | + form.$pending = undefined; |
|---|
| 17892 | + form.$name = $interpolate(attrs.name || attrs.ngForm || '')($scope); |
|---|
| 17893 | + form.$dirty = false; |
|---|
| 17894 | + form.$pristine = true; |
|---|
| 17895 | + form.$valid = true; |
|---|
| 17896 | + form.$invalid = false; |
|---|
| 17897 | + form.$submitted = false; |
|---|
| 17898 | + |
|---|
| 17899 | + parentForm.$addControl(form); |
|---|
| 17900 | + |
|---|
| 17901 | + /** |
|---|
| 17902 | + * @ngdoc method |
|---|
| 17903 | + * @name form.FormController#$rollbackViewValue |
|---|
| 17904 | + * |
|---|
| 17905 | + * @description |
|---|
| 17906 | + * Rollback all form controls pending updates to the `$modelValue`. |
|---|
| 17907 | + * |
|---|
| 17908 | + * Updates may be pending by a debounced event or because the input is waiting for a some future |
|---|
| 17909 | + * event defined in `ng-model-options`. This method is typically needed by the reset button of |
|---|
| 17910 | + * a form that uses `ng-model-options` to pend updates. |
|---|
| 17911 | + */ |
|---|
| 17912 | + form.$rollbackViewValue = function() { |
|---|
| 17913 | + forEach(controls, function(control) { |
|---|
| 17914 | + control.$rollbackViewValue(); |
|---|
| 17915 | + }); |
|---|
| 17916 | + }; |
|---|
| 17917 | + |
|---|
| 17918 | + /** |
|---|
| 17919 | + * @ngdoc method |
|---|
| 17920 | + * @name form.FormController#$commitViewValue |
|---|
| 17921 | + * |
|---|
| 17922 | + * @description |
|---|
| 17923 | + * Commit all form controls pending updates to the `$modelValue`. |
|---|
| 17924 | + * |
|---|
| 17925 | + * Updates may be pending by a debounced event or because the input is waiting for a some future |
|---|
| 17926 | + * event defined in `ng-model-options`. This method is rarely needed as `NgModelController` |
|---|
| 17927 | + * usually handles calling this in response to input events. |
|---|
| 17928 | + */ |
|---|
| 17929 | + form.$commitViewValue = function() { |
|---|
| 17930 | + forEach(controls, function(control) { |
|---|
| 17931 | + control.$commitViewValue(); |
|---|
| 17932 | + }); |
|---|
| 17933 | + }; |
|---|
| 17934 | + |
|---|
| 17935 | + /** |
|---|
| 17936 | + * @ngdoc method |
|---|
| 17937 | + * @name form.FormController#$addControl |
|---|
| 17938 | + * |
|---|
| 17939 | + * @description |
|---|
| 17940 | + * Register a control with the form. |
|---|
| 17941 | + * |
|---|
| 17942 | + * Input elements using ngModelController do this automatically when they are linked. |
|---|
| 17943 | + */ |
|---|
| 17944 | + form.$addControl = function(control) { |
|---|
| 17945 | + // Breaking change - before, inputs whose name was "hasOwnProperty" were quietly ignored |
|---|
| 17946 | + // and not added to the scope. Now we throw an error. |
|---|
| 17947 | + assertNotHasOwnProperty(control.$name, 'input'); |
|---|
| 17948 | + controls.push(control); |
|---|
| 17949 | + |
|---|
| 17950 | + if (control.$name) { |
|---|
| 17951 | + form[control.$name] = control; |
|---|
| 17952 | + } |
|---|
| 17953 | + }; |
|---|
| 17954 | + |
|---|
| 17955 | + // Private API: rename a form control |
|---|
| 17956 | + form.$$renameControl = function(control, newName) { |
|---|
| 17957 | + var oldName = control.$name; |
|---|
| 17958 | + |
|---|
| 17959 | + if (form[oldName] === control) { |
|---|
| 17960 | + delete form[oldName]; |
|---|
| 17961 | + } |
|---|
| 17962 | + form[newName] = control; |
|---|
| 17963 | + control.$name = newName; |
|---|
| 17964 | + }; |
|---|
| 17965 | + |
|---|
| 17966 | + /** |
|---|
| 17967 | + * @ngdoc method |
|---|
| 17968 | + * @name form.FormController#$removeControl |
|---|
| 17969 | + * |
|---|
| 17970 | + * @description |
|---|
| 17971 | + * Deregister a control from the form. |
|---|
| 17972 | + * |
|---|
| 17973 | + * Input elements using ngModelController do this automatically when they are destroyed. |
|---|
| 17974 | + */ |
|---|
| 17975 | + form.$removeControl = function(control) { |
|---|
| 17976 | + if (control.$name && form[control.$name] === control) { |
|---|
| 17977 | + delete form[control.$name]; |
|---|
| 17978 | + } |
|---|
| 17979 | + forEach(form.$pending, function(value, name) { |
|---|
| 17980 | + form.$setValidity(name, null, control); |
|---|
| 17981 | + }); |
|---|
| 17982 | + forEach(form.$error, function(value, name) { |
|---|
| 17983 | + form.$setValidity(name, null, control); |
|---|
| 17984 | + }); |
|---|
| 17985 | + |
|---|
| 17986 | + arrayRemove(controls, control); |
|---|
| 17987 | + }; |
|---|
| 17988 | + |
|---|
| 17989 | + |
|---|
| 17990 | + /** |
|---|
| 17991 | + * @ngdoc method |
|---|
| 17992 | + * @name form.FormController#$setValidity |
|---|
| 17993 | + * |
|---|
| 17994 | + * @description |
|---|
| 17995 | + * Sets the validity of a form control. |
|---|
| 17996 | + * |
|---|
| 17997 | + * This method will also propagate to parent forms. |
|---|
| 17998 | + */ |
|---|
| 17999 | + addSetValidityMethod({ |
|---|
| 18000 | + ctrl: this, |
|---|
| 18001 | + $element: element, |
|---|
| 18002 | + set: function(object, property, control) { |
|---|
| 18003 | + var list = object[property]; |
|---|
| 18004 | + if (!list) { |
|---|
| 18005 | + object[property] = [control]; |
|---|
| 18006 | + } else { |
|---|
| 18007 | + var index = list.indexOf(control); |
|---|
| 18008 | + if (index === -1) { |
|---|
| 18009 | + list.push(control); |
|---|
| 18010 | + } |
|---|
| 18011 | + } |
|---|
| 18012 | + }, |
|---|
| 18013 | + unset: function(object, property, control) { |
|---|
| 18014 | + var list = object[property]; |
|---|
| 18015 | + if (!list) { |
|---|
| 18016 | + return; |
|---|
| 18017 | + } |
|---|
| 18018 | + arrayRemove(list, control); |
|---|
| 18019 | + if (list.length === 0) { |
|---|
| 18020 | + delete object[property]; |
|---|
| 18021 | + } |
|---|
| 18022 | + }, |
|---|
| 18023 | + parentForm: parentForm, |
|---|
| 18024 | + $animate: $animate |
|---|
| 18025 | + }); |
|---|
| 18026 | + |
|---|
| 18027 | + /** |
|---|
| 18028 | + * @ngdoc method |
|---|
| 18029 | + * @name form.FormController#$setDirty |
|---|
| 18030 | + * |
|---|
| 18031 | + * @description |
|---|
| 18032 | + * Sets the form to a dirty state. |
|---|
| 18033 | + * |
|---|
| 18034 | + * This method can be called to add the 'ng-dirty' class and set the form to a dirty |
|---|
| 18035 | + * state (ng-dirty class). This method will also propagate to parent forms. |
|---|
| 18036 | + */ |
|---|
| 18037 | + form.$setDirty = function() { |
|---|
| 18038 | + $animate.removeClass(element, PRISTINE_CLASS); |
|---|
| 18039 | + $animate.addClass(element, DIRTY_CLASS); |
|---|
| 18040 | + form.$dirty = true; |
|---|
| 18041 | + form.$pristine = false; |
|---|
| 18042 | + parentForm.$setDirty(); |
|---|
| 18043 | + }; |
|---|
| 18044 | + |
|---|
| 18045 | + /** |
|---|
| 18046 | + * @ngdoc method |
|---|
| 18047 | + * @name form.FormController#$setPristine |
|---|
| 18048 | + * |
|---|
| 18049 | + * @description |
|---|
| 18050 | + * Sets the form to its pristine state. |
|---|
| 18051 | + * |
|---|
| 18052 | + * This method can be called to remove the 'ng-dirty' class and set the form to its pristine |
|---|
| 18053 | + * state (ng-pristine class). This method will also propagate to all the controls contained |
|---|
| 18054 | + * in this form. |
|---|
| 18055 | + * |
|---|
| 18056 | + * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after |
|---|
| 18057 | + * saving or resetting it. |
|---|
| 18058 | + */ |
|---|
| 18059 | + form.$setPristine = function () { |
|---|
| 18060 | + $animate.setClass(element, PRISTINE_CLASS, DIRTY_CLASS + ' ' + SUBMITTED_CLASS); |
|---|
| 18061 | + form.$dirty = false; |
|---|
| 18062 | + form.$pristine = true; |
|---|
| 18063 | + form.$submitted = false; |
|---|
| 18064 | + forEach(controls, function(control) { |
|---|
| 18065 | + control.$setPristine(); |
|---|
| 18066 | + }); |
|---|
| 18067 | + }; |
|---|
| 18068 | + |
|---|
| 18069 | + /** |
|---|
| 18070 | + * @ngdoc method |
|---|
| 18071 | + * @name form.FormController#$setUntouched |
|---|
| 18072 | + * |
|---|
| 18073 | + * @description |
|---|
| 18074 | + * Sets the form to its untouched state. |
|---|
| 18075 | + * |
|---|
| 18076 | + * This method can be called to remove the 'ng-touched' class and set the form controls to their |
|---|
| 18077 | + * untouched state (ng-untouched class). |
|---|
| 18078 | + * |
|---|
| 18079 | + * Setting a form controls back to their untouched state is often useful when setting the form |
|---|
| 18080 | + * back to its pristine state. |
|---|
| 18081 | + */ |
|---|
| 18082 | + form.$setUntouched = function () { |
|---|
| 18083 | + forEach(controls, function(control) { |
|---|
| 18084 | + control.$setUntouched(); |
|---|
| 18085 | + }); |
|---|
| 18086 | + }; |
|---|
| 18087 | + |
|---|
| 18088 | + /** |
|---|
| 18089 | + * @ngdoc method |
|---|
| 18090 | + * @name form.FormController#$setSubmitted |
|---|
| 18091 | + * |
|---|
| 18092 | + * @description |
|---|
| 18093 | + * Sets the form to its submitted state. |
|---|
| 18094 | + */ |
|---|
| 18095 | + form.$setSubmitted = function () { |
|---|
| 18096 | + $animate.addClass(element, SUBMITTED_CLASS); |
|---|
| 18097 | + form.$submitted = true; |
|---|
| 18098 | + parentForm.$setSubmitted(); |
|---|
| 18099 | + }; |
|---|
| 18100 | +} |
|---|
| 18101 | + |
|---|
| 18102 | +/** |
|---|
| 18103 | + * @ngdoc directive |
|---|
| 18104 | + * @name ngForm |
|---|
| 18105 | + * @restrict EAC |
|---|
| 18106 | + * |
|---|
| 18107 | + * @description |
|---|
| 18108 | + * Nestable alias of {@link ng.directive:form `form`} directive. HTML |
|---|
| 18109 | + * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a |
|---|
| 18110 | + * sub-group of controls needs to be determined. |
|---|
| 18111 | + * |
|---|
| 18112 | + * Note: the purpose of `ngForm` is to group controls, |
|---|
| 18113 | + * but not to be a replacement for the `<form>` tag with all of its capabilities |
|---|
| 18114 | + * (e.g. posting to the server, ...). |
|---|
| 18115 | + * |
|---|
| 18116 | + * @param {string=} ngForm|name Name of the form. If specified, the form controller will be published into |
|---|
| 18117 | + * related scope, under this name. |
|---|
| 18118 | + * |
|---|
| 18119 | + */ |
|---|
| 18120 | + |
|---|
| 18121 | + /** |
|---|
| 18122 | + * @ngdoc directive |
|---|
| 18123 | + * @name form |
|---|
| 18124 | + * @restrict E |
|---|
| 18125 | + * |
|---|
| 18126 | + * @description |
|---|
| 18127 | + * Directive that instantiates |
|---|
| 18128 | + * {@link form.FormController FormController}. |
|---|
| 18129 | + * |
|---|
| 18130 | + * If the `name` attribute is specified, the form controller is published onto the current scope under |
|---|
| 18131 | + * this name. |
|---|
| 18132 | + * |
|---|
| 18133 | + * # Alias: {@link ng.directive:ngForm `ngForm`} |
|---|
| 18134 | + * |
|---|
| 18135 | + * In Angular forms can be nested. This means that the outer form is valid when all of the child |
|---|
| 18136 | + * forms are valid as well. However, browsers do not allow nesting of `<form>` elements, so |
|---|
| 18137 | + * Angular provides the {@link ng.directive:ngForm `ngForm`} directive which behaves identically to |
|---|
| 18138 | + * `<form>` but can be nested. This allows you to have nested forms, which is very useful when |
|---|
| 18139 | + * using Angular validation directives in forms that are dynamically generated using the |
|---|
| 18140 | + * {@link ng.directive:ngRepeat `ngRepeat`} directive. Since you cannot dynamically generate the `name` |
|---|
| 18141 | + * attribute of input elements using interpolation, you have to wrap each set of repeated inputs in an |
|---|
| 18142 | + * `ngForm` directive and nest these in an outer `form` element. |
|---|
| 18143 | + * |
|---|
| 18144 | + * |
|---|
| 18145 | + * # CSS classes |
|---|
| 18146 | + * - `ng-valid` is set if the form is valid. |
|---|
| 18147 | + * - `ng-invalid` is set if the form is invalid. |
|---|
| 18148 | + * - `ng-pristine` is set if the form is pristine. |
|---|
| 18149 | + * - `ng-dirty` is set if the form is dirty. |
|---|
| 18150 | + * - `ng-submitted` is set if the form was submitted. |
|---|
| 18151 | + * |
|---|
| 18152 | + * Keep in mind that ngAnimate can detect each of these classes when added and removed. |
|---|
| 18153 | + * |
|---|
| 18154 | + * |
|---|
| 18155 | + * # Submitting a form and preventing the default action |
|---|
| 18156 | + * |
|---|
| 18157 | + * Since the role of forms in client-side Angular applications is different than in classical |
|---|
| 18158 | + * roundtrip apps, it is desirable for the browser not to translate the form submission into a full |
|---|
| 18159 | + * page reload that sends the data to the server. Instead some javascript logic should be triggered |
|---|
| 18160 | + * to handle the form submission in an application-specific way. |
|---|
| 18161 | + * |
|---|
| 18162 | + * For this reason, Angular prevents the default action (form submission to the server) unless the |
|---|
| 18163 | + * `<form>` element has an `action` attribute specified. |
|---|
| 18164 | + * |
|---|
| 18165 | + * You can use one of the following two ways to specify what javascript method should be called when |
|---|
| 18166 | + * a form is submitted: |
|---|
| 18167 | + * |
|---|
| 18168 | + * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element |
|---|
| 18169 | + * - {@link ng.directive:ngClick ngClick} directive on the first |
|---|
| 18170 | + * button or input field of type submit (input[type=submit]) |
|---|
| 18171 | + * |
|---|
| 18172 | + * To prevent double execution of the handler, use only one of the {@link ng.directive:ngSubmit ngSubmit} |
|---|
| 18173 | + * or {@link ng.directive:ngClick ngClick} directives. |
|---|
| 18174 | + * This is because of the following form submission rules in the HTML specification: |
|---|
| 18175 | + * |
|---|
| 18176 | + * - If a form has only one input field then hitting enter in this field triggers form submit |
|---|
| 18177 | + * (`ngSubmit`) |
|---|
| 18178 | + * - if a form has 2+ input fields and no buttons or input[type=submit] then hitting enter |
|---|
| 18179 | + * doesn't trigger submit |
|---|
| 18180 | + * - if a form has one or more input fields and one or more buttons or input[type=submit] then |
|---|
| 18181 | + * hitting enter in any of the input fields will trigger the click handler on the *first* button or |
|---|
| 18182 | + * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`) |
|---|
| 18183 | + * |
|---|
| 18184 | + * Any pending `ngModelOptions` changes will take place immediately when an enclosing form is |
|---|
| 18185 | + * submitted. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit` |
|---|
| 18186 | + * to have access to the updated model. |
|---|
| 18187 | + * |
|---|
| 18188 | + * ## Animation Hooks |
|---|
| 18189 | + * |
|---|
| 18190 | + * Animations in ngForm are triggered when any of the associated CSS classes are added and removed. |
|---|
| 18191 | + * These classes are: `.ng-pristine`, `.ng-dirty`, `.ng-invalid` and `.ng-valid` as well as any |
|---|
| 18192 | + * other validations that are performed within the form. Animations in ngForm are similar to how |
|---|
| 18193 | + * they work in ngClass and animations can be hooked into using CSS transitions, keyframes as well |
|---|
| 18194 | + * as JS animations. |
|---|
| 18195 | + * |
|---|
| 18196 | + * The following example shows a simple way to utilize CSS transitions to style a form element |
|---|
| 18197 | + * that has been rendered as invalid after it has been validated: |
|---|
| 18198 | + * |
|---|
| 18199 | + * <pre> |
|---|
| 18200 | + * //be sure to include ngAnimate as a module to hook into more |
|---|
| 18201 | + * //advanced animations |
|---|
| 18202 | + * .my-form { |
|---|
| 18203 | + * transition:0.5s linear all; |
|---|
| 18204 | + * background: white; |
|---|
| 18205 | + * } |
|---|
| 18206 | + * .my-form.ng-invalid { |
|---|
| 18207 | + * background: red; |
|---|
| 18208 | + * color:white; |
|---|
| 18209 | + * } |
|---|
| 18210 | + * </pre> |
|---|
| 18211 | + * |
|---|
| 18212 | + * @example |
|---|
| 18213 | + <example deps="angular-animate.js" animations="true" fixBase="true" module="formExample"> |
|---|
| 18214 | + <file name="index.html"> |
|---|
| 18215 | + <script> |
|---|
| 18216 | + angular.module('formExample', []) |
|---|
| 18217 | + .controller('FormController', ['$scope', function($scope) { |
|---|
| 18218 | + $scope.userType = 'guest'; |
|---|
| 18219 | + }]); |
|---|
| 18220 | + </script> |
|---|
| 18221 | + <style> |
|---|
| 18222 | + .my-form { |
|---|
| 18223 | + -webkit-transition:all linear 0.5s; |
|---|
| 18224 | + transition:all linear 0.5s; |
|---|
| 18225 | + background: transparent; |
|---|
| 18226 | + } |
|---|
| 18227 | + .my-form.ng-invalid { |
|---|
| 18228 | + background: red; |
|---|
| 18229 | + } |
|---|
| 18230 | + </style> |
|---|
| 18231 | + <form name="myForm" ng-controller="FormController" class="my-form"> |
|---|
| 18232 | + userType: <input name="input" ng-model="userType" required> |
|---|
| 18233 | + <span class="error" ng-show="myForm.input.$error.required">Required!</span><br> |
|---|
| 18234 | + <tt>userType = {{userType}}</tt><br> |
|---|
| 18235 | + <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br> |
|---|
| 18236 | + <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br> |
|---|
| 18237 | + <tt>myForm.$valid = {{myForm.$valid}}</tt><br> |
|---|
| 18238 | + <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br> |
|---|
| 18239 | + </form> |
|---|
| 18240 | + </file> |
|---|
| 18241 | + <file name="protractor.js" type="protractor"> |
|---|
| 18242 | + it('should initialize to model', function() { |
|---|
| 18243 | + var userType = element(by.binding('userType')); |
|---|
| 18244 | + var valid = element(by.binding('myForm.input.$valid')); |
|---|
| 18245 | + |
|---|
| 18246 | + expect(userType.getText()).toContain('guest'); |
|---|
| 18247 | + expect(valid.getText()).toContain('true'); |
|---|
| 18248 | + }); |
|---|
| 18249 | + |
|---|
| 18250 | + it('should be invalid if empty', function() { |
|---|
| 18251 | + var userType = element(by.binding('userType')); |
|---|
| 18252 | + var valid = element(by.binding('myForm.input.$valid')); |
|---|
| 18253 | + var userInput = element(by.model('userType')); |
|---|
| 18254 | + |
|---|
| 18255 | + userInput.clear(); |
|---|
| 18256 | + userInput.sendKeys(''); |
|---|
| 18257 | + |
|---|
| 18258 | + expect(userType.getText()).toEqual('userType ='); |
|---|
| 18259 | + expect(valid.getText()).toContain('false'); |
|---|
| 18260 | + }); |
|---|
| 18261 | + </file> |
|---|
| 18262 | + </example> |
|---|
| 18263 | + * |
|---|
| 18264 | + * @param {string=} name Name of the form. If specified, the form controller will be published into |
|---|
| 18265 | + * related scope, under this name. |
|---|
| 18266 | + */ |
|---|
| 18267 | +var formDirectiveFactory = function(isNgForm) { |
|---|
| 18268 | + return ['$timeout', function($timeout) { |
|---|
| 18269 | + var formDirective = { |
|---|
| 18270 | + name: 'form', |
|---|
| 18271 | + restrict: isNgForm ? 'EAC' : 'E', |
|---|
| 18272 | + controller: FormController, |
|---|
| 18273 | + compile: function ngFormCompile(formElement) { |
|---|
| 18274 | + // Setup initial state of the control |
|---|
| 18275 | + formElement.addClass(PRISTINE_CLASS).addClass(VALID_CLASS); |
|---|
| 18276 | + |
|---|
| 18277 | + return { |
|---|
| 18278 | + pre: function ngFormPreLink(scope, formElement, attr, controller) { |
|---|
| 18279 | + // if `action` attr is not present on the form, prevent the default action (submission) |
|---|
| 18280 | + if (!('action' in attr)) { |
|---|
| 18281 | + // we can't use jq events because if a form is destroyed during submission the default |
|---|
| 18282 | + // action is not prevented. see #1238 |
|---|
| 18283 | + // |
|---|
| 18284 | + // IE 9 is not affected because it doesn't fire a submit event and try to do a full |
|---|
| 18285 | + // page reload if the form was destroyed by submission of the form via a click handler |
|---|
| 18286 | + // on a button in the form. Looks like an IE9 specific bug. |
|---|
| 18287 | + var handleFormSubmission = function(event) { |
|---|
| 18288 | + scope.$apply(function() { |
|---|
| 18289 | + controller.$commitViewValue(); |
|---|
| 18290 | + controller.$setSubmitted(); |
|---|
| 18291 | + }); |
|---|
| 18292 | + |
|---|
| 18293 | + event.preventDefault |
|---|
| 18294 | + ? event.preventDefault() |
|---|
| 18295 | + : event.returnValue = false; // IE |
|---|
| 18296 | + }; |
|---|
| 18297 | + |
|---|
| 18298 | + addEventListenerFn(formElement[0], 'submit', handleFormSubmission); |
|---|
| 18299 | + |
|---|
| 18300 | + // unregister the preventDefault listener so that we don't not leak memory but in a |
|---|
| 18301 | + // way that will achieve the prevention of the default action. |
|---|
| 18302 | + formElement.on('$destroy', function() { |
|---|
| 18303 | + $timeout(function() { |
|---|
| 18304 | + removeEventListenerFn(formElement[0], 'submit', handleFormSubmission); |
|---|
| 18305 | + }, 0, false); |
|---|
| 18306 | + }); |
|---|
| 18307 | + } |
|---|
| 18308 | + |
|---|
| 18309 | + var parentFormCtrl = controller.$$parentForm, |
|---|
| 18310 | + alias = controller.$name; |
|---|
| 18311 | + |
|---|
| 18312 | + if (alias) { |
|---|
| 18313 | + setter(scope, alias, controller, alias); |
|---|
| 18314 | + attr.$observe(attr.name ? 'name' : 'ngForm', function(newValue) { |
|---|
| 18315 | + if (alias === newValue) return; |
|---|
| 18316 | + setter(scope, alias, undefined, alias); |
|---|
| 18317 | + alias = newValue; |
|---|
| 18318 | + setter(scope, alias, controller, alias); |
|---|
| 18319 | + parentFormCtrl.$$renameControl(controller, alias); |
|---|
| 18320 | + }); |
|---|
| 18321 | + } |
|---|
| 18322 | + formElement.on('$destroy', function() { |
|---|
| 18323 | + parentFormCtrl.$removeControl(controller); |
|---|
| 18324 | + if (alias) { |
|---|
| 18325 | + setter(scope, alias, undefined, alias); |
|---|
| 18326 | + } |
|---|
| 18327 | + extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards |
|---|
| 18328 | + }); |
|---|
| 18329 | + } |
|---|
| 18330 | + }; |
|---|
| 18331 | + } |
|---|
| 18332 | + }; |
|---|
| 18333 | + |
|---|
| 18334 | + return formDirective; |
|---|
| 18335 | + }]; |
|---|
| 18336 | +}; |
|---|
| 18337 | + |
|---|
| 18338 | +var formDirective = formDirectiveFactory(); |
|---|
| 18339 | +var ngFormDirective = formDirectiveFactory(true); |
|---|
| 18340 | + |
|---|
| 18341 | +/* global VALID_CLASS: true, |
|---|
| 18342 | + INVALID_CLASS: true, |
|---|
| 18343 | + PRISTINE_CLASS: true, |
|---|
| 18344 | + DIRTY_CLASS: true, |
|---|
| 18345 | + UNTOUCHED_CLASS: true, |
|---|
| 18346 | + TOUCHED_CLASS: true, |
|---|
| 18347 | +*/ |
|---|
| 18348 | + |
|---|
| 18349 | +// Regex code is obtained from SO: https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime#answer-3143231 |
|---|
| 18350 | +var ISO_DATE_REGEXP = /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/; |
|---|
| 18351 | +var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/; |
|---|
| 18352 | +var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i; |
|---|
| 18353 | +var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/; |
|---|
| 18354 | +var DATE_REGEXP = /^(\d{4})-(\d{2})-(\d{2})$/; |
|---|
| 18355 | +var DATETIMELOCAL_REGEXP = /^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/; |
|---|
| 18356 | +var WEEK_REGEXP = /^(\d{4})-W(\d\d)$/; |
|---|
| 18357 | +var MONTH_REGEXP = /^(\d{4})-(\d\d)$/; |
|---|
| 18358 | +var TIME_REGEXP = /^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/; |
|---|
| 18359 | +var DEFAULT_REGEXP = /(\s+|^)default(\s+|$)/; |
|---|
| 18360 | + |
|---|
| 18361 | +var $ngModelMinErr = new minErr('ngModel'); |
|---|
| 18362 | + |
|---|
| 18363 | +var inputType = { |
|---|
| 18364 | + |
|---|
| 18365 | + /** |
|---|
| 18366 | + * @ngdoc input |
|---|
| 18367 | + * @name input[text] |
|---|
| 18368 | + * |
|---|
| 18369 | + * @description |
|---|
| 18370 | + * Standard HTML text input with angular data binding, inherited by most of the `input` elements. |
|---|
| 18371 | + * |
|---|
| 18372 | + * *NOTE* Not every feature offered is available for all input types. |
|---|
| 18373 | + * |
|---|
| 18374 | + * @param {string} ngModel Assignable angular expression to data-bind to. |
|---|
| 18375 | + * @param {string=} name Property name of the form under which the control is published. |
|---|
| 18376 | + * @param {string=} required Adds `required` validation error key if the value is not entered. |
|---|
| 18377 | + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to |
|---|
| 18378 | + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of |
|---|
| 18379 | + * `required` when you want to data-bind to the `required` attribute. |
|---|
| 18380 | + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than |
|---|
| 18381 | + * minlength. |
|---|
| 18382 | + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than |
|---|
| 18383 | + * maxlength. |
|---|
| 18384 | + * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the |
|---|
| 18385 | + * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for |
|---|
| 18386 | + * patterns defined as scope expressions. |
|---|
| 18387 | + * @param {string=} ngChange Angular expression to be executed when input changes due to user |
|---|
| 18388 | + * interaction with the input element. |
|---|
| 18389 | + * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. |
|---|
| 18390 | + * This parameter is ignored for input[type=password] controls, which will never trim the |
|---|
| 18391 | + * input. |
|---|
| 18392 | + * |
|---|
| 18393 | + * @example |
|---|
| 18394 | + <example name="text-input-directive" module="textInputExample"> |
|---|
| 18395 | + <file name="index.html"> |
|---|
| 18396 | + <script> |
|---|
| 18397 | + angular.module('textInputExample', []) |
|---|
| 18398 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 18399 | + $scope.text = 'guest'; |
|---|
| 18400 | + $scope.word = /^\s*\w*\s*$/; |
|---|
| 18401 | + }]); |
|---|
| 18402 | + </script> |
|---|
| 18403 | + <form name="myForm" ng-controller="ExampleController"> |
|---|
| 18404 | + Single word: <input type="text" name="input" ng-model="text" |
|---|
| 18405 | + ng-pattern="word" required ng-trim="false"> |
|---|
| 18406 | + <span class="error" ng-show="myForm.input.$error.required"> |
|---|
| 18407 | + Required!</span> |
|---|
| 18408 | + <span class="error" ng-show="myForm.input.$error.pattern"> |
|---|
| 18409 | + Single word only!</span> |
|---|
| 18410 | + |
|---|
| 18411 | + <tt>text = {{text}}</tt><br/> |
|---|
| 18412 | + <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/> |
|---|
| 18413 | + <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/> |
|---|
| 18414 | + <tt>myForm.$valid = {{myForm.$valid}}</tt><br/> |
|---|
| 18415 | + <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/> |
|---|
| 18416 | + </form> |
|---|
| 18417 | + </file> |
|---|
| 18418 | + <file name="protractor.js" type="protractor"> |
|---|
| 18419 | + var text = element(by.binding('text')); |
|---|
| 18420 | + var valid = element(by.binding('myForm.input.$valid')); |
|---|
| 18421 | + var input = element(by.model('text')); |
|---|
| 18422 | + |
|---|
| 18423 | + it('should initialize to model', function() { |
|---|
| 18424 | + expect(text.getText()).toContain('guest'); |
|---|
| 18425 | + expect(valid.getText()).toContain('true'); |
|---|
| 18426 | + }); |
|---|
| 18427 | + |
|---|
| 18428 | + it('should be invalid if empty', function() { |
|---|
| 18429 | + input.clear(); |
|---|
| 18430 | + input.sendKeys(''); |
|---|
| 18431 | + |
|---|
| 18432 | + expect(text.getText()).toEqual('text ='); |
|---|
| 18433 | + expect(valid.getText()).toContain('false'); |
|---|
| 18434 | + }); |
|---|
| 18435 | + |
|---|
| 18436 | + it('should be invalid if multi word', function() { |
|---|
| 18437 | + input.clear(); |
|---|
| 18438 | + input.sendKeys('hello world'); |
|---|
| 18439 | + |
|---|
| 18440 | + expect(valid.getText()).toContain('false'); |
|---|
| 18441 | + }); |
|---|
| 18442 | + </file> |
|---|
| 18443 | + </example> |
|---|
| 18444 | + */ |
|---|
| 18445 | + 'text': textInputType, |
|---|
| 18446 | + |
|---|
| 18447 | + /** |
|---|
| 18448 | + * @ngdoc input |
|---|
| 18449 | + * @name input[date] |
|---|
| 18450 | + * |
|---|
| 18451 | + * @description |
|---|
| 18452 | + * Input with date validation and transformation. In browsers that do not yet support |
|---|
| 18453 | + * the HTML5 date input, a text element will be used. In that case, text must be entered in a valid ISO-8601 |
|---|
| 18454 | + * date format (yyyy-MM-dd), for example: `2009-01-06`. Since many |
|---|
| 18455 | + * modern browsers do not yet support this input type, it is important to provide cues to users on the |
|---|
| 18456 | + * expected input format via a placeholder or label. The model must always be a Date object. |
|---|
| 18457 | + * |
|---|
| 18458 | + * The timezone to be used to read/write the `Date` instance in the model can be defined using |
|---|
| 18459 | + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. |
|---|
| 18460 | + * |
|---|
| 18461 | + * @param {string} ngModel Assignable angular expression to data-bind to. |
|---|
| 18462 | + * @param {string=} name Property name of the form under which the control is published. |
|---|
| 18463 | + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a |
|---|
| 18464 | + * valid ISO date string (yyyy-MM-dd). |
|---|
| 18465 | + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be |
|---|
| 18466 | + * a valid ISO date string (yyyy-MM-dd). |
|---|
| 18467 | + * @param {string=} required Sets `required` validation error key if the value is not entered. |
|---|
| 18468 | + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to |
|---|
| 18469 | + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of |
|---|
| 18470 | + * `required` when you want to data-bind to the `required` attribute. |
|---|
| 18471 | + * @param {string=} ngChange Angular expression to be executed when input changes due to user |
|---|
| 18472 | + * interaction with the input element. |
|---|
| 18473 | + * |
|---|
| 18474 | + * @example |
|---|
| 18475 | + <example name="date-input-directive" module="dateInputExample"> |
|---|
| 18476 | + <file name="index.html"> |
|---|
| 18477 | + <script> |
|---|
| 18478 | + angular.module('dateInputExample', []) |
|---|
| 18479 | + .controller('DateController', ['$scope', function($scope) { |
|---|
| 18480 | + $scope.value = new Date(2013, 9, 22); |
|---|
| 18481 | + }]); |
|---|
| 18482 | + </script> |
|---|
| 18483 | + <form name="myForm" ng-controller="DateController as dateCtrl"> |
|---|
| 18484 | + Pick a date in 2013: |
|---|
| 18485 | + <input type="date" id="exampleInput" name="input" ng-model="value" |
|---|
| 18486 | + placeholder="yyyy-MM-dd" min="2013-01-01" max="2013-12-31" required /> |
|---|
| 18487 | + <span class="error" ng-show="myForm.input.$error.required"> |
|---|
| 18488 | + Required!</span> |
|---|
| 18489 | + <span class="error" ng-show="myForm.input.$error.date"> |
|---|
| 18490 | + Not a valid date!</span> |
|---|
| 18491 | + <tt>value = {{value | date: "yyyy-MM-dd"}}</tt><br/> |
|---|
| 18492 | + <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/> |
|---|
| 18493 | + <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/> |
|---|
| 18494 | + <tt>myForm.$valid = {{myForm.$valid}}</tt><br/> |
|---|
| 18495 | + <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/> |
|---|
| 18496 | + </form> |
|---|
| 18497 | + </file> |
|---|
| 18498 | + <file name="protractor.js" type="protractor"> |
|---|
| 18499 | + var value = element(by.binding('value | date: "yyyy-MM-dd"')); |
|---|
| 18500 | + var valid = element(by.binding('myForm.input.$valid')); |
|---|
| 18501 | + var input = element(by.model('value')); |
|---|
| 18502 | + |
|---|
| 18503 | + // currently protractor/webdriver does not support |
|---|
| 18504 | + // sending keys to all known HTML5 input controls |
|---|
| 18505 | + // for various browsers (see https://github.com/angular/protractor/issues/562). |
|---|
| 18506 | + function setInput(val) { |
|---|
| 18507 | + // set the value of the element and force validation. |
|---|
| 18508 | + var scr = "var ipt = document.getElementById('exampleInput'); " + |
|---|
| 18509 | + "ipt.value = '" + val + "';" + |
|---|
| 18510 | + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; |
|---|
| 18511 | + browser.executeScript(scr); |
|---|
| 18512 | + } |
|---|
| 18513 | + |
|---|
| 18514 | + it('should initialize to model', function() { |
|---|
| 18515 | + expect(value.getText()).toContain('2013-10-22'); |
|---|
| 18516 | + expect(valid.getText()).toContain('myForm.input.$valid = true'); |
|---|
| 18517 | + }); |
|---|
| 18518 | + |
|---|
| 18519 | + it('should be invalid if empty', function() { |
|---|
| 18520 | + setInput(''); |
|---|
| 18521 | + expect(value.getText()).toEqual('value ='); |
|---|
| 18522 | + expect(valid.getText()).toContain('myForm.input.$valid = false'); |
|---|
| 18523 | + }); |
|---|
| 18524 | + |
|---|
| 18525 | + it('should be invalid if over max', function() { |
|---|
| 18526 | + setInput('2015-01-01'); |
|---|
| 18527 | + expect(value.getText()).toContain(''); |
|---|
| 18528 | + expect(valid.getText()).toContain('myForm.input.$valid = false'); |
|---|
| 18529 | + }); |
|---|
| 18530 | + </file> |
|---|
| 18531 | + </example> |
|---|
| 18532 | + */ |
|---|
| 18533 | + 'date': createDateInputType('date', DATE_REGEXP, |
|---|
| 18534 | + createDateParser(DATE_REGEXP, ['yyyy', 'MM', 'dd']), |
|---|
| 18535 | + 'yyyy-MM-dd'), |
|---|
| 18536 | + |
|---|
| 18537 | + /** |
|---|
| 18538 | + * @ngdoc input |
|---|
| 18539 | + * @name input[dateTimeLocal] |
|---|
| 18540 | + * |
|---|
| 18541 | + * @description |
|---|
| 18542 | + * Input with datetime validation and transformation. In browsers that do not yet support |
|---|
| 18543 | + * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 |
|---|
| 18544 | + * local datetime format (yyyy-MM-ddTHH:mm:ss), for example: `2010-12-28T14:57:00`. The model must be a Date object. |
|---|
| 18545 | + * |
|---|
| 18546 | + * The timezone to be used to read/write the `Date` instance in the model can be defined using |
|---|
| 18547 | + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. |
|---|
| 18548 | + * |
|---|
| 18549 | + * @param {string} ngModel Assignable angular expression to data-bind to. |
|---|
| 18550 | + * @param {string=} name Property name of the form under which the control is published. |
|---|
| 18551 | + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a |
|---|
| 18552 | + * valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). |
|---|
| 18553 | + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be |
|---|
| 18554 | + * a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). |
|---|
| 18555 | + * @param {string=} required Sets `required` validation error key if the value is not entered. |
|---|
| 18556 | + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to |
|---|
| 18557 | + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of |
|---|
| 18558 | + * `required` when you want to data-bind to the `required` attribute. |
|---|
| 18559 | + * @param {string=} ngChange Angular expression to be executed when input changes due to user |
|---|
| 18560 | + * interaction with the input element. |
|---|
| 18561 | + * |
|---|
| 18562 | + * @example |
|---|
| 18563 | + <example name="datetimelocal-input-directive" module="dateExample"> |
|---|
| 18564 | + <file name="index.html"> |
|---|
| 18565 | + <script> |
|---|
| 18566 | + angular.module('dateExample', []) |
|---|
| 18567 | + .controller('DateController', ['$scope', function($scope) { |
|---|
| 18568 | + $scope.value = new Date(2010, 11, 28, 14, 57); |
|---|
| 18569 | + }]); |
|---|
| 18570 | + </script> |
|---|
| 18571 | + <form name="myForm" ng-controller="DateController as dateCtrl"> |
|---|
| 18572 | + Pick a date between in 2013: |
|---|
| 18573 | + <input type="datetime-local" id="exampleInput" name="input" ng-model="value" |
|---|
| 18574 | + placeholder="yyyy-MM-ddTHH:mm:ss" min="2001-01-01T00:00:00" max="2013-12-31T00:00:00" required /> |
|---|
| 18575 | + <span class="error" ng-show="myForm.input.$error.required"> |
|---|
| 18576 | + Required!</span> |
|---|
| 18577 | + <span class="error" ng-show="myForm.input.$error.datetimelocal"> |
|---|
| 18578 | + Not a valid date!</span> |
|---|
| 18579 | + <tt>value = {{value | date: "yyyy-MM-ddTHH:mm:ss"}}</tt><br/> |
|---|
| 18580 | + <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/> |
|---|
| 18581 | + <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/> |
|---|
| 18582 | + <tt>myForm.$valid = {{myForm.$valid}}</tt><br/> |
|---|
| 18583 | + <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/> |
|---|
| 18584 | + </form> |
|---|
| 18585 | + </file> |
|---|
| 18586 | + <file name="protractor.js" type="protractor"> |
|---|
| 18587 | + var value = element(by.binding('value | date: "yyyy-MM-ddTHH:mm:ss"')); |
|---|
| 18588 | + var valid = element(by.binding('myForm.input.$valid')); |
|---|
| 18589 | + var input = element(by.model('value')); |
|---|
| 18590 | + |
|---|
| 18591 | + // currently protractor/webdriver does not support |
|---|
| 18592 | + // sending keys to all known HTML5 input controls |
|---|
| 18593 | + // for various browsers (https://github.com/angular/protractor/issues/562). |
|---|
| 18594 | + function setInput(val) { |
|---|
| 18595 | + // set the value of the element and force validation. |
|---|
| 18596 | + var scr = "var ipt = document.getElementById('exampleInput'); " + |
|---|
| 18597 | + "ipt.value = '" + val + "';" + |
|---|
| 18598 | + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; |
|---|
| 18599 | + browser.executeScript(scr); |
|---|
| 18600 | + } |
|---|
| 18601 | + |
|---|
| 18602 | + it('should initialize to model', function() { |
|---|
| 18603 | + expect(value.getText()).toContain('2010-12-28T14:57:00'); |
|---|
| 18604 | + expect(valid.getText()).toContain('myForm.input.$valid = true'); |
|---|
| 18605 | + }); |
|---|
| 18606 | + |
|---|
| 18607 | + it('should be invalid if empty', function() { |
|---|
| 18608 | + setInput(''); |
|---|
| 18609 | + expect(value.getText()).toEqual('value ='); |
|---|
| 18610 | + expect(valid.getText()).toContain('myForm.input.$valid = false'); |
|---|
| 18611 | + }); |
|---|
| 18612 | + |
|---|
| 18613 | + it('should be invalid if over max', function() { |
|---|
| 18614 | + setInput('2015-01-01T23:59:00'); |
|---|
| 18615 | + expect(value.getText()).toContain(''); |
|---|
| 18616 | + expect(valid.getText()).toContain('myForm.input.$valid = false'); |
|---|
| 18617 | + }); |
|---|
| 18618 | + </file> |
|---|
| 18619 | + </example> |
|---|
| 18620 | + */ |
|---|
| 18621 | + 'datetime-local': createDateInputType('datetimelocal', DATETIMELOCAL_REGEXP, |
|---|
| 18622 | + createDateParser(DATETIMELOCAL_REGEXP, ['yyyy', 'MM', 'dd', 'HH', 'mm', 'ss', 'sss']), |
|---|
| 18623 | + 'yyyy-MM-ddTHH:mm:ss.sss'), |
|---|
| 18624 | + |
|---|
| 18625 | + /** |
|---|
| 18626 | + * @ngdoc input |
|---|
| 18627 | + * @name input[time] |
|---|
| 18628 | + * |
|---|
| 18629 | + * @description |
|---|
| 18630 | + * Input with time validation and transformation. In browsers that do not yet support |
|---|
| 18631 | + * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 |
|---|
| 18632 | + * local time format (HH:mm:ss), for example: `14:57:00`. Model must be a Date object. This binding will always output a |
|---|
| 18633 | + * Date object to the model of January 1, 1970, or local date `new Date(1970, 0, 1, HH, mm, ss)`. |
|---|
| 18634 | + * |
|---|
| 18635 | + * The timezone to be used to read/write the `Date` instance in the model can be defined using |
|---|
| 18636 | + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. |
|---|
| 18637 | + * |
|---|
| 18638 | + * @param {string} ngModel Assignable angular expression to data-bind to. |
|---|
| 18639 | + * @param {string=} name Property name of the form under which the control is published. |
|---|
| 18640 | + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a |
|---|
| 18641 | + * valid ISO time format (HH:mm:ss). |
|---|
| 18642 | + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be a |
|---|
| 18643 | + * valid ISO time format (HH:mm:ss). |
|---|
| 18644 | + * @param {string=} required Sets `required` validation error key if the value is not entered. |
|---|
| 18645 | + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to |
|---|
| 18646 | + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of |
|---|
| 18647 | + * `required` when you want to data-bind to the `required` attribute. |
|---|
| 18648 | + * @param {string=} ngChange Angular expression to be executed when input changes due to user |
|---|
| 18649 | + * interaction with the input element. |
|---|
| 18650 | + * |
|---|
| 18651 | + * @example |
|---|
| 18652 | + <example name="time-input-directive" module="timeExample"> |
|---|
| 18653 | + <file name="index.html"> |
|---|
| 18654 | + <script> |
|---|
| 18655 | + angular.module('timeExample', []) |
|---|
| 18656 | + .controller('DateController', ['$scope', function($scope) { |
|---|
| 18657 | + $scope.value = new Date(1970, 0, 1, 14, 57, 0); |
|---|
| 18658 | + }]); |
|---|
| 18659 | + </script> |
|---|
| 18660 | + <form name="myForm" ng-controller="DateController as dateCtrl"> |
|---|
| 18661 | + Pick a between 8am and 5pm: |
|---|
| 18662 | + <input type="time" id="exampleInput" name="input" ng-model="value" |
|---|
| 18663 | + placeholder="HH:mm:ss" min="08:00:00" max="17:00:00" required /> |
|---|
| 18664 | + <span class="error" ng-show="myForm.input.$error.required"> |
|---|
| 18665 | + Required!</span> |
|---|
| 18666 | + <span class="error" ng-show="myForm.input.$error.time"> |
|---|
| 18667 | + Not a valid date!</span> |
|---|
| 18668 | + <tt>value = {{value | date: "HH:mm:ss"}}</tt><br/> |
|---|
| 18669 | + <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/> |
|---|
| 18670 | + <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/> |
|---|
| 18671 | + <tt>myForm.$valid = {{myForm.$valid}}</tt><br/> |
|---|
| 18672 | + <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/> |
|---|
| 18673 | + </form> |
|---|
| 18674 | + </file> |
|---|
| 18675 | + <file name="protractor.js" type="protractor"> |
|---|
| 18676 | + var value = element(by.binding('value | date: "HH:mm:ss"')); |
|---|
| 18677 | + var valid = element(by.binding('myForm.input.$valid')); |
|---|
| 18678 | + var input = element(by.model('value')); |
|---|
| 18679 | + |
|---|
| 18680 | + // currently protractor/webdriver does not support |
|---|
| 18681 | + // sending keys to all known HTML5 input controls |
|---|
| 18682 | + // for various browsers (https://github.com/angular/protractor/issues/562). |
|---|
| 18683 | + function setInput(val) { |
|---|
| 18684 | + // set the value of the element and force validation. |
|---|
| 18685 | + var scr = "var ipt = document.getElementById('exampleInput'); " + |
|---|
| 18686 | + "ipt.value = '" + val + "';" + |
|---|
| 18687 | + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; |
|---|
| 18688 | + browser.executeScript(scr); |
|---|
| 18689 | + } |
|---|
| 18690 | + |
|---|
| 18691 | + it('should initialize to model', function() { |
|---|
| 18692 | + expect(value.getText()).toContain('14:57:00'); |
|---|
| 18693 | + expect(valid.getText()).toContain('myForm.input.$valid = true'); |
|---|
| 18694 | + }); |
|---|
| 18695 | + |
|---|
| 18696 | + it('should be invalid if empty', function() { |
|---|
| 18697 | + setInput(''); |
|---|
| 18698 | + expect(value.getText()).toEqual('value ='); |
|---|
| 18699 | + expect(valid.getText()).toContain('myForm.input.$valid = false'); |
|---|
| 18700 | + }); |
|---|
| 18701 | + |
|---|
| 18702 | + it('should be invalid if over max', function() { |
|---|
| 18703 | + setInput('23:59:00'); |
|---|
| 18704 | + expect(value.getText()).toContain(''); |
|---|
| 18705 | + expect(valid.getText()).toContain('myForm.input.$valid = false'); |
|---|
| 18706 | + }); |
|---|
| 18707 | + </file> |
|---|
| 18708 | + </example> |
|---|
| 18709 | + */ |
|---|
| 18710 | + 'time': createDateInputType('time', TIME_REGEXP, |
|---|
| 18711 | + createDateParser(TIME_REGEXP, ['HH', 'mm', 'ss', 'sss']), |
|---|
| 18712 | + 'HH:mm:ss.sss'), |
|---|
| 18713 | + |
|---|
| 18714 | + /** |
|---|
| 18715 | + * @ngdoc input |
|---|
| 18716 | + * @name input[week] |
|---|
| 18717 | + * |
|---|
| 18718 | + * @description |
|---|
| 18719 | + * Input with week-of-the-year validation and transformation to Date. In browsers that do not yet support |
|---|
| 18720 | + * the HTML5 week input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 |
|---|
| 18721 | + * week format (yyyy-W##), for example: `2013-W02`. The model must always be a Date object. |
|---|
| 18722 | + * |
|---|
| 18723 | + * The timezone to be used to read/write the `Date` instance in the model can be defined using |
|---|
| 18724 | + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. |
|---|
| 18725 | + * |
|---|
| 18726 | + * @param {string} ngModel Assignable angular expression to data-bind to. |
|---|
| 18727 | + * @param {string=} name Property name of the form under which the control is published. |
|---|
| 18728 | + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a |
|---|
| 18729 | + * valid ISO week format (yyyy-W##). |
|---|
| 18730 | + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be |
|---|
| 18731 | + * a valid ISO week format (yyyy-W##). |
|---|
| 18732 | + * @param {string=} required Sets `required` validation error key if the value is not entered. |
|---|
| 18733 | + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to |
|---|
| 18734 | + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of |
|---|
| 18735 | + * `required` when you want to data-bind to the `required` attribute. |
|---|
| 18736 | + * @param {string=} ngChange Angular expression to be executed when input changes due to user |
|---|
| 18737 | + * interaction with the input element. |
|---|
| 18738 | + * |
|---|
| 18739 | + * @example |
|---|
| 18740 | + <example name="week-input-directive" module="weekExample"> |
|---|
| 18741 | + <file name="index.html"> |
|---|
| 18742 | + <script> |
|---|
| 18743 | + angular.module('weekExample', []) |
|---|
| 18744 | + .controller('DateController', ['$scope', function($scope) { |
|---|
| 18745 | + $scope.value = new Date(2013, 0, 3); |
|---|
| 18746 | + }]); |
|---|
| 18747 | + </script> |
|---|
| 18748 | + <form name="myForm" ng-controller="DateController as dateCtrl"> |
|---|
| 18749 | + Pick a date between in 2013: |
|---|
| 18750 | + <input id="exampleInput" type="week" name="input" ng-model="value" |
|---|
| 18751 | + placeholder="YYYY-W##" min="2012-W32" max="2013-W52" required /> |
|---|
| 18752 | + <span class="error" ng-show="myForm.input.$error.required"> |
|---|
| 18753 | + Required!</span> |
|---|
| 18754 | + <span class="error" ng-show="myForm.input.$error.week"> |
|---|
| 18755 | + Not a valid date!</span> |
|---|
| 18756 | + <tt>value = {{value | date: "yyyy-Www"}}</tt><br/> |
|---|
| 18757 | + <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/> |
|---|
| 18758 | + <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/> |
|---|
| 18759 | + <tt>myForm.$valid = {{myForm.$valid}}</tt><br/> |
|---|
| 18760 | + <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/> |
|---|
| 18761 | + </form> |
|---|
| 18762 | + </file> |
|---|
| 18763 | + <file name="protractor.js" type="protractor"> |
|---|
| 18764 | + var value = element(by.binding('value | date: "yyyy-Www"')); |
|---|
| 18765 | + var valid = element(by.binding('myForm.input.$valid')); |
|---|
| 18766 | + var input = element(by.model('value')); |
|---|
| 18767 | + |
|---|
| 18768 | + // currently protractor/webdriver does not support |
|---|
| 18769 | + // sending keys to all known HTML5 input controls |
|---|
| 18770 | + // for various browsers (https://github.com/angular/protractor/issues/562). |
|---|
| 18771 | + function setInput(val) { |
|---|
| 18772 | + // set the value of the element and force validation. |
|---|
| 18773 | + var scr = "var ipt = document.getElementById('exampleInput'); " + |
|---|
| 18774 | + "ipt.value = '" + val + "';" + |
|---|
| 18775 | + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; |
|---|
| 18776 | + browser.executeScript(scr); |
|---|
| 18777 | + } |
|---|
| 18778 | + |
|---|
| 18779 | + it('should initialize to model', function() { |
|---|
| 18780 | + expect(value.getText()).toContain('2013-W01'); |
|---|
| 18781 | + expect(valid.getText()).toContain('myForm.input.$valid = true'); |
|---|
| 18782 | + }); |
|---|
| 18783 | + |
|---|
| 18784 | + it('should be invalid if empty', function() { |
|---|
| 18785 | + setInput(''); |
|---|
| 18786 | + expect(value.getText()).toEqual('value ='); |
|---|
| 18787 | + expect(valid.getText()).toContain('myForm.input.$valid = false'); |
|---|
| 18788 | + }); |
|---|
| 18789 | + |
|---|
| 18790 | + it('should be invalid if over max', function() { |
|---|
| 18791 | + setInput('2015-W01'); |
|---|
| 18792 | + expect(value.getText()).toContain(''); |
|---|
| 18793 | + expect(valid.getText()).toContain('myForm.input.$valid = false'); |
|---|
| 18794 | + }); |
|---|
| 18795 | + </file> |
|---|
| 18796 | + </example> |
|---|
| 18797 | + */ |
|---|
| 18798 | + 'week': createDateInputType('week', WEEK_REGEXP, weekParser, 'yyyy-Www'), |
|---|
| 18799 | + |
|---|
| 18800 | + /** |
|---|
| 18801 | + * @ngdoc input |
|---|
| 18802 | + * @name input[month] |
|---|
| 18803 | + * |
|---|
| 18804 | + * @description |
|---|
| 18805 | + * Input with month validation and transformation. In browsers that do not yet support |
|---|
| 18806 | + * the HTML5 month input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 |
|---|
| 18807 | + * month format (yyyy-MM), for example: `2009-01`. The model must always be a Date object. In the event the model is |
|---|
| 18808 | + * not set to the first of the month, the first of that model's month is assumed. |
|---|
| 18809 | + * |
|---|
| 18810 | + * The timezone to be used to read/write the `Date` instance in the model can be defined using |
|---|
| 18811 | + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. |
|---|
| 18812 | + * |
|---|
| 18813 | + * @param {string} ngModel Assignable angular expression to data-bind to. |
|---|
| 18814 | + * @param {string=} name Property name of the form under which the control is published. |
|---|
| 18815 | + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be |
|---|
| 18816 | + * a valid ISO month format (yyyy-MM). |
|---|
| 18817 | + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must |
|---|
| 18818 | + * be a valid ISO month format (yyyy-MM). |
|---|
| 18819 | + * @param {string=} required Sets `required` validation error key if the value is not entered. |
|---|
| 18820 | + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to |
|---|
| 18821 | + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of |
|---|
| 18822 | + * `required` when you want to data-bind to the `required` attribute. |
|---|
| 18823 | + * @param {string=} ngChange Angular expression to be executed when input changes due to user |
|---|
| 18824 | + * interaction with the input element. |
|---|
| 18825 | + * |
|---|
| 18826 | + * @example |
|---|
| 18827 | + <example name="month-input-directive" module="monthExample"> |
|---|
| 18828 | + <file name="index.html"> |
|---|
| 18829 | + <script> |
|---|
| 18830 | + angular.module('monthExample', []) |
|---|
| 18831 | + .controller('DateController', ['$scope', function($scope) { |
|---|
| 18832 | + $scope.value = new Date(2013, 9, 1); |
|---|
| 18833 | + }]); |
|---|
| 18834 | + </script> |
|---|
| 18835 | + <form name="myForm" ng-controller="DateController as dateCtrl"> |
|---|
| 18836 | + Pick a month int 2013: |
|---|
| 18837 | + <input id="exampleInput" type="month" name="input" ng-model="value" |
|---|
| 18838 | + placeholder="yyyy-MM" min="2013-01" max="2013-12" required /> |
|---|
| 18839 | + <span class="error" ng-show="myForm.input.$error.required"> |
|---|
| 18840 | + Required!</span> |
|---|
| 18841 | + <span class="error" ng-show="myForm.input.$error.month"> |
|---|
| 18842 | + Not a valid month!</span> |
|---|
| 18843 | + <tt>value = {{value | date: "yyyy-MM"}}</tt><br/> |
|---|
| 18844 | + <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/> |
|---|
| 18845 | + <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/> |
|---|
| 18846 | + <tt>myForm.$valid = {{myForm.$valid}}</tt><br/> |
|---|
| 18847 | + <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/> |
|---|
| 18848 | + </form> |
|---|
| 18849 | + </file> |
|---|
| 18850 | + <file name="protractor.js" type="protractor"> |
|---|
| 18851 | + var value = element(by.binding('value | date: "yyyy-MM"')); |
|---|
| 18852 | + var valid = element(by.binding('myForm.input.$valid')); |
|---|
| 18853 | + var input = element(by.model('value')); |
|---|
| 18854 | + |
|---|
| 18855 | + // currently protractor/webdriver does not support |
|---|
| 18856 | + // sending keys to all known HTML5 input controls |
|---|
| 18857 | + // for various browsers (https://github.com/angular/protractor/issues/562). |
|---|
| 18858 | + function setInput(val) { |
|---|
| 18859 | + // set the value of the element and force validation. |
|---|
| 18860 | + var scr = "var ipt = document.getElementById('exampleInput'); " + |
|---|
| 18861 | + "ipt.value = '" + val + "';" + |
|---|
| 18862 | + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; |
|---|
| 18863 | + browser.executeScript(scr); |
|---|
| 18864 | + } |
|---|
| 18865 | + |
|---|
| 18866 | + it('should initialize to model', function() { |
|---|
| 18867 | + expect(value.getText()).toContain('2013-10'); |
|---|
| 18868 | + expect(valid.getText()).toContain('myForm.input.$valid = true'); |
|---|
| 18869 | + }); |
|---|
| 18870 | + |
|---|
| 18871 | + it('should be invalid if empty', function() { |
|---|
| 18872 | + setInput(''); |
|---|
| 18873 | + expect(value.getText()).toEqual('value ='); |
|---|
| 18874 | + expect(valid.getText()).toContain('myForm.input.$valid = false'); |
|---|
| 18875 | + }); |
|---|
| 18876 | + |
|---|
| 18877 | + it('should be invalid if over max', function() { |
|---|
| 18878 | + setInput('2015-01'); |
|---|
| 18879 | + expect(value.getText()).toContain(''); |
|---|
| 18880 | + expect(valid.getText()).toContain('myForm.input.$valid = false'); |
|---|
| 18881 | + }); |
|---|
| 18882 | + </file> |
|---|
| 18883 | + </example> |
|---|
| 18884 | + */ |
|---|
| 18885 | + 'month': createDateInputType('month', MONTH_REGEXP, |
|---|
| 18886 | + createDateParser(MONTH_REGEXP, ['yyyy', 'MM']), |
|---|
| 18887 | + 'yyyy-MM'), |
|---|
| 18888 | + |
|---|
| 18889 | + /** |
|---|
| 18890 | + * @ngdoc input |
|---|
| 18891 | + * @name input[number] |
|---|
| 18892 | + * |
|---|
| 18893 | + * @description |
|---|
| 18894 | + * Text input with number validation and transformation. Sets the `number` validation |
|---|
| 18895 | + * error if not a valid number. |
|---|
| 18896 | + * |
|---|
| 18897 | + * @param {string} ngModel Assignable angular expression to data-bind to. |
|---|
| 18898 | + * @param {string=} name Property name of the form under which the control is published. |
|---|
| 18899 | + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. |
|---|
| 18900 | + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. |
|---|
| 18901 | + * @param {string=} required Sets `required` validation error key if the value is not entered. |
|---|
| 18902 | + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to |
|---|
| 18903 | + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of |
|---|
| 18904 | + * `required` when you want to data-bind to the `required` attribute. |
|---|
| 18905 | + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than |
|---|
| 18906 | + * minlength. |
|---|
| 18907 | + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than |
|---|
| 18908 | + * maxlength. |
|---|
| 18909 | + * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the |
|---|
| 18910 | + * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for |
|---|
| 18911 | + * patterns defined as scope expressions. |
|---|
| 18912 | + * @param {string=} ngChange Angular expression to be executed when input changes due to user |
|---|
| 18913 | + * interaction with the input element. |
|---|
| 18914 | + * |
|---|
| 18915 | + * @example |
|---|
| 18916 | + <example name="number-input-directive" module="numberExample"> |
|---|
| 18917 | + <file name="index.html"> |
|---|
| 18918 | + <script> |
|---|
| 18919 | + angular.module('numberExample', []) |
|---|
| 18920 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 18921 | + $scope.value = 12; |
|---|
| 18922 | + }]); |
|---|
| 18923 | + </script> |
|---|
| 18924 | + <form name="myForm" ng-controller="ExampleController"> |
|---|
| 18925 | + Number: <input type="number" name="input" ng-model="value" |
|---|
| 18926 | + min="0" max="99" required> |
|---|
| 18927 | + <span class="error" ng-show="myForm.input.$error.required"> |
|---|
| 18928 | + Required!</span> |
|---|
| 18929 | + <span class="error" ng-show="myForm.input.$error.number"> |
|---|
| 18930 | + Not valid number!</span> |
|---|
| 18931 | + <tt>value = {{value}}</tt><br/> |
|---|
| 18932 | + <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/> |
|---|
| 18933 | + <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/> |
|---|
| 18934 | + <tt>myForm.$valid = {{myForm.$valid}}</tt><br/> |
|---|
| 18935 | + <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/> |
|---|
| 18936 | + </form> |
|---|
| 18937 | + </file> |
|---|
| 18938 | + <file name="protractor.js" type="protractor"> |
|---|
| 18939 | + var value = element(by.binding('value')); |
|---|
| 18940 | + var valid = element(by.binding('myForm.input.$valid')); |
|---|
| 18941 | + var input = element(by.model('value')); |
|---|
| 18942 | + |
|---|
| 18943 | + it('should initialize to model', function() { |
|---|
| 18944 | + expect(value.getText()).toContain('12'); |
|---|
| 18945 | + expect(valid.getText()).toContain('true'); |
|---|
| 18946 | + }); |
|---|
| 18947 | + |
|---|
| 18948 | + it('should be invalid if empty', function() { |
|---|
| 18949 | + input.clear(); |
|---|
| 18950 | + input.sendKeys(''); |
|---|
| 18951 | + expect(value.getText()).toEqual('value ='); |
|---|
| 18952 | + expect(valid.getText()).toContain('false'); |
|---|
| 18953 | + }); |
|---|
| 18954 | + |
|---|
| 18955 | + it('should be invalid if over max', function() { |
|---|
| 18956 | + input.clear(); |
|---|
| 18957 | + input.sendKeys('123'); |
|---|
| 18958 | + expect(value.getText()).toEqual('value ='); |
|---|
| 18959 | + expect(valid.getText()).toContain('false'); |
|---|
| 18960 | + }); |
|---|
| 18961 | + </file> |
|---|
| 18962 | + </example> |
|---|
| 18963 | + */ |
|---|
| 18964 | + 'number': numberInputType, |
|---|
| 18965 | + |
|---|
| 18966 | + |
|---|
| 18967 | + /** |
|---|
| 18968 | + * @ngdoc input |
|---|
| 18969 | + * @name input[url] |
|---|
| 18970 | + * |
|---|
| 18971 | + * @description |
|---|
| 18972 | + * Text input with URL validation. Sets the `url` validation error key if the content is not a |
|---|
| 18973 | + * valid URL. |
|---|
| 18974 | + * |
|---|
| 18975 | + * @param {string} ngModel Assignable angular expression to data-bind to. |
|---|
| 18976 | + * @param {string=} name Property name of the form under which the control is published. |
|---|
| 18977 | + * @param {string=} required Sets `required` validation error key if the value is not entered. |
|---|
| 18978 | + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to |
|---|
| 18979 | + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of |
|---|
| 18980 | + * `required` when you want to data-bind to the `required` attribute. |
|---|
| 18981 | + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than |
|---|
| 18982 | + * minlength. |
|---|
| 18983 | + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than |
|---|
| 18984 | + * maxlength. |
|---|
| 18985 | + * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the |
|---|
| 18986 | + * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for |
|---|
| 18987 | + * patterns defined as scope expressions. |
|---|
| 18988 | + * @param {string=} ngChange Angular expression to be executed when input changes due to user |
|---|
| 18989 | + * interaction with the input element. |
|---|
| 18990 | + * |
|---|
| 18991 | + * @example |
|---|
| 18992 | + <example name="url-input-directive" module="urlExample"> |
|---|
| 18993 | + <file name="index.html"> |
|---|
| 18994 | + <script> |
|---|
| 18995 | + angular.module('urlExample', []) |
|---|
| 18996 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 18997 | + $scope.text = 'http://google.com'; |
|---|
| 18998 | + }]); |
|---|
| 18999 | + </script> |
|---|
| 19000 | + <form name="myForm" ng-controller="ExampleController"> |
|---|
| 19001 | + URL: <input type="url" name="input" ng-model="text" required> |
|---|
| 19002 | + <span class="error" ng-show="myForm.input.$error.required"> |
|---|
| 19003 | + Required!</span> |
|---|
| 19004 | + <span class="error" ng-show="myForm.input.$error.url"> |
|---|
| 19005 | + Not valid url!</span> |
|---|
| 19006 | + <tt>text = {{text}}</tt><br/> |
|---|
| 19007 | + <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/> |
|---|
| 19008 | + <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/> |
|---|
| 19009 | + <tt>myForm.$valid = {{myForm.$valid}}</tt><br/> |
|---|
| 19010 | + <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/> |
|---|
| 19011 | + <tt>myForm.$error.url = {{!!myForm.$error.url}}</tt><br/> |
|---|
| 19012 | + </form> |
|---|
| 19013 | + </file> |
|---|
| 19014 | + <file name="protractor.js" type="protractor"> |
|---|
| 19015 | + var text = element(by.binding('text')); |
|---|
| 19016 | + var valid = element(by.binding('myForm.input.$valid')); |
|---|
| 19017 | + var input = element(by.model('text')); |
|---|
| 19018 | + |
|---|
| 19019 | + it('should initialize to model', function() { |
|---|
| 19020 | + expect(text.getText()).toContain('http://google.com'); |
|---|
| 19021 | + expect(valid.getText()).toContain('true'); |
|---|
| 19022 | + }); |
|---|
| 19023 | + |
|---|
| 19024 | + it('should be invalid if empty', function() { |
|---|
| 19025 | + input.clear(); |
|---|
| 19026 | + input.sendKeys(''); |
|---|
| 19027 | + |
|---|
| 19028 | + expect(text.getText()).toEqual('text ='); |
|---|
| 19029 | + expect(valid.getText()).toContain('false'); |
|---|
| 19030 | + }); |
|---|
| 19031 | + |
|---|
| 19032 | + it('should be invalid if not url', function() { |
|---|
| 19033 | + input.clear(); |
|---|
| 19034 | + input.sendKeys('box'); |
|---|
| 19035 | + |
|---|
| 19036 | + expect(valid.getText()).toContain('false'); |
|---|
| 19037 | + }); |
|---|
| 19038 | + </file> |
|---|
| 19039 | + </example> |
|---|
| 19040 | + */ |
|---|
| 19041 | + 'url': urlInputType, |
|---|
| 19042 | + |
|---|
| 19043 | + |
|---|
| 19044 | + /** |
|---|
| 19045 | + * @ngdoc input |
|---|
| 19046 | + * @name input[email] |
|---|
| 19047 | + * |
|---|
| 19048 | + * @description |
|---|
| 19049 | + * Text input with email validation. Sets the `email` validation error key if not a valid email |
|---|
| 19050 | + * address. |
|---|
| 19051 | + * |
|---|
| 19052 | + * @param {string} ngModel Assignable angular expression to data-bind to. |
|---|
| 19053 | + * @param {string=} name Property name of the form under which the control is published. |
|---|
| 19054 | + * @param {string=} required Sets `required` validation error key if the value is not entered. |
|---|
| 19055 | + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to |
|---|
| 19056 | + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of |
|---|
| 19057 | + * `required` when you want to data-bind to the `required` attribute. |
|---|
| 19058 | + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than |
|---|
| 19059 | + * minlength. |
|---|
| 19060 | + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than |
|---|
| 19061 | + * maxlength. |
|---|
| 19062 | + * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the |
|---|
| 19063 | + * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for |
|---|
| 19064 | + * patterns defined as scope expressions. |
|---|
| 19065 | + * @param {string=} ngChange Angular expression to be executed when input changes due to user |
|---|
| 19066 | + * interaction with the input element. |
|---|
| 19067 | + * |
|---|
| 19068 | + * @example |
|---|
| 19069 | + <example name="email-input-directive" module="emailExample"> |
|---|
| 19070 | + <file name="index.html"> |
|---|
| 19071 | + <script> |
|---|
| 19072 | + angular.module('emailExample', []) |
|---|
| 19073 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 19074 | + $scope.text = 'me@example.com'; |
|---|
| 19075 | + }]); |
|---|
| 19076 | + </script> |
|---|
| 19077 | + <form name="myForm" ng-controller="ExampleController"> |
|---|
| 19078 | + Email: <input type="email" name="input" ng-model="text" required> |
|---|
| 19079 | + <span class="error" ng-show="myForm.input.$error.required"> |
|---|
| 19080 | + Required!</span> |
|---|
| 19081 | + <span class="error" ng-show="myForm.input.$error.email"> |
|---|
| 19082 | + Not valid email!</span> |
|---|
| 19083 | + <tt>text = {{text}}</tt><br/> |
|---|
| 19084 | + <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/> |
|---|
| 19085 | + <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/> |
|---|
| 19086 | + <tt>myForm.$valid = {{myForm.$valid}}</tt><br/> |
|---|
| 19087 | + <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/> |
|---|
| 19088 | + <tt>myForm.$error.email = {{!!myForm.$error.email}}</tt><br/> |
|---|
| 19089 | + </form> |
|---|
| 19090 | + </file> |
|---|
| 19091 | + <file name="protractor.js" type="protractor"> |
|---|
| 19092 | + var text = element(by.binding('text')); |
|---|
| 19093 | + var valid = element(by.binding('myForm.input.$valid')); |
|---|
| 19094 | + var input = element(by.model('text')); |
|---|
| 19095 | + |
|---|
| 19096 | + it('should initialize to model', function() { |
|---|
| 19097 | + expect(text.getText()).toContain('me@example.com'); |
|---|
| 19098 | + expect(valid.getText()).toContain('true'); |
|---|
| 19099 | + }); |
|---|
| 19100 | + |
|---|
| 19101 | + it('should be invalid if empty', function() { |
|---|
| 19102 | + input.clear(); |
|---|
| 19103 | + input.sendKeys(''); |
|---|
| 19104 | + expect(text.getText()).toEqual('text ='); |
|---|
| 19105 | + expect(valid.getText()).toContain('false'); |
|---|
| 19106 | + }); |
|---|
| 19107 | + |
|---|
| 19108 | + it('should be invalid if not email', function() { |
|---|
| 19109 | + input.clear(); |
|---|
| 19110 | + input.sendKeys('xxx'); |
|---|
| 19111 | + |
|---|
| 19112 | + expect(valid.getText()).toContain('false'); |
|---|
| 19113 | + }); |
|---|
| 19114 | + </file> |
|---|
| 19115 | + </example> |
|---|
| 19116 | + */ |
|---|
| 19117 | + 'email': emailInputType, |
|---|
| 19118 | + |
|---|
| 19119 | + |
|---|
| 19120 | + /** |
|---|
| 19121 | + * @ngdoc input |
|---|
| 19122 | + * @name input[radio] |
|---|
| 19123 | + * |
|---|
| 19124 | + * @description |
|---|
| 19125 | + * HTML radio button. |
|---|
| 19126 | + * |
|---|
| 19127 | + * @param {string} ngModel Assignable angular expression to data-bind to. |
|---|
| 19128 | + * @param {string} value The value to which the expression should be set when selected. |
|---|
| 19129 | + * @param {string=} name Property name of the form under which the control is published. |
|---|
| 19130 | + * @param {string=} ngChange Angular expression to be executed when input changes due to user |
|---|
| 19131 | + * interaction with the input element. |
|---|
| 19132 | + * @param {string} ngValue Angular expression which sets the value to which the expression should |
|---|
| 19133 | + * be set when selected. |
|---|
| 19134 | + * |
|---|
| 19135 | + * @example |
|---|
| 19136 | + <example name="radio-input-directive" module="radioExample"> |
|---|
| 19137 | + <file name="index.html"> |
|---|
| 19138 | + <script> |
|---|
| 19139 | + angular.module('radioExample', []) |
|---|
| 19140 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 19141 | + $scope.color = 'blue'; |
|---|
| 19142 | + $scope.specialValue = { |
|---|
| 19143 | + "id": "12345", |
|---|
| 19144 | + "value": "green" |
|---|
| 19145 | + }; |
|---|
| 19146 | + }]); |
|---|
| 19147 | + </script> |
|---|
| 19148 | + <form name="myForm" ng-controller="ExampleController"> |
|---|
| 19149 | + <input type="radio" ng-model="color" value="red"> Red <br/> |
|---|
| 19150 | + <input type="radio" ng-model="color" ng-value="specialValue"> Green <br/> |
|---|
| 19151 | + <input type="radio" ng-model="color" value="blue"> Blue <br/> |
|---|
| 19152 | + <tt>color = {{color | json}}</tt><br/> |
|---|
| 19153 | + </form> |
|---|
| 19154 | + Note that `ng-value="specialValue"` sets radio item's value to be the value of `$scope.specialValue`. |
|---|
| 19155 | + </file> |
|---|
| 19156 | + <file name="protractor.js" type="protractor"> |
|---|
| 19157 | + it('should change state', function() { |
|---|
| 19158 | + var color = element(by.binding('color')); |
|---|
| 19159 | + |
|---|
| 19160 | + expect(color.getText()).toContain('blue'); |
|---|
| 19161 | + |
|---|
| 19162 | + element.all(by.model('color')).get(0).click(); |
|---|
| 19163 | + |
|---|
| 19164 | + expect(color.getText()).toContain('red'); |
|---|
| 19165 | + }); |
|---|
| 19166 | + </file> |
|---|
| 19167 | + </example> |
|---|
| 19168 | + */ |
|---|
| 19169 | + 'radio': radioInputType, |
|---|
| 19170 | + |
|---|
| 19171 | + |
|---|
| 19172 | + /** |
|---|
| 19173 | + * @ngdoc input |
|---|
| 19174 | + * @name input[checkbox] |
|---|
| 19175 | + * |
|---|
| 19176 | + * @description |
|---|
| 19177 | + * HTML checkbox. |
|---|
| 19178 | + * |
|---|
| 19179 | + * @param {string} ngModel Assignable angular expression to data-bind to. |
|---|
| 19180 | + * @param {string=} name Property name of the form under which the control is published. |
|---|
| 19181 | + * @param {expression=} ngTrueValue The value to which the expression should be set when selected. |
|---|
| 19182 | + * @param {expression=} ngFalseValue The value to which the expression should be set when not selected. |
|---|
| 19183 | + * @param {string=} ngChange Angular expression to be executed when input changes due to user |
|---|
| 19184 | + * interaction with the input element. |
|---|
| 19185 | + * |
|---|
| 19186 | + * @example |
|---|
| 19187 | + <example name="checkbox-input-directive" module="checkboxExample"> |
|---|
| 19188 | + <file name="index.html"> |
|---|
| 19189 | + <script> |
|---|
| 19190 | + angular.module('checkboxExample', []) |
|---|
| 19191 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 19192 | + $scope.value1 = true; |
|---|
| 19193 | + $scope.value2 = 'YES' |
|---|
| 19194 | + }]); |
|---|
| 19195 | + </script> |
|---|
| 19196 | + <form name="myForm" ng-controller="ExampleController"> |
|---|
| 19197 | + Value1: <input type="checkbox" ng-model="value1"> <br/> |
|---|
| 19198 | + Value2: <input type="checkbox" ng-model="value2" |
|---|
| 19199 | + ng-true-value="'YES'" ng-false-value="'NO'"> <br/> |
|---|
| 19200 | + <tt>value1 = {{value1}}</tt><br/> |
|---|
| 19201 | + <tt>value2 = {{value2}}</tt><br/> |
|---|
| 19202 | + </form> |
|---|
| 19203 | + </file> |
|---|
| 19204 | + <file name="protractor.js" type="protractor"> |
|---|
| 19205 | + it('should change state', function() { |
|---|
| 19206 | + var value1 = element(by.binding('value1')); |
|---|
| 19207 | + var value2 = element(by.binding('value2')); |
|---|
| 19208 | + |
|---|
| 19209 | + expect(value1.getText()).toContain('true'); |
|---|
| 19210 | + expect(value2.getText()).toContain('YES'); |
|---|
| 19211 | + |
|---|
| 19212 | + element(by.model('value1')).click(); |
|---|
| 19213 | + element(by.model('value2')).click(); |
|---|
| 19214 | + |
|---|
| 19215 | + expect(value1.getText()).toContain('false'); |
|---|
| 19216 | + expect(value2.getText()).toContain('NO'); |
|---|
| 19217 | + }); |
|---|
| 19218 | + </file> |
|---|
| 19219 | + </example> |
|---|
| 19220 | + */ |
|---|
| 19221 | + 'checkbox': checkboxInputType, |
|---|
| 19222 | + |
|---|
| 19223 | + 'hidden': noop, |
|---|
| 19224 | + 'button': noop, |
|---|
| 19225 | + 'submit': noop, |
|---|
| 19226 | + 'reset': noop, |
|---|
| 19227 | + 'file': noop |
|---|
| 19228 | +}; |
|---|
| 19229 | + |
|---|
| 19230 | +function testFlags(validity, flags) { |
|---|
| 19231 | + var i, flag; |
|---|
| 19232 | + if (flags) { |
|---|
| 19233 | + for (i=0; i<flags.length; ++i) { |
|---|
| 19234 | + flag = flags[i]; |
|---|
| 19235 | + if (validity[flag]) { |
|---|
| 19236 | + return true; |
|---|
| 19237 | + } |
|---|
| 19238 | + } |
|---|
| 19239 | + } |
|---|
| 19240 | + return false; |
|---|
| 19241 | +} |
|---|
| 19242 | + |
|---|
| 19243 | +function stringBasedInputType(ctrl) { |
|---|
| 19244 | + ctrl.$formatters.push(function(value) { |
|---|
| 19245 | + return ctrl.$isEmpty(value) ? value : value.toString(); |
|---|
| 19246 | + }); |
|---|
| 19247 | +} |
|---|
| 19248 | + |
|---|
| 19249 | +function textInputType(scope, element, attr, ctrl, $sniffer, $browser) { |
|---|
| 19250 | + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); |
|---|
| 19251 | + stringBasedInputType(ctrl); |
|---|
| 19252 | +} |
|---|
| 19253 | + |
|---|
| 19254 | +function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) { |
|---|
| 19255 | + var validity = element.prop(VALIDITY_STATE_PROPERTY); |
|---|
| 19256 | + var placeholder = element[0].placeholder, noevent = {}; |
|---|
| 19257 | + var type = lowercase(element[0].type); |
|---|
| 19258 | + |
|---|
| 19259 | + // In composition mode, users are still inputing intermediate text buffer, |
|---|
| 19260 | + // hold the listener until composition is done. |
|---|
| 19261 | + // More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent |
|---|
| 19262 | + if (!$sniffer.android) { |
|---|
| 19263 | + var composing = false; |
|---|
| 19264 | + |
|---|
| 19265 | + element.on('compositionstart', function(data) { |
|---|
| 19266 | + composing = true; |
|---|
| 19267 | + }); |
|---|
| 19268 | + |
|---|
| 19269 | + element.on('compositionend', function() { |
|---|
| 19270 | + composing = false; |
|---|
| 19271 | + listener(); |
|---|
| 19272 | + }); |
|---|
| 19273 | + } |
|---|
| 19274 | + |
|---|
| 19275 | + var listener = function(ev) { |
|---|
| 19276 | + if (composing) return; |
|---|
| 19277 | + var value = element.val(), |
|---|
| 19278 | + event = ev && ev.type; |
|---|
| 19279 | + |
|---|
| 19280 | + // IE (11 and under) seem to emit an 'input' event if the placeholder value changes. |
|---|
| 19281 | + // We don't want to dirty the value when this happens, so we abort here. Unfortunately, |
|---|
| 19282 | + // IE also sends input events for other non-input-related things, (such as focusing on a |
|---|
| 19283 | + // form control), so this change is not entirely enough to solve this. |
|---|
| 19284 | + if (msie && (ev || noevent).type === 'input' && element[0].placeholder !== placeholder) { |
|---|
| 19285 | + placeholder = element[0].placeholder; |
|---|
| 19286 | + return; |
|---|
| 19287 | + } |
|---|
| 19288 | + |
|---|
| 19289 | + // By default we will trim the value |
|---|
| 19290 | + // If the attribute ng-trim exists we will avoid trimming |
|---|
| 19291 | + // If input type is 'password', the value is never trimmed |
|---|
| 19292 | + if (type !== 'password' && (!attr.ngTrim || attr.ngTrim !== 'false')) { |
|---|
| 19293 | + value = trim(value); |
|---|
| 19294 | + } |
|---|
| 19295 | + |
|---|
| 19296 | + // If a control is suffering from bad input (due to native validators), browsers discard its |
|---|
| 19297 | + // value, so it may be necessary to revalidate (by calling $setViewValue again) even if the |
|---|
| 19298 | + // control's value is the same empty value twice in a row. |
|---|
| 19299 | + if (ctrl.$viewValue !== value || (value === '' && ctrl.$$hasNativeValidators)) { |
|---|
| 19300 | + ctrl.$setViewValue(value, event); |
|---|
| 19301 | + } |
|---|
| 19302 | + }; |
|---|
| 19303 | + |
|---|
| 19304 | + // if the browser does support "input" event, we are fine - except on IE9 which doesn't fire the |
|---|
| 19305 | + // input event on backspace, delete or cut |
|---|
| 19306 | + if ($sniffer.hasEvent('input')) { |
|---|
| 19307 | + element.on('input', listener); |
|---|
| 19308 | + } else { |
|---|
| 19309 | + var timeout; |
|---|
| 19310 | + |
|---|
| 19311 | + var deferListener = function(ev) { |
|---|
| 19312 | + if (!timeout) { |
|---|
| 19313 | + timeout = $browser.defer(function() { |
|---|
| 19314 | + listener(ev); |
|---|
| 19315 | + timeout = null; |
|---|
| 19316 | + }); |
|---|
| 19317 | + } |
|---|
| 19318 | + }; |
|---|
| 19319 | + |
|---|
| 19320 | + element.on('keydown', function(event) { |
|---|
| 19321 | + var key = event.keyCode; |
|---|
| 19322 | + |
|---|
| 19323 | + // ignore |
|---|
| 19324 | + // command modifiers arrows |
|---|
| 19325 | + if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return; |
|---|
| 19326 | + |
|---|
| 19327 | + deferListener(event); |
|---|
| 19328 | + }); |
|---|
| 19329 | + |
|---|
| 19330 | + // if user modifies input value using context menu in IE, we need "paste" and "cut" events to catch it |
|---|
| 19331 | + if ($sniffer.hasEvent('paste')) { |
|---|
| 19332 | + element.on('paste cut', deferListener); |
|---|
| 19333 | + } |
|---|
| 19334 | + } |
|---|
| 19335 | + |
|---|
| 19336 | + // if user paste into input using mouse on older browser |
|---|
| 19337 | + // or form autocomplete on newer browser, we need "change" event to catch it |
|---|
| 19338 | + element.on('change', listener); |
|---|
| 19339 | + |
|---|
| 19340 | + ctrl.$render = function() { |
|---|
| 19341 | + element.val(ctrl.$isEmpty(ctrl.$modelValue) ? '' : ctrl.$viewValue); |
|---|
| 19342 | + }; |
|---|
| 19343 | +} |
|---|
| 19344 | + |
|---|
| 19345 | +function weekParser(isoWeek, existingDate) { |
|---|
| 19346 | + if (isDate(isoWeek)) { |
|---|
| 19347 | + return isoWeek; |
|---|
| 19348 | + } |
|---|
| 19349 | + |
|---|
| 19350 | + if (isString(isoWeek)) { |
|---|
| 19351 | + WEEK_REGEXP.lastIndex = 0; |
|---|
| 19352 | + var parts = WEEK_REGEXP.exec(isoWeek); |
|---|
| 19353 | + if (parts) { |
|---|
| 19354 | + var year = +parts[1], |
|---|
| 19355 | + week = +parts[2], |
|---|
| 19356 | + hours = 0, |
|---|
| 19357 | + minutes = 0, |
|---|
| 19358 | + seconds = 0, |
|---|
| 19359 | + milliseconds = 0, |
|---|
| 19360 | + firstThurs = getFirstThursdayOfYear(year), |
|---|
| 19361 | + addDays = (week - 1) * 7; |
|---|
| 19362 | + |
|---|
| 19363 | + if (existingDate) { |
|---|
| 19364 | + hours = existingDate.getHours(); |
|---|
| 19365 | + minutes = existingDate.getMinutes(); |
|---|
| 19366 | + seconds = existingDate.getSeconds(); |
|---|
| 19367 | + milliseconds = existingDate.getMilliseconds(); |
|---|
| 19368 | + } |
|---|
| 19369 | + |
|---|
| 19370 | + return new Date(year, 0, firstThurs.getDate() + addDays, hours, minutes, seconds, milliseconds); |
|---|
| 19371 | + } |
|---|
| 19372 | + } |
|---|
| 19373 | + |
|---|
| 19374 | + return NaN; |
|---|
| 19375 | +} |
|---|
| 19376 | + |
|---|
| 19377 | +function createDateParser(regexp, mapping) { |
|---|
| 19378 | + return function(iso, date) { |
|---|
| 19379 | + var parts, map; |
|---|
| 19380 | + |
|---|
| 19381 | + if (isDate(iso)) { |
|---|
| 19382 | + return iso; |
|---|
| 19383 | + } |
|---|
| 19384 | + |
|---|
| 19385 | + if (isString(iso)) { |
|---|
| 19386 | + // When a date is JSON'ified to wraps itself inside of an extra |
|---|
| 19387 | + // set of double quotes. This makes the date parsing code unable |
|---|
| 19388 | + // to match the date string and parse it as a date. |
|---|
| 19389 | + if (iso.charAt(0) == '"' && iso.charAt(iso.length-1) == '"') { |
|---|
| 19390 | + iso = iso.substring(1, iso.length-1); |
|---|
| 19391 | + } |
|---|
| 19392 | + if (ISO_DATE_REGEXP.test(iso)) { |
|---|
| 19393 | + return new Date(iso); |
|---|
| 19394 | + } |
|---|
| 19395 | + regexp.lastIndex = 0; |
|---|
| 19396 | + parts = regexp.exec(iso); |
|---|
| 19397 | + |
|---|
| 19398 | + if (parts) { |
|---|
| 19399 | + parts.shift(); |
|---|
| 19400 | + if (date) { |
|---|
| 19401 | + map = { |
|---|
| 19402 | + yyyy: date.getFullYear(), |
|---|
| 19403 | + MM: date.getMonth() + 1, |
|---|
| 19404 | + dd: date.getDate(), |
|---|
| 19405 | + HH: date.getHours(), |
|---|
| 19406 | + mm: date.getMinutes(), |
|---|
| 19407 | + ss: date.getSeconds(), |
|---|
| 19408 | + sss: date.getMilliseconds() / 1000 |
|---|
| 19409 | + }; |
|---|
| 19410 | + } else { |
|---|
| 19411 | + map = { yyyy: 1970, MM: 1, dd: 1, HH: 0, mm: 0, ss: 0, sss: 0 }; |
|---|
| 19412 | + } |
|---|
| 19413 | + |
|---|
| 19414 | + forEach(parts, function(part, index) { |
|---|
| 19415 | + if (index < mapping.length) { |
|---|
| 19416 | + map[mapping[index]] = +part; |
|---|
| 19417 | + } |
|---|
| 19418 | + }); |
|---|
| 19419 | + return new Date(map.yyyy, map.MM - 1, map.dd, map.HH, map.mm, map.ss || 0, map.sss * 1000 || 0); |
|---|
| 19420 | + } |
|---|
| 19421 | + } |
|---|
| 19422 | + |
|---|
| 19423 | + return NaN; |
|---|
| 19424 | + }; |
|---|
| 19425 | +} |
|---|
| 19426 | + |
|---|
| 19427 | +function createDateInputType(type, regexp, parseDate, format) { |
|---|
| 19428 | + return function dynamicDateInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter) { |
|---|
| 19429 | + badInputChecker(scope, element, attr, ctrl); |
|---|
| 19430 | + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); |
|---|
| 19431 | + var timezone = ctrl && ctrl.$options && ctrl.$options.timezone; |
|---|
| 19432 | + var previousDate; |
|---|
| 19433 | + |
|---|
| 19434 | + ctrl.$$parserName = type; |
|---|
| 19435 | + ctrl.$parsers.push(function(value) { |
|---|
| 19436 | + if (ctrl.$isEmpty(value)) return null; |
|---|
| 19437 | + if (regexp.test(value)) { |
|---|
| 19438 | + // Note: We cannot read ctrl.$modelValue, as there might be a different |
|---|
| 19439 | + // parser/formatter in the processing chain so that the model |
|---|
| 19440 | + // contains some different data format! |
|---|
| 19441 | + var parsedDate = parseDate(value, previousDate); |
|---|
| 19442 | + if (timezone === 'UTC') { |
|---|
| 19443 | + parsedDate.setMinutes(parsedDate.getMinutes() - parsedDate.getTimezoneOffset()); |
|---|
| 19444 | + } |
|---|
| 19445 | + return parsedDate; |
|---|
| 19446 | + } |
|---|
| 19447 | + return undefined; |
|---|
| 19448 | + }); |
|---|
| 19449 | + |
|---|
| 19450 | + ctrl.$formatters.push(function(value) { |
|---|
| 19451 | + if (!ctrl.$isEmpty(value)) { |
|---|
| 19452 | + if (!isDate(value)) { |
|---|
| 19453 | + throw $ngModelMinErr('datefmt', 'Expected `{0}` to be a date', value); |
|---|
| 19454 | + } |
|---|
| 19455 | + previousDate = value; |
|---|
| 19456 | + if (previousDate && timezone === 'UTC') { |
|---|
| 19457 | + var timezoneOffset = 60000 * previousDate.getTimezoneOffset(); |
|---|
| 19458 | + previousDate = new Date(previousDate.getTime() + timezoneOffset); |
|---|
| 19459 | + } |
|---|
| 19460 | + return $filter('date')(value, format, timezone); |
|---|
| 19461 | + } else { |
|---|
| 19462 | + previousDate = null; |
|---|
| 19463 | + } |
|---|
| 19464 | + return ''; |
|---|
| 19465 | + }); |
|---|
| 19466 | + |
|---|
| 19467 | + if (isDefined(attr.min) || attr.ngMin) { |
|---|
| 19468 | + var minVal; |
|---|
| 19469 | + ctrl.$validators.min = function(value) { |
|---|
| 19470 | + return ctrl.$isEmpty(value) || isUndefined(minVal) || parseDate(value) >= minVal; |
|---|
| 19471 | + }; |
|---|
| 19472 | + attr.$observe('min', function(val) { |
|---|
| 19473 | + minVal = parseObservedDateValue(val); |
|---|
| 19474 | + ctrl.$validate(); |
|---|
| 19475 | + }); |
|---|
| 19476 | + } |
|---|
| 19477 | + |
|---|
| 19478 | + if (isDefined(attr.max) || attr.ngMax) { |
|---|
| 19479 | + var maxVal; |
|---|
| 19480 | + ctrl.$validators.max = function(value) { |
|---|
| 19481 | + return ctrl.$isEmpty(value) || isUndefined(maxVal) || parseDate(value) <= maxVal; |
|---|
| 19482 | + }; |
|---|
| 19483 | + attr.$observe('max', function(val) { |
|---|
| 19484 | + maxVal = parseObservedDateValue(val); |
|---|
| 19485 | + ctrl.$validate(); |
|---|
| 19486 | + }); |
|---|
| 19487 | + } |
|---|
| 19488 | + // Override the standard $isEmpty to detect invalid dates as well |
|---|
| 19489 | + ctrl.$isEmpty = function(value) { |
|---|
| 19490 | + // Invalid Date: getTime() returns NaN |
|---|
| 19491 | + return !value || (value.getTime && value.getTime() !== value.getTime()); |
|---|
| 19492 | + }; |
|---|
| 19493 | + |
|---|
| 19494 | + function parseObservedDateValue(val) { |
|---|
| 19495 | + return isDefined(val) ? (isDate(val) ? val : parseDate(val)) : undefined; |
|---|
| 19496 | + } |
|---|
| 19497 | + }; |
|---|
| 19498 | +} |
|---|
| 19499 | + |
|---|
| 19500 | +function badInputChecker(scope, element, attr, ctrl) { |
|---|
| 19501 | + var node = element[0]; |
|---|
| 19502 | + var nativeValidation = ctrl.$$hasNativeValidators = isObject(node.validity); |
|---|
| 19503 | + if (nativeValidation) { |
|---|
| 19504 | + ctrl.$parsers.push(function(value) { |
|---|
| 19505 | + var validity = element.prop(VALIDITY_STATE_PROPERTY) || {}; |
|---|
| 19506 | + // Detect bug in FF35 for input[email] (https://bugzilla.mozilla.org/show_bug.cgi?id=1064430): |
|---|
| 19507 | + // - also sets validity.badInput (should only be validity.typeMismatch). |
|---|
| 19508 | + // - see http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#e-mail-state-(type=email) |
|---|
| 19509 | + // - can ignore this case as we can still read out the erroneous email... |
|---|
| 19510 | + return validity.badInput && !validity.typeMismatch ? undefined : value; |
|---|
| 19511 | + }); |
|---|
| 19512 | + } |
|---|
| 19513 | +} |
|---|
| 19514 | + |
|---|
| 19515 | +function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { |
|---|
| 19516 | + badInputChecker(scope, element, attr, ctrl); |
|---|
| 19517 | + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); |
|---|
| 19518 | + |
|---|
| 19519 | + ctrl.$$parserName = 'number'; |
|---|
| 19520 | + ctrl.$parsers.push(function(value) { |
|---|
| 19521 | + if (ctrl.$isEmpty(value)) return null; |
|---|
| 19522 | + if (NUMBER_REGEXP.test(value)) return parseFloat(value); |
|---|
| 19523 | + return undefined; |
|---|
| 19524 | + }); |
|---|
| 19525 | + |
|---|
| 19526 | + ctrl.$formatters.push(function(value) { |
|---|
| 19527 | + if (!ctrl.$isEmpty(value)) { |
|---|
| 19528 | + if (!isNumber(value)) { |
|---|
| 19529 | + throw $ngModelMinErr('numfmt', 'Expected `{0}` to be a number', value); |
|---|
| 19530 | + } |
|---|
| 19531 | + value = value.toString(); |
|---|
| 19532 | + } |
|---|
| 19533 | + return value; |
|---|
| 19534 | + }); |
|---|
| 19535 | + |
|---|
| 19536 | + if (attr.min || attr.ngMin) { |
|---|
| 19537 | + var minVal; |
|---|
| 19538 | + ctrl.$validators.min = function(value) { |
|---|
| 19539 | + return ctrl.$isEmpty(value) || isUndefined(minVal) || value >= minVal; |
|---|
| 19540 | + }; |
|---|
| 19541 | + |
|---|
| 19542 | + attr.$observe('min', function(val) { |
|---|
| 19543 | + if (isDefined(val) && !isNumber(val)) { |
|---|
| 19544 | + val = parseFloat(val, 10); |
|---|
| 19545 | + } |
|---|
| 19546 | + minVal = isNumber(val) && !isNaN(val) ? val : undefined; |
|---|
| 19547 | + // TODO(matsko): implement validateLater to reduce number of validations |
|---|
| 19548 | + ctrl.$validate(); |
|---|
| 19549 | + }); |
|---|
| 19550 | + } |
|---|
| 19551 | + |
|---|
| 19552 | + if (attr.max || attr.ngMax) { |
|---|
| 19553 | + var maxVal; |
|---|
| 19554 | + ctrl.$validators.max = function(value) { |
|---|
| 19555 | + return ctrl.$isEmpty(value) || isUndefined(maxVal) || value <= maxVal; |
|---|
| 19556 | + }; |
|---|
| 19557 | + |
|---|
| 19558 | + attr.$observe('max', function(val) { |
|---|
| 19559 | + if (isDefined(val) && !isNumber(val)) { |
|---|
| 19560 | + val = parseFloat(val, 10); |
|---|
| 19561 | + } |
|---|
| 19562 | + maxVal = isNumber(val) && !isNaN(val) ? val : undefined; |
|---|
| 19563 | + // TODO(matsko): implement validateLater to reduce number of validations |
|---|
| 19564 | + ctrl.$validate(); |
|---|
| 19565 | + }); |
|---|
| 19566 | + } |
|---|
| 19567 | +} |
|---|
| 19568 | + |
|---|
| 19569 | +function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) { |
|---|
| 19570 | + // Note: no badInputChecker here by purpose as `url` is only a validation |
|---|
| 19571 | + // in browsers, i.e. we can always read out input.value even if it is not valid! |
|---|
| 19572 | + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); |
|---|
| 19573 | + stringBasedInputType(ctrl); |
|---|
| 19574 | + |
|---|
| 19575 | + ctrl.$$parserName = 'url'; |
|---|
| 19576 | + ctrl.$validators.url = function(value) { |
|---|
| 19577 | + return ctrl.$isEmpty(value) || URL_REGEXP.test(value); |
|---|
| 19578 | + }; |
|---|
| 19579 | +} |
|---|
| 19580 | + |
|---|
| 19581 | +function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) { |
|---|
| 19582 | + // Note: no badInputChecker here by purpose as `url` is only a validation |
|---|
| 19583 | + // in browsers, i.e. we can always read out input.value even if it is not valid! |
|---|
| 19584 | + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); |
|---|
| 19585 | + stringBasedInputType(ctrl); |
|---|
| 19586 | + |
|---|
| 19587 | + ctrl.$$parserName = 'email'; |
|---|
| 19588 | + ctrl.$validators.email = function(value) { |
|---|
| 19589 | + return ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value); |
|---|
| 19590 | + }; |
|---|
| 19591 | +} |
|---|
| 19592 | + |
|---|
| 19593 | +function radioInputType(scope, element, attr, ctrl) { |
|---|
| 19594 | + // make the name unique, if not defined |
|---|
| 19595 | + if (isUndefined(attr.name)) { |
|---|
| 19596 | + element.attr('name', nextUid()); |
|---|
| 19597 | + } |
|---|
| 19598 | + |
|---|
| 19599 | + var listener = function(ev) { |
|---|
| 19600 | + if (element[0].checked) { |
|---|
| 19601 | + ctrl.$setViewValue(attr.value, ev && ev.type); |
|---|
| 19602 | + } |
|---|
| 19603 | + }; |
|---|
| 19604 | + |
|---|
| 19605 | + element.on('click', listener); |
|---|
| 19606 | + |
|---|
| 19607 | + ctrl.$render = function() { |
|---|
| 19608 | + var value = attr.value; |
|---|
| 19609 | + element[0].checked = (value == ctrl.$viewValue); |
|---|
| 19610 | + }; |
|---|
| 19611 | + |
|---|
| 19612 | + attr.$observe('value', ctrl.$render); |
|---|
| 19613 | +} |
|---|
| 19614 | + |
|---|
| 19615 | +function parseConstantExpr($parse, context, name, expression, fallback) { |
|---|
| 19616 | + var parseFn; |
|---|
| 19617 | + if (isDefined(expression)) { |
|---|
| 19618 | + parseFn = $parse(expression); |
|---|
| 19619 | + if (!parseFn.constant) { |
|---|
| 19620 | + throw minErr('ngModel')('constexpr', 'Expected constant expression for `{0}`, but saw ' + |
|---|
| 19621 | + '`{1}`.', name, expression); |
|---|
| 19622 | + } |
|---|
| 19623 | + return parseFn(context); |
|---|
| 19624 | + } |
|---|
| 19625 | + return fallback; |
|---|
| 19626 | +} |
|---|
| 19627 | + |
|---|
| 19628 | +function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter, $parse) { |
|---|
| 19629 | + var trueValue = parseConstantExpr($parse, scope, 'ngTrueValue', attr.ngTrueValue, true); |
|---|
| 19630 | + var falseValue = parseConstantExpr($parse, scope, 'ngFalseValue', attr.ngFalseValue, false); |
|---|
| 19631 | + |
|---|
| 19632 | + var listener = function(ev) { |
|---|
| 19633 | + ctrl.$setViewValue(element[0].checked, ev && ev.type); |
|---|
| 19634 | + }; |
|---|
| 19635 | + |
|---|
| 19636 | + element.on('click', listener); |
|---|
| 19637 | + |
|---|
| 19638 | + ctrl.$render = function() { |
|---|
| 19639 | + element[0].checked = ctrl.$viewValue; |
|---|
| 19640 | + }; |
|---|
| 19641 | + |
|---|
| 19642 | + // Override the standard `$isEmpty` because an empty checkbox is never equal to the trueValue |
|---|
| 19643 | + ctrl.$isEmpty = function(value) { |
|---|
| 19644 | + return value !== trueValue; |
|---|
| 19645 | + }; |
|---|
| 19646 | + |
|---|
| 19647 | + ctrl.$formatters.push(function(value) { |
|---|
| 19648 | + return equals(value, trueValue); |
|---|
| 19649 | + }); |
|---|
| 19650 | + |
|---|
| 19651 | + ctrl.$parsers.push(function(value) { |
|---|
| 19652 | + return value ? trueValue : falseValue; |
|---|
| 19653 | + }); |
|---|
| 19654 | +} |
|---|
| 19655 | + |
|---|
| 19656 | + |
|---|
| 19657 | +/** |
|---|
| 19658 | + * @ngdoc directive |
|---|
| 19659 | + * @name textarea |
|---|
| 19660 | + * @restrict E |
|---|
| 19661 | + * |
|---|
| 19662 | + * @description |
|---|
| 19663 | + * HTML textarea element control with angular data-binding. The data-binding and validation |
|---|
| 19664 | + * properties of this element are exactly the same as those of the |
|---|
| 19665 | + * {@link ng.directive:input input element}. |
|---|
| 19666 | + * |
|---|
| 19667 | + * @param {string} ngModel Assignable angular expression to data-bind to. |
|---|
| 19668 | + * @param {string=} name Property name of the form under which the control is published. |
|---|
| 19669 | + * @param {string=} required Sets `required` validation error key if the value is not entered. |
|---|
| 19670 | + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to |
|---|
| 19671 | + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of |
|---|
| 19672 | + * `required` when you want to data-bind to the `required` attribute. |
|---|
| 19673 | + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than |
|---|
| 19674 | + * minlength. |
|---|
| 19675 | + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than |
|---|
| 19676 | + * maxlength. |
|---|
| 19677 | + * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the |
|---|
| 19678 | + * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for |
|---|
| 19679 | + * patterns defined as scope expressions. |
|---|
| 19680 | + * @param {string=} ngChange Angular expression to be executed when input changes due to user |
|---|
| 19681 | + * interaction with the input element. |
|---|
| 19682 | + * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. |
|---|
| 19683 | + */ |
|---|
| 19684 | + |
|---|
| 19685 | + |
|---|
| 19686 | +/** |
|---|
| 19687 | + * @ngdoc directive |
|---|
| 19688 | + * @name input |
|---|
| 19689 | + * @restrict E |
|---|
| 19690 | + * |
|---|
| 19691 | + * @description |
|---|
| 19692 | + * HTML input element control with angular data-binding. Input control follows HTML5 input types |
|---|
| 19693 | + * and polyfills the HTML5 validation behavior for older browsers. |
|---|
| 19694 | + * |
|---|
| 19695 | + * *NOTE* Not every feature offered is available for all input types. |
|---|
| 19696 | + * |
|---|
| 19697 | + * @param {string} ngModel Assignable angular expression to data-bind to. |
|---|
| 19698 | + * @param {string=} name Property name of the form under which the control is published. |
|---|
| 19699 | + * @param {string=} required Sets `required` validation error key if the value is not entered. |
|---|
| 19700 | + * @param {boolean=} ngRequired Sets `required` attribute if set to true |
|---|
| 19701 | + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than |
|---|
| 19702 | + * minlength. |
|---|
| 19703 | + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than |
|---|
| 19704 | + * maxlength. |
|---|
| 19705 | + * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the |
|---|
| 19706 | + * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for |
|---|
| 19707 | + * patterns defined as scope expressions. |
|---|
| 19708 | + * @param {string=} ngChange Angular expression to be executed when input changes due to user |
|---|
| 19709 | + * interaction with the input element. |
|---|
| 19710 | + * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. |
|---|
| 19711 | + * This parameter is ignored for input[type=password] controls, which will never trim the |
|---|
| 19712 | + * input. |
|---|
| 19713 | + * |
|---|
| 19714 | + * @example |
|---|
| 19715 | + <example name="input-directive" module="inputExample"> |
|---|
| 19716 | + <file name="index.html"> |
|---|
| 19717 | + <script> |
|---|
| 19718 | + angular.module('inputExample', []) |
|---|
| 19719 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 19720 | + $scope.user = {name: 'guest', last: 'visitor'}; |
|---|
| 19721 | + }]); |
|---|
| 19722 | + </script> |
|---|
| 19723 | + <div ng-controller="ExampleController"> |
|---|
| 19724 | + <form name="myForm"> |
|---|
| 19725 | + User name: <input type="text" name="userName" ng-model="user.name" required> |
|---|
| 19726 | + <span class="error" ng-show="myForm.userName.$error.required"> |
|---|
| 19727 | + Required!</span><br> |
|---|
| 19728 | + Last name: <input type="text" name="lastName" ng-model="user.last" |
|---|
| 19729 | + ng-minlength="3" ng-maxlength="10"> |
|---|
| 19730 | + <span class="error" ng-show="myForm.lastName.$error.minlength"> |
|---|
| 19731 | + Too short!</span> |
|---|
| 19732 | + <span class="error" ng-show="myForm.lastName.$error.maxlength"> |
|---|
| 19733 | + Too long!</span><br> |
|---|
| 19734 | + </form> |
|---|
| 19735 | + <hr> |
|---|
| 19736 | + <tt>user = {{user}}</tt><br/> |
|---|
| 19737 | + <tt>myForm.userName.$valid = {{myForm.userName.$valid}}</tt><br> |
|---|
| 19738 | + <tt>myForm.userName.$error = {{myForm.userName.$error}}</tt><br> |
|---|
| 19739 | + <tt>myForm.lastName.$valid = {{myForm.lastName.$valid}}</tt><br> |
|---|
| 19740 | + <tt>myForm.lastName.$error = {{myForm.lastName.$error}}</tt><br> |
|---|
| 19741 | + <tt>myForm.$valid = {{myForm.$valid}}</tt><br> |
|---|
| 19742 | + <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br> |
|---|
| 19743 | + <tt>myForm.$error.minlength = {{!!myForm.$error.minlength}}</tt><br> |
|---|
| 19744 | + <tt>myForm.$error.maxlength = {{!!myForm.$error.maxlength}}</tt><br> |
|---|
| 19745 | + </div> |
|---|
| 19746 | + </file> |
|---|
| 19747 | + <file name="protractor.js" type="protractor"> |
|---|
| 19748 | + var user = element(by.exactBinding('user')); |
|---|
| 19749 | + var userNameValid = element(by.binding('myForm.userName.$valid')); |
|---|
| 19750 | + var lastNameValid = element(by.binding('myForm.lastName.$valid')); |
|---|
| 19751 | + var lastNameError = element(by.binding('myForm.lastName.$error')); |
|---|
| 19752 | + var formValid = element(by.binding('myForm.$valid')); |
|---|
| 19753 | + var userNameInput = element(by.model('user.name')); |
|---|
| 19754 | + var userLastInput = element(by.model('user.last')); |
|---|
| 19755 | + |
|---|
| 19756 | + it('should initialize to model', function() { |
|---|
| 19757 | + expect(user.getText()).toContain('{"name":"guest","last":"visitor"}'); |
|---|
| 19758 | + expect(userNameValid.getText()).toContain('true'); |
|---|
| 19759 | + expect(formValid.getText()).toContain('true'); |
|---|
| 19760 | + }); |
|---|
| 19761 | + |
|---|
| 19762 | + it('should be invalid if empty when required', function() { |
|---|
| 19763 | + userNameInput.clear(); |
|---|
| 19764 | + userNameInput.sendKeys(''); |
|---|
| 19765 | + |
|---|
| 19766 | + expect(user.getText()).toContain('{"last":"visitor"}'); |
|---|
| 19767 | + expect(userNameValid.getText()).toContain('false'); |
|---|
| 19768 | + expect(formValid.getText()).toContain('false'); |
|---|
| 19769 | + }); |
|---|
| 19770 | + |
|---|
| 19771 | + it('should be valid if empty when min length is set', function() { |
|---|
| 19772 | + userLastInput.clear(); |
|---|
| 19773 | + userLastInput.sendKeys(''); |
|---|
| 19774 | + |
|---|
| 19775 | + expect(user.getText()).toContain('{"name":"guest","last":""}'); |
|---|
| 19776 | + expect(lastNameValid.getText()).toContain('true'); |
|---|
| 19777 | + expect(formValid.getText()).toContain('true'); |
|---|
| 19778 | + }); |
|---|
| 19779 | + |
|---|
| 19780 | + it('should be invalid if less than required min length', function() { |
|---|
| 19781 | + userLastInput.clear(); |
|---|
| 19782 | + userLastInput.sendKeys('xx'); |
|---|
| 19783 | + |
|---|
| 19784 | + expect(user.getText()).toContain('{"name":"guest"}'); |
|---|
| 19785 | + expect(lastNameValid.getText()).toContain('false'); |
|---|
| 19786 | + expect(lastNameError.getText()).toContain('minlength'); |
|---|
| 19787 | + expect(formValid.getText()).toContain('false'); |
|---|
| 19788 | + }); |
|---|
| 19789 | + |
|---|
| 19790 | + it('should be invalid if longer than max length', function() { |
|---|
| 19791 | + userLastInput.clear(); |
|---|
| 19792 | + userLastInput.sendKeys('some ridiculously long name'); |
|---|
| 19793 | + |
|---|
| 19794 | + expect(user.getText()).toContain('{"name":"guest"}'); |
|---|
| 19795 | + expect(lastNameValid.getText()).toContain('false'); |
|---|
| 19796 | + expect(lastNameError.getText()).toContain('maxlength'); |
|---|
| 19797 | + expect(formValid.getText()).toContain('false'); |
|---|
| 19798 | + }); |
|---|
| 19799 | + </file> |
|---|
| 19800 | + </example> |
|---|
| 19801 | + */ |
|---|
| 19802 | +var inputDirective = ['$browser', '$sniffer', '$filter', '$parse', |
|---|
| 19803 | + function($browser, $sniffer, $filter, $parse) { |
|---|
| 19804 | + return { |
|---|
| 19805 | + restrict: 'E', |
|---|
| 19806 | + require: ['?ngModel'], |
|---|
| 19807 | + link: { |
|---|
| 19808 | + pre: function(scope, element, attr, ctrls) { |
|---|
| 19809 | + if (ctrls[0]) { |
|---|
| 19810 | + (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer, |
|---|
| 19811 | + $browser, $filter, $parse); |
|---|
| 19812 | + } |
|---|
| 19813 | + } |
|---|
| 19814 | + } |
|---|
| 19815 | + }; |
|---|
| 19816 | +}]; |
|---|
| 19817 | + |
|---|
| 19818 | +var VALID_CLASS = 'ng-valid', |
|---|
| 19819 | + INVALID_CLASS = 'ng-invalid', |
|---|
| 19820 | + PRISTINE_CLASS = 'ng-pristine', |
|---|
| 19821 | + DIRTY_CLASS = 'ng-dirty', |
|---|
| 19822 | + UNTOUCHED_CLASS = 'ng-untouched', |
|---|
| 19823 | + TOUCHED_CLASS = 'ng-touched', |
|---|
| 19824 | + PENDING_CLASS = 'ng-pending'; |
|---|
| 19825 | + |
|---|
| 19826 | +/** |
|---|
| 19827 | + * @ngdoc type |
|---|
| 19828 | + * @name ngModel.NgModelController |
|---|
| 19829 | + * |
|---|
| 19830 | + * @property {string} $viewValue Actual string value in the view. |
|---|
| 19831 | + * @property {*} $modelValue The value in the model, that the control is bound to. |
|---|
| 19832 | + * @property {Array.<Function>} $parsers Array of functions to execute, as a pipeline, whenever |
|---|
| 19833 | + the control reads value from the DOM. Each function is called, in turn, passing the value |
|---|
| 19834 | + through to the next. The last return value is used to populate the model. |
|---|
| 19835 | + Used to sanitize / convert the value as well as validation. For validation, |
|---|
| 19836 | + the parsers should update the validity state using |
|---|
| 19837 | + {@link ngModel.NgModelController#$setValidity $setValidity()}, |
|---|
| 19838 | + and return `undefined` for invalid values. |
|---|
| 19839 | + |
|---|
| 19840 | + * |
|---|
| 19841 | + * @property {Array.<Function>} $formatters Array of functions to execute, as a pipeline, whenever |
|---|
| 19842 | + the model value changes. Each function is called, in turn, passing the value through to the |
|---|
| 19843 | + next. Used to format / convert values for display in the control and validation. |
|---|
| 19844 | + * ```js |
|---|
| 19845 | + * function formatter(value) { |
|---|
| 19846 | + * if (value) { |
|---|
| 19847 | + * return value.toUpperCase(); |
|---|
| 19848 | + * } |
|---|
| 19849 | + * } |
|---|
| 19850 | + * ngModel.$formatters.push(formatter); |
|---|
| 19851 | + * ``` |
|---|
| 19852 | + * |
|---|
| 19853 | + * @property {Object.<string, function>} $validators A collection of validators that are applied |
|---|
| 19854 | + * whenever the model value changes. The key value within the object refers to the name of the |
|---|
| 19855 | + * validator while the function refers to the validation operation. The validation operation is |
|---|
| 19856 | + * provided with the model value as an argument and must return a true or false value depending |
|---|
| 19857 | + * on the response of that validation. |
|---|
| 19858 | + * |
|---|
| 19859 | + * ```js |
|---|
| 19860 | + * ngModel.$validators.validCharacters = function(modelValue, viewValue) { |
|---|
| 19861 | + * var value = modelValue || viewValue; |
|---|
| 19862 | + * return /[0-9]+/.test(value) && |
|---|
| 19863 | + * /[a-z]+/.test(value) && |
|---|
| 19864 | + * /[A-Z]+/.test(value) && |
|---|
| 19865 | + * /\W+/.test(value); |
|---|
| 19866 | + * }; |
|---|
| 19867 | + * ``` |
|---|
| 19868 | + * |
|---|
| 19869 | + * @property {Object.<string, function>} $asyncValidators A collection of validations that are expected to |
|---|
| 19870 | + * perform an asynchronous validation (e.g. a HTTP request). The validation function that is provided |
|---|
| 19871 | + * is expected to return a promise when it is run during the model validation process. Once the promise |
|---|
| 19872 | + * is delivered then the validation status will be set to true when fulfilled and false when rejected. |
|---|
| 19873 | + * When the asynchronous validators are triggered, each of the validators will run in parallel and the model |
|---|
| 19874 | + * value will only be updated once all validators have been fulfilled. Also, keep in mind that all |
|---|
| 19875 | + * asynchronous validators will only run once all synchronous validators have passed. |
|---|
| 19876 | + * |
|---|
| 19877 | + * Please note that if $http is used then it is important that the server returns a success HTTP response code |
|---|
| 19878 | + * in order to fulfill the validation and a status level of `4xx` in order to reject the validation. |
|---|
| 19879 | + * |
|---|
| 19880 | + * ```js |
|---|
| 19881 | + * ngModel.$asyncValidators.uniqueUsername = function(modelValue, viewValue) { |
|---|
| 19882 | + * var value = modelValue || viewValue; |
|---|
| 19883 | + * |
|---|
| 19884 | + * // Lookup user by username |
|---|
| 19885 | + * return $http.get('/api/users/' + value). |
|---|
| 19886 | + * then(function resolved() { |
|---|
| 19887 | + * //username exists, this means validation fails |
|---|
| 19888 | + * return $q.reject('exists'); |
|---|
| 19889 | + * }, function rejected() { |
|---|
| 19890 | + * //username does not exist, therefore this validation passes |
|---|
| 19891 | + * return true; |
|---|
| 19892 | + * }); |
|---|
| 19893 | + * }; |
|---|
| 19894 | + * ``` |
|---|
| 19895 | + * |
|---|
| 19896 | + * @param {string} name The name of the validator. |
|---|
| 19897 | + * @param {Function} validationFn The validation function that will be run. |
|---|
| 19898 | + * |
|---|
| 19899 | + * @property {Array.<Function>} $viewChangeListeners Array of functions to execute whenever the |
|---|
| 19900 | + * view value has changed. It is called with no arguments, and its return value is ignored. |
|---|
| 19901 | + * This can be used in place of additional $watches against the model value. |
|---|
| 19902 | + * |
|---|
| 19903 | + * @property {Object} $error An object hash with all failing validator ids as keys. |
|---|
| 19904 | + * @property {Object} $pending An object hash with all pending validator ids as keys. |
|---|
| 19905 | + * |
|---|
| 19906 | + * @property {boolean} $untouched True if control has not lost focus yet. |
|---|
| 19907 | + * @property {boolean} $touched True if control has lost focus. |
|---|
| 19908 | + * @property {boolean} $pristine True if user has not interacted with the control yet. |
|---|
| 19909 | + * @property {boolean} $dirty True if user has already interacted with the control. |
|---|
| 19910 | + * @property {boolean} $valid True if there is no error. |
|---|
| 19911 | + * @property {boolean} $invalid True if at least one error on the control. |
|---|
| 19912 | + * |
|---|
| 19913 | + * @description |
|---|
| 19914 | + * |
|---|
| 19915 | + * `NgModelController` provides API for the `ng-model` directive. The controller contains |
|---|
| 19916 | + * services for data-binding, validation, CSS updates, and value formatting and parsing. It |
|---|
| 19917 | + * purposefully does not contain any logic which deals with DOM rendering or listening to |
|---|
| 19918 | + * DOM events. Such DOM related logic should be provided by other directives which make use of |
|---|
| 19919 | + * `NgModelController` for data-binding. |
|---|
| 19920 | + * |
|---|
| 19921 | + * ## Custom Control Example |
|---|
| 19922 | + * This example shows how to use `NgModelController` with a custom control to achieve |
|---|
| 19923 | + * data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`) |
|---|
| 19924 | + * collaborate together to achieve the desired result. |
|---|
| 19925 | + * |
|---|
| 19926 | + * Note that `contenteditable` is an HTML5 attribute, which tells the browser to let the element |
|---|
| 19927 | + * contents be edited in place by the user. This will not work on older browsers. |
|---|
| 19928 | + * |
|---|
| 19929 | + * We are using the {@link ng.service:$sce $sce} service here and include the {@link ngSanitize $sanitize} |
|---|
| 19930 | + * module to automatically remove "bad" content like inline event listener (e.g. `<span onclick="...">`). |
|---|
| 19931 | + * However, as we are using `$sce` the model can still decide to to provide unsafe content if it marks |
|---|
| 19932 | + * that content using the `$sce` service. |
|---|
| 19933 | + * |
|---|
| 19934 | + * <example name="NgModelController" module="customControl" deps="angular-sanitize.js"> |
|---|
| 19935 | + <file name="style.css"> |
|---|
| 19936 | + [contenteditable] { |
|---|
| 19937 | + border: 1px solid black; |
|---|
| 19938 | + background-color: white; |
|---|
| 19939 | + min-height: 20px; |
|---|
| 19940 | + } |
|---|
| 19941 | + |
|---|
| 19942 | + .ng-invalid { |
|---|
| 19943 | + border: 1px solid red; |
|---|
| 19944 | + } |
|---|
| 19945 | + |
|---|
| 19946 | + </file> |
|---|
| 19947 | + <file name="script.js"> |
|---|
| 19948 | + angular.module('customControl', ['ngSanitize']). |
|---|
| 19949 | + directive('contenteditable', ['$sce', function($sce) { |
|---|
| 19950 | + return { |
|---|
| 19951 | + restrict: 'A', // only activate on element attribute |
|---|
| 19952 | + require: '?ngModel', // get a hold of NgModelController |
|---|
| 19953 | + link: function(scope, element, attrs, ngModel) { |
|---|
| 19954 | + if (!ngModel) return; // do nothing if no ng-model |
|---|
| 19955 | + |
|---|
| 19956 | + // Specify how UI should be updated |
|---|
| 19957 | + ngModel.$render = function() { |
|---|
| 19958 | + element.html($sce.getTrustedHtml(ngModel.$viewValue || '')); |
|---|
| 19959 | + }; |
|---|
| 19960 | + |
|---|
| 19961 | + // Listen for change events to enable binding |
|---|
| 19962 | + element.on('blur keyup change', function() { |
|---|
| 19963 | + scope.$apply(read); |
|---|
| 19964 | + }); |
|---|
| 19965 | + read(); // initialize |
|---|
| 19966 | + |
|---|
| 19967 | + // Write data to the model |
|---|
| 19968 | + function read() { |
|---|
| 19969 | + var html = element.html(); |
|---|
| 19970 | + // When we clear the content editable the browser leaves a <br> behind |
|---|
| 19971 | + // If strip-br attribute is provided then we strip this out |
|---|
| 19972 | + if ( attrs.stripBr && html == '<br>' ) { |
|---|
| 19973 | + html = ''; |
|---|
| 19974 | + } |
|---|
| 19975 | + ngModel.$setViewValue(html); |
|---|
| 19976 | + } |
|---|
| 19977 | + } |
|---|
| 19978 | + }; |
|---|
| 19979 | + }]); |
|---|
| 19980 | + </file> |
|---|
| 19981 | + <file name="index.html"> |
|---|
| 19982 | + <form name="myForm"> |
|---|
| 19983 | + <div contenteditable |
|---|
| 19984 | + name="myWidget" ng-model="userContent" |
|---|
| 19985 | + strip-br="true" |
|---|
| 19986 | + required>Change me!</div> |
|---|
| 19987 | + <span ng-show="myForm.myWidget.$error.required">Required!</span> |
|---|
| 19988 | + <hr> |
|---|
| 19989 | + <textarea ng-model="userContent"></textarea> |
|---|
| 19990 | + </form> |
|---|
| 19991 | + </file> |
|---|
| 19992 | + <file name="protractor.js" type="protractor"> |
|---|
| 19993 | + it('should data-bind and become invalid', function() { |
|---|
| 19994 | + if (browser.params.browser == 'safari' || browser.params.browser == 'firefox') { |
|---|
| 19995 | + // SafariDriver can't handle contenteditable |
|---|
| 19996 | + // and Firefox driver can't clear contenteditables very well |
|---|
| 19997 | + return; |
|---|
| 19998 | + } |
|---|
| 19999 | + var contentEditable = element(by.css('[contenteditable]')); |
|---|
| 20000 | + var content = 'Change me!'; |
|---|
| 20001 | + |
|---|
| 20002 | + expect(contentEditable.getText()).toEqual(content); |
|---|
| 20003 | + |
|---|
| 20004 | + contentEditable.clear(); |
|---|
| 20005 | + contentEditable.sendKeys(protractor.Key.BACK_SPACE); |
|---|
| 20006 | + expect(contentEditable.getText()).toEqual(''); |
|---|
| 20007 | + expect(contentEditable.getAttribute('class')).toMatch(/ng-invalid-required/); |
|---|
| 20008 | + }); |
|---|
| 20009 | + </file> |
|---|
| 20010 | + * </example> |
|---|
| 20011 | + * |
|---|
| 20012 | + * |
|---|
| 20013 | + */ |
|---|
| 20014 | +var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', '$animate', '$timeout', '$rootScope', '$q', '$interpolate', |
|---|
| 20015 | + function($scope, $exceptionHandler, $attr, $element, $parse, $animate, $timeout, $rootScope, $q, $interpolate) { |
|---|
| 20016 | + this.$viewValue = Number.NaN; |
|---|
| 20017 | + this.$modelValue = Number.NaN; |
|---|
| 20018 | + this.$validators = {}; |
|---|
| 20019 | + this.$asyncValidators = {}; |
|---|
| 20020 | + this.$parsers = []; |
|---|
| 20021 | + this.$formatters = []; |
|---|
| 20022 | + this.$viewChangeListeners = []; |
|---|
| 20023 | + this.$untouched = true; |
|---|
| 20024 | + this.$touched = false; |
|---|
| 20025 | + this.$pristine = true; |
|---|
| 20026 | + this.$dirty = false; |
|---|
| 20027 | + this.$valid = true; |
|---|
| 20028 | + this.$invalid = false; |
|---|
| 20029 | + this.$error = {}; // keep invalid keys here |
|---|
| 20030 | + this.$$success = {}; // keep valid keys here |
|---|
| 20031 | + this.$pending = undefined; // keep pending keys here |
|---|
| 20032 | + this.$name = $interpolate($attr.name || '', false)($scope); |
|---|
| 20033 | + |
|---|
| 20034 | + |
|---|
| 20035 | + var parsedNgModel = $parse($attr.ngModel), |
|---|
| 20036 | + pendingDebounce = null, |
|---|
| 20037 | + ctrl = this; |
|---|
| 20038 | + |
|---|
| 20039 | + var ngModelGet = function ngModelGet() { |
|---|
| 20040 | + var modelValue = parsedNgModel($scope); |
|---|
| 20041 | + if (ctrl.$options && ctrl.$options.getterSetter && isFunction(modelValue)) { |
|---|
| 20042 | + modelValue = modelValue(); |
|---|
| 20043 | + } |
|---|
| 20044 | + return modelValue; |
|---|
| 20045 | + }; |
|---|
| 20046 | + |
|---|
| 20047 | + var ngModelSet = function ngModelSet(newValue) { |
|---|
| 20048 | + var getterSetter; |
|---|
| 20049 | + if (ctrl.$options && ctrl.$options.getterSetter && |
|---|
| 20050 | + isFunction(getterSetter = parsedNgModel($scope))) { |
|---|
| 20051 | + |
|---|
| 20052 | + getterSetter(ctrl.$modelValue); |
|---|
| 20053 | + } else { |
|---|
| 20054 | + parsedNgModel.assign($scope, ctrl.$modelValue); |
|---|
| 20055 | + } |
|---|
| 20056 | + }; |
|---|
| 20057 | + |
|---|
| 20058 | + this.$$setOptions = function(options) { |
|---|
| 20059 | + ctrl.$options = options; |
|---|
| 20060 | + |
|---|
| 20061 | + if (!parsedNgModel.assign && (!options || !options.getterSetter)) { |
|---|
| 20062 | + throw $ngModelMinErr('nonassign', "Expression '{0}' is non-assignable. Element: {1}", |
|---|
| 20063 | + $attr.ngModel, startingTag($element)); |
|---|
| 20064 | + } |
|---|
| 20065 | + }; |
|---|
| 20066 | + |
|---|
| 20067 | + /** |
|---|
| 20068 | + * @ngdoc method |
|---|
| 20069 | + * @name ngModel.NgModelController#$render |
|---|
| 20070 | + * |
|---|
| 20071 | + * @description |
|---|
| 20072 | + * Called when the view needs to be updated. It is expected that the user of the ng-model |
|---|
| 20073 | + * directive will implement this method. |
|---|
| 20074 | + * |
|---|
| 20075 | + * The `$render()` method is invoked in the following situations: |
|---|
| 20076 | + * |
|---|
| 20077 | + * * `$rollbackViewValue()` is called. If we are rolling back the view value to the last |
|---|
| 20078 | + * committed value then `$render()` is called to update the input control. |
|---|
| 20079 | + * * The value referenced by `ng-model` is changed programmatically and both the `$modelValue` and |
|---|
| 20080 | + * the `$viewValue` are different to last time. |
|---|
| 20081 | + * |
|---|
| 20082 | + * Since `ng-model` does not do a deep watch, `$render()` is only invoked if the values of |
|---|
| 20083 | + * `$modelValue` and `$viewValue` are actually different to their previous value. If `$modelValue` |
|---|
| 20084 | + * or `$viewValue` are objects (rather than a string or number) then `$render()` will not be |
|---|
| 20085 | + * invoked if you only change a property on the objects. |
|---|
| 20086 | + */ |
|---|
| 20087 | + this.$render = noop; |
|---|
| 20088 | + |
|---|
| 20089 | + /** |
|---|
| 20090 | + * @ngdoc method |
|---|
| 20091 | + * @name ngModel.NgModelController#$isEmpty |
|---|
| 20092 | + * |
|---|
| 20093 | + * @description |
|---|
| 20094 | + * This is called when we need to determine if the value of the input is empty. |
|---|
| 20095 | + * |
|---|
| 20096 | + * For instance, the required directive does this to work out if the input has data or not. |
|---|
| 20097 | + * The default `$isEmpty` function checks whether the value is `undefined`, `''`, `null` or `NaN`. |
|---|
| 20098 | + * |
|---|
| 20099 | + * You can override this for input directives whose concept of being empty is different to the |
|---|
| 20100 | + * default. The `checkboxInputType` directive does this because in its case a value of `false` |
|---|
| 20101 | + * implies empty. |
|---|
| 20102 | + * |
|---|
| 20103 | + * @param {*} value Model value to check. |
|---|
| 20104 | + * @returns {boolean} True if `value` is empty. |
|---|
| 20105 | + */ |
|---|
| 20106 | + this.$isEmpty = function(value) { |
|---|
| 20107 | + return isUndefined(value) || value === '' || value === null || value !== value; |
|---|
| 20108 | + }; |
|---|
| 20109 | + |
|---|
| 20110 | + var parentForm = $element.inheritedData('$formController') || nullFormCtrl, |
|---|
| 20111 | + currentValidationRunId = 0; |
|---|
| 20112 | + |
|---|
| 20113 | + /** |
|---|
| 20114 | + * @ngdoc method |
|---|
| 20115 | + * @name ngModel.NgModelController#$setValidity |
|---|
| 20116 | + * |
|---|
| 20117 | + * @description |
|---|
| 20118 | + * Change the validity state, and notifies the form. |
|---|
| 20119 | + * |
|---|
| 20120 | + * This method can be called within $parsers/$formatters. However, if possible, please use the |
|---|
| 20121 | + * `ngModel.$validators` pipeline which is designed to call this method automatically. |
|---|
| 20122 | + * |
|---|
| 20123 | + * @param {string} validationErrorKey Name of the validator. the `validationErrorKey` will assign |
|---|
| 20124 | + * to `$error[validationErrorKey]` and `$pending[validationErrorKey]` |
|---|
| 20125 | + * so that it is available for data-binding. |
|---|
| 20126 | + * The `validationErrorKey` should be in camelCase and will get converted into dash-case |
|---|
| 20127 | + * for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error` |
|---|
| 20128 | + * class and can be bound to as `{{someForm.someControl.$error.myError}}` . |
|---|
| 20129 | + * @param {boolean} isValid Whether the current state is valid (true), invalid (false), pending (undefined), |
|---|
| 20130 | + * or skipped (null). |
|---|
| 20131 | + */ |
|---|
| 20132 | + addSetValidityMethod({ |
|---|
| 20133 | + ctrl: this, |
|---|
| 20134 | + $element: $element, |
|---|
| 20135 | + set: function(object, property) { |
|---|
| 20136 | + object[property] = true; |
|---|
| 20137 | + }, |
|---|
| 20138 | + unset: function(object, property) { |
|---|
| 20139 | + delete object[property]; |
|---|
| 20140 | + }, |
|---|
| 20141 | + parentForm: parentForm, |
|---|
| 20142 | + $animate: $animate |
|---|
| 20143 | + }); |
|---|
| 20144 | + |
|---|
| 20145 | + /** |
|---|
| 20146 | + * @ngdoc method |
|---|
| 20147 | + * @name ngModel.NgModelController#$setPristine |
|---|
| 20148 | + * |
|---|
| 20149 | + * @description |
|---|
| 20150 | + * Sets the control to its pristine state. |
|---|
| 20151 | + * |
|---|
| 20152 | + * This method can be called to remove the 'ng-dirty' class and set the control to its pristine |
|---|
| 20153 | + * state (ng-pristine class). A model is considered to be pristine when the model has not been changed |
|---|
| 20154 | + * from when first compiled within then form. |
|---|
| 20155 | + */ |
|---|
| 20156 | + this.$setPristine = function () { |
|---|
| 20157 | + ctrl.$dirty = false; |
|---|
| 20158 | + ctrl.$pristine = true; |
|---|
| 20159 | + $animate.removeClass($element, DIRTY_CLASS); |
|---|
| 20160 | + $animate.addClass($element, PRISTINE_CLASS); |
|---|
| 20161 | + }; |
|---|
| 20162 | + |
|---|
| 20163 | + /** |
|---|
| 20164 | + * @ngdoc method |
|---|
| 20165 | + * @name ngModel.NgModelController#$setUntouched |
|---|
| 20166 | + * |
|---|
| 20167 | + * @description |
|---|
| 20168 | + * Sets the control to its untouched state. |
|---|
| 20169 | + * |
|---|
| 20170 | + * This method can be called to remove the 'ng-touched' class and set the control to its |
|---|
| 20171 | + * untouched state (ng-untouched class). Upon compilation, a model is set as untouched |
|---|
| 20172 | + * by default, however this function can be used to restore that state if the model has |
|---|
| 20173 | + * already been touched by the user. |
|---|
| 20174 | + */ |
|---|
| 20175 | + this.$setUntouched = function() { |
|---|
| 20176 | + ctrl.$touched = false; |
|---|
| 20177 | + ctrl.$untouched = true; |
|---|
| 20178 | + $animate.setClass($element, UNTOUCHED_CLASS, TOUCHED_CLASS); |
|---|
| 20179 | + }; |
|---|
| 20180 | + |
|---|
| 20181 | + /** |
|---|
| 20182 | + * @ngdoc method |
|---|
| 20183 | + * @name ngModel.NgModelController#$setTouched |
|---|
| 20184 | + * |
|---|
| 20185 | + * @description |
|---|
| 20186 | + * Sets the control to its touched state. |
|---|
| 20187 | + * |
|---|
| 20188 | + * This method can be called to remove the 'ng-untouched' class and set the control to its |
|---|
| 20189 | + * touched state (ng-touched class). A model is considered to be touched when the user has |
|---|
| 20190 | + * first interacted (focussed) on the model input element and then shifted focus away (blurred) |
|---|
| 20191 | + * from the input element. |
|---|
| 20192 | + */ |
|---|
| 20193 | + this.$setTouched = function() { |
|---|
| 20194 | + ctrl.$touched = true; |
|---|
| 20195 | + ctrl.$untouched = false; |
|---|
| 20196 | + $animate.setClass($element, TOUCHED_CLASS, UNTOUCHED_CLASS); |
|---|
| 20197 | + }; |
|---|
| 20198 | + |
|---|
| 20199 | + /** |
|---|
| 20200 | + * @ngdoc method |
|---|
| 20201 | + * @name ngModel.NgModelController#$rollbackViewValue |
|---|
| 20202 | + * |
|---|
| 20203 | + * @description |
|---|
| 20204 | + * Cancel an update and reset the input element's value to prevent an update to the `$modelValue`, |
|---|
| 20205 | + * which may be caused by a pending debounced event or because the input is waiting for a some |
|---|
| 20206 | + * future event. |
|---|
| 20207 | + * |
|---|
| 20208 | + * If you have an input that uses `ng-model-options` to set up debounced events or events such |
|---|
| 20209 | + * as blur you can have a situation where there is a period when the `$viewValue` |
|---|
| 20210 | + * is out of synch with the ngModel's `$modelValue`. |
|---|
| 20211 | + * |
|---|
| 20212 | + * In this case, you can run into difficulties if you try to update the ngModel's `$modelValue` |
|---|
| 20213 | + * programmatically before these debounced/future events have resolved/occurred, because Angular's |
|---|
| 20214 | + * dirty checking mechanism is not able to tell whether the model has actually changed or not. |
|---|
| 20215 | + * |
|---|
| 20216 | + * The `$rollbackViewValue()` method should be called before programmatically changing the model of an |
|---|
| 20217 | + * input which may have such events pending. This is important in order to make sure that the |
|---|
| 20218 | + * input field will be updated with the new model value and any pending operations are cancelled. |
|---|
| 20219 | + * |
|---|
| 20220 | + * <example name="ng-model-cancel-update" module="cancel-update-example"> |
|---|
| 20221 | + * <file name="app.js"> |
|---|
| 20222 | + * angular.module('cancel-update-example', []) |
|---|
| 20223 | + * |
|---|
| 20224 | + * .controller('CancelUpdateController', ['$scope', function($scope) { |
|---|
| 20225 | + * $scope.resetWithCancel = function (e) { |
|---|
| 20226 | + * if (e.keyCode == 27) { |
|---|
| 20227 | + * $scope.myForm.myInput1.$rollbackViewValue(); |
|---|
| 20228 | + * $scope.myValue = ''; |
|---|
| 20229 | + * } |
|---|
| 20230 | + * }; |
|---|
| 20231 | + * $scope.resetWithoutCancel = function (e) { |
|---|
| 20232 | + * if (e.keyCode == 27) { |
|---|
| 20233 | + * $scope.myValue = ''; |
|---|
| 20234 | + * } |
|---|
| 20235 | + * }; |
|---|
| 20236 | + * }]); |
|---|
| 20237 | + * </file> |
|---|
| 20238 | + * <file name="index.html"> |
|---|
| 20239 | + * <div ng-controller="CancelUpdateController"> |
|---|
| 20240 | + * <p>Try typing something in each input. See that the model only updates when you |
|---|
| 20241 | + * blur off the input. |
|---|
| 20242 | + * </p> |
|---|
| 20243 | + * <p>Now see what happens if you start typing then press the Escape key</p> |
|---|
| 20244 | + * |
|---|
| 20245 | + * <form name="myForm" ng-model-options="{ updateOn: 'blur' }"> |
|---|
| 20246 | + * <p>With $rollbackViewValue()</p> |
|---|
| 20247 | + * <input name="myInput1" ng-model="myValue" ng-keydown="resetWithCancel($event)"><br/> |
|---|
| 20248 | + * myValue: "{{ myValue }}" |
|---|
| 20249 | + * |
|---|
| 20250 | + * <p>Without $rollbackViewValue()</p> |
|---|
| 20251 | + * <input name="myInput2" ng-model="myValue" ng-keydown="resetWithoutCancel($event)"><br/> |
|---|
| 20252 | + * myValue: "{{ myValue }}" |
|---|
| 20253 | + * </form> |
|---|
| 20254 | + * </div> |
|---|
| 20255 | + * </file> |
|---|
| 20256 | + * </example> |
|---|
| 20257 | + */ |
|---|
| 20258 | + this.$rollbackViewValue = function() { |
|---|
| 20259 | + $timeout.cancel(pendingDebounce); |
|---|
| 20260 | + ctrl.$viewValue = ctrl.$$lastCommittedViewValue; |
|---|
| 20261 | + ctrl.$render(); |
|---|
| 20262 | + }; |
|---|
| 20263 | + |
|---|
| 20264 | + /** |
|---|
| 20265 | + * @ngdoc method |
|---|
| 20266 | + * @name ngModel.NgModelController#$validate |
|---|
| 20267 | + * |
|---|
| 20268 | + * @description |
|---|
| 20269 | + * Runs each of the registered validators (first synchronous validators and then asynchronous validators). |
|---|
| 20270 | + */ |
|---|
| 20271 | + this.$validate = function() { |
|---|
| 20272 | + // ignore $validate before model is initialized |
|---|
| 20273 | + if (isNumber(ctrl.$modelValue) && isNaN(ctrl.$modelValue)) { |
|---|
| 20274 | + return; |
|---|
| 20275 | + } |
|---|
| 20276 | + this.$$parseAndValidate(); |
|---|
| 20277 | + }; |
|---|
| 20278 | + |
|---|
| 20279 | + this.$$runValidators = function(parseValid, modelValue, viewValue, doneCallback) { |
|---|
| 20280 | + currentValidationRunId++; |
|---|
| 20281 | + var localValidationRunId = currentValidationRunId; |
|---|
| 20282 | + |
|---|
| 20283 | + // check parser error |
|---|
| 20284 | + if (!processParseErrors(parseValid)) { |
|---|
| 20285 | + validationDone(false); |
|---|
| 20286 | + return; |
|---|
| 20287 | + } |
|---|
| 20288 | + if (!processSyncValidators()) { |
|---|
| 20289 | + validationDone(false); |
|---|
| 20290 | + return; |
|---|
| 20291 | + } |
|---|
| 20292 | + processAsyncValidators(); |
|---|
| 20293 | + |
|---|
| 20294 | + function processParseErrors(parseValid) { |
|---|
| 20295 | + var errorKey = ctrl.$$parserName || 'parse'; |
|---|
| 20296 | + if (parseValid === undefined) { |
|---|
| 20297 | + setValidity(errorKey, null); |
|---|
| 20298 | + } else { |
|---|
| 20299 | + setValidity(errorKey, parseValid); |
|---|
| 20300 | + if (!parseValid) { |
|---|
| 20301 | + forEach(ctrl.$validators, function(v, name) { |
|---|
| 20302 | + setValidity(name, null); |
|---|
| 20303 | + }); |
|---|
| 20304 | + forEach(ctrl.$asyncValidators, function(v, name) { |
|---|
| 20305 | + setValidity(name, null); |
|---|
| 20306 | + }); |
|---|
| 20307 | + return false; |
|---|
| 20308 | + } |
|---|
| 20309 | + } |
|---|
| 20310 | + return true; |
|---|
| 20311 | + } |
|---|
| 20312 | + |
|---|
| 20313 | + function processSyncValidators() { |
|---|
| 20314 | + var syncValidatorsValid = true; |
|---|
| 20315 | + forEach(ctrl.$validators, function(validator, name) { |
|---|
| 20316 | + var result = validator(modelValue, viewValue); |
|---|
| 20317 | + syncValidatorsValid = syncValidatorsValid && result; |
|---|
| 20318 | + setValidity(name, result); |
|---|
| 20319 | + }); |
|---|
| 20320 | + if (!syncValidatorsValid) { |
|---|
| 20321 | + forEach(ctrl.$asyncValidators, function(v, name) { |
|---|
| 20322 | + setValidity(name, null); |
|---|
| 20323 | + }); |
|---|
| 20324 | + return false; |
|---|
| 20325 | + } |
|---|
| 20326 | + return true; |
|---|
| 20327 | + } |
|---|
| 20328 | + |
|---|
| 20329 | + function processAsyncValidators() { |
|---|
| 20330 | + var validatorPromises = []; |
|---|
| 20331 | + var allValid = true; |
|---|
| 20332 | + forEach(ctrl.$asyncValidators, function(validator, name) { |
|---|
| 20333 | + var promise = validator(modelValue, viewValue); |
|---|
| 20334 | + if (!isPromiseLike(promise)) { |
|---|
| 20335 | + throw $ngModelMinErr("$asyncValidators", |
|---|
| 20336 | + "Expected asynchronous validator to return a promise but got '{0}' instead.", promise); |
|---|
| 20337 | + } |
|---|
| 20338 | + setValidity(name, undefined); |
|---|
| 20339 | + validatorPromises.push(promise.then(function() { |
|---|
| 20340 | + setValidity(name, true); |
|---|
| 20341 | + }, function(error) { |
|---|
| 20342 | + allValid = false; |
|---|
| 20343 | + setValidity(name, false); |
|---|
| 20344 | + })); |
|---|
| 20345 | + }); |
|---|
| 20346 | + if (!validatorPromises.length) { |
|---|
| 20347 | + validationDone(true); |
|---|
| 20348 | + } else { |
|---|
| 20349 | + $q.all(validatorPromises).then(function() { |
|---|
| 20350 | + validationDone(allValid); |
|---|
| 20351 | + }, noop); |
|---|
| 20352 | + } |
|---|
| 20353 | + } |
|---|
| 20354 | + |
|---|
| 20355 | + function setValidity(name, isValid) { |
|---|
| 20356 | + if (localValidationRunId === currentValidationRunId) { |
|---|
| 20357 | + ctrl.$setValidity(name, isValid); |
|---|
| 20358 | + } |
|---|
| 20359 | + } |
|---|
| 20360 | + |
|---|
| 20361 | + function validationDone(allValid) { |
|---|
| 20362 | + if (localValidationRunId === currentValidationRunId) { |
|---|
| 20363 | + |
|---|
| 20364 | + doneCallback(allValid); |
|---|
| 20365 | + } |
|---|
| 20366 | + } |
|---|
| 20367 | + }; |
|---|
| 20368 | + |
|---|
| 20369 | + /** |
|---|
| 20370 | + * @ngdoc method |
|---|
| 20371 | + * @name ngModel.NgModelController#$commitViewValue |
|---|
| 20372 | + * |
|---|
| 20373 | + * @description |
|---|
| 20374 | + * Commit a pending update to the `$modelValue`. |
|---|
| 20375 | + * |
|---|
| 20376 | + * Updates may be pending by a debounced event or because the input is waiting for a some future |
|---|
| 20377 | + * event defined in `ng-model-options`. this method is rarely needed as `NgModelController` |
|---|
| 20378 | + * usually handles calling this in response to input events. |
|---|
| 20379 | + */ |
|---|
| 20380 | + this.$commitViewValue = function() { |
|---|
| 20381 | + var viewValue = ctrl.$viewValue; |
|---|
| 20382 | + |
|---|
| 20383 | + $timeout.cancel(pendingDebounce); |
|---|
| 20384 | + |
|---|
| 20385 | + // If the view value has not changed then we should just exit, except in the case where there is |
|---|
| 20386 | + // a native validator on the element. In this case the validation state may have changed even though |
|---|
| 20387 | + // the viewValue has stayed empty. |
|---|
| 20388 | + if (ctrl.$$lastCommittedViewValue === viewValue && (viewValue !== '' || !ctrl.$$hasNativeValidators)) { |
|---|
| 20389 | + return; |
|---|
| 20390 | + } |
|---|
| 20391 | + ctrl.$$lastCommittedViewValue = viewValue; |
|---|
| 20392 | + |
|---|
| 20393 | + // change to dirty |
|---|
| 20394 | + if (ctrl.$pristine) { |
|---|
| 20395 | + ctrl.$dirty = true; |
|---|
| 20396 | + ctrl.$pristine = false; |
|---|
| 20397 | + $animate.removeClass($element, PRISTINE_CLASS); |
|---|
| 20398 | + $animate.addClass($element, DIRTY_CLASS); |
|---|
| 20399 | + parentForm.$setDirty(); |
|---|
| 20400 | + } |
|---|
| 20401 | + this.$$parseAndValidate(); |
|---|
| 20402 | + }; |
|---|
| 20403 | + |
|---|
| 20404 | + this.$$parseAndValidate = function() { |
|---|
| 20405 | + var viewValue = ctrl.$$lastCommittedViewValue; |
|---|
| 20406 | + var modelValue = viewValue; |
|---|
| 20407 | + var parserValid = isUndefined(modelValue) ? undefined : true; |
|---|
| 20408 | + |
|---|
| 20409 | + if (parserValid) { |
|---|
| 20410 | + for(var i = 0; i < ctrl.$parsers.length; i++) { |
|---|
| 20411 | + modelValue = ctrl.$parsers[i](modelValue); |
|---|
| 20412 | + if (isUndefined(modelValue)) { |
|---|
| 20413 | + parserValid = false; |
|---|
| 20414 | + break; |
|---|
| 20415 | + } |
|---|
| 20416 | + } |
|---|
| 20417 | + } |
|---|
| 20418 | + if (isNumber(ctrl.$modelValue) && isNaN(ctrl.$modelValue)) { |
|---|
| 20419 | + // ctrl.$modelValue has not been touched yet... |
|---|
| 20420 | + ctrl.$modelValue = ngModelGet(); |
|---|
| 20421 | + } |
|---|
| 20422 | + var prevModelValue = ctrl.$modelValue; |
|---|
| 20423 | + var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid; |
|---|
| 20424 | + if (allowInvalid) { |
|---|
| 20425 | + ctrl.$modelValue = modelValue; |
|---|
| 20426 | + writeToModelIfNeeded(); |
|---|
| 20427 | + } |
|---|
| 20428 | + ctrl.$$runValidators(parserValid, modelValue, viewValue, function(allValid) { |
|---|
| 20429 | + if (!allowInvalid) { |
|---|
| 20430 | + // Note: Don't check ctrl.$valid here, as we could have |
|---|
| 20431 | + // external validators (e.g. calculated on the server), |
|---|
| 20432 | + // that just call $setValidity and need the model value |
|---|
| 20433 | + // to calculate their validity. |
|---|
| 20434 | + ctrl.$modelValue = allValid ? modelValue : undefined; |
|---|
| 20435 | + writeToModelIfNeeded(); |
|---|
| 20436 | + } |
|---|
| 20437 | + }); |
|---|
| 20438 | + |
|---|
| 20439 | + function writeToModelIfNeeded() { |
|---|
| 20440 | + if (ctrl.$modelValue !== prevModelValue) { |
|---|
| 20441 | + ctrl.$$writeModelToScope(); |
|---|
| 20442 | + } |
|---|
| 20443 | + } |
|---|
| 20444 | + }; |
|---|
| 20445 | + |
|---|
| 20446 | + this.$$writeModelToScope = function() { |
|---|
| 20447 | + ngModelSet(ctrl.$modelValue); |
|---|
| 20448 | + forEach(ctrl.$viewChangeListeners, function(listener) { |
|---|
| 20449 | + try { |
|---|
| 20450 | + listener(); |
|---|
| 20451 | + } catch(e) { |
|---|
| 20452 | + $exceptionHandler(e); |
|---|
| 20453 | + } |
|---|
| 20454 | + }); |
|---|
| 20455 | + }; |
|---|
| 20456 | + |
|---|
| 20457 | + /** |
|---|
| 20458 | + * @ngdoc method |
|---|
| 20459 | + * @name ngModel.NgModelController#$setViewValue |
|---|
| 20460 | + * |
|---|
| 20461 | + * @description |
|---|
| 20462 | + * Update the view value. |
|---|
| 20463 | + * |
|---|
| 20464 | + * This method should be called when an input directive want to change the view value; typically, |
|---|
| 20465 | + * this is done from within a DOM event handler. |
|---|
| 20466 | + * |
|---|
| 20467 | + * For example {@link ng.directive:input input} calls it when the value of the input changes and |
|---|
| 20468 | + * {@link ng.directive:select select} calls it when an option is selected. |
|---|
| 20469 | + * |
|---|
| 20470 | + * If the new `value` is an object (rather than a string or a number), we should make a copy of the |
|---|
| 20471 | + * object before passing it to `$setViewValue`. This is because `ngModel` does not perform a deep |
|---|
| 20472 | + * watch of objects, it only looks for a change of identity. If you only change the property of |
|---|
| 20473 | + * the object then ngModel will not realise that the object has changed and will not invoke the |
|---|
| 20474 | + * `$parsers` and `$validators` pipelines. |
|---|
| 20475 | + * |
|---|
| 20476 | + * For this reason, you should not change properties of the copy once it has been passed to |
|---|
| 20477 | + * `$setViewValue`. Otherwise you may cause the model value on the scope to change incorrectly. |
|---|
| 20478 | + * |
|---|
| 20479 | + * When this method is called, the new `value` will be staged for committing through the `$parsers` |
|---|
| 20480 | + * and `$validators` pipelines. If there are no special {@link ngModelOptions} specified then the staged |
|---|
| 20481 | + * value sent directly for processing, finally to be applied to `$modelValue` and then the |
|---|
| 20482 | + * **expression** specified in the `ng-model` attribute. |
|---|
| 20483 | + * |
|---|
| 20484 | + * Lastly, all the registered change listeners, in the `$viewChangeListeners` list, are called. |
|---|
| 20485 | + * |
|---|
| 20486 | + * In case the {@link ng.directive:ngModelOptions ngModelOptions} directive is used with `updateOn` |
|---|
| 20487 | + * and the `default` trigger is not listed, all those actions will remain pending until one of the |
|---|
| 20488 | + * `updateOn` events is triggered on the DOM element. |
|---|
| 20489 | + * All these actions will be debounced if the {@link ng.directive:ngModelOptions ngModelOptions} |
|---|
| 20490 | + * directive is used with a custom debounce for this particular event. |
|---|
| 20491 | + * |
|---|
| 20492 | + * Note that calling this function does not trigger a `$digest`. |
|---|
| 20493 | + * |
|---|
| 20494 | + * @param {string} value Value from the view. |
|---|
| 20495 | + * @param {string} trigger Event that triggered the update. |
|---|
| 20496 | + */ |
|---|
| 20497 | + this.$setViewValue = function(value, trigger) { |
|---|
| 20498 | + ctrl.$viewValue = value; |
|---|
| 20499 | + if (!ctrl.$options || ctrl.$options.updateOnDefault) { |
|---|
| 20500 | + ctrl.$$debounceViewValueCommit(trigger); |
|---|
| 20501 | + } |
|---|
| 20502 | + }; |
|---|
| 20503 | + |
|---|
| 20504 | + this.$$debounceViewValueCommit = function(trigger) { |
|---|
| 20505 | + var debounceDelay = 0, |
|---|
| 20506 | + options = ctrl.$options, |
|---|
| 20507 | + debounce; |
|---|
| 20508 | + |
|---|
| 20509 | + if (options && isDefined(options.debounce)) { |
|---|
| 20510 | + debounce = options.debounce; |
|---|
| 20511 | + if (isNumber(debounce)) { |
|---|
| 20512 | + debounceDelay = debounce; |
|---|
| 20513 | + } else if (isNumber(debounce[trigger])) { |
|---|
| 20514 | + debounceDelay = debounce[trigger]; |
|---|
| 20515 | + } else if (isNumber(debounce['default'])) { |
|---|
| 20516 | + debounceDelay = debounce['default']; |
|---|
| 20517 | + } |
|---|
| 20518 | + } |
|---|
| 20519 | + |
|---|
| 20520 | + $timeout.cancel(pendingDebounce); |
|---|
| 20521 | + if (debounceDelay) { |
|---|
| 20522 | + pendingDebounce = $timeout(function() { |
|---|
| 20523 | + ctrl.$commitViewValue(); |
|---|
| 20524 | + }, debounceDelay); |
|---|
| 20525 | + } else if ($rootScope.$$phase) { |
|---|
| 20526 | + ctrl.$commitViewValue(); |
|---|
| 20527 | + } else { |
|---|
| 20528 | + $scope.$apply(function() { |
|---|
| 20529 | + ctrl.$commitViewValue(); |
|---|
| 20530 | + }); |
|---|
| 20531 | + } |
|---|
| 20532 | + }; |
|---|
| 20533 | + |
|---|
| 20534 | + // model -> value |
|---|
| 20535 | + // Note: we cannot use a normal scope.$watch as we want to detect the following: |
|---|
| 20536 | + // 1. scope value is 'a' |
|---|
| 20537 | + // 2. user enters 'b' |
|---|
| 20538 | + // 3. ng-change kicks in and reverts scope value to 'a' |
|---|
| 20539 | + // -> scope value did not change since the last digest as |
|---|
| 20540 | + // ng-change executes in apply phase |
|---|
| 20541 | + // 4. view should be changed back to 'a' |
|---|
| 20542 | + $scope.$watch(function ngModelWatch() { |
|---|
| 20543 | + var modelValue = ngModelGet(); |
|---|
| 20544 | + |
|---|
| 20545 | + // if scope model value and ngModel value are out of sync |
|---|
| 20546 | + // TODO(perf): why not move this to the action fn? |
|---|
| 20547 | + if (modelValue !== ctrl.$modelValue) { |
|---|
| 20548 | + ctrl.$modelValue = modelValue; |
|---|
| 20549 | + |
|---|
| 20550 | + var formatters = ctrl.$formatters, |
|---|
| 20551 | + idx = formatters.length; |
|---|
| 20552 | + |
|---|
| 20553 | + var viewValue = modelValue; |
|---|
| 20554 | + while(idx--) { |
|---|
| 20555 | + viewValue = formatters[idx](viewValue); |
|---|
| 20556 | + } |
|---|
| 20557 | + if (ctrl.$viewValue !== viewValue) { |
|---|
| 20558 | + ctrl.$viewValue = ctrl.$$lastCommittedViewValue = viewValue; |
|---|
| 20559 | + ctrl.$render(); |
|---|
| 20560 | + |
|---|
| 20561 | + ctrl.$$runValidators(undefined, modelValue, viewValue, noop); |
|---|
| 20562 | + } |
|---|
| 20563 | + } |
|---|
| 20564 | + |
|---|
| 20565 | + return modelValue; |
|---|
| 20566 | + }); |
|---|
| 20567 | +}]; |
|---|
| 20568 | + |
|---|
| 20569 | + |
|---|
| 20570 | +/** |
|---|
| 20571 | + * @ngdoc directive |
|---|
| 20572 | + * @name ngModel |
|---|
| 20573 | + * |
|---|
| 20574 | + * @element input |
|---|
| 20575 | + * |
|---|
| 20576 | + * @description |
|---|
| 20577 | + * The `ngModel` directive binds an `input`,`select`, `textarea` (or custom form control) to a |
|---|
| 20578 | + * property on the scope using {@link ngModel.NgModelController NgModelController}, |
|---|
| 20579 | + * which is created and exposed by this directive. |
|---|
| 20580 | + * |
|---|
| 20581 | + * `ngModel` is responsible for: |
|---|
| 20582 | + * |
|---|
| 20583 | + * - Binding the view into the model, which other directives such as `input`, `textarea` or `select` |
|---|
| 20584 | + * require. |
|---|
| 20585 | + * - Providing validation behavior (i.e. required, number, email, url). |
|---|
| 20586 | + * - Keeping the state of the control (valid/invalid, dirty/pristine, touched/untouched, validation errors). |
|---|
| 20587 | + * - Setting related css classes on the element (`ng-valid`, `ng-invalid`, `ng-dirty`, `ng-pristine`, `ng-touched`, `ng-untouched`) including animations. |
|---|
| 20588 | + * - Registering the control with its parent {@link ng.directive:form form}. |
|---|
| 20589 | + * |
|---|
| 20590 | + * Note: `ngModel` will try to bind to the property given by evaluating the expression on the |
|---|
| 20591 | + * current scope. If the property doesn't already exist on this scope, it will be created |
|---|
| 20592 | + * implicitly and added to the scope. |
|---|
| 20593 | + * |
|---|
| 20594 | + * For best practices on using `ngModel`, see: |
|---|
| 20595 | + * |
|---|
| 20596 | + * - [https://github.com/angular/angular.js/wiki/Understanding-Scopes] |
|---|
| 20597 | + * |
|---|
| 20598 | + * For basic examples, how to use `ngModel`, see: |
|---|
| 20599 | + * |
|---|
| 20600 | + * - {@link ng.directive:input input} |
|---|
| 20601 | + * - {@link input[text] text} |
|---|
| 20602 | + * - {@link input[checkbox] checkbox} |
|---|
| 20603 | + * - {@link input[radio] radio} |
|---|
| 20604 | + * - {@link input[number] number} |
|---|
| 20605 | + * - {@link input[email] email} |
|---|
| 20606 | + * - {@link input[url] url} |
|---|
| 20607 | + * - {@link input[date] date} |
|---|
| 20608 | + * - {@link input[dateTimeLocal] dateTimeLocal} |
|---|
| 20609 | + * - {@link input[time] time} |
|---|
| 20610 | + * - {@link input[month] month} |
|---|
| 20611 | + * - {@link input[week] week} |
|---|
| 20612 | + * - {@link ng.directive:select select} |
|---|
| 20613 | + * - {@link ng.directive:textarea textarea} |
|---|
| 20614 | + * |
|---|
| 20615 | + * # CSS classes |
|---|
| 20616 | + * The following CSS classes are added and removed on the associated input/select/textarea element |
|---|
| 20617 | + * depending on the validity of the model. |
|---|
| 20618 | + * |
|---|
| 20619 | + * - `ng-valid` is set if the model is valid. |
|---|
| 20620 | + * - `ng-invalid` is set if the model is invalid. |
|---|
| 20621 | + * - `ng-pristine` is set if the model is pristine. |
|---|
| 20622 | + * - `ng-dirty` is set if the model is dirty. |
|---|
| 20623 | + * |
|---|
| 20624 | + * Keep in mind that ngAnimate can detect each of these classes when added and removed. |
|---|
| 20625 | + * |
|---|
| 20626 | + * ## Animation Hooks |
|---|
| 20627 | + * |
|---|
| 20628 | + * Animations within models are triggered when any of the associated CSS classes are added and removed |
|---|
| 20629 | + * on the input element which is attached to the model. These classes are: `.ng-pristine`, `.ng-dirty`, |
|---|
| 20630 | + * `.ng-invalid` and `.ng-valid` as well as any other validations that are performed on the model itself. |
|---|
| 20631 | + * The animations that are triggered within ngModel are similar to how they work in ngClass and |
|---|
| 20632 | + * animations can be hooked into using CSS transitions, keyframes as well as JS animations. |
|---|
| 20633 | + * |
|---|
| 20634 | + * The following example shows a simple way to utilize CSS transitions to style an input element |
|---|
| 20635 | + * that has been rendered as invalid after it has been validated: |
|---|
| 20636 | + * |
|---|
| 20637 | + * <pre> |
|---|
| 20638 | + * //be sure to include ngAnimate as a module to hook into more |
|---|
| 20639 | + * //advanced animations |
|---|
| 20640 | + * .my-input { |
|---|
| 20641 | + * transition:0.5s linear all; |
|---|
| 20642 | + * background: white; |
|---|
| 20643 | + * } |
|---|
| 20644 | + * .my-input.ng-invalid { |
|---|
| 20645 | + * background: red; |
|---|
| 20646 | + * color:white; |
|---|
| 20647 | + * } |
|---|
| 20648 | + * </pre> |
|---|
| 20649 | + * |
|---|
| 20650 | + * @example |
|---|
| 20651 | + * <example deps="angular-animate.js" animations="true" fixBase="true" module="inputExample"> |
|---|
| 20652 | + <file name="index.html"> |
|---|
| 20653 | + <script> |
|---|
| 20654 | + angular.module('inputExample', []) |
|---|
| 20655 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 20656 | + $scope.val = '1'; |
|---|
| 20657 | + }]); |
|---|
| 20658 | + </script> |
|---|
| 20659 | + <style> |
|---|
| 20660 | + .my-input { |
|---|
| 20661 | + -webkit-transition:all linear 0.5s; |
|---|
| 20662 | + transition:all linear 0.5s; |
|---|
| 20663 | + background: transparent; |
|---|
| 20664 | + } |
|---|
| 20665 | + .my-input.ng-invalid { |
|---|
| 20666 | + color:white; |
|---|
| 20667 | + background: red; |
|---|
| 20668 | + } |
|---|
| 20669 | + </style> |
|---|
| 20670 | + Update input to see transitions when valid/invalid. |
|---|
| 20671 | + Integer is a valid value. |
|---|
| 20672 | + <form name="testForm" ng-controller="ExampleController"> |
|---|
| 20673 | + <input ng-model="val" ng-pattern="/^\d+$/" name="anim" class="my-input" /> |
|---|
| 20674 | + </form> |
|---|
| 20675 | + </file> |
|---|
| 20676 | + * </example> |
|---|
| 20677 | + * |
|---|
| 20678 | + * ## Binding to a getter/setter |
|---|
| 20679 | + * |
|---|
| 20680 | + * Sometimes it's helpful to bind `ngModel` to a getter/setter function. A getter/setter is a |
|---|
| 20681 | + * function that returns a representation of the model when called with zero arguments, and sets |
|---|
| 20682 | + * the internal state of a model when called with an argument. It's sometimes useful to use this |
|---|
| 20683 | + * for models that have an internal representation that's different than what the model exposes |
|---|
| 20684 | + * to the view. |
|---|
| 20685 | + * |
|---|
| 20686 | + * <div class="alert alert-success"> |
|---|
| 20687 | + * **Best Practice:** It's best to keep getters fast because Angular is likely to call them more |
|---|
| 20688 | + * frequently than other parts of your code. |
|---|
| 20689 | + * </div> |
|---|
| 20690 | + * |
|---|
| 20691 | + * You use this behavior by adding `ng-model-options="{ getterSetter: true }"` to an element that |
|---|
| 20692 | + * has `ng-model` attached to it. You can also add `ng-model-options="{ getterSetter: true }"` to |
|---|
| 20693 | + * a `<form>`, which will enable this behavior for all `<input>`s within it. See |
|---|
| 20694 | + * {@link ng.directive:ngModelOptions `ngModelOptions`} for more. |
|---|
| 20695 | + * |
|---|
| 20696 | + * The following example shows how to use `ngModel` with a getter/setter: |
|---|
| 20697 | + * |
|---|
| 20698 | + * @example |
|---|
| 20699 | + * <example name="ngModel-getter-setter" module="getterSetterExample"> |
|---|
| 20700 | + <file name="index.html"> |
|---|
| 20701 | + <div ng-controller="ExampleController"> |
|---|
| 20702 | + <form name="userForm"> |
|---|
| 20703 | + Name: |
|---|
| 20704 | + <input type="text" name="userName" |
|---|
| 20705 | + ng-model="user.name" |
|---|
| 20706 | + ng-model-options="{ getterSetter: true }" /> |
|---|
| 20707 | + </form> |
|---|
| 20708 | + <pre>user.name = <span ng-bind="user.name()"></span></pre> |
|---|
| 20709 | + </div> |
|---|
| 20710 | + </file> |
|---|
| 20711 | + <file name="app.js"> |
|---|
| 20712 | + angular.module('getterSetterExample', []) |
|---|
| 20713 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 20714 | + var _name = 'Brian'; |
|---|
| 20715 | + $scope.user = { |
|---|
| 20716 | + name: function (newName) { |
|---|
| 20717 | + if (angular.isDefined(newName)) { |
|---|
| 20718 | + _name = newName; |
|---|
| 20719 | + } |
|---|
| 20720 | + return _name; |
|---|
| 20721 | + } |
|---|
| 20722 | + }; |
|---|
| 20723 | + }]); |
|---|
| 20724 | + </file> |
|---|
| 20725 | + * </example> |
|---|
| 20726 | + */ |
|---|
| 20727 | +var ngModelDirective = function() { |
|---|
| 20728 | + return { |
|---|
| 20729 | + restrict: 'A', |
|---|
| 20730 | + require: ['ngModel', '^?form', '^?ngModelOptions'], |
|---|
| 20731 | + controller: NgModelController, |
|---|
| 20732 | + // Prelink needs to run before any input directive |
|---|
| 20733 | + // so that we can set the NgModelOptions in NgModelController |
|---|
| 20734 | + // before anyone else uses it. |
|---|
| 20735 | + priority: 1, |
|---|
| 20736 | + compile: function ngModelCompile(element) { |
|---|
| 20737 | + // Setup initial state of the control |
|---|
| 20738 | + element.addClass(PRISTINE_CLASS).addClass(UNTOUCHED_CLASS).addClass(VALID_CLASS); |
|---|
| 20739 | + |
|---|
| 20740 | + return { |
|---|
| 20741 | + pre: function ngModelPreLink(scope, element, attr, ctrls) { |
|---|
| 20742 | + var modelCtrl = ctrls[0], |
|---|
| 20743 | + formCtrl = ctrls[1] || nullFormCtrl; |
|---|
| 20744 | + |
|---|
| 20745 | + modelCtrl.$$setOptions(ctrls[2] && ctrls[2].$options); |
|---|
| 20746 | + |
|---|
| 20747 | + // notify others, especially parent forms |
|---|
| 20748 | + formCtrl.$addControl(modelCtrl); |
|---|
| 20749 | + |
|---|
| 20750 | + attr.$observe('name', function(newValue) { |
|---|
| 20751 | + if (modelCtrl.$name !== newValue) { |
|---|
| 20752 | + formCtrl.$$renameControl(modelCtrl, newValue); |
|---|
| 20753 | + } |
|---|
| 20754 | + }); |
|---|
| 20755 | + |
|---|
| 20756 | + scope.$on('$destroy', function() { |
|---|
| 20757 | + formCtrl.$removeControl(modelCtrl); |
|---|
| 20758 | + }); |
|---|
| 20759 | + }, |
|---|
| 20760 | + post: function ngModelPostLink(scope, element, attr, ctrls) { |
|---|
| 20761 | + var modelCtrl = ctrls[0]; |
|---|
| 20762 | + if (modelCtrl.$options && modelCtrl.$options.updateOn) { |
|---|
| 20763 | + element.on(modelCtrl.$options.updateOn, function(ev) { |
|---|
| 20764 | + modelCtrl.$$debounceViewValueCommit(ev && ev.type); |
|---|
| 20765 | + }); |
|---|
| 20766 | + } |
|---|
| 20767 | + |
|---|
| 20768 | + element.on('blur', function(ev) { |
|---|
| 20769 | + if (modelCtrl.$touched) return; |
|---|
| 20770 | + |
|---|
| 20771 | + scope.$apply(function() { |
|---|
| 20772 | + modelCtrl.$setTouched(); |
|---|
| 20773 | + }); |
|---|
| 20774 | + }); |
|---|
| 20775 | + } |
|---|
| 20776 | + }; |
|---|
| 20777 | + } |
|---|
| 20778 | + }; |
|---|
| 20779 | +}; |
|---|
| 20780 | + |
|---|
| 20781 | + |
|---|
| 20782 | +/** |
|---|
| 20783 | + * @ngdoc directive |
|---|
| 20784 | + * @name ngChange |
|---|
| 20785 | + * |
|---|
| 20786 | + * @description |
|---|
| 20787 | + * Evaluate the given expression when the user changes the input. |
|---|
| 20788 | + * The expression is evaluated immediately, unlike the JavaScript onchange event |
|---|
| 20789 | + * which only triggers at the end of a change (usually, when the user leaves the |
|---|
| 20790 | + * form element or presses the return key). |
|---|
| 20791 | + * |
|---|
| 20792 | + * The `ngChange` expression is only evaluated when a change in the input value causes |
|---|
| 20793 | + * a new value to be committed to the model. |
|---|
| 20794 | + * |
|---|
| 20795 | + * It will not be evaluated: |
|---|
| 20796 | + * * if the value returned from the `$parsers` transformation pipeline has not changed |
|---|
| 20797 | + * * if the input has continued to be invalid since the model will stay `null` |
|---|
| 20798 | + * * if the model is changed programmatically and not by a change to the input value |
|---|
| 20799 | + * |
|---|
| 20800 | + * |
|---|
| 20801 | + * Note, this directive requires `ngModel` to be present. |
|---|
| 20802 | + * |
|---|
| 20803 | + * @element input |
|---|
| 20804 | + * @param {expression} ngChange {@link guide/expression Expression} to evaluate upon change |
|---|
| 20805 | + * in input value. |
|---|
| 20806 | + * |
|---|
| 20807 | + * @example |
|---|
| 20808 | + * <example name="ngChange-directive" module="changeExample"> |
|---|
| 20809 | + * <file name="index.html"> |
|---|
| 20810 | + * <script> |
|---|
| 20811 | + * angular.module('changeExample', []) |
|---|
| 20812 | + * .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 20813 | + * $scope.counter = 0; |
|---|
| 20814 | + * $scope.change = function() { |
|---|
| 20815 | + * $scope.counter++; |
|---|
| 20816 | + * }; |
|---|
| 20817 | + * }]); |
|---|
| 20818 | + * </script> |
|---|
| 20819 | + * <div ng-controller="ExampleController"> |
|---|
| 20820 | + * <input type="checkbox" ng-model="confirmed" ng-change="change()" id="ng-change-example1" /> |
|---|
| 20821 | + * <input type="checkbox" ng-model="confirmed" id="ng-change-example2" /> |
|---|
| 20822 | + * <label for="ng-change-example2">Confirmed</label><br /> |
|---|
| 20823 | + * <tt>debug = {{confirmed}}</tt><br/> |
|---|
| 20824 | + * <tt>counter = {{counter}}</tt><br/> |
|---|
| 20825 | + * </div> |
|---|
| 20826 | + * </file> |
|---|
| 20827 | + * <file name="protractor.js" type="protractor"> |
|---|
| 20828 | + * var counter = element(by.binding('counter')); |
|---|
| 20829 | + * var debug = element(by.binding('confirmed')); |
|---|
| 20830 | + * |
|---|
| 20831 | + * it('should evaluate the expression if changing from view', function() { |
|---|
| 20832 | + * expect(counter.getText()).toContain('0'); |
|---|
| 20833 | + * |
|---|
| 20834 | + * element(by.id('ng-change-example1')).click(); |
|---|
| 20835 | + * |
|---|
| 20836 | + * expect(counter.getText()).toContain('1'); |
|---|
| 20837 | + * expect(debug.getText()).toContain('true'); |
|---|
| 20838 | + * }); |
|---|
| 20839 | + * |
|---|
| 20840 | + * it('should not evaluate the expression if changing from model', function() { |
|---|
| 20841 | + * element(by.id('ng-change-example2')).click(); |
|---|
| 20842 | + |
|---|
| 20843 | + * expect(counter.getText()).toContain('0'); |
|---|
| 20844 | + * expect(debug.getText()).toContain('true'); |
|---|
| 20845 | + * }); |
|---|
| 20846 | + * </file> |
|---|
| 20847 | + * </example> |
|---|
| 20848 | + */ |
|---|
| 20849 | +var ngChangeDirective = valueFn({ |
|---|
| 20850 | + restrict: 'A', |
|---|
| 20851 | + require: 'ngModel', |
|---|
| 20852 | + link: function(scope, element, attr, ctrl) { |
|---|
| 20853 | + ctrl.$viewChangeListeners.push(function() { |
|---|
| 20854 | + scope.$eval(attr.ngChange); |
|---|
| 20855 | + }); |
|---|
| 20856 | + } |
|---|
| 20857 | +}); |
|---|
| 20858 | + |
|---|
| 20859 | + |
|---|
| 20860 | +var requiredDirective = function() { |
|---|
| 20861 | + return { |
|---|
| 20862 | + restrict: 'A', |
|---|
| 20863 | + require: '?ngModel', |
|---|
| 20864 | + link: function(scope, elm, attr, ctrl) { |
|---|
| 20865 | + if (!ctrl) return; |
|---|
| 20866 | + attr.required = true; // force truthy in case we are on non input element |
|---|
| 20867 | + |
|---|
| 20868 | + ctrl.$validators.required = function(value) { |
|---|
| 20869 | + return !attr.required || !ctrl.$isEmpty(value); |
|---|
| 20870 | + }; |
|---|
| 20871 | + |
|---|
| 20872 | + attr.$observe('required', function() { |
|---|
| 20873 | + ctrl.$validate(); |
|---|
| 20874 | + }); |
|---|
| 20875 | + } |
|---|
| 20876 | + }; |
|---|
| 20877 | +}; |
|---|
| 20878 | + |
|---|
| 20879 | + |
|---|
| 20880 | +var patternDirective = function() { |
|---|
| 20881 | + return { |
|---|
| 20882 | + restrict: 'A', |
|---|
| 20883 | + require: '?ngModel', |
|---|
| 20884 | + link: function(scope, elm, attr, ctrl) { |
|---|
| 20885 | + if (!ctrl) return; |
|---|
| 20886 | + |
|---|
| 20887 | + var regexp, patternExp = attr.ngPattern || attr.pattern; |
|---|
| 20888 | + attr.$observe('pattern', function(regex) { |
|---|
| 20889 | + if (isString(regex) && regex.length > 0) { |
|---|
| 20890 | + regex = new RegExp(regex); |
|---|
| 20891 | + } |
|---|
| 20892 | + |
|---|
| 20893 | + if (regex && !regex.test) { |
|---|
| 20894 | + throw minErr('ngPattern')('noregexp', |
|---|
| 20895 | + 'Expected {0} to be a RegExp but was {1}. Element: {2}', patternExp, |
|---|
| 20896 | + regex, startingTag(elm)); |
|---|
| 20897 | + } |
|---|
| 20898 | + |
|---|
| 20899 | + regexp = regex || undefined; |
|---|
| 20900 | + ctrl.$validate(); |
|---|
| 20901 | + }); |
|---|
| 20902 | + |
|---|
| 20903 | + ctrl.$validators.pattern = function(value) { |
|---|
| 20904 | + return ctrl.$isEmpty(value) || isUndefined(regexp) || regexp.test(value); |
|---|
| 20905 | + }; |
|---|
| 20906 | + } |
|---|
| 20907 | + }; |
|---|
| 20908 | +}; |
|---|
| 20909 | + |
|---|
| 20910 | + |
|---|
| 20911 | +var maxlengthDirective = function() { |
|---|
| 20912 | + return { |
|---|
| 20913 | + restrict: 'A', |
|---|
| 20914 | + require: '?ngModel', |
|---|
| 20915 | + link: function(scope, elm, attr, ctrl) { |
|---|
| 20916 | + if (!ctrl) return; |
|---|
| 20917 | + |
|---|
| 20918 | + var maxlength = 0; |
|---|
| 20919 | + attr.$observe('maxlength', function(value) { |
|---|
| 20920 | + maxlength = int(value) || 0; |
|---|
| 20921 | + ctrl.$validate(); |
|---|
| 20922 | + }); |
|---|
| 20923 | + ctrl.$validators.maxlength = function(modelValue, viewValue) { |
|---|
| 20924 | + return ctrl.$isEmpty(modelValue) || viewValue.length <= maxlength; |
|---|
| 20925 | + }; |
|---|
| 20926 | + } |
|---|
| 20927 | + }; |
|---|
| 20928 | +}; |
|---|
| 20929 | + |
|---|
| 20930 | +var minlengthDirective = function() { |
|---|
| 20931 | + return { |
|---|
| 20932 | + restrict: 'A', |
|---|
| 20933 | + require: '?ngModel', |
|---|
| 20934 | + link: function(scope, elm, attr, ctrl) { |
|---|
| 20935 | + if (!ctrl) return; |
|---|
| 20936 | + |
|---|
| 20937 | + var minlength = 0; |
|---|
| 20938 | + attr.$observe('minlength', function(value) { |
|---|
| 20939 | + minlength = int(value) || 0; |
|---|
| 20940 | + ctrl.$validate(); |
|---|
| 20941 | + }); |
|---|
| 20942 | + ctrl.$validators.minlength = function(modelValue, viewValue) { |
|---|
| 20943 | + return ctrl.$isEmpty(modelValue) || viewValue.length >= minlength; |
|---|
| 20944 | + }; |
|---|
| 20945 | + } |
|---|
| 20946 | + }; |
|---|
| 20947 | +}; |
|---|
| 20948 | + |
|---|
| 20949 | + |
|---|
| 20950 | +/** |
|---|
| 20951 | + * @ngdoc directive |
|---|
| 20952 | + * @name ngList |
|---|
| 20953 | + * |
|---|
| 20954 | + * @description |
|---|
| 20955 | + * Text input that converts between a delimited string and an array of strings. The default |
|---|
| 20956 | + * delimiter is a comma followed by a space - equivalent to `ng-list=", "`. You can specify a custom |
|---|
| 20957 | + * delimiter as the value of the `ngList` attribute - for example, `ng-list=" | "`. |
|---|
| 20958 | + * |
|---|
| 20959 | + * The behaviour of the directive is affected by the use of the `ngTrim` attribute. |
|---|
| 20960 | + * * If `ngTrim` is set to `"false"` then whitespace around both the separator and each |
|---|
| 20961 | + * list item is respected. This implies that the user of the directive is responsible for |
|---|
| 20962 | + * dealing with whitespace but also allows you to use whitespace as a delimiter, such as a |
|---|
| 20963 | + * tab or newline character. |
|---|
| 20964 | + * * Otherwise whitespace around the delimiter is ignored when splitting (although it is respected |
|---|
| 20965 | + * when joining the list items back together) and whitespace around each list item is stripped |
|---|
| 20966 | + * before it is added to the model. |
|---|
| 20967 | + * |
|---|
| 20968 | + * ### Example with Validation |
|---|
| 20969 | + * |
|---|
| 20970 | + * <example name="ngList-directive" module="listExample"> |
|---|
| 20971 | + * <file name="app.js"> |
|---|
| 20972 | + * angular.module('listExample', []) |
|---|
| 20973 | + * .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 20974 | + * $scope.names = ['morpheus', 'neo', 'trinity']; |
|---|
| 20975 | + * }]); |
|---|
| 20976 | + * </file> |
|---|
| 20977 | + * <file name="index.html"> |
|---|
| 20978 | + * <form name="myForm" ng-controller="ExampleController"> |
|---|
| 20979 | + * List: <input name="namesInput" ng-model="names" ng-list required> |
|---|
| 20980 | + * <span class="error" ng-show="myForm.namesInput.$error.required"> |
|---|
| 20981 | + * Required!</span> |
|---|
| 20982 | + * <br> |
|---|
| 20983 | + * <tt>names = {{names}}</tt><br/> |
|---|
| 20984 | + * <tt>myForm.namesInput.$valid = {{myForm.namesInput.$valid}}</tt><br/> |
|---|
| 20985 | + * <tt>myForm.namesInput.$error = {{myForm.namesInput.$error}}</tt><br/> |
|---|
| 20986 | + * <tt>myForm.$valid = {{myForm.$valid}}</tt><br/> |
|---|
| 20987 | + * <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/> |
|---|
| 20988 | + * </form> |
|---|
| 20989 | + * </file> |
|---|
| 20990 | + * <file name="protractor.js" type="protractor"> |
|---|
| 20991 | + * var listInput = element(by.model('names')); |
|---|
| 20992 | + * var names = element(by.exactBinding('names')); |
|---|
| 20993 | + * var valid = element(by.binding('myForm.namesInput.$valid')); |
|---|
| 20994 | + * var error = element(by.css('span.error')); |
|---|
| 20995 | + * |
|---|
| 20996 | + * it('should initialize to model', function() { |
|---|
| 20997 | + * expect(names.getText()).toContain('["morpheus","neo","trinity"]'); |
|---|
| 20998 | + * expect(valid.getText()).toContain('true'); |
|---|
| 20999 | + * expect(error.getCssValue('display')).toBe('none'); |
|---|
| 21000 | + * }); |
|---|
| 21001 | + * |
|---|
| 21002 | + * it('should be invalid if empty', function() { |
|---|
| 21003 | + * listInput.clear(); |
|---|
| 21004 | + * listInput.sendKeys(''); |
|---|
| 21005 | + * |
|---|
| 21006 | + * expect(names.getText()).toContain(''); |
|---|
| 21007 | + * expect(valid.getText()).toContain('false'); |
|---|
| 21008 | + * expect(error.getCssValue('display')).not.toBe('none'); |
|---|
| 21009 | + * }); |
|---|
| 21010 | + * </file> |
|---|
| 21011 | + * </example> |
|---|
| 21012 | + * |
|---|
| 21013 | + * ### Example - splitting on whitespace |
|---|
| 21014 | + * <example name="ngList-directive-newlines"> |
|---|
| 21015 | + * <file name="index.html"> |
|---|
| 21016 | + * <textarea ng-model="list" ng-list=" " ng-trim="false"></textarea> |
|---|
| 21017 | + * <pre>{{ list | json }}</pre> |
|---|
| 21018 | + * </file> |
|---|
| 21019 | + * <file name="protractor.js" type="protractor"> |
|---|
| 21020 | + * it("should split the text by newlines", function() { |
|---|
| 21021 | + * var listInput = element(by.model('list')); |
|---|
| 21022 | + * var output = element(by.binding('list | json')); |
|---|
| 21023 | + * listInput.sendKeys('abc\ndef\nghi'); |
|---|
| 21024 | + * expect(output.getText()).toContain('[\n "abc",\n "def",\n "ghi"\n]'); |
|---|
| 21025 | + * }); |
|---|
| 21026 | + * </file> |
|---|
| 21027 | + * </example> |
|---|
| 21028 | + * |
|---|
| 21029 | + * @element input |
|---|
| 21030 | + * @param {string=} ngList optional delimiter that should be used to split the value. |
|---|
| 21031 | + */ |
|---|
| 21032 | +var ngListDirective = function() { |
|---|
| 21033 | + return { |
|---|
| 21034 | + restrict: 'A', |
|---|
| 21035 | + priority: 100, |
|---|
| 21036 | + require: 'ngModel', |
|---|
| 21037 | + link: function(scope, element, attr, ctrl) { |
|---|
| 21038 | + // We want to control whitespace trimming so we use this convoluted approach |
|---|
| 21039 | + // to access the ngList attribute, which doesn't pre-trim the attribute |
|---|
| 21040 | + var ngList = element.attr(attr.$attr.ngList) || ', '; |
|---|
| 21041 | + var trimValues = attr.ngTrim !== 'false'; |
|---|
| 21042 | + var separator = trimValues ? trim(ngList) : ngList; |
|---|
| 21043 | + |
|---|
| 21044 | + var parse = function(viewValue) { |
|---|
| 21045 | + // If the viewValue is invalid (say required but empty) it will be `undefined` |
|---|
| 21046 | + if (isUndefined(viewValue)) return; |
|---|
| 21047 | + |
|---|
| 21048 | + var list = []; |
|---|
| 21049 | + |
|---|
| 21050 | + if (viewValue) { |
|---|
| 21051 | + forEach(viewValue.split(separator), function(value) { |
|---|
| 21052 | + if (value) list.push(trimValues ? trim(value) : value); |
|---|
| 21053 | + }); |
|---|
| 21054 | + } |
|---|
| 21055 | + |
|---|
| 21056 | + return list; |
|---|
| 21057 | + }; |
|---|
| 21058 | + |
|---|
| 21059 | + ctrl.$parsers.push(parse); |
|---|
| 21060 | + ctrl.$formatters.push(function(value) { |
|---|
| 21061 | + if (isArray(value)) { |
|---|
| 21062 | + return value.join(ngList); |
|---|
| 21063 | + } |
|---|
| 21064 | + |
|---|
| 21065 | + return undefined; |
|---|
| 21066 | + }); |
|---|
| 21067 | + |
|---|
| 21068 | + // Override the standard $isEmpty because an empty array means the input is empty. |
|---|
| 21069 | + ctrl.$isEmpty = function(value) { |
|---|
| 21070 | + return !value || !value.length; |
|---|
| 21071 | + }; |
|---|
| 21072 | + } |
|---|
| 21073 | + }; |
|---|
| 21074 | +}; |
|---|
| 21075 | + |
|---|
| 21076 | + |
|---|
| 21077 | +var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/; |
|---|
| 21078 | +/** |
|---|
| 21079 | + * @ngdoc directive |
|---|
| 21080 | + * @name ngValue |
|---|
| 21081 | + * |
|---|
| 21082 | + * @description |
|---|
| 21083 | + * Binds the given expression to the value of `input[select]` or `input[radio]`, so |
|---|
| 21084 | + * that when the element is selected, the `ngModel` of that element is set to the |
|---|
| 21085 | + * bound value. |
|---|
| 21086 | + * |
|---|
| 21087 | + * `ngValue` is useful when dynamically generating lists of radio buttons using `ng-repeat`, as |
|---|
| 21088 | + * shown below. |
|---|
| 21089 | + * |
|---|
| 21090 | + * @element input |
|---|
| 21091 | + * @param {string=} ngValue angular expression, whose value will be bound to the `value` attribute |
|---|
| 21092 | + * of the `input` element |
|---|
| 21093 | + * |
|---|
| 21094 | + * @example |
|---|
| 21095 | + <example name="ngValue-directive" module="valueExample"> |
|---|
| 21096 | + <file name="index.html"> |
|---|
| 21097 | + <script> |
|---|
| 21098 | + angular.module('valueExample', []) |
|---|
| 21099 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 21100 | + $scope.names = ['pizza', 'unicorns', 'robots']; |
|---|
| 21101 | + $scope.my = { favorite: 'unicorns' }; |
|---|
| 21102 | + }]); |
|---|
| 21103 | + </script> |
|---|
| 21104 | + <form ng-controller="ExampleController"> |
|---|
| 21105 | + <h2>Which is your favorite?</h2> |
|---|
| 21106 | + <label ng-repeat="name in names" for="{{name}}"> |
|---|
| 21107 | + {{name}} |
|---|
| 21108 | + <input type="radio" |
|---|
| 21109 | + ng-model="my.favorite" |
|---|
| 21110 | + ng-value="name" |
|---|
| 21111 | + id="{{name}}" |
|---|
| 21112 | + name="favorite"> |
|---|
| 21113 | + </label> |
|---|
| 21114 | + <div>You chose {{my.favorite}}</div> |
|---|
| 21115 | + </form> |
|---|
| 21116 | + </file> |
|---|
| 21117 | + <file name="protractor.js" type="protractor"> |
|---|
| 21118 | + var favorite = element(by.binding('my.favorite')); |
|---|
| 21119 | + |
|---|
| 21120 | + it('should initialize to model', function() { |
|---|
| 21121 | + expect(favorite.getText()).toContain('unicorns'); |
|---|
| 21122 | + }); |
|---|
| 21123 | + it('should bind the values to the inputs', function() { |
|---|
| 21124 | + element.all(by.model('my.favorite')).get(0).click(); |
|---|
| 21125 | + expect(favorite.getText()).toContain('pizza'); |
|---|
| 21126 | + }); |
|---|
| 21127 | + </file> |
|---|
| 21128 | + </example> |
|---|
| 21129 | + */ |
|---|
| 21130 | +var ngValueDirective = function() { |
|---|
| 21131 | + return { |
|---|
| 21132 | + restrict: 'A', |
|---|
| 21133 | + priority: 100, |
|---|
| 21134 | + compile: function(tpl, tplAttr) { |
|---|
| 21135 | + if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) { |
|---|
| 21136 | + return function ngValueConstantLink(scope, elm, attr) { |
|---|
| 21137 | + attr.$set('value', scope.$eval(attr.ngValue)); |
|---|
| 21138 | + }; |
|---|
| 21139 | + } else { |
|---|
| 21140 | + return function ngValueLink(scope, elm, attr) { |
|---|
| 21141 | + scope.$watch(attr.ngValue, function valueWatchAction(value) { |
|---|
| 21142 | + attr.$set('value', value); |
|---|
| 21143 | + }); |
|---|
| 21144 | + }; |
|---|
| 21145 | + } |
|---|
| 21146 | + } |
|---|
| 21147 | + }; |
|---|
| 21148 | +}; |
|---|
| 21149 | + |
|---|
| 21150 | +/** |
|---|
| 21151 | + * @ngdoc directive |
|---|
| 21152 | + * @name ngModelOptions |
|---|
| 21153 | + * |
|---|
| 21154 | + * @description |
|---|
| 21155 | + * Allows tuning how model updates are done. Using `ngModelOptions` you can specify a custom list of |
|---|
| 21156 | + * events that will trigger a model update and/or a debouncing delay so that the actual update only |
|---|
| 21157 | + * takes place when a timer expires; this timer will be reset after another change takes place. |
|---|
| 21158 | + * |
|---|
| 21159 | + * Given the nature of `ngModelOptions`, the value displayed inside input fields in the view might |
|---|
| 21160 | + * be different than the value in the actual model. This means that if you update the model you |
|---|
| 21161 | + * should also invoke {@link ngModel.NgModelController `$rollbackViewValue`} on the relevant input field in |
|---|
| 21162 | + * order to make sure it is synchronized with the model and that any debounced action is canceled. |
|---|
| 21163 | + * |
|---|
| 21164 | + * The easiest way to reference the control's {@link ngModel.NgModelController `$rollbackViewValue`} |
|---|
| 21165 | + * method is by making sure the input is placed inside a form that has a `name` attribute. This is |
|---|
| 21166 | + * important because `form` controllers are published to the related scope under the name in their |
|---|
| 21167 | + * `name` attribute. |
|---|
| 21168 | + * |
|---|
| 21169 | + * Any pending changes will take place immediately when an enclosing form is submitted via the |
|---|
| 21170 | + * `submit` event. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit` |
|---|
| 21171 | + * to have access to the updated model. |
|---|
| 21172 | + * |
|---|
| 21173 | + * `ngModelOptions` has an effect on the element it's declared on and its descendants. |
|---|
| 21174 | + * |
|---|
| 21175 | + * @param {Object} ngModelOptions options to apply to the current model. Valid keys are: |
|---|
| 21176 | + * - `updateOn`: string specifying which event should be the input bound to. You can set several |
|---|
| 21177 | + * events using an space delimited list. There is a special event called `default` that |
|---|
| 21178 | + * matches the default events belonging of the control. |
|---|
| 21179 | + * - `debounce`: integer value which contains the debounce model update value in milliseconds. A |
|---|
| 21180 | + * value of 0 triggers an immediate update. If an object is supplied instead, you can specify a |
|---|
| 21181 | + * custom value for each event. For example: |
|---|
| 21182 | + * `ng-model-options="{ updateOn: 'default blur', debounce: {'default': 500, 'blur': 0} }"` |
|---|
| 21183 | + * - `allowInvalid`: boolean value which indicates that the model can be set with values that did |
|---|
| 21184 | + * not validate correctly instead of the default behavior of setting the model to undefined. |
|---|
| 21185 | + * - `getterSetter`: boolean value which determines whether or not to treat functions bound to |
|---|
| 21186 | + `ngModel` as getters/setters. |
|---|
| 21187 | + * - `timezone`: Defines the timezone to be used to read/write the `Date` instance in the model for |
|---|
| 21188 | + * `<input type="date">`, `<input type="time">`, ... . Right now, the only supported value is `'UTC'`, |
|---|
| 21189 | + * otherwise the default timezone of the browser will be used. |
|---|
| 21190 | + * |
|---|
| 21191 | + * @example |
|---|
| 21192 | + |
|---|
| 21193 | + The following example shows how to override immediate updates. Changes on the inputs within the |
|---|
| 21194 | + form will update the model only when the control loses focus (blur event). If `escape` key is |
|---|
| 21195 | + pressed while the input field is focused, the value is reset to the value in the current model. |
|---|
| 21196 | + |
|---|
| 21197 | + <example name="ngModelOptions-directive-blur" module="optionsExample"> |
|---|
| 21198 | + <file name="index.html"> |
|---|
| 21199 | + <div ng-controller="ExampleController"> |
|---|
| 21200 | + <form name="userForm"> |
|---|
| 21201 | + Name: |
|---|
| 21202 | + <input type="text" name="userName" |
|---|
| 21203 | + ng-model="user.name" |
|---|
| 21204 | + ng-model-options="{ updateOn: 'blur' }" |
|---|
| 21205 | + ng-keyup="cancel($event)" /><br /> |
|---|
| 21206 | + |
|---|
| 21207 | + Other data: |
|---|
| 21208 | + <input type="text" ng-model="user.data" /><br /> |
|---|
| 21209 | + </form> |
|---|
| 21210 | + <pre>user.name = <span ng-bind="user.name"></span></pre> |
|---|
| 21211 | + </div> |
|---|
| 21212 | + </file> |
|---|
| 21213 | + <file name="app.js"> |
|---|
| 21214 | + angular.module('optionsExample', []) |
|---|
| 21215 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 21216 | + $scope.user = { name: 'say', data: '' }; |
|---|
| 21217 | + |
|---|
| 21218 | + $scope.cancel = function (e) { |
|---|
| 21219 | + if (e.keyCode == 27) { |
|---|
| 21220 | + $scope.userForm.userName.$rollbackViewValue(); |
|---|
| 21221 | + } |
|---|
| 21222 | + }; |
|---|
| 21223 | + }]); |
|---|
| 21224 | + </file> |
|---|
| 21225 | + <file name="protractor.js" type="protractor"> |
|---|
| 21226 | + var model = element(by.binding('user.name')); |
|---|
| 21227 | + var input = element(by.model('user.name')); |
|---|
| 21228 | + var other = element(by.model('user.data')); |
|---|
| 21229 | + |
|---|
| 21230 | + it('should allow custom events', function() { |
|---|
| 21231 | + input.sendKeys(' hello'); |
|---|
| 21232 | + input.click(); |
|---|
| 21233 | + expect(model.getText()).toEqual('say'); |
|---|
| 21234 | + other.click(); |
|---|
| 21235 | + expect(model.getText()).toEqual('say hello'); |
|---|
| 21236 | + }); |
|---|
| 21237 | + |
|---|
| 21238 | + it('should $rollbackViewValue when model changes', function() { |
|---|
| 21239 | + input.sendKeys(' hello'); |
|---|
| 21240 | + expect(input.getAttribute('value')).toEqual('say hello'); |
|---|
| 21241 | + input.sendKeys(protractor.Key.ESCAPE); |
|---|
| 21242 | + expect(input.getAttribute('value')).toEqual('say'); |
|---|
| 21243 | + other.click(); |
|---|
| 21244 | + expect(model.getText()).toEqual('say'); |
|---|
| 21245 | + }); |
|---|
| 21246 | + </file> |
|---|
| 21247 | + </example> |
|---|
| 21248 | + |
|---|
| 21249 | + This one shows how to debounce model changes. Model will be updated only 1 sec after last change. |
|---|
| 21250 | + If the `Clear` button is pressed, any debounced action is canceled and the value becomes empty. |
|---|
| 21251 | + |
|---|
| 21252 | + <example name="ngModelOptions-directive-debounce" module="optionsExample"> |
|---|
| 21253 | + <file name="index.html"> |
|---|
| 21254 | + <div ng-controller="ExampleController"> |
|---|
| 21255 | + <form name="userForm"> |
|---|
| 21256 | + Name: |
|---|
| 21257 | + <input type="text" name="userName" |
|---|
| 21258 | + ng-model="user.name" |
|---|
| 21259 | + ng-model-options="{ debounce: 1000 }" /> |
|---|
| 21260 | + <button ng-click="userForm.userName.$rollbackViewValue(); user.name=''">Clear</button><br /> |
|---|
| 21261 | + </form> |
|---|
| 21262 | + <pre>user.name = <span ng-bind="user.name"></span></pre> |
|---|
| 21263 | + </div> |
|---|
| 21264 | + </file> |
|---|
| 21265 | + <file name="app.js"> |
|---|
| 21266 | + angular.module('optionsExample', []) |
|---|
| 21267 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 21268 | + $scope.user = { name: 'say' }; |
|---|
| 21269 | + }]); |
|---|
| 21270 | + </file> |
|---|
| 21271 | + </example> |
|---|
| 21272 | + |
|---|
| 21273 | + This one shows how to bind to getter/setters: |
|---|
| 21274 | + |
|---|
| 21275 | + <example name="ngModelOptions-directive-getter-setter" module="getterSetterExample"> |
|---|
| 21276 | + <file name="index.html"> |
|---|
| 21277 | + <div ng-controller="ExampleController"> |
|---|
| 21278 | + <form name="userForm"> |
|---|
| 21279 | + Name: |
|---|
| 21280 | + <input type="text" name="userName" |
|---|
| 21281 | + ng-model="user.name" |
|---|
| 21282 | + ng-model-options="{ getterSetter: true }" /> |
|---|
| 21283 | + </form> |
|---|
| 21284 | + <pre>user.name = <span ng-bind="user.name()"></span></pre> |
|---|
| 21285 | + </div> |
|---|
| 21286 | + </file> |
|---|
| 21287 | + <file name="app.js"> |
|---|
| 21288 | + angular.module('getterSetterExample', []) |
|---|
| 21289 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 21290 | + var _name = 'Brian'; |
|---|
| 21291 | + $scope.user = { |
|---|
| 21292 | + name: function (newName) { |
|---|
| 21293 | + return angular.isDefined(newName) ? (_name = newName) : _name; |
|---|
| 21294 | + } |
|---|
| 21295 | + }; |
|---|
| 21296 | + }]); |
|---|
| 21297 | + </file> |
|---|
| 21298 | + </example> |
|---|
| 21299 | + */ |
|---|
| 21300 | +var ngModelOptionsDirective = function() { |
|---|
| 21301 | + return { |
|---|
| 21302 | + restrict: 'A', |
|---|
| 21303 | + controller: ['$scope', '$attrs', function($scope, $attrs) { |
|---|
| 21304 | + var that = this; |
|---|
| 21305 | + this.$options = $scope.$eval($attrs.ngModelOptions); |
|---|
| 21306 | + // Allow adding/overriding bound events |
|---|
| 21307 | + if (this.$options.updateOn !== undefined) { |
|---|
| 21308 | + this.$options.updateOnDefault = false; |
|---|
| 21309 | + // extract "default" pseudo-event from list of events that can trigger a model update |
|---|
| 21310 | + this.$options.updateOn = trim(this.$options.updateOn.replace(DEFAULT_REGEXP, function() { |
|---|
| 21311 | + that.$options.updateOnDefault = true; |
|---|
| 21312 | + return ' '; |
|---|
| 21313 | + })); |
|---|
| 21314 | + } else { |
|---|
| 21315 | + this.$options.updateOnDefault = true; |
|---|
| 21316 | + } |
|---|
| 21317 | + }] |
|---|
| 21318 | + }; |
|---|
| 21319 | +}; |
|---|
| 21320 | + |
|---|
| 21321 | +// helper methods |
|---|
| 21322 | +function addSetValidityMethod(context) { |
|---|
| 21323 | + var ctrl = context.ctrl, |
|---|
| 21324 | + $element = context.$element, |
|---|
| 21325 | + classCache = {}, |
|---|
| 21326 | + set = context.set, |
|---|
| 21327 | + unset = context.unset, |
|---|
| 21328 | + parentForm = context.parentForm, |
|---|
| 21329 | + $animate = context.$animate; |
|---|
| 21330 | + |
|---|
| 21331 | + classCache[INVALID_CLASS] = !(classCache[VALID_CLASS] = $element.hasClass(VALID_CLASS)); |
|---|
| 21332 | + |
|---|
| 21333 | + ctrl.$setValidity = setValidity; |
|---|
| 21334 | + |
|---|
| 21335 | + function setValidity(validationErrorKey, state, options) { |
|---|
| 21336 | + if (state === undefined) { |
|---|
| 21337 | + createAndSet('$pending', validationErrorKey, options); |
|---|
| 21338 | + } else { |
|---|
| 21339 | + unsetAndCleanup('$pending', validationErrorKey, options); |
|---|
| 21340 | + } |
|---|
| 21341 | + if (!isBoolean(state)) { |
|---|
| 21342 | + unset(ctrl.$error, validationErrorKey, options); |
|---|
| 21343 | + unset(ctrl.$$success, validationErrorKey, options); |
|---|
| 21344 | + } else { |
|---|
| 21345 | + if (state) { |
|---|
| 21346 | + unset(ctrl.$error, validationErrorKey, options); |
|---|
| 21347 | + set(ctrl.$$success, validationErrorKey, options); |
|---|
| 21348 | + } else { |
|---|
| 21349 | + set(ctrl.$error, validationErrorKey, options); |
|---|
| 21350 | + unset(ctrl.$$success, validationErrorKey, options); |
|---|
| 21351 | + } |
|---|
| 21352 | + } |
|---|
| 21353 | + if (ctrl.$pending) { |
|---|
| 21354 | + cachedToggleClass(PENDING_CLASS, true); |
|---|
| 21355 | + ctrl.$valid = ctrl.$invalid = undefined; |
|---|
| 21356 | + toggleValidationCss('', null); |
|---|
| 21357 | + } else { |
|---|
| 21358 | + cachedToggleClass(PENDING_CLASS, false); |
|---|
| 21359 | + ctrl.$valid = isObjectEmpty(ctrl.$error); |
|---|
| 21360 | + ctrl.$invalid = !ctrl.$valid; |
|---|
| 21361 | + toggleValidationCss('', ctrl.$valid); |
|---|
| 21362 | + } |
|---|
| 21363 | + |
|---|
| 21364 | + // re-read the state as the set/unset methods could have |
|---|
| 21365 | + // combined state in ctrl.$error[validationError] (used for forms), |
|---|
| 21366 | + // where setting/unsetting only increments/decrements the value, |
|---|
| 21367 | + // and does not replace it. |
|---|
| 21368 | + var combinedState; |
|---|
| 21369 | + if (ctrl.$pending && ctrl.$pending[validationErrorKey]) { |
|---|
| 21370 | + combinedState = undefined; |
|---|
| 21371 | + } else if (ctrl.$error[validationErrorKey]) { |
|---|
| 21372 | + combinedState = false; |
|---|
| 21373 | + } else if (ctrl.$$success[validationErrorKey]) { |
|---|
| 21374 | + combinedState = true; |
|---|
| 21375 | + } else { |
|---|
| 21376 | + combinedState = null; |
|---|
| 21377 | + } |
|---|
| 21378 | + toggleValidationCss(validationErrorKey, combinedState); |
|---|
| 21379 | + parentForm.$setValidity(validationErrorKey, combinedState, ctrl); |
|---|
| 21380 | + } |
|---|
| 21381 | + |
|---|
| 21382 | + function createAndSet(name, value, options) { |
|---|
| 21383 | + if (!ctrl[name]) { |
|---|
| 21384 | + ctrl[name] = {}; |
|---|
| 21385 | + } |
|---|
| 21386 | + set(ctrl[name], value, options); |
|---|
| 21387 | + } |
|---|
| 21388 | + |
|---|
| 21389 | + function unsetAndCleanup(name, value, options) { |
|---|
| 21390 | + if (ctrl[name]) { |
|---|
| 21391 | + unset(ctrl[name], value, options); |
|---|
| 21392 | + } |
|---|
| 21393 | + if (isObjectEmpty(ctrl[name])) { |
|---|
| 21394 | + ctrl[name] = undefined; |
|---|
| 21395 | + } |
|---|
| 21396 | + } |
|---|
| 21397 | + |
|---|
| 21398 | + function cachedToggleClass(className, switchValue) { |
|---|
| 21399 | + if (switchValue && !classCache[className]) { |
|---|
| 21400 | + $animate.addClass($element, className); |
|---|
| 21401 | + classCache[className] = true; |
|---|
| 21402 | + } else if (!switchValue && classCache[className]) { |
|---|
| 21403 | + $animate.removeClass($element, className); |
|---|
| 21404 | + classCache[className] = false; |
|---|
| 21405 | + } |
|---|
| 21406 | + } |
|---|
| 21407 | + |
|---|
| 21408 | + function toggleValidationCss(validationErrorKey, isValid) { |
|---|
| 21409 | + validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : ''; |
|---|
| 21410 | + |
|---|
| 21411 | + cachedToggleClass(VALID_CLASS + validationErrorKey, isValid === true); |
|---|
| 21412 | + cachedToggleClass(INVALID_CLASS + validationErrorKey, isValid === false); |
|---|
| 21413 | + } |
|---|
| 21414 | +} |
|---|
| 21415 | + |
|---|
| 21416 | +function isObjectEmpty(obj) { |
|---|
| 21417 | + if (obj) { |
|---|
| 21418 | + for (var prop in obj) { |
|---|
| 21419 | + return false; |
|---|
| 21420 | + } |
|---|
| 21421 | + } |
|---|
| 21422 | + return true; |
|---|
| 21423 | +} |
|---|
| 21424 | + |
|---|
| 21425 | +/** |
|---|
| 21426 | + * @ngdoc directive |
|---|
| 21427 | + * @name ngBind |
|---|
| 21428 | + * @restrict AC |
|---|
| 21429 | + * |
|---|
| 21430 | + * @description |
|---|
| 21431 | + * The `ngBind` attribute tells Angular to replace the text content of the specified HTML element |
|---|
| 21432 | + * with the value of a given expression, and to update the text content when the value of that |
|---|
| 21433 | + * expression changes. |
|---|
| 21434 | + * |
|---|
| 21435 | + * Typically, you don't use `ngBind` directly, but instead you use the double curly markup like |
|---|
| 21436 | + * `{{ expression }}` which is similar but less verbose. |
|---|
| 21437 | + * |
|---|
| 21438 | + * It is preferable to use `ngBind` instead of `{{ expression }}` if a template is momentarily |
|---|
| 21439 | + * displayed by the browser in its raw state before Angular compiles it. Since `ngBind` is an |
|---|
| 21440 | + * element attribute, it makes the bindings invisible to the user while the page is loading. |
|---|
| 21441 | + * |
|---|
| 21442 | + * An alternative solution to this problem would be using the |
|---|
| 21443 | + * {@link ng.directive:ngCloak ngCloak} directive. |
|---|
| 21444 | + * |
|---|
| 21445 | + * |
|---|
| 21446 | + * @element ANY |
|---|
| 21447 | + * @param {expression} ngBind {@link guide/expression Expression} to evaluate. |
|---|
| 21448 | + * |
|---|
| 21449 | + * @example |
|---|
| 21450 | + * Enter a name in the Live Preview text box; the greeting below the text box changes instantly. |
|---|
| 21451 | + <example module="bindExample"> |
|---|
| 21452 | + <file name="index.html"> |
|---|
| 21453 | + <script> |
|---|
| 21454 | + angular.module('bindExample', []) |
|---|
| 21455 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 21456 | + $scope.name = 'Whirled'; |
|---|
| 21457 | + }]); |
|---|
| 21458 | + </script> |
|---|
| 21459 | + <div ng-controller="ExampleController"> |
|---|
| 21460 | + Enter name: <input type="text" ng-model="name"><br> |
|---|
| 21461 | + Hello <span ng-bind="name"></span>! |
|---|
| 21462 | + </div> |
|---|
| 21463 | + </file> |
|---|
| 21464 | + <file name="protractor.js" type="protractor"> |
|---|
| 21465 | + it('should check ng-bind', function() { |
|---|
| 21466 | + var nameInput = element(by.model('name')); |
|---|
| 21467 | + |
|---|
| 21468 | + expect(element(by.binding('name')).getText()).toBe('Whirled'); |
|---|
| 21469 | + nameInput.clear(); |
|---|
| 21470 | + nameInput.sendKeys('world'); |
|---|
| 21471 | + expect(element(by.binding('name')).getText()).toBe('world'); |
|---|
| 21472 | + }); |
|---|
| 21473 | + </file> |
|---|
| 21474 | + </example> |
|---|
| 21475 | + */ |
|---|
| 21476 | +var ngBindDirective = ['$compile', function($compile) { |
|---|
| 21477 | + return { |
|---|
| 21478 | + restrict: 'AC', |
|---|
| 21479 | + compile: function ngBindCompile(templateElement) { |
|---|
| 21480 | + $compile.$$addBindingClass(templateElement); |
|---|
| 21481 | + return function ngBindLink(scope, element, attr) { |
|---|
| 21482 | + $compile.$$addBindingInfo(element, attr.ngBind); |
|---|
| 21483 | + element = element[0]; |
|---|
| 21484 | + scope.$watch(attr.ngBind, function ngBindWatchAction(value) { |
|---|
| 21485 | + element.textContent = value === undefined ? '' : value; |
|---|
| 21486 | + }); |
|---|
| 21487 | + }; |
|---|
| 21488 | + } |
|---|
| 21489 | + }; |
|---|
| 21490 | +}]; |
|---|
| 21491 | + |
|---|
| 21492 | + |
|---|
| 21493 | +/** |
|---|
| 21494 | + * @ngdoc directive |
|---|
| 21495 | + * @name ngBindTemplate |
|---|
| 21496 | + * |
|---|
| 21497 | + * @description |
|---|
| 21498 | + * The `ngBindTemplate` directive specifies that the element |
|---|
| 21499 | + * text content should be replaced with the interpolation of the template |
|---|
| 21500 | + * in the `ngBindTemplate` attribute. |
|---|
| 21501 | + * Unlike `ngBind`, the `ngBindTemplate` can contain multiple `{{` `}}` |
|---|
| 21502 | + * expressions. This directive is needed since some HTML elements |
|---|
| 21503 | + * (such as TITLE and OPTION) cannot contain SPAN elements. |
|---|
| 21504 | + * |
|---|
| 21505 | + * @element ANY |
|---|
| 21506 | + * @param {string} ngBindTemplate template of form |
|---|
| 21507 | + * <tt>{{</tt> <tt>expression</tt> <tt>}}</tt> to eval. |
|---|
| 21508 | + * |
|---|
| 21509 | + * @example |
|---|
| 21510 | + * Try it here: enter text in text box and watch the greeting change. |
|---|
| 21511 | + <example module="bindExample"> |
|---|
| 21512 | + <file name="index.html"> |
|---|
| 21513 | + <script> |
|---|
| 21514 | + angular.module('bindExample', []) |
|---|
| 21515 | + .controller('ExampleController', ['$scope', function ($scope) { |
|---|
| 21516 | + $scope.salutation = 'Hello'; |
|---|
| 21517 | + $scope.name = 'World'; |
|---|
| 21518 | + }]); |
|---|
| 21519 | + </script> |
|---|
| 21520 | + <div ng-controller="ExampleController"> |
|---|
| 21521 | + Salutation: <input type="text" ng-model="salutation"><br> |
|---|
| 21522 | + Name: <input type="text" ng-model="name"><br> |
|---|
| 21523 | + <pre ng-bind-template="{{salutation}} {{name}}!"></pre> |
|---|
| 21524 | + </div> |
|---|
| 21525 | + </file> |
|---|
| 21526 | + <file name="protractor.js" type="protractor"> |
|---|
| 21527 | + it('should check ng-bind', function() { |
|---|
| 21528 | + var salutationElem = element(by.binding('salutation')); |
|---|
| 21529 | + var salutationInput = element(by.model('salutation')); |
|---|
| 21530 | + var nameInput = element(by.model('name')); |
|---|
| 21531 | + |
|---|
| 21532 | + expect(salutationElem.getText()).toBe('Hello World!'); |
|---|
| 21533 | + |
|---|
| 21534 | + salutationInput.clear(); |
|---|
| 21535 | + salutationInput.sendKeys('Greetings'); |
|---|
| 21536 | + nameInput.clear(); |
|---|
| 21537 | + nameInput.sendKeys('user'); |
|---|
| 21538 | + |
|---|
| 21539 | + expect(salutationElem.getText()).toBe('Greetings user!'); |
|---|
| 21540 | + }); |
|---|
| 21541 | + </file> |
|---|
| 21542 | + </example> |
|---|
| 21543 | + */ |
|---|
| 21544 | +var ngBindTemplateDirective = ['$interpolate', '$compile', function($interpolate, $compile) { |
|---|
| 21545 | + return { |
|---|
| 21546 | + compile: function ngBindTemplateCompile(templateElement) { |
|---|
| 21547 | + $compile.$$addBindingClass(templateElement); |
|---|
| 21548 | + return function ngBindTemplateLink(scope, element, attr) { |
|---|
| 21549 | + var interpolateFn = $interpolate(element.attr(attr.$attr.ngBindTemplate)); |
|---|
| 21550 | + $compile.$$addBindingInfo(element, interpolateFn.expressions); |
|---|
| 21551 | + element = element[0]; |
|---|
| 21552 | + attr.$observe('ngBindTemplate', function(value) { |
|---|
| 21553 | + element.textContent = value === undefined ? '' : value; |
|---|
| 21554 | + }); |
|---|
| 21555 | + }; |
|---|
| 21556 | + } |
|---|
| 21557 | + }; |
|---|
| 21558 | +}]; |
|---|
| 21559 | + |
|---|
| 21560 | + |
|---|
| 21561 | +/** |
|---|
| 21562 | + * @ngdoc directive |
|---|
| 21563 | + * @name ngBindHtml |
|---|
| 21564 | + * |
|---|
| 21565 | + * @description |
|---|
| 21566 | + * Creates a binding that will innerHTML the result of evaluating the `expression` into the current |
|---|
| 21567 | + * element in a secure way. By default, the innerHTML-ed content will be sanitized using the {@link |
|---|
| 21568 | + * ngSanitize.$sanitize $sanitize} service. To utilize this functionality, ensure that `$sanitize` |
|---|
| 21569 | + * is available, for example, by including {@link ngSanitize} in your module's dependencies (not in |
|---|
| 21570 | + * core Angular). In order to use {@link ngSanitize} in your module's dependencies, you need to |
|---|
| 21571 | + * include "angular-sanitize.js" in your application. |
|---|
| 21572 | + * |
|---|
| 21573 | + * You may also bypass sanitization for values you know are safe. To do so, bind to |
|---|
| 21574 | + * an explicitly trusted value via {@link ng.$sce#trustAsHtml $sce.trustAsHtml}. See the example |
|---|
| 21575 | + * under {@link ng.$sce#show-me-an-example-using-sce- Strict Contextual Escaping (SCE)}. |
|---|
| 21576 | + * |
|---|
| 21577 | + * Note: If a `$sanitize` service is unavailable and the bound value isn't explicitly trusted, you |
|---|
| 21578 | + * will have an exception (instead of an exploit.) |
|---|
| 21579 | + * |
|---|
| 21580 | + * @element ANY |
|---|
| 21581 | + * @param {expression} ngBindHtml {@link guide/expression Expression} to evaluate. |
|---|
| 21582 | + * |
|---|
| 21583 | + * @example |
|---|
| 21584 | + |
|---|
| 21585 | + <example module="bindHtmlExample" deps="angular-sanitize.js"> |
|---|
| 21586 | + <file name="index.html"> |
|---|
| 21587 | + <div ng-controller="ExampleController"> |
|---|
| 21588 | + <p ng-bind-html="myHTML"></p> |
|---|
| 21589 | + </div> |
|---|
| 21590 | + </file> |
|---|
| 21591 | + |
|---|
| 21592 | + <file name="script.js"> |
|---|
| 21593 | + angular.module('bindHtmlExample', ['ngSanitize']) |
|---|
| 21594 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 21595 | + $scope.myHTML = |
|---|
| 21596 | + 'I am an <code>HTML</code>string with ' + |
|---|
| 21597 | + '<a href="#">links!</a> and other <em>stuff</em>'; |
|---|
| 21598 | + }]); |
|---|
| 21599 | + </file> |
|---|
| 21600 | + |
|---|
| 21601 | + <file name="protractor.js" type="protractor"> |
|---|
| 21602 | + it('should check ng-bind-html', function() { |
|---|
| 21603 | + expect(element(by.binding('myHTML')).getText()).toBe( |
|---|
| 21604 | + 'I am an HTMLstring with links! and other stuff'); |
|---|
| 21605 | + }); |
|---|
| 21606 | + </file> |
|---|
| 21607 | + </example> |
|---|
| 21608 | + */ |
|---|
| 21609 | +var ngBindHtmlDirective = ['$sce', '$parse', '$compile', function($sce, $parse, $compile) { |
|---|
| 21610 | + return { |
|---|
| 21611 | + restrict: 'A', |
|---|
| 21612 | + compile: function ngBindHtmlCompile(tElement, tAttrs) { |
|---|
| 21613 | + var ngBindHtmlGetter = $parse(tAttrs.ngBindHtml); |
|---|
| 21614 | + var ngBindHtmlWatch = $parse(tAttrs.ngBindHtml, function getStringValue(value) { |
|---|
| 21615 | + return (value || '').toString(); |
|---|
| 21616 | + }); |
|---|
| 21617 | + $compile.$$addBindingClass(tElement); |
|---|
| 21618 | + |
|---|
| 21619 | + return function ngBindHtmlLink(scope, element, attr) { |
|---|
| 21620 | + $compile.$$addBindingInfo(element, attr.ngBindHtml); |
|---|
| 21621 | + |
|---|
| 21622 | + scope.$watch(ngBindHtmlWatch, function ngBindHtmlWatchAction() { |
|---|
| 21623 | + // we re-evaluate the expr because we want a TrustedValueHolderType |
|---|
| 21624 | + // for $sce, not a string |
|---|
| 21625 | + element.html($sce.getTrustedHtml(ngBindHtmlGetter(scope)) || ''); |
|---|
| 21626 | + }); |
|---|
| 21627 | + }; |
|---|
| 21628 | + } |
|---|
| 21629 | + }; |
|---|
| 21630 | +}]; |
|---|
| 21631 | + |
|---|
| 21632 | +function classDirective(name, selector) { |
|---|
| 21633 | + name = 'ngClass' + name; |
|---|
| 21634 | + return ['$animate', function($animate) { |
|---|
| 21635 | + return { |
|---|
| 21636 | + restrict: 'AC', |
|---|
| 21637 | + link: function(scope, element, attr) { |
|---|
| 21638 | + var oldVal; |
|---|
| 21639 | + |
|---|
| 21640 | + scope.$watch(attr[name], ngClassWatchAction, true); |
|---|
| 21641 | + |
|---|
| 21642 | + attr.$observe('class', function(value) { |
|---|
| 21643 | + ngClassWatchAction(scope.$eval(attr[name])); |
|---|
| 21644 | + }); |
|---|
| 21645 | + |
|---|
| 21646 | + |
|---|
| 21647 | + if (name !== 'ngClass') { |
|---|
| 21648 | + scope.$watch('$index', function($index, old$index) { |
|---|
| 21649 | + // jshint bitwise: false |
|---|
| 21650 | + var mod = $index & 1; |
|---|
| 21651 | + if (mod !== (old$index & 1)) { |
|---|
| 21652 | + var classes = arrayClasses(scope.$eval(attr[name])); |
|---|
| 21653 | + mod === selector ? |
|---|
| 21654 | + addClasses(classes) : |
|---|
| 21655 | + removeClasses(classes); |
|---|
| 21656 | + } |
|---|
| 21657 | + }); |
|---|
| 21658 | + } |
|---|
| 21659 | + |
|---|
| 21660 | + function addClasses(classes) { |
|---|
| 21661 | + var newClasses = digestClassCounts(classes, 1); |
|---|
| 21662 | + attr.$addClass(newClasses); |
|---|
| 21663 | + } |
|---|
| 21664 | + |
|---|
| 21665 | + function removeClasses(classes) { |
|---|
| 21666 | + var newClasses = digestClassCounts(classes, -1); |
|---|
| 21667 | + attr.$removeClass(newClasses); |
|---|
| 21668 | + } |
|---|
| 21669 | + |
|---|
| 21670 | + function digestClassCounts (classes, count) { |
|---|
| 21671 | + var classCounts = element.data('$classCounts') || {}; |
|---|
| 21672 | + var classesToUpdate = []; |
|---|
| 21673 | + forEach(classes, function (className) { |
|---|
| 21674 | + if (count > 0 || classCounts[className]) { |
|---|
| 21675 | + classCounts[className] = (classCounts[className] || 0) + count; |
|---|
| 21676 | + if (classCounts[className] === +(count > 0)) { |
|---|
| 21677 | + classesToUpdate.push(className); |
|---|
| 21678 | + } |
|---|
| 21679 | + } |
|---|
| 21680 | + }); |
|---|
| 21681 | + element.data('$classCounts', classCounts); |
|---|
| 21682 | + return classesToUpdate.join(' '); |
|---|
| 21683 | + } |
|---|
| 21684 | + |
|---|
| 21685 | + function updateClasses (oldClasses, newClasses) { |
|---|
| 21686 | + var toAdd = arrayDifference(newClasses, oldClasses); |
|---|
| 21687 | + var toRemove = arrayDifference(oldClasses, newClasses); |
|---|
| 21688 | + toAdd = digestClassCounts(toAdd, 1); |
|---|
| 21689 | + toRemove = digestClassCounts(toRemove, -1); |
|---|
| 21690 | + if (toAdd && toAdd.length) { |
|---|
| 21691 | + $animate.addClass(element, toAdd); |
|---|
| 21692 | + } |
|---|
| 21693 | + if (toRemove && toRemove.length) { |
|---|
| 21694 | + $animate.removeClass(element, toRemove); |
|---|
| 21695 | + } |
|---|
| 21696 | + } |
|---|
| 21697 | + |
|---|
| 21698 | + function ngClassWatchAction(newVal) { |
|---|
| 21699 | + if (selector === true || scope.$index % 2 === selector) { |
|---|
| 21700 | + var newClasses = arrayClasses(newVal || []); |
|---|
| 21701 | + if (!oldVal) { |
|---|
| 21702 | + addClasses(newClasses); |
|---|
| 21703 | + } else if (!equals(newVal,oldVal)) { |
|---|
| 21704 | + var oldClasses = arrayClasses(oldVal); |
|---|
| 21705 | + updateClasses(oldClasses, newClasses); |
|---|
| 21706 | + } |
|---|
| 21707 | + } |
|---|
| 21708 | + oldVal = shallowCopy(newVal); |
|---|
| 21709 | + } |
|---|
| 21710 | + } |
|---|
| 21711 | + }; |
|---|
| 21712 | + |
|---|
| 21713 | + function arrayDifference(tokens1, tokens2) { |
|---|
| 21714 | + var values = []; |
|---|
| 21715 | + |
|---|
| 21716 | + outer: |
|---|
| 21717 | + for(var i = 0; i < tokens1.length; i++) { |
|---|
| 21718 | + var token = tokens1[i]; |
|---|
| 21719 | + for(var j = 0; j < tokens2.length; j++) { |
|---|
| 21720 | + if(token == tokens2[j]) continue outer; |
|---|
| 21721 | + } |
|---|
| 21722 | + values.push(token); |
|---|
| 21723 | + } |
|---|
| 21724 | + return values; |
|---|
| 21725 | + } |
|---|
| 21726 | + |
|---|
| 21727 | + function arrayClasses (classVal) { |
|---|
| 21728 | + if (isArray(classVal)) { |
|---|
| 21729 | + return classVal; |
|---|
| 21730 | + } else if (isString(classVal)) { |
|---|
| 21731 | + return classVal.split(' '); |
|---|
| 21732 | + } else if (isObject(classVal)) { |
|---|
| 21733 | + var classes = [], i = 0; |
|---|
| 21734 | + forEach(classVal, function(v, k) { |
|---|
| 21735 | + if (v) { |
|---|
| 21736 | + classes = classes.concat(k.split(' ')); |
|---|
| 21737 | + } |
|---|
| 21738 | + }); |
|---|
| 21739 | + return classes; |
|---|
| 21740 | + } |
|---|
| 21741 | + return classVal; |
|---|
| 21742 | + } |
|---|
| 21743 | + }]; |
|---|
| 21744 | +} |
|---|
| 21745 | + |
|---|
| 21746 | +/** |
|---|
| 21747 | + * @ngdoc directive |
|---|
| 21748 | + * @name ngClass |
|---|
| 21749 | + * @restrict AC |
|---|
| 21750 | + * |
|---|
| 21751 | + * @description |
|---|
| 21752 | + * The `ngClass` directive allows you to dynamically set CSS classes on an HTML element by databinding |
|---|
| 21753 | + * an expression that represents all classes to be added. |
|---|
| 21754 | + * |
|---|
| 21755 | + * The directive operates in three different ways, depending on which of three types the expression |
|---|
| 21756 | + * evaluates to: |
|---|
| 21757 | + * |
|---|
| 21758 | + * 1. If the expression evaluates to a string, the string should be one or more space-delimited class |
|---|
| 21759 | + * names. |
|---|
| 21760 | + * |
|---|
| 21761 | + * 2. If the expression evaluates to an array, each element of the array should be a string that is |
|---|
| 21762 | + * one or more space-delimited class names. |
|---|
| 21763 | + * |
|---|
| 21764 | + * 3. If the expression evaluates to an object, then for each key-value pair of the |
|---|
| 21765 | + * object with a truthy value the corresponding key is used as a class name. |
|---|
| 21766 | + * |
|---|
| 21767 | + * The directive won't add duplicate classes if a particular class was already set. |
|---|
| 21768 | + * |
|---|
| 21769 | + * When the expression changes, the previously added classes are removed and only then the |
|---|
| 21770 | + * new classes are added. |
|---|
| 21771 | + * |
|---|
| 21772 | + * @animations |
|---|
| 21773 | + * add - happens just before the class is applied to the element |
|---|
| 21774 | + * remove - happens just before the class is removed from the element |
|---|
| 21775 | + * |
|---|
| 21776 | + * @element ANY |
|---|
| 21777 | + * @param {expression} ngClass {@link guide/expression Expression} to eval. The result |
|---|
| 21778 | + * of the evaluation can be a string representing space delimited class |
|---|
| 21779 | + * names, an array, or a map of class names to boolean values. In the case of a map, the |
|---|
| 21780 | + * names of the properties whose values are truthy will be added as css classes to the |
|---|
| 21781 | + * element. |
|---|
| 21782 | + * |
|---|
| 21783 | + * @example Example that demonstrates basic bindings via ngClass directive. |
|---|
| 21784 | + <example> |
|---|
| 21785 | + <file name="index.html"> |
|---|
| 21786 | + <p ng-class="{strike: deleted, bold: important, red: error}">Map Syntax Example</p> |
|---|
| 21787 | + <input type="checkbox" ng-model="deleted"> deleted (apply "strike" class)<br> |
|---|
| 21788 | + <input type="checkbox" ng-model="important"> important (apply "bold" class)<br> |
|---|
| 21789 | + <input type="checkbox" ng-model="error"> error (apply "red" class) |
|---|
| 21790 | + <hr> |
|---|
| 21791 | + <p ng-class="style">Using String Syntax</p> |
|---|
| 21792 | + <input type="text" ng-model="style" placeholder="Type: bold strike red"> |
|---|
| 21793 | + <hr> |
|---|
| 21794 | + <p ng-class="[style1, style2, style3]">Using Array Syntax</p> |
|---|
| 21795 | + <input ng-model="style1" placeholder="Type: bold, strike or red"><br> |
|---|
| 21796 | + <input ng-model="style2" placeholder="Type: bold, strike or red"><br> |
|---|
| 21797 | + <input ng-model="style3" placeholder="Type: bold, strike or red"><br> |
|---|
| 21798 | + </file> |
|---|
| 21799 | + <file name="style.css"> |
|---|
| 21800 | + .strike { |
|---|
| 21801 | + text-decoration: line-through; |
|---|
| 21802 | + } |
|---|
| 21803 | + .bold { |
|---|
| 21804 | + font-weight: bold; |
|---|
| 21805 | + } |
|---|
| 21806 | + .red { |
|---|
| 21807 | + color: red; |
|---|
| 21808 | + } |
|---|
| 21809 | + </file> |
|---|
| 21810 | + <file name="protractor.js" type="protractor"> |
|---|
| 21811 | + var ps = element.all(by.css('p')); |
|---|
| 21812 | + |
|---|
| 21813 | + it('should let you toggle the class', function() { |
|---|
| 21814 | + |
|---|
| 21815 | + expect(ps.first().getAttribute('class')).not.toMatch(/bold/); |
|---|
| 21816 | + expect(ps.first().getAttribute('class')).not.toMatch(/red/); |
|---|
| 21817 | + |
|---|
| 21818 | + element(by.model('important')).click(); |
|---|
| 21819 | + expect(ps.first().getAttribute('class')).toMatch(/bold/); |
|---|
| 21820 | + |
|---|
| 21821 | + element(by.model('error')).click(); |
|---|
| 21822 | + expect(ps.first().getAttribute('class')).toMatch(/red/); |
|---|
| 21823 | + }); |
|---|
| 21824 | + |
|---|
| 21825 | + it('should let you toggle string example', function() { |
|---|
| 21826 | + expect(ps.get(1).getAttribute('class')).toBe(''); |
|---|
| 21827 | + element(by.model('style')).clear(); |
|---|
| 21828 | + element(by.model('style')).sendKeys('red'); |
|---|
| 21829 | + expect(ps.get(1).getAttribute('class')).toBe('red'); |
|---|
| 21830 | + }); |
|---|
| 21831 | + |
|---|
| 21832 | + it('array example should have 3 classes', function() { |
|---|
| 21833 | + expect(ps.last().getAttribute('class')).toBe(''); |
|---|
| 21834 | + element(by.model('style1')).sendKeys('bold'); |
|---|
| 21835 | + element(by.model('style2')).sendKeys('strike'); |
|---|
| 21836 | + element(by.model('style3')).sendKeys('red'); |
|---|
| 21837 | + expect(ps.last().getAttribute('class')).toBe('bold strike red'); |
|---|
| 21838 | + }); |
|---|
| 21839 | + </file> |
|---|
| 21840 | + </example> |
|---|
| 21841 | + |
|---|
| 21842 | + ## Animations |
|---|
| 21843 | + |
|---|
| 21844 | + The example below demonstrates how to perform animations using ngClass. |
|---|
| 21845 | + |
|---|
| 21846 | + <example module="ngAnimate" deps="angular-animate.js" animations="true"> |
|---|
| 21847 | + <file name="index.html"> |
|---|
| 21848 | + <input id="setbtn" type="button" value="set" ng-click="myVar='my-class'"> |
|---|
| 21849 | + <input id="clearbtn" type="button" value="clear" ng-click="myVar=''"> |
|---|
| 21850 | + <br> |
|---|
| 21851 | + <span class="base-class" ng-class="myVar">Sample Text</span> |
|---|
| 21852 | + </file> |
|---|
| 21853 | + <file name="style.css"> |
|---|
| 21854 | + .base-class { |
|---|
| 21855 | + -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; |
|---|
| 21856 | + transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; |
|---|
| 21857 | + } |
|---|
| 21858 | + |
|---|
| 21859 | + .base-class.my-class { |
|---|
| 21860 | + color: red; |
|---|
| 21861 | + font-size:3em; |
|---|
| 21862 | + } |
|---|
| 21863 | + </file> |
|---|
| 21864 | + <file name="protractor.js" type="protractor"> |
|---|
| 21865 | + it('should check ng-class', function() { |
|---|
| 21866 | + expect(element(by.css('.base-class')).getAttribute('class')).not. |
|---|
| 21867 | + toMatch(/my-class/); |
|---|
| 21868 | + |
|---|
| 21869 | + element(by.id('setbtn')).click(); |
|---|
| 21870 | + |
|---|
| 21871 | + expect(element(by.css('.base-class')).getAttribute('class')). |
|---|
| 21872 | + toMatch(/my-class/); |
|---|
| 21873 | + |
|---|
| 21874 | + element(by.id('clearbtn')).click(); |
|---|
| 21875 | + |
|---|
| 21876 | + expect(element(by.css('.base-class')).getAttribute('class')).not. |
|---|
| 21877 | + toMatch(/my-class/); |
|---|
| 21878 | + }); |
|---|
| 21879 | + </file> |
|---|
| 21880 | + </example> |
|---|
| 21881 | + |
|---|
| 21882 | + |
|---|
| 21883 | + ## ngClass and pre-existing CSS3 Transitions/Animations |
|---|
| 21884 | + The ngClass directive still supports CSS3 Transitions/Animations even if they do not follow the ngAnimate CSS naming structure. |
|---|
| 21885 | + Upon animation ngAnimate will apply supplementary CSS classes to track the start and end of an animation, but this will not hinder |
|---|
| 21886 | + any pre-existing CSS transitions already on the element. To get an idea of what happens during a class-based animation, be sure |
|---|
| 21887 | + to view the step by step details of {@link ng.$animate#addClass $animate.addClass} and |
|---|
| 21888 | + {@link ng.$animate#removeClass $animate.removeClass}. |
|---|
| 21889 | + */ |
|---|
| 21890 | +var ngClassDirective = classDirective('', true); |
|---|
| 21891 | + |
|---|
| 21892 | +/** |
|---|
| 21893 | + * @ngdoc directive |
|---|
| 21894 | + * @name ngClassOdd |
|---|
| 21895 | + * @restrict AC |
|---|
| 21896 | + * |
|---|
| 21897 | + * @description |
|---|
| 21898 | + * The `ngClassOdd` and `ngClassEven` directives work exactly as |
|---|
| 21899 | + * {@link ng.directive:ngClass ngClass}, except they work in |
|---|
| 21900 | + * conjunction with `ngRepeat` and take effect only on odd (even) rows. |
|---|
| 21901 | + * |
|---|
| 21902 | + * This directive can be applied only within the scope of an |
|---|
| 21903 | + * {@link ng.directive:ngRepeat ngRepeat}. |
|---|
| 21904 | + * |
|---|
| 21905 | + * @element ANY |
|---|
| 21906 | + * @param {expression} ngClassOdd {@link guide/expression Expression} to eval. The result |
|---|
| 21907 | + * of the evaluation can be a string representing space delimited class names or an array. |
|---|
| 21908 | + * |
|---|
| 21909 | + * @example |
|---|
| 21910 | + <example> |
|---|
| 21911 | + <file name="index.html"> |
|---|
| 21912 | + <ol ng-init="names=['John', 'Mary', 'Cate', 'Suz']"> |
|---|
| 21913 | + <li ng-repeat="name in names"> |
|---|
| 21914 | + <span ng-class-odd="'odd'" ng-class-even="'even'"> |
|---|
| 21915 | + {{name}} |
|---|
| 21916 | + </span> |
|---|
| 21917 | + </li> |
|---|
| 21918 | + </ol> |
|---|
| 21919 | + </file> |
|---|
| 21920 | + <file name="style.css"> |
|---|
| 21921 | + .odd { |
|---|
| 21922 | + color: red; |
|---|
| 21923 | + } |
|---|
| 21924 | + .even { |
|---|
| 21925 | + color: blue; |
|---|
| 21926 | + } |
|---|
| 21927 | + </file> |
|---|
| 21928 | + <file name="protractor.js" type="protractor"> |
|---|
| 21929 | + it('should check ng-class-odd and ng-class-even', function() { |
|---|
| 21930 | + expect(element(by.repeater('name in names').row(0).column('name')).getAttribute('class')). |
|---|
| 21931 | + toMatch(/odd/); |
|---|
| 21932 | + expect(element(by.repeater('name in names').row(1).column('name')).getAttribute('class')). |
|---|
| 21933 | + toMatch(/even/); |
|---|
| 21934 | + }); |
|---|
| 21935 | + </file> |
|---|
| 21936 | + </example> |
|---|
| 21937 | + */ |
|---|
| 21938 | +var ngClassOddDirective = classDirective('Odd', 0); |
|---|
| 21939 | + |
|---|
| 21940 | +/** |
|---|
| 21941 | + * @ngdoc directive |
|---|
| 21942 | + * @name ngClassEven |
|---|
| 21943 | + * @restrict AC |
|---|
| 21944 | + * |
|---|
| 21945 | + * @description |
|---|
| 21946 | + * The `ngClassOdd` and `ngClassEven` directives work exactly as |
|---|
| 21947 | + * {@link ng.directive:ngClass ngClass}, except they work in |
|---|
| 21948 | + * conjunction with `ngRepeat` and take effect only on odd (even) rows. |
|---|
| 21949 | + * |
|---|
| 21950 | + * This directive can be applied only within the scope of an |
|---|
| 21951 | + * {@link ng.directive:ngRepeat ngRepeat}. |
|---|
| 21952 | + * |
|---|
| 21953 | + * @element ANY |
|---|
| 21954 | + * @param {expression} ngClassEven {@link guide/expression Expression} to eval. The |
|---|
| 21955 | + * result of the evaluation can be a string representing space delimited class names or an array. |
|---|
| 21956 | + * |
|---|
| 21957 | + * @example |
|---|
| 21958 | + <example> |
|---|
| 21959 | + <file name="index.html"> |
|---|
| 21960 | + <ol ng-init="names=['John', 'Mary', 'Cate', 'Suz']"> |
|---|
| 21961 | + <li ng-repeat="name in names"> |
|---|
| 21962 | + <span ng-class-odd="'odd'" ng-class-even="'even'"> |
|---|
| 21963 | + {{name}} |
|---|
| 21964 | + </span> |
|---|
| 21965 | + </li> |
|---|
| 21966 | + </ol> |
|---|
| 21967 | + </file> |
|---|
| 21968 | + <file name="style.css"> |
|---|
| 21969 | + .odd { |
|---|
| 21970 | + color: red; |
|---|
| 21971 | + } |
|---|
| 21972 | + .even { |
|---|
| 21973 | + color: blue; |
|---|
| 21974 | + } |
|---|
| 21975 | + </file> |
|---|
| 21976 | + <file name="protractor.js" type="protractor"> |
|---|
| 21977 | + it('should check ng-class-odd and ng-class-even', function() { |
|---|
| 21978 | + expect(element(by.repeater('name in names').row(0).column('name')).getAttribute('class')). |
|---|
| 21979 | + toMatch(/odd/); |
|---|
| 21980 | + expect(element(by.repeater('name in names').row(1).column('name')).getAttribute('class')). |
|---|
| 21981 | + toMatch(/even/); |
|---|
| 21982 | + }); |
|---|
| 21983 | + </file> |
|---|
| 21984 | + </example> |
|---|
| 21985 | + */ |
|---|
| 21986 | +var ngClassEvenDirective = classDirective('Even', 1); |
|---|
| 21987 | + |
|---|
| 21988 | +/** |
|---|
| 21989 | + * @ngdoc directive |
|---|
| 21990 | + * @name ngCloak |
|---|
| 21991 | + * @restrict AC |
|---|
| 21992 | + * |
|---|
| 21993 | + * @description |
|---|
| 21994 | + * The `ngCloak` directive is used to prevent the Angular html template from being briefly |
|---|
| 21995 | + * displayed by the browser in its raw (uncompiled) form while your application is loading. Use this |
|---|
| 21996 | + * directive to avoid the undesirable flicker effect caused by the html template display. |
|---|
| 21997 | + * |
|---|
| 21998 | + * The directive can be applied to the `<body>` element, but the preferred usage is to apply |
|---|
| 21999 | + * multiple `ngCloak` directives to small portions of the page to permit progressive rendering |
|---|
| 22000 | + * of the browser view. |
|---|
| 22001 | + * |
|---|
| 22002 | + * `ngCloak` works in cooperation with the following css rule embedded within `angular.js` and |
|---|
| 22003 | + * `angular.min.js`. |
|---|
| 22004 | + * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}). |
|---|
| 22005 | + * |
|---|
| 22006 | + * ```css |
|---|
| 22007 | + * [ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak { |
|---|
| 22008 | + * display: none !important; |
|---|
| 22009 | + * } |
|---|
| 22010 | + * ``` |
|---|
| 22011 | + * |
|---|
| 22012 | + * When this css rule is loaded by the browser, all html elements (including their children) that |
|---|
| 22013 | + * are tagged with the `ngCloak` directive are hidden. When Angular encounters this directive |
|---|
| 22014 | + * during the compilation of the template it deletes the `ngCloak` element attribute, making |
|---|
| 22015 | + * the compiled element visible. |
|---|
| 22016 | + * |
|---|
| 22017 | + * For the best result, the `angular.js` script must be loaded in the head section of the html |
|---|
| 22018 | + * document; alternatively, the css rule above must be included in the external stylesheet of the |
|---|
| 22019 | + * application. |
|---|
| 22020 | + * |
|---|
| 22021 | + * Legacy browsers, like IE7, do not provide attribute selector support (added in CSS 2.1) so they |
|---|
| 22022 | + * cannot match the `[ng\:cloak]` selector. To work around this limitation, you must add the css |
|---|
| 22023 | + * class `ng-cloak` in addition to the `ngCloak` directive as shown in the example below. |
|---|
| 22024 | + * |
|---|
| 22025 | + * @element ANY |
|---|
| 22026 | + * |
|---|
| 22027 | + * @example |
|---|
| 22028 | + <example> |
|---|
| 22029 | + <file name="index.html"> |
|---|
| 22030 | + <div id="template1" ng-cloak>{{ 'hello' }}</div> |
|---|
| 22031 | + <div id="template2" ng-cloak class="ng-cloak">{{ 'hello IE7' }}</div> |
|---|
| 22032 | + </file> |
|---|
| 22033 | + <file name="protractor.js" type="protractor"> |
|---|
| 22034 | + it('should remove the template directive and css class', function() { |
|---|
| 22035 | + expect($('#template1').getAttribute('ng-cloak')). |
|---|
| 22036 | + toBeNull(); |
|---|
| 22037 | + expect($('#template2').getAttribute('ng-cloak')). |
|---|
| 22038 | + toBeNull(); |
|---|
| 22039 | + }); |
|---|
| 22040 | + </file> |
|---|
| 22041 | + </example> |
|---|
| 22042 | + * |
|---|
| 22043 | + */ |
|---|
| 22044 | +var ngCloakDirective = ngDirective({ |
|---|
| 22045 | + compile: function(element, attr) { |
|---|
| 22046 | + attr.$set('ngCloak', undefined); |
|---|
| 22047 | + element.removeClass('ng-cloak'); |
|---|
| 22048 | + } |
|---|
| 22049 | +}); |
|---|
| 22050 | + |
|---|
| 22051 | +/** |
|---|
| 22052 | + * @ngdoc directive |
|---|
| 22053 | + * @name ngController |
|---|
| 22054 | + * |
|---|
| 22055 | + * @description |
|---|
| 22056 | + * The `ngController` directive attaches a controller class to the view. This is a key aspect of how angular |
|---|
| 22057 | + * supports the principles behind the Model-View-Controller design pattern. |
|---|
| 22058 | + * |
|---|
| 22059 | + * MVC components in angular: |
|---|
| 22060 | + * |
|---|
| 22061 | + * * Model — Models are the properties of a scope; scopes are attached to the DOM where scope properties |
|---|
| 22062 | + * are accessed through bindings. |
|---|
| 22063 | + * * View — The template (HTML with data bindings) that is rendered into the View. |
|---|
| 22064 | + * * Controller — The `ngController` directive specifies a Controller class; the class contains business |
|---|
| 22065 | + * logic behind the application to decorate the scope with functions and values |
|---|
| 22066 | + * |
|---|
| 22067 | + * Note that you can also attach controllers to the DOM by declaring it in a route definition |
|---|
| 22068 | + * via the {@link ngRoute.$route $route} service. A common mistake is to declare the controller |
|---|
| 22069 | + * again using `ng-controller` in the template itself. This will cause the controller to be attached |
|---|
| 22070 | + * and executed twice. |
|---|
| 22071 | + * |
|---|
| 22072 | + * @element ANY |
|---|
| 22073 | + * @scope |
|---|
| 22074 | + * @priority 500 |
|---|
| 22075 | + * @param {expression} ngController Name of a constructor function registered with the current |
|---|
| 22076 | + * {@link ng.$controllerProvider $controllerProvider} or an {@link guide/expression expression} |
|---|
| 22077 | + * that on the current scope evaluates to a constructor function. |
|---|
| 22078 | + * |
|---|
| 22079 | + * The controller instance can be published into a scope property by specifying |
|---|
| 22080 | + * `ng-controller="as propertyName"`. |
|---|
| 22081 | + * |
|---|
| 22082 | + * If the current `$controllerProvider` is configured to use globals (via |
|---|
| 22083 | + * {@link ng.$controllerProvider#allowGlobals `$controllerProvider.allowGlobals()` }), this may |
|---|
| 22084 | + * also be the name of a globally accessible constructor function (not recommended). |
|---|
| 22085 | + * |
|---|
| 22086 | + * @example |
|---|
| 22087 | + * Here is a simple form for editing user contact information. Adding, removing, clearing, and |
|---|
| 22088 | + * greeting are methods declared on the controller (see source tab). These methods can |
|---|
| 22089 | + * easily be called from the angular markup. Any changes to the data are automatically reflected |
|---|
| 22090 | + * in the View without the need for a manual update. |
|---|
| 22091 | + * |
|---|
| 22092 | + * Two different declaration styles are included below: |
|---|
| 22093 | + * |
|---|
| 22094 | + * * one binds methods and properties directly onto the controller using `this`: |
|---|
| 22095 | + * `ng-controller="SettingsController1 as settings"` |
|---|
| 22096 | + * * one injects `$scope` into the controller: |
|---|
| 22097 | + * `ng-controller="SettingsController2"` |
|---|
| 22098 | + * |
|---|
| 22099 | + * The second option is more common in the Angular community, and is generally used in boilerplates |
|---|
| 22100 | + * and in this guide. However, there are advantages to binding properties directly to the controller |
|---|
| 22101 | + * and avoiding scope. |
|---|
| 22102 | + * |
|---|
| 22103 | + * * Using `controller as` makes it obvious which controller you are accessing in the template when |
|---|
| 22104 | + * multiple controllers apply to an element. |
|---|
| 22105 | + * * If you are writing your controllers as classes you have easier access to the properties and |
|---|
| 22106 | + * methods, which will appear on the scope, from inside the controller code. |
|---|
| 22107 | + * * Since there is always a `.` in the bindings, you don't have to worry about prototypal |
|---|
| 22108 | + * inheritance masking primitives. |
|---|
| 22109 | + * |
|---|
| 22110 | + * This example demonstrates the `controller as` syntax. |
|---|
| 22111 | + * |
|---|
| 22112 | + * <example name="ngControllerAs" module="controllerAsExample"> |
|---|
| 22113 | + * <file name="index.html"> |
|---|
| 22114 | + * <div id="ctrl-as-exmpl" ng-controller="SettingsController1 as settings"> |
|---|
| 22115 | + * Name: <input type="text" ng-model="settings.name"/> |
|---|
| 22116 | + * [ <a href="" ng-click="settings.greet()">greet</a> ]<br/> |
|---|
| 22117 | + * Contact: |
|---|
| 22118 | + * <ul> |
|---|
| 22119 | + * <li ng-repeat="contact in settings.contacts"> |
|---|
| 22120 | + * <select ng-model="contact.type"> |
|---|
| 22121 | + * <option>phone</option> |
|---|
| 22122 | + * <option>email</option> |
|---|
| 22123 | + * </select> |
|---|
| 22124 | + * <input type="text" ng-model="contact.value"/> |
|---|
| 22125 | + * [ <a href="" ng-click="settings.clearContact(contact)">clear</a> |
|---|
| 22126 | + * | <a href="" ng-click="settings.removeContact(contact)">X</a> ] |
|---|
| 22127 | + * </li> |
|---|
| 22128 | + * <li>[ <a href="" ng-click="settings.addContact()">add</a> ]</li> |
|---|
| 22129 | + * </ul> |
|---|
| 22130 | + * </div> |
|---|
| 22131 | + * </file> |
|---|
| 22132 | + * <file name="app.js"> |
|---|
| 22133 | + * angular.module('controllerAsExample', []) |
|---|
| 22134 | + * .controller('SettingsController1', SettingsController1); |
|---|
| 22135 | + * |
|---|
| 22136 | + * function SettingsController1() { |
|---|
| 22137 | + * this.name = "John Smith"; |
|---|
| 22138 | + * this.contacts = [ |
|---|
| 22139 | + * {type: 'phone', value: '408 555 1212'}, |
|---|
| 22140 | + * {type: 'email', value: 'john.smith@example.org'} ]; |
|---|
| 22141 | + * } |
|---|
| 22142 | + * |
|---|
| 22143 | + * SettingsController1.prototype.greet = function() { |
|---|
| 22144 | + * alert(this.name); |
|---|
| 22145 | + * }; |
|---|
| 22146 | + * |
|---|
| 22147 | + * SettingsController1.prototype.addContact = function() { |
|---|
| 22148 | + * this.contacts.push({type: 'email', value: 'yourname@example.org'}); |
|---|
| 22149 | + * }; |
|---|
| 22150 | + * |
|---|
| 22151 | + * SettingsController1.prototype.removeContact = function(contactToRemove) { |
|---|
| 22152 | + * var index = this.contacts.indexOf(contactToRemove); |
|---|
| 22153 | + * this.contacts.splice(index, 1); |
|---|
| 22154 | + * }; |
|---|
| 22155 | + * |
|---|
| 22156 | + * SettingsController1.prototype.clearContact = function(contact) { |
|---|
| 22157 | + * contact.type = 'phone'; |
|---|
| 22158 | + * contact.value = ''; |
|---|
| 22159 | + * }; |
|---|
| 22160 | + * </file> |
|---|
| 22161 | + * <file name="protractor.js" type="protractor"> |
|---|
| 22162 | + * it('should check controller as', function() { |
|---|
| 22163 | + * var container = element(by.id('ctrl-as-exmpl')); |
|---|
| 22164 | + * expect(container.element(by.model('settings.name')) |
|---|
| 22165 | + * .getAttribute('value')).toBe('John Smith'); |
|---|
| 22166 | + * |
|---|
| 22167 | + * var firstRepeat = |
|---|
| 22168 | + * container.element(by.repeater('contact in settings.contacts').row(0)); |
|---|
| 22169 | + * var secondRepeat = |
|---|
| 22170 | + * container.element(by.repeater('contact in settings.contacts').row(1)); |
|---|
| 22171 | + * |
|---|
| 22172 | + * expect(firstRepeat.element(by.model('contact.value')).getAttribute('value')) |
|---|
| 22173 | + * .toBe('408 555 1212'); |
|---|
| 22174 | + * |
|---|
| 22175 | + * expect(secondRepeat.element(by.model('contact.value')).getAttribute('value')) |
|---|
| 22176 | + * .toBe('john.smith@example.org'); |
|---|
| 22177 | + * |
|---|
| 22178 | + * firstRepeat.element(by.linkText('clear')).click(); |
|---|
| 22179 | + * |
|---|
| 22180 | + * expect(firstRepeat.element(by.model('contact.value')).getAttribute('value')) |
|---|
| 22181 | + * .toBe(''); |
|---|
| 22182 | + * |
|---|
| 22183 | + * container.element(by.linkText('add')).click(); |
|---|
| 22184 | + * |
|---|
| 22185 | + * expect(container.element(by.repeater('contact in settings.contacts').row(2)) |
|---|
| 22186 | + * .element(by.model('contact.value')) |
|---|
| 22187 | + * .getAttribute('value')) |
|---|
| 22188 | + * .toBe('yourname@example.org'); |
|---|
| 22189 | + * }); |
|---|
| 22190 | + * </file> |
|---|
| 22191 | + * </example> |
|---|
| 22192 | + * |
|---|
| 22193 | + * This example demonstrates the "attach to `$scope`" style of controller. |
|---|
| 22194 | + * |
|---|
| 22195 | + * <example name="ngController" module="controllerExample"> |
|---|
| 22196 | + * <file name="index.html"> |
|---|
| 22197 | + * <div id="ctrl-exmpl" ng-controller="SettingsController2"> |
|---|
| 22198 | + * Name: <input type="text" ng-model="name"/> |
|---|
| 22199 | + * [ <a href="" ng-click="greet()">greet</a> ]<br/> |
|---|
| 22200 | + * Contact: |
|---|
| 22201 | + * <ul> |
|---|
| 22202 | + * <li ng-repeat="contact in contacts"> |
|---|
| 22203 | + * <select ng-model="contact.type"> |
|---|
| 22204 | + * <option>phone</option> |
|---|
| 22205 | + * <option>email</option> |
|---|
| 22206 | + * </select> |
|---|
| 22207 | + * <input type="text" ng-model="contact.value"/> |
|---|
| 22208 | + * [ <a href="" ng-click="clearContact(contact)">clear</a> |
|---|
| 22209 | + * | <a href="" ng-click="removeContact(contact)">X</a> ] |
|---|
| 22210 | + * </li> |
|---|
| 22211 | + * <li>[ <a href="" ng-click="addContact()">add</a> ]</li> |
|---|
| 22212 | + * </ul> |
|---|
| 22213 | + * </div> |
|---|
| 22214 | + * </file> |
|---|
| 22215 | + * <file name="app.js"> |
|---|
| 22216 | + * angular.module('controllerExample', []) |
|---|
| 22217 | + * .controller('SettingsController2', ['$scope', SettingsController2]); |
|---|
| 22218 | + * |
|---|
| 22219 | + * function SettingsController2($scope) { |
|---|
| 22220 | + * $scope.name = "John Smith"; |
|---|
| 22221 | + * $scope.contacts = [ |
|---|
| 22222 | + * {type:'phone', value:'408 555 1212'}, |
|---|
| 22223 | + * {type:'email', value:'john.smith@example.org'} ]; |
|---|
| 22224 | + * |
|---|
| 22225 | + * $scope.greet = function() { |
|---|
| 22226 | + * alert($scope.name); |
|---|
| 22227 | + * }; |
|---|
| 22228 | + * |
|---|
| 22229 | + * $scope.addContact = function() { |
|---|
| 22230 | + * $scope.contacts.push({type:'email', value:'yourname@example.org'}); |
|---|
| 22231 | + * }; |
|---|
| 22232 | + * |
|---|
| 22233 | + * $scope.removeContact = function(contactToRemove) { |
|---|
| 22234 | + * var index = $scope.contacts.indexOf(contactToRemove); |
|---|
| 22235 | + * $scope.contacts.splice(index, 1); |
|---|
| 22236 | + * }; |
|---|
| 22237 | + * |
|---|
| 22238 | + * $scope.clearContact = function(contact) { |
|---|
| 22239 | + * contact.type = 'phone'; |
|---|
| 22240 | + * contact.value = ''; |
|---|
| 22241 | + * }; |
|---|
| 22242 | + * } |
|---|
| 22243 | + * </file> |
|---|
| 22244 | + * <file name="protractor.js" type="protractor"> |
|---|
| 22245 | + * it('should check controller', function() { |
|---|
| 22246 | + * var container = element(by.id('ctrl-exmpl')); |
|---|
| 22247 | + * |
|---|
| 22248 | + * expect(container.element(by.model('name')) |
|---|
| 22249 | + * .getAttribute('value')).toBe('John Smith'); |
|---|
| 22250 | + * |
|---|
| 22251 | + * var firstRepeat = |
|---|
| 22252 | + * container.element(by.repeater('contact in contacts').row(0)); |
|---|
| 22253 | + * var secondRepeat = |
|---|
| 22254 | + * container.element(by.repeater('contact in contacts').row(1)); |
|---|
| 22255 | + * |
|---|
| 22256 | + * expect(firstRepeat.element(by.model('contact.value')).getAttribute('value')) |
|---|
| 22257 | + * .toBe('408 555 1212'); |
|---|
| 22258 | + * expect(secondRepeat.element(by.model('contact.value')).getAttribute('value')) |
|---|
| 22259 | + * .toBe('john.smith@example.org'); |
|---|
| 22260 | + * |
|---|
| 22261 | + * firstRepeat.element(by.linkText('clear')).click(); |
|---|
| 22262 | + * |
|---|
| 22263 | + * expect(firstRepeat.element(by.model('contact.value')).getAttribute('value')) |
|---|
| 22264 | + * .toBe(''); |
|---|
| 22265 | + * |
|---|
| 22266 | + * container.element(by.linkText('add')).click(); |
|---|
| 22267 | + * |
|---|
| 22268 | + * expect(container.element(by.repeater('contact in contacts').row(2)) |
|---|
| 22269 | + * .element(by.model('contact.value')) |
|---|
| 22270 | + * .getAttribute('value')) |
|---|
| 22271 | + * .toBe('yourname@example.org'); |
|---|
| 22272 | + * }); |
|---|
| 22273 | + * </file> |
|---|
| 22274 | + *</example> |
|---|
| 22275 | + |
|---|
| 22276 | + */ |
|---|
| 22277 | +var ngControllerDirective = [function() { |
|---|
| 22278 | + return { |
|---|
| 22279 | + restrict: 'A', |
|---|
| 22280 | + scope: true, |
|---|
| 22281 | + controller: '@', |
|---|
| 22282 | + priority: 500 |
|---|
| 22283 | + }; |
|---|
| 22284 | +}]; |
|---|
| 22285 | + |
|---|
| 22286 | +/** |
|---|
| 22287 | + * @ngdoc directive |
|---|
| 22288 | + * @name ngCsp |
|---|
| 22289 | + * |
|---|
| 22290 | + * @element html |
|---|
| 22291 | + * @description |
|---|
| 22292 | + * Enables [CSP (Content Security Policy)](https://developer.mozilla.org/en/Security/CSP) support. |
|---|
| 22293 | + * |
|---|
| 22294 | + * This is necessary when developing things like Google Chrome Extensions or Universal Windows Apps. |
|---|
| 22295 | + * |
|---|
| 22296 | + * CSP forbids apps to use `eval` or `Function(string)` generated functions (among other things). |
|---|
| 22297 | + * For Angular to be CSP compatible there are only two things that we need to do differently: |
|---|
| 22298 | + * |
|---|
| 22299 | + * - don't use `Function` constructor to generate optimized value getters |
|---|
| 22300 | + * - don't inject custom stylesheet into the document |
|---|
| 22301 | + * |
|---|
| 22302 | + * AngularJS uses `Function(string)` generated functions as a speed optimization. Applying the `ngCsp` |
|---|
| 22303 | + * directive will cause Angular to use CSP compatibility mode. When this mode is on AngularJS will |
|---|
| 22304 | + * evaluate all expressions up to 30% slower than in non-CSP mode, but no security violations will |
|---|
| 22305 | + * be raised. |
|---|
| 22306 | + * |
|---|
| 22307 | + * CSP forbids JavaScript to inline stylesheet rules. In non CSP mode Angular automatically |
|---|
| 22308 | + * includes some CSS rules (e.g. {@link ng.directive:ngCloak ngCloak}). |
|---|
| 22309 | + * To make those directives work in CSP mode, include the `angular-csp.css` manually. |
|---|
| 22310 | + * |
|---|
| 22311 | + * Angular tries to autodetect if CSP is active and automatically turn on the CSP-safe mode. This |
|---|
| 22312 | + * autodetection however triggers a CSP error to be logged in the console: |
|---|
| 22313 | + * |
|---|
| 22314 | + * ``` |
|---|
| 22315 | + * Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of |
|---|
| 22316 | + * script in the following Content Security Policy directive: "default-src 'self'". Note that |
|---|
| 22317 | + * 'script-src' was not explicitly set, so 'default-src' is used as a fallback. |
|---|
| 22318 | + * ``` |
|---|
| 22319 | + * |
|---|
| 22320 | + * This error is harmless but annoying. To prevent the error from showing up, put the `ngCsp` |
|---|
| 22321 | + * directive on the root element of the application or on the `angular.js` script tag, whichever |
|---|
| 22322 | + * appears first in the html document. |
|---|
| 22323 | + * |
|---|
| 22324 | + * *Note: This directive is only available in the `ng-csp` and `data-ng-csp` attribute form.* |
|---|
| 22325 | + * |
|---|
| 22326 | + * @example |
|---|
| 22327 | + * This example shows how to apply the `ngCsp` directive to the `html` tag. |
|---|
| 22328 | + ```html |
|---|
| 22329 | + <!doctype html> |
|---|
| 22330 | + <html ng-app ng-csp> |
|---|
| 22331 | + ... |
|---|
| 22332 | + ... |
|---|
| 22333 | + </html> |
|---|
| 22334 | + ``` |
|---|
| 22335 | + * @example |
|---|
| 22336 | + // Note: the suffix `.csp` in the example name triggers |
|---|
| 22337 | + // csp mode in our http server! |
|---|
| 22338 | + <example name="example.csp" module="cspExample" ng-csp="true"> |
|---|
| 22339 | + <file name="index.html"> |
|---|
| 22340 | + <div ng-controller="MainController as ctrl"> |
|---|
| 22341 | + <div> |
|---|
| 22342 | + <button ng-click="ctrl.inc()" id="inc">Increment</button> |
|---|
| 22343 | + <span id="counter"> |
|---|
| 22344 | + {{ctrl.counter}} |
|---|
| 22345 | + </span> |
|---|
| 22346 | + </div> |
|---|
| 22347 | + |
|---|
| 22348 | + <div> |
|---|
| 22349 | + <button ng-click="ctrl.evil()" id="evil">Evil</button> |
|---|
| 22350 | + <span id="evilError"> |
|---|
| 22351 | + {{ctrl.evilError}} |
|---|
| 22352 | + </span> |
|---|
| 22353 | + </div> |
|---|
| 22354 | + </div> |
|---|
| 22355 | + </file> |
|---|
| 22356 | + <file name="script.js"> |
|---|
| 22357 | + angular.module('cspExample', []) |
|---|
| 22358 | + .controller('MainController', function() { |
|---|
| 22359 | + this.counter = 0; |
|---|
| 22360 | + this.inc = function() { |
|---|
| 22361 | + this.counter++; |
|---|
| 22362 | + }; |
|---|
| 22363 | + this.evil = function() { |
|---|
| 22364 | + // jshint evil:true |
|---|
| 22365 | + try { |
|---|
| 22366 | + eval('1+2'); |
|---|
| 22367 | + } catch (e) { |
|---|
| 22368 | + this.evilError = e.message; |
|---|
| 22369 | + } |
|---|
| 22370 | + }; |
|---|
| 22371 | + }); |
|---|
| 22372 | + </file> |
|---|
| 22373 | + <file name="protractor.js" type="protractor"> |
|---|
| 22374 | + var util, webdriver; |
|---|
| 22375 | + |
|---|
| 22376 | + var incBtn = element(by.id('inc')); |
|---|
| 22377 | + var counter = element(by.id('counter')); |
|---|
| 22378 | + var evilBtn = element(by.id('evil')); |
|---|
| 22379 | + var evilError = element(by.id('evilError')); |
|---|
| 22380 | + |
|---|
| 22381 | + function getAndClearSevereErrors() { |
|---|
| 22382 | + return browser.manage().logs().get('browser').then(function(browserLog) { |
|---|
| 22383 | + return browserLog.filter(function(logEntry) { |
|---|
| 22384 | + return logEntry.level.value > webdriver.logging.Level.WARNING.value; |
|---|
| 22385 | + }); |
|---|
| 22386 | + }); |
|---|
| 22387 | + } |
|---|
| 22388 | + |
|---|
| 22389 | + function clearErrors() { |
|---|
| 22390 | + getAndClearSevereErrors(); |
|---|
| 22391 | + } |
|---|
| 22392 | + |
|---|
| 22393 | + function expectNoErrors() { |
|---|
| 22394 | + getAndClearSevereErrors().then(function(filteredLog) { |
|---|
| 22395 | + expect(filteredLog.length).toEqual(0); |
|---|
| 22396 | + if (filteredLog.length) { |
|---|
| 22397 | + console.log('browser console errors: ' + util.inspect(filteredLog)); |
|---|
| 22398 | + } |
|---|
| 22399 | + }); |
|---|
| 22400 | + } |
|---|
| 22401 | + |
|---|
| 22402 | + function expectError(regex) { |
|---|
| 22403 | + getAndClearSevereErrors().then(function(filteredLog) { |
|---|
| 22404 | + var found = false; |
|---|
| 22405 | + filteredLog.forEach(function(log) { |
|---|
| 22406 | + if (log.message.match(regex)) { |
|---|
| 22407 | + found = true; |
|---|
| 22408 | + } |
|---|
| 22409 | + }); |
|---|
| 22410 | + if (!found) { |
|---|
| 22411 | + throw new Error('expected an error that matches ' + regex); |
|---|
| 22412 | + } |
|---|
| 22413 | + }); |
|---|
| 22414 | + } |
|---|
| 22415 | + |
|---|
| 22416 | + beforeEach(function() { |
|---|
| 22417 | + util = require('util'); |
|---|
| 22418 | + webdriver = require('protractor/node_modules/selenium-webdriver'); |
|---|
| 22419 | + }); |
|---|
| 22420 | + |
|---|
| 22421 | + // For now, we only test on Chrome, |
|---|
| 22422 | + // as Safari does not load the page with Protractor's injected scripts, |
|---|
| 22423 | + // and Firefox webdriver always disables content security policy (#6358) |
|---|
| 22424 | + if (browser.params.browser !== 'chrome') { |
|---|
| 22425 | + return; |
|---|
| 22426 | + } |
|---|
| 22427 | + |
|---|
| 22428 | + it('should not report errors when the page is loaded', function() { |
|---|
| 22429 | + // clear errors so we are not dependent on previous tests |
|---|
| 22430 | + clearErrors(); |
|---|
| 22431 | + // Need to reload the page as the page is already loaded when |
|---|
| 22432 | + // we come here |
|---|
| 22433 | + browser.driver.getCurrentUrl().then(function(url) { |
|---|
| 22434 | + browser.get(url); |
|---|
| 22435 | + }); |
|---|
| 22436 | + expectNoErrors(); |
|---|
| 22437 | + }); |
|---|
| 22438 | + |
|---|
| 22439 | + it('should evaluate expressions', function() { |
|---|
| 22440 | + expect(counter.getText()).toEqual('0'); |
|---|
| 22441 | + incBtn.click(); |
|---|
| 22442 | + expect(counter.getText()).toEqual('1'); |
|---|
| 22443 | + expectNoErrors(); |
|---|
| 22444 | + }); |
|---|
| 22445 | + |
|---|
| 22446 | + it('should throw and report an error when using "eval"', function() { |
|---|
| 22447 | + evilBtn.click(); |
|---|
| 22448 | + expect(evilError.getText()).toMatch(/Content Security Policy/); |
|---|
| 22449 | + expectError(/Content Security Policy/); |
|---|
| 22450 | + }); |
|---|
| 22451 | + </file> |
|---|
| 22452 | + </example> |
|---|
| 22453 | + */ |
|---|
| 22454 | + |
|---|
| 22455 | +// ngCsp is not implemented as a proper directive any more, because we need it be processed while we |
|---|
| 22456 | +// bootstrap the system (before $parse is instantiated), for this reason we just have |
|---|
| 22457 | +// the csp.isActive() fn that looks for ng-csp attribute anywhere in the current doc |
|---|
| 22458 | + |
|---|
| 22459 | +/** |
|---|
| 22460 | + * @ngdoc directive |
|---|
| 22461 | + * @name ngClick |
|---|
| 22462 | + * |
|---|
| 22463 | + * @description |
|---|
| 22464 | + * The ngClick directive allows you to specify custom behavior when |
|---|
| 22465 | + * an element is clicked. |
|---|
| 22466 | + * |
|---|
| 22467 | + * @element ANY |
|---|
| 22468 | + * @priority 0 |
|---|
| 22469 | + * @param {expression} ngClick {@link guide/expression Expression} to evaluate upon |
|---|
| 22470 | + * click. ({@link guide/expression#-event- Event object is available as `$event`}) |
|---|
| 22471 | + * |
|---|
| 22472 | + * @example |
|---|
| 22473 | + <example> |
|---|
| 22474 | + <file name="index.html"> |
|---|
| 22475 | + <button ng-click="count = count + 1" ng-init="count=0"> |
|---|
| 22476 | + Increment |
|---|
| 22477 | + </button> |
|---|
| 22478 | + <span> |
|---|
| 22479 | + count: {{count}} |
|---|
| 22480 | + </span> |
|---|
| 22481 | + </file> |
|---|
| 22482 | + <file name="protractor.js" type="protractor"> |
|---|
| 22483 | + it('should check ng-click', function() { |
|---|
| 22484 | + expect(element(by.binding('count')).getText()).toMatch('0'); |
|---|
| 22485 | + element(by.css('button')).click(); |
|---|
| 22486 | + expect(element(by.binding('count')).getText()).toMatch('1'); |
|---|
| 22487 | + }); |
|---|
| 22488 | + </file> |
|---|
| 22489 | + </example> |
|---|
| 22490 | + */ |
|---|
| 22491 | +/* |
|---|
| 22492 | + * A directive that allows creation of custom onclick handlers that are defined as angular |
|---|
| 22493 | + * expressions and are compiled and executed within the current scope. |
|---|
| 22494 | + * |
|---|
| 22495 | + * Events that are handled via these handler are always configured not to propagate further. |
|---|
| 22496 | + */ |
|---|
| 22497 | +var ngEventDirectives = {}; |
|---|
| 22498 | + |
|---|
| 22499 | +// For events that might fire synchronously during DOM manipulation |
|---|
| 22500 | +// we need to execute their event handlers asynchronously using $evalAsync, |
|---|
| 22501 | +// so that they are not executed in an inconsistent state. |
|---|
| 22502 | +var forceAsyncEvents = { |
|---|
| 22503 | + 'blur': true, |
|---|
| 22504 | + 'focus': true |
|---|
| 22505 | +}; |
|---|
| 22506 | +forEach( |
|---|
| 22507 | + 'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste'.split(' '), |
|---|
| 22508 | + function(eventName) { |
|---|
| 22509 | + var directiveName = directiveNormalize('ng-' + eventName); |
|---|
| 22510 | + ngEventDirectives[directiveName] = ['$parse', '$rootScope', function($parse, $rootScope) { |
|---|
| 22511 | + return { |
|---|
| 22512 | + restrict: 'A', |
|---|
| 22513 | + compile: function($element, attr) { |
|---|
| 22514 | + var fn = $parse(attr[directiveName]); |
|---|
| 22515 | + return function ngEventHandler(scope, element) { |
|---|
| 22516 | + element.on(eventName, function(event) { |
|---|
| 22517 | + var callback = function() { |
|---|
| 22518 | + fn(scope, {$event:event}); |
|---|
| 22519 | + }; |
|---|
| 22520 | + if (forceAsyncEvents[eventName] && $rootScope.$$phase) { |
|---|
| 22521 | + scope.$evalAsync(callback); |
|---|
| 22522 | + } else { |
|---|
| 22523 | + scope.$apply(callback); |
|---|
| 22524 | + } |
|---|
| 22525 | + }); |
|---|
| 22526 | + }; |
|---|
| 22527 | + } |
|---|
| 22528 | + }; |
|---|
| 22529 | + }]; |
|---|
| 22530 | + } |
|---|
| 22531 | +); |
|---|
| 22532 | + |
|---|
| 22533 | +/** |
|---|
| 22534 | + * @ngdoc directive |
|---|
| 22535 | + * @name ngDblclick |
|---|
| 22536 | + * |
|---|
| 22537 | + * @description |
|---|
| 22538 | + * The `ngDblclick` directive allows you to specify custom behavior on a dblclick event. |
|---|
| 22539 | + * |
|---|
| 22540 | + * @element ANY |
|---|
| 22541 | + * @priority 0 |
|---|
| 22542 | + * @param {expression} ngDblclick {@link guide/expression Expression} to evaluate upon |
|---|
| 22543 | + * a dblclick. (The Event object is available as `$event`) |
|---|
| 22544 | + * |
|---|
| 22545 | + * @example |
|---|
| 22546 | + <example> |
|---|
| 22547 | + <file name="index.html"> |
|---|
| 22548 | + <button ng-dblclick="count = count + 1" ng-init="count=0"> |
|---|
| 22549 | + Increment (on double click) |
|---|
| 22550 | + </button> |
|---|
| 22551 | + count: {{count}} |
|---|
| 22552 | + </file> |
|---|
| 22553 | + </example> |
|---|
| 22554 | + */ |
|---|
| 22555 | + |
|---|
| 22556 | + |
|---|
| 22557 | +/** |
|---|
| 22558 | + * @ngdoc directive |
|---|
| 22559 | + * @name ngMousedown |
|---|
| 22560 | + * |
|---|
| 22561 | + * @description |
|---|
| 22562 | + * The ngMousedown directive allows you to specify custom behavior on mousedown event. |
|---|
| 22563 | + * |
|---|
| 22564 | + * @element ANY |
|---|
| 22565 | + * @priority 0 |
|---|
| 22566 | + * @param {expression} ngMousedown {@link guide/expression Expression} to evaluate upon |
|---|
| 22567 | + * mousedown. ({@link guide/expression#-event- Event object is available as `$event`}) |
|---|
| 22568 | + * |
|---|
| 22569 | + * @example |
|---|
| 22570 | + <example> |
|---|
| 22571 | + <file name="index.html"> |
|---|
| 22572 | + <button ng-mousedown="count = count + 1" ng-init="count=0"> |
|---|
| 22573 | + Increment (on mouse down) |
|---|
| 22574 | + </button> |
|---|
| 22575 | + count: {{count}} |
|---|
| 22576 | + </file> |
|---|
| 22577 | + </example> |
|---|
| 22578 | + */ |
|---|
| 22579 | + |
|---|
| 22580 | + |
|---|
| 22581 | +/** |
|---|
| 22582 | + * @ngdoc directive |
|---|
| 22583 | + * @name ngMouseup |
|---|
| 22584 | + * |
|---|
| 22585 | + * @description |
|---|
| 22586 | + * Specify custom behavior on mouseup event. |
|---|
| 22587 | + * |
|---|
| 22588 | + * @element ANY |
|---|
| 22589 | + * @priority 0 |
|---|
| 22590 | + * @param {expression} ngMouseup {@link guide/expression Expression} to evaluate upon |
|---|
| 22591 | + * mouseup. ({@link guide/expression#-event- Event object is available as `$event`}) |
|---|
| 22592 | + * |
|---|
| 22593 | + * @example |
|---|
| 22594 | + <example> |
|---|
| 22595 | + <file name="index.html"> |
|---|
| 22596 | + <button ng-mouseup="count = count + 1" ng-init="count=0"> |
|---|
| 22597 | + Increment (on mouse up) |
|---|
| 22598 | + </button> |
|---|
| 22599 | + count: {{count}} |
|---|
| 22600 | + </file> |
|---|
| 22601 | + </example> |
|---|
| 22602 | + */ |
|---|
| 22603 | + |
|---|
| 22604 | +/** |
|---|
| 22605 | + * @ngdoc directive |
|---|
| 22606 | + * @name ngMouseover |
|---|
| 22607 | + * |
|---|
| 22608 | + * @description |
|---|
| 22609 | + * Specify custom behavior on mouseover event. |
|---|
| 22610 | + * |
|---|
| 22611 | + * @element ANY |
|---|
| 22612 | + * @priority 0 |
|---|
| 22613 | + * @param {expression} ngMouseover {@link guide/expression Expression} to evaluate upon |
|---|
| 22614 | + * mouseover. ({@link guide/expression#-event- Event object is available as `$event`}) |
|---|
| 22615 | + * |
|---|
| 22616 | + * @example |
|---|
| 22617 | + <example> |
|---|
| 22618 | + <file name="index.html"> |
|---|
| 22619 | + <button ng-mouseover="count = count + 1" ng-init="count=0"> |
|---|
| 22620 | + Increment (when mouse is over) |
|---|
| 22621 | + </button> |
|---|
| 22622 | + count: {{count}} |
|---|
| 22623 | + </file> |
|---|
| 22624 | + </example> |
|---|
| 22625 | + */ |
|---|
| 22626 | + |
|---|
| 22627 | + |
|---|
| 22628 | +/** |
|---|
| 22629 | + * @ngdoc directive |
|---|
| 22630 | + * @name ngMouseenter |
|---|
| 22631 | + * |
|---|
| 22632 | + * @description |
|---|
| 22633 | + * Specify custom behavior on mouseenter event. |
|---|
| 22634 | + * |
|---|
| 22635 | + * @element ANY |
|---|
| 22636 | + * @priority 0 |
|---|
| 22637 | + * @param {expression} ngMouseenter {@link guide/expression Expression} to evaluate upon |
|---|
| 22638 | + * mouseenter. ({@link guide/expression#-event- Event object is available as `$event`}) |
|---|
| 22639 | + * |
|---|
| 22640 | + * @example |
|---|
| 22641 | + <example> |
|---|
| 22642 | + <file name="index.html"> |
|---|
| 22643 | + <button ng-mouseenter="count = count + 1" ng-init="count=0"> |
|---|
| 22644 | + Increment (when mouse enters) |
|---|
| 22645 | + </button> |
|---|
| 22646 | + count: {{count}} |
|---|
| 22647 | + </file> |
|---|
| 22648 | + </example> |
|---|
| 22649 | + */ |
|---|
| 22650 | + |
|---|
| 22651 | + |
|---|
| 22652 | +/** |
|---|
| 22653 | + * @ngdoc directive |
|---|
| 22654 | + * @name ngMouseleave |
|---|
| 22655 | + * |
|---|
| 22656 | + * @description |
|---|
| 22657 | + * Specify custom behavior on mouseleave event. |
|---|
| 22658 | + * |
|---|
| 22659 | + * @element ANY |
|---|
| 22660 | + * @priority 0 |
|---|
| 22661 | + * @param {expression} ngMouseleave {@link guide/expression Expression} to evaluate upon |
|---|
| 22662 | + * mouseleave. ({@link guide/expression#-event- Event object is available as `$event`}) |
|---|
| 22663 | + * |
|---|
| 22664 | + * @example |
|---|
| 22665 | + <example> |
|---|
| 22666 | + <file name="index.html"> |
|---|
| 22667 | + <button ng-mouseleave="count = count + 1" ng-init="count=0"> |
|---|
| 22668 | + Increment (when mouse leaves) |
|---|
| 22669 | + </button> |
|---|
| 22670 | + count: {{count}} |
|---|
| 22671 | + </file> |
|---|
| 22672 | + </example> |
|---|
| 22673 | + */ |
|---|
| 22674 | + |
|---|
| 22675 | + |
|---|
| 22676 | +/** |
|---|
| 22677 | + * @ngdoc directive |
|---|
| 22678 | + * @name ngMousemove |
|---|
| 22679 | + * |
|---|
| 22680 | + * @description |
|---|
| 22681 | + * Specify custom behavior on mousemove event. |
|---|
| 22682 | + * |
|---|
| 22683 | + * @element ANY |
|---|
| 22684 | + * @priority 0 |
|---|
| 22685 | + * @param {expression} ngMousemove {@link guide/expression Expression} to evaluate upon |
|---|
| 22686 | + * mousemove. ({@link guide/expression#-event- Event object is available as `$event`}) |
|---|
| 22687 | + * |
|---|
| 22688 | + * @example |
|---|
| 22689 | + <example> |
|---|
| 22690 | + <file name="index.html"> |
|---|
| 22691 | + <button ng-mousemove="count = count + 1" ng-init="count=0"> |
|---|
| 22692 | + Increment (when mouse moves) |
|---|
| 22693 | + </button> |
|---|
| 22694 | + count: {{count}} |
|---|
| 22695 | + </file> |
|---|
| 22696 | + </example> |
|---|
| 22697 | + */ |
|---|
| 22698 | + |
|---|
| 22699 | + |
|---|
| 22700 | +/** |
|---|
| 22701 | + * @ngdoc directive |
|---|
| 22702 | + * @name ngKeydown |
|---|
| 22703 | + * |
|---|
| 22704 | + * @description |
|---|
| 22705 | + * Specify custom behavior on keydown event. |
|---|
| 22706 | + * |
|---|
| 22707 | + * @element ANY |
|---|
| 22708 | + * @priority 0 |
|---|
| 22709 | + * @param {expression} ngKeydown {@link guide/expression Expression} to evaluate upon |
|---|
| 22710 | + * keydown. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.) |
|---|
| 22711 | + * |
|---|
| 22712 | + * @example |
|---|
| 22713 | + <example> |
|---|
| 22714 | + <file name="index.html"> |
|---|
| 22715 | + <input ng-keydown="count = count + 1" ng-init="count=0"> |
|---|
| 22716 | + key down count: {{count}} |
|---|
| 22717 | + </file> |
|---|
| 22718 | + </example> |
|---|
| 22719 | + */ |
|---|
| 22720 | + |
|---|
| 22721 | + |
|---|
| 22722 | +/** |
|---|
| 22723 | + * @ngdoc directive |
|---|
| 22724 | + * @name ngKeyup |
|---|
| 22725 | + * |
|---|
| 22726 | + * @description |
|---|
| 22727 | + * Specify custom behavior on keyup event. |
|---|
| 22728 | + * |
|---|
| 22729 | + * @element ANY |
|---|
| 22730 | + * @priority 0 |
|---|
| 22731 | + * @param {expression} ngKeyup {@link guide/expression Expression} to evaluate upon |
|---|
| 22732 | + * keyup. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.) |
|---|
| 22733 | + * |
|---|
| 22734 | + * @example |
|---|
| 22735 | + <example> |
|---|
| 22736 | + <file name="index.html"> |
|---|
| 22737 | + <p>Typing in the input box below updates the key count</p> |
|---|
| 22738 | + <input ng-keyup="count = count + 1" ng-init="count=0"> key up count: {{count}} |
|---|
| 22739 | + |
|---|
| 22740 | + <p>Typing in the input box below updates the keycode</p> |
|---|
| 22741 | + <input ng-keyup="event=$event"> |
|---|
| 22742 | + <p>event keyCode: {{ event.keyCode }}</p> |
|---|
| 22743 | + <p>event altKey: {{ event.altKey }}</p> |
|---|
| 22744 | + </file> |
|---|
| 22745 | + </example> |
|---|
| 22746 | + */ |
|---|
| 22747 | + |
|---|
| 22748 | + |
|---|
| 22749 | +/** |
|---|
| 22750 | + * @ngdoc directive |
|---|
| 22751 | + * @name ngKeypress |
|---|
| 22752 | + * |
|---|
| 22753 | + * @description |
|---|
| 22754 | + * Specify custom behavior on keypress event. |
|---|
| 22755 | + * |
|---|
| 22756 | + * @element ANY |
|---|
| 22757 | + * @param {expression} ngKeypress {@link guide/expression Expression} to evaluate upon |
|---|
| 22758 | + * keypress. ({@link guide/expression#-event- Event object is available as `$event`} |
|---|
| 22759 | + * and can be interrogated for keyCode, altKey, etc.) |
|---|
| 22760 | + * |
|---|
| 22761 | + * @example |
|---|
| 22762 | + <example> |
|---|
| 22763 | + <file name="index.html"> |
|---|
| 22764 | + <input ng-keypress="count = count + 1" ng-init="count=0"> |
|---|
| 22765 | + key press count: {{count}} |
|---|
| 22766 | + </file> |
|---|
| 22767 | + </example> |
|---|
| 22768 | + */ |
|---|
| 22769 | + |
|---|
| 22770 | + |
|---|
| 22771 | +/** |
|---|
| 22772 | + * @ngdoc directive |
|---|
| 22773 | + * @name ngSubmit |
|---|
| 22774 | + * |
|---|
| 22775 | + * @description |
|---|
| 22776 | + * Enables binding angular expressions to onsubmit events. |
|---|
| 22777 | + * |
|---|
| 22778 | + * Additionally it prevents the default action (which for form means sending the request to the |
|---|
| 22779 | + * server and reloading the current page), but only if the form does not contain `action`, |
|---|
| 22780 | + * `data-action`, or `x-action` attributes. |
|---|
| 22781 | + * |
|---|
| 22782 | + * <div class="alert alert-warning"> |
|---|
| 22783 | + * **Warning:** Be careful not to cause "double-submission" by using both the `ngClick` and |
|---|
| 22784 | + * `ngSubmit` handlers together. See the |
|---|
| 22785 | + * {@link form#submitting-a-form-and-preventing-the-default-action `form` directive documentation} |
|---|
| 22786 | + * for a detailed discussion of when `ngSubmit` may be triggered. |
|---|
| 22787 | + * </div> |
|---|
| 22788 | + * |
|---|
| 22789 | + * @element form |
|---|
| 22790 | + * @priority 0 |
|---|
| 22791 | + * @param {expression} ngSubmit {@link guide/expression Expression} to eval. |
|---|
| 22792 | + * ({@link guide/expression#-event- Event object is available as `$event`}) |
|---|
| 22793 | + * |
|---|
| 22794 | + * @example |
|---|
| 22795 | + <example module="submitExample"> |
|---|
| 22796 | + <file name="index.html"> |
|---|
| 22797 | + <script> |
|---|
| 22798 | + angular.module('submitExample', []) |
|---|
| 22799 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 22800 | + $scope.list = []; |
|---|
| 22801 | + $scope.text = 'hello'; |
|---|
| 22802 | + $scope.submit = function() { |
|---|
| 22803 | + if ($scope.text) { |
|---|
| 22804 | + $scope.list.push(this.text); |
|---|
| 22805 | + $scope.text = ''; |
|---|
| 22806 | + } |
|---|
| 22807 | + }; |
|---|
| 22808 | + }]); |
|---|
| 22809 | + </script> |
|---|
| 22810 | + <form ng-submit="submit()" ng-controller="ExampleController"> |
|---|
| 22811 | + Enter text and hit enter: |
|---|
| 22812 | + <input type="text" ng-model="text" name="text" /> |
|---|
| 22813 | + <input type="submit" id="submit" value="Submit" /> |
|---|
| 22814 | + <pre>list={{list}}</pre> |
|---|
| 22815 | + </form> |
|---|
| 22816 | + </file> |
|---|
| 22817 | + <file name="protractor.js" type="protractor"> |
|---|
| 22818 | + it('should check ng-submit', function() { |
|---|
| 22819 | + expect(element(by.binding('list')).getText()).toBe('list=[]'); |
|---|
| 22820 | + element(by.css('#submit')).click(); |
|---|
| 22821 | + expect(element(by.binding('list')).getText()).toContain('hello'); |
|---|
| 22822 | + expect(element(by.model('text')).getAttribute('value')).toBe(''); |
|---|
| 22823 | + }); |
|---|
| 22824 | + it('should ignore empty strings', function() { |
|---|
| 22825 | + expect(element(by.binding('list')).getText()).toBe('list=[]'); |
|---|
| 22826 | + element(by.css('#submit')).click(); |
|---|
| 22827 | + element(by.css('#submit')).click(); |
|---|
| 22828 | + expect(element(by.binding('list')).getText()).toContain('hello'); |
|---|
| 22829 | + }); |
|---|
| 22830 | + </file> |
|---|
| 22831 | + </example> |
|---|
| 22832 | + */ |
|---|
| 22833 | + |
|---|
| 22834 | +/** |
|---|
| 22835 | + * @ngdoc directive |
|---|
| 22836 | + * @name ngFocus |
|---|
| 22837 | + * |
|---|
| 22838 | + * @description |
|---|
| 22839 | + * Specify custom behavior on focus event. |
|---|
| 22840 | + * |
|---|
| 22841 | + * Note: As the `focus` event is executed synchronously when calling `input.focus()` |
|---|
| 22842 | + * AngularJS executes the expression using `scope.$evalAsync` if the event is fired |
|---|
| 22843 | + * during an `$apply` to ensure a consistent state. |
|---|
| 22844 | + * |
|---|
| 22845 | + * @element window, input, select, textarea, a |
|---|
| 22846 | + * @priority 0 |
|---|
| 22847 | + * @param {expression} ngFocus {@link guide/expression Expression} to evaluate upon |
|---|
| 22848 | + * focus. ({@link guide/expression#-event- Event object is available as `$event`}) |
|---|
| 22849 | + * |
|---|
| 22850 | + * @example |
|---|
| 22851 | + * See {@link ng.directive:ngClick ngClick} |
|---|
| 22852 | + */ |
|---|
| 22853 | + |
|---|
| 22854 | +/** |
|---|
| 22855 | + * @ngdoc directive |
|---|
| 22856 | + * @name ngBlur |
|---|
| 22857 | + * |
|---|
| 22858 | + * @description |
|---|
| 22859 | + * Specify custom behavior on blur event. |
|---|
| 22860 | + * |
|---|
| 22861 | + * A [blur event](https://developer.mozilla.org/en-US/docs/Web/Events/blur) fires when |
|---|
| 22862 | + * an element has lost focus. |
|---|
| 22863 | + * |
|---|
| 22864 | + * Note: As the `blur` event is executed synchronously also during DOM manipulations |
|---|
| 22865 | + * (e.g. removing a focussed input), |
|---|
| 22866 | + * AngularJS executes the expression using `scope.$evalAsync` if the event is fired |
|---|
| 22867 | + * during an `$apply` to ensure a consistent state. |
|---|
| 22868 | + * |
|---|
| 22869 | + * @element window, input, select, textarea, a |
|---|
| 22870 | + * @priority 0 |
|---|
| 22871 | + * @param {expression} ngBlur {@link guide/expression Expression} to evaluate upon |
|---|
| 22872 | + * blur. ({@link guide/expression#-event- Event object is available as `$event`}) |
|---|
| 22873 | + * |
|---|
| 22874 | + * @example |
|---|
| 22875 | + * See {@link ng.directive:ngClick ngClick} |
|---|
| 22876 | + */ |
|---|
| 22877 | + |
|---|
| 22878 | +/** |
|---|
| 22879 | + * @ngdoc directive |
|---|
| 22880 | + * @name ngCopy |
|---|
| 22881 | + * |
|---|
| 22882 | + * @description |
|---|
| 22883 | + * Specify custom behavior on copy event. |
|---|
| 22884 | + * |
|---|
| 22885 | + * @element window, input, select, textarea, a |
|---|
| 22886 | + * @priority 0 |
|---|
| 22887 | + * @param {expression} ngCopy {@link guide/expression Expression} to evaluate upon |
|---|
| 22888 | + * copy. ({@link guide/expression#-event- Event object is available as `$event`}) |
|---|
| 22889 | + * |
|---|
| 22890 | + * @example |
|---|
| 22891 | + <example> |
|---|
| 22892 | + <file name="index.html"> |
|---|
| 22893 | + <input ng-copy="copied=true" ng-init="copied=false; value='copy me'" ng-model="value"> |
|---|
| 22894 | + copied: {{copied}} |
|---|
| 22895 | + </file> |
|---|
| 22896 | + </example> |
|---|
| 22897 | + */ |
|---|
| 22898 | + |
|---|
| 22899 | +/** |
|---|
| 22900 | + * @ngdoc directive |
|---|
| 22901 | + * @name ngCut |
|---|
| 22902 | + * |
|---|
| 22903 | + * @description |
|---|
| 22904 | + * Specify custom behavior on cut event. |
|---|
| 22905 | + * |
|---|
| 22906 | + * @element window, input, select, textarea, a |
|---|
| 22907 | + * @priority 0 |
|---|
| 22908 | + * @param {expression} ngCut {@link guide/expression Expression} to evaluate upon |
|---|
| 22909 | + * cut. ({@link guide/expression#-event- Event object is available as `$event`}) |
|---|
| 22910 | + * |
|---|
| 22911 | + * @example |
|---|
| 22912 | + <example> |
|---|
| 22913 | + <file name="index.html"> |
|---|
| 22914 | + <input ng-cut="cut=true" ng-init="cut=false; value='cut me'" ng-model="value"> |
|---|
| 22915 | + cut: {{cut}} |
|---|
| 22916 | + </file> |
|---|
| 22917 | + </example> |
|---|
| 22918 | + */ |
|---|
| 22919 | + |
|---|
| 22920 | +/** |
|---|
| 22921 | + * @ngdoc directive |
|---|
| 22922 | + * @name ngPaste |
|---|
| 22923 | + * |
|---|
| 22924 | + * @description |
|---|
| 22925 | + * Specify custom behavior on paste event. |
|---|
| 22926 | + * |
|---|
| 22927 | + * @element window, input, select, textarea, a |
|---|
| 22928 | + * @priority 0 |
|---|
| 22929 | + * @param {expression} ngPaste {@link guide/expression Expression} to evaluate upon |
|---|
| 22930 | + * paste. ({@link guide/expression#-event- Event object is available as `$event`}) |
|---|
| 22931 | + * |
|---|
| 22932 | + * @example |
|---|
| 22933 | + <example> |
|---|
| 22934 | + <file name="index.html"> |
|---|
| 22935 | + <input ng-paste="paste=true" ng-init="paste=false" placeholder='paste here'> |
|---|
| 22936 | + pasted: {{paste}} |
|---|
| 22937 | + </file> |
|---|
| 22938 | + </example> |
|---|
| 22939 | + */ |
|---|
| 22940 | + |
|---|
| 22941 | +/** |
|---|
| 22942 | + * @ngdoc directive |
|---|
| 22943 | + * @name ngIf |
|---|
| 22944 | + * @restrict A |
|---|
| 22945 | + * |
|---|
| 22946 | + * @description |
|---|
| 22947 | + * The `ngIf` directive removes or recreates a portion of the DOM tree based on an |
|---|
| 22948 | + * {expression}. If the expression assigned to `ngIf` evaluates to a false |
|---|
| 22949 | + * value then the element is removed from the DOM, otherwise a clone of the |
|---|
| 22950 | + * element is reinserted into the DOM. |
|---|
| 22951 | + * |
|---|
| 22952 | + * `ngIf` differs from `ngShow` and `ngHide` in that `ngIf` completely removes and recreates the |
|---|
| 22953 | + * element in the DOM rather than changing its visibility via the `display` css property. A common |
|---|
| 22954 | + * case when this difference is significant is when using css selectors that rely on an element's |
|---|
| 22955 | + * position within the DOM, such as the `:first-child` or `:last-child` pseudo-classes. |
|---|
| 22956 | + * |
|---|
| 22957 | + * Note that when an element is removed using `ngIf` its scope is destroyed and a new scope |
|---|
| 22958 | + * is created when the element is restored. The scope created within `ngIf` inherits from |
|---|
| 22959 | + * its parent scope using |
|---|
| 22960 | + * [prototypal inheritance](https://github.com/angular/angular.js/wiki/Understanding-Scopes#javascript-prototypal-inheritance). |
|---|
| 22961 | + * An important implication of this is if `ngModel` is used within `ngIf` to bind to |
|---|
| 22962 | + * a javascript primitive defined in the parent scope. In this case any modifications made to the |
|---|
| 22963 | + * variable within the child scope will override (hide) the value in the parent scope. |
|---|
| 22964 | + * |
|---|
| 22965 | + * Also, `ngIf` recreates elements using their compiled state. An example of this behavior |
|---|
| 22966 | + * is if an element's class attribute is directly modified after it's compiled, using something like |
|---|
| 22967 | + * jQuery's `.addClass()` method, and the element is later removed. When `ngIf` recreates the element |
|---|
| 22968 | + * the added class will be lost because the original compiled state is used to regenerate the element. |
|---|
| 22969 | + * |
|---|
| 22970 | + * Additionally, you can provide animations via the `ngAnimate` module to animate the `enter` |
|---|
| 22971 | + * and `leave` effects. |
|---|
| 22972 | + * |
|---|
| 22973 | + * @animations |
|---|
| 22974 | + * enter - happens just after the `ngIf` contents change and a new DOM element is created and injected into the `ngIf` container |
|---|
| 22975 | + * leave - happens just before the `ngIf` contents are removed from the DOM |
|---|
| 22976 | + * |
|---|
| 22977 | + * @element ANY |
|---|
| 22978 | + * @scope |
|---|
| 22979 | + * @priority 600 |
|---|
| 22980 | + * @param {expression} ngIf If the {@link guide/expression expression} is falsy then |
|---|
| 22981 | + * the element is removed from the DOM tree. If it is truthy a copy of the compiled |
|---|
| 22982 | + * element is added to the DOM tree. |
|---|
| 22983 | + * |
|---|
| 22984 | + * @example |
|---|
| 22985 | + <example module="ngAnimate" deps="angular-animate.js" animations="true"> |
|---|
| 22986 | + <file name="index.html"> |
|---|
| 22987 | + Click me: <input type="checkbox" ng-model="checked" ng-init="checked=true" /><br/> |
|---|
| 22988 | + Show when checked: |
|---|
| 22989 | + <span ng-if="checked" class="animate-if"> |
|---|
| 22990 | + This is removed when the checkbox is unchecked. |
|---|
| 22991 | + </span> |
|---|
| 22992 | + </file> |
|---|
| 22993 | + <file name="animations.css"> |
|---|
| 22994 | + .animate-if { |
|---|
| 22995 | + background:white; |
|---|
| 22996 | + border:1px solid black; |
|---|
| 22997 | + padding:10px; |
|---|
| 22998 | + } |
|---|
| 22999 | + |
|---|
| 23000 | + .animate-if.ng-enter, .animate-if.ng-leave { |
|---|
| 23001 | + -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; |
|---|
| 23002 | + transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; |
|---|
| 23003 | + } |
|---|
| 23004 | + |
|---|
| 23005 | + .animate-if.ng-enter, |
|---|
| 23006 | + .animate-if.ng-leave.ng-leave-active { |
|---|
| 23007 | + opacity:0; |
|---|
| 23008 | + } |
|---|
| 23009 | + |
|---|
| 23010 | + .animate-if.ng-leave, |
|---|
| 23011 | + .animate-if.ng-enter.ng-enter-active { |
|---|
| 23012 | + opacity:1; |
|---|
| 23013 | + } |
|---|
| 23014 | + </file> |
|---|
| 23015 | + </example> |
|---|
| 23016 | + */ |
|---|
| 23017 | +var ngIfDirective = ['$animate', function($animate) { |
|---|
| 23018 | + return { |
|---|
| 23019 | + multiElement: true, |
|---|
| 23020 | + transclude: 'element', |
|---|
| 23021 | + priority: 600, |
|---|
| 23022 | + terminal: true, |
|---|
| 23023 | + restrict: 'A', |
|---|
| 23024 | + $$tlb: true, |
|---|
| 23025 | + link: function ($scope, $element, $attr, ctrl, $transclude) { |
|---|
| 23026 | + var block, childScope, previousElements; |
|---|
| 23027 | + $scope.$watch($attr.ngIf, function ngIfWatchAction(value) { |
|---|
| 23028 | + |
|---|
| 23029 | + if (value) { |
|---|
| 23030 | + if (!childScope) { |
|---|
| 23031 | + $transclude(function (clone, newScope) { |
|---|
| 23032 | + childScope = newScope; |
|---|
| 23033 | + clone[clone.length++] = document.createComment(' end ngIf: ' + $attr.ngIf + ' '); |
|---|
| 23034 | + // Note: We only need the first/last node of the cloned nodes. |
|---|
| 23035 | + // However, we need to keep the reference to the jqlite wrapper as it might be changed later |
|---|
| 23036 | + // by a directive with templateUrl when its template arrives. |
|---|
| 23037 | + block = { |
|---|
| 23038 | + clone: clone |
|---|
| 23039 | + }; |
|---|
| 23040 | + $animate.enter(clone, $element.parent(), $element); |
|---|
| 23041 | + }); |
|---|
| 23042 | + } |
|---|
| 23043 | + } else { |
|---|
| 23044 | + if (previousElements) { |
|---|
| 23045 | + previousElements.remove(); |
|---|
| 23046 | + previousElements = null; |
|---|
| 23047 | + } |
|---|
| 23048 | + if (childScope) { |
|---|
| 23049 | + childScope.$destroy(); |
|---|
| 23050 | + childScope = null; |
|---|
| 23051 | + } |
|---|
| 23052 | + if (block) { |
|---|
| 23053 | + previousElements = getBlockNodes(block.clone); |
|---|
| 23054 | + $animate.leave(previousElements).then(function() { |
|---|
| 23055 | + previousElements = null; |
|---|
| 23056 | + }); |
|---|
| 23057 | + block = null; |
|---|
| 23058 | + } |
|---|
| 23059 | + } |
|---|
| 23060 | + }); |
|---|
| 23061 | + } |
|---|
| 23062 | + }; |
|---|
| 23063 | +}]; |
|---|
| 23064 | + |
|---|
| 23065 | +/** |
|---|
| 23066 | + * @ngdoc directive |
|---|
| 23067 | + * @name ngInclude |
|---|
| 23068 | + * @restrict ECA |
|---|
| 23069 | + * |
|---|
| 23070 | + * @description |
|---|
| 23071 | + * Fetches, compiles and includes an external HTML fragment. |
|---|
| 23072 | + * |
|---|
| 23073 | + * By default, the template URL is restricted to the same domain and protocol as the |
|---|
| 23074 | + * application document. This is done by calling {@link $sce#getTrustedResourceUrl |
|---|
| 23075 | + * $sce.getTrustedResourceUrl} on it. To load templates from other domains or protocols |
|---|
| 23076 | + * you may either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist them} or |
|---|
| 23077 | + * {@link $sce#trustAsResourceUrl wrap them} as trusted values. Refer to Angular's {@link |
|---|
| 23078 | + * ng.$sce Strict Contextual Escaping}. |
|---|
| 23079 | + * |
|---|
| 23080 | + * In addition, the browser's |
|---|
| 23081 | + * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest) |
|---|
| 23082 | + * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/) |
|---|
| 23083 | + * policy may further restrict whether the template is successfully loaded. |
|---|
| 23084 | + * For example, `ngInclude` won't work for cross-domain requests on all browsers and for `file://` |
|---|
| 23085 | + * access on some browsers. |
|---|
| 23086 | + * |
|---|
| 23087 | + * @animations |
|---|
| 23088 | + * enter - animation is used to bring new content into the browser. |
|---|
| 23089 | + * leave - animation is used to animate existing content away. |
|---|
| 23090 | + * |
|---|
| 23091 | + * The enter and leave animation occur concurrently. |
|---|
| 23092 | + * |
|---|
| 23093 | + * @scope |
|---|
| 23094 | + * @priority 400 |
|---|
| 23095 | + * |
|---|
| 23096 | + * @param {string} ngInclude|src angular expression evaluating to URL. If the source is a string constant, |
|---|
| 23097 | + * make sure you wrap it in **single** quotes, e.g. `src="'myPartialTemplate.html'"`. |
|---|
| 23098 | + * @param {string=} onload Expression to evaluate when a new partial is loaded. |
|---|
| 23099 | + * |
|---|
| 23100 | + * @param {string=} autoscroll Whether `ngInclude` should call {@link ng.$anchorScroll |
|---|
| 23101 | + * $anchorScroll} to scroll the viewport after the content is loaded. |
|---|
| 23102 | + * |
|---|
| 23103 | + * - If the attribute is not set, disable scrolling. |
|---|
| 23104 | + * - If the attribute is set without value, enable scrolling. |
|---|
| 23105 | + * - Otherwise enable scrolling only if the expression evaluates to truthy value. |
|---|
| 23106 | + * |
|---|
| 23107 | + * @example |
|---|
| 23108 | + <example module="includeExample" deps="angular-animate.js" animations="true"> |
|---|
| 23109 | + <file name="index.html"> |
|---|
| 23110 | + <div ng-controller="ExampleController"> |
|---|
| 23111 | + <select ng-model="template" ng-options="t.name for t in templates"> |
|---|
| 23112 | + <option value="">(blank)</option> |
|---|
| 23113 | + </select> |
|---|
| 23114 | + url of the template: <tt>{{template.url}}</tt> |
|---|
| 23115 | + <hr/> |
|---|
| 23116 | + <div class="slide-animate-container"> |
|---|
| 23117 | + <div class="slide-animate" ng-include="template.url"></div> |
|---|
| 23118 | + </div> |
|---|
| 23119 | + </div> |
|---|
| 23120 | + </file> |
|---|
| 23121 | + <file name="script.js"> |
|---|
| 23122 | + angular.module('includeExample', ['ngAnimate']) |
|---|
| 23123 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 23124 | + $scope.templates = |
|---|
| 23125 | + [ { name: 'template1.html', url: 'template1.html'}, |
|---|
| 23126 | + { name: 'template2.html', url: 'template2.html'} ]; |
|---|
| 23127 | + $scope.template = $scope.templates[0]; |
|---|
| 23128 | + }]); |
|---|
| 23129 | + </file> |
|---|
| 23130 | + <file name="template1.html"> |
|---|
| 23131 | + Content of template1.html |
|---|
| 23132 | + </file> |
|---|
| 23133 | + <file name="template2.html"> |
|---|
| 23134 | + Content of template2.html |
|---|
| 23135 | + </file> |
|---|
| 23136 | + <file name="animations.css"> |
|---|
| 23137 | + .slide-animate-container { |
|---|
| 23138 | + position:relative; |
|---|
| 23139 | + background:white; |
|---|
| 23140 | + border:1px solid black; |
|---|
| 23141 | + height:40px; |
|---|
| 23142 | + overflow:hidden; |
|---|
| 23143 | + } |
|---|
| 23144 | + |
|---|
| 23145 | + .slide-animate { |
|---|
| 23146 | + padding:10px; |
|---|
| 23147 | + } |
|---|
| 23148 | + |
|---|
| 23149 | + .slide-animate.ng-enter, .slide-animate.ng-leave { |
|---|
| 23150 | + -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; |
|---|
| 23151 | + transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; |
|---|
| 23152 | + |
|---|
| 23153 | + position:absolute; |
|---|
| 23154 | + top:0; |
|---|
| 23155 | + left:0; |
|---|
| 23156 | + right:0; |
|---|
| 23157 | + bottom:0; |
|---|
| 23158 | + display:block; |
|---|
| 23159 | + padding:10px; |
|---|
| 23160 | + } |
|---|
| 23161 | + |
|---|
| 23162 | + .slide-animate.ng-enter { |
|---|
| 23163 | + top:-50px; |
|---|
| 23164 | + } |
|---|
| 23165 | + .slide-animate.ng-enter.ng-enter-active { |
|---|
| 23166 | + top:0; |
|---|
| 23167 | + } |
|---|
| 23168 | + |
|---|
| 23169 | + .slide-animate.ng-leave { |
|---|
| 23170 | + top:0; |
|---|
| 23171 | + } |
|---|
| 23172 | + .slide-animate.ng-leave.ng-leave-active { |
|---|
| 23173 | + top:50px; |
|---|
| 23174 | + } |
|---|
| 23175 | + </file> |
|---|
| 23176 | + <file name="protractor.js" type="protractor"> |
|---|
| 23177 | + var templateSelect = element(by.model('template')); |
|---|
| 23178 | + var includeElem = element(by.css('[ng-include]')); |
|---|
| 23179 | + |
|---|
| 23180 | + it('should load template1.html', function() { |
|---|
| 23181 | + expect(includeElem.getText()).toMatch(/Content of template1.html/); |
|---|
| 23182 | + }); |
|---|
| 23183 | + |
|---|
| 23184 | + it('should load template2.html', function() { |
|---|
| 23185 | + if (browser.params.browser == 'firefox') { |
|---|
| 23186 | + // Firefox can't handle using selects |
|---|
| 23187 | + // See https://github.com/angular/protractor/issues/480 |
|---|
| 23188 | + return; |
|---|
| 23189 | + } |
|---|
| 23190 | + templateSelect.click(); |
|---|
| 23191 | + templateSelect.all(by.css('option')).get(2).click(); |
|---|
| 23192 | + expect(includeElem.getText()).toMatch(/Content of template2.html/); |
|---|
| 23193 | + }); |
|---|
| 23194 | + |
|---|
| 23195 | + it('should change to blank', function() { |
|---|
| 23196 | + if (browser.params.browser == 'firefox') { |
|---|
| 23197 | + // Firefox can't handle using selects |
|---|
| 23198 | + return; |
|---|
| 23199 | + } |
|---|
| 23200 | + templateSelect.click(); |
|---|
| 23201 | + templateSelect.all(by.css('option')).get(0).click(); |
|---|
| 23202 | + expect(includeElem.isPresent()).toBe(false); |
|---|
| 23203 | + }); |
|---|
| 23204 | + </file> |
|---|
| 23205 | + </example> |
|---|
| 23206 | + */ |
|---|
| 23207 | + |
|---|
| 23208 | + |
|---|
| 23209 | +/** |
|---|
| 23210 | + * @ngdoc event |
|---|
| 23211 | + * @name ngInclude#$includeContentRequested |
|---|
| 23212 | + * @eventType emit on the scope ngInclude was declared in |
|---|
| 23213 | + * @description |
|---|
| 23214 | + * Emitted every time the ngInclude content is requested. |
|---|
| 23215 | + * |
|---|
| 23216 | + * @param {Object} angularEvent Synthetic event object. |
|---|
| 23217 | + * @param {String} src URL of content to load. |
|---|
| 23218 | + */ |
|---|
| 23219 | + |
|---|
| 23220 | + |
|---|
| 23221 | +/** |
|---|
| 23222 | + * @ngdoc event |
|---|
| 23223 | + * @name ngInclude#$includeContentLoaded |
|---|
| 23224 | + * @eventType emit on the current ngInclude scope |
|---|
| 23225 | + * @description |
|---|
| 23226 | + * Emitted every time the ngInclude content is reloaded. |
|---|
| 23227 | + * |
|---|
| 23228 | + * @param {Object} angularEvent Synthetic event object. |
|---|
| 23229 | + * @param {String} src URL of content to load. |
|---|
| 23230 | + */ |
|---|
| 23231 | + |
|---|
| 23232 | + |
|---|
| 23233 | +/** |
|---|
| 23234 | + * @ngdoc event |
|---|
| 23235 | + * @name ngInclude#$includeContentError |
|---|
| 23236 | + * @eventType emit on the scope ngInclude was declared in |
|---|
| 23237 | + * @description |
|---|
| 23238 | + * Emitted when a template HTTP request yields an erronous response (status < 200 || status > 299) |
|---|
| 23239 | + * |
|---|
| 23240 | + * @param {Object} angularEvent Synthetic event object. |
|---|
| 23241 | + * @param {String} src URL of content to load. |
|---|
| 23242 | + */ |
|---|
| 23243 | +var ngIncludeDirective = ['$templateRequest', '$anchorScroll', '$animate', '$sce', |
|---|
| 23244 | + function($templateRequest, $anchorScroll, $animate, $sce) { |
|---|
| 23245 | + return { |
|---|
| 23246 | + restrict: 'ECA', |
|---|
| 23247 | + priority: 400, |
|---|
| 23248 | + terminal: true, |
|---|
| 23249 | + transclude: 'element', |
|---|
| 23250 | + controller: angular.noop, |
|---|
| 23251 | + compile: function(element, attr) { |
|---|
| 23252 | + var srcExp = attr.ngInclude || attr.src, |
|---|
| 23253 | + onloadExp = attr.onload || '', |
|---|
| 23254 | + autoScrollExp = attr.autoscroll; |
|---|
| 23255 | + |
|---|
| 23256 | + return function(scope, $element, $attr, ctrl, $transclude) { |
|---|
| 23257 | + var changeCounter = 0, |
|---|
| 23258 | + currentScope, |
|---|
| 23259 | + previousElement, |
|---|
| 23260 | + currentElement; |
|---|
| 23261 | + |
|---|
| 23262 | + var cleanupLastIncludeContent = function() { |
|---|
| 23263 | + if(previousElement) { |
|---|
| 23264 | + previousElement.remove(); |
|---|
| 23265 | + previousElement = null; |
|---|
| 23266 | + } |
|---|
| 23267 | + if(currentScope) { |
|---|
| 23268 | + currentScope.$destroy(); |
|---|
| 23269 | + currentScope = null; |
|---|
| 23270 | + } |
|---|
| 23271 | + if(currentElement) { |
|---|
| 23272 | + $animate.leave(currentElement).then(function() { |
|---|
| 23273 | + previousElement = null; |
|---|
| 23274 | + }); |
|---|
| 23275 | + previousElement = currentElement; |
|---|
| 23276 | + currentElement = null; |
|---|
| 23277 | + } |
|---|
| 23278 | + }; |
|---|
| 23279 | + |
|---|
| 23280 | + scope.$watch($sce.parseAsResourceUrl(srcExp), function ngIncludeWatchAction(src) { |
|---|
| 23281 | + var afterAnimation = function() { |
|---|
| 23282 | + if (isDefined(autoScrollExp) && (!autoScrollExp || scope.$eval(autoScrollExp))) { |
|---|
| 23283 | + $anchorScroll(); |
|---|
| 23284 | + } |
|---|
| 23285 | + }; |
|---|
| 23286 | + var thisChangeId = ++changeCounter; |
|---|
| 23287 | + |
|---|
| 23288 | + if (src) { |
|---|
| 23289 | + //set the 2nd param to true to ignore the template request error so that the inner |
|---|
| 23290 | + //contents and scope can be cleaned up. |
|---|
| 23291 | + $templateRequest(src, true).then(function(response) { |
|---|
| 23292 | + if (thisChangeId !== changeCounter) return; |
|---|
| 23293 | + var newScope = scope.$new(); |
|---|
| 23294 | + ctrl.template = response; |
|---|
| 23295 | + |
|---|
| 23296 | + // Note: This will also link all children of ng-include that were contained in the original |
|---|
| 23297 | + // html. If that content contains controllers, ... they could pollute/change the scope. |
|---|
| 23298 | + // However, using ng-include on an element with additional content does not make sense... |
|---|
| 23299 | + // Note: We can't remove them in the cloneAttchFn of $transclude as that |
|---|
| 23300 | + // function is called before linking the content, which would apply child |
|---|
| 23301 | + // directives to non existing elements. |
|---|
| 23302 | + var clone = $transclude(newScope, function(clone) { |
|---|
| 23303 | + cleanupLastIncludeContent(); |
|---|
| 23304 | + $animate.enter(clone, null, $element).then(afterAnimation); |
|---|
| 23305 | + }); |
|---|
| 23306 | + |
|---|
| 23307 | + currentScope = newScope; |
|---|
| 23308 | + currentElement = clone; |
|---|
| 23309 | + |
|---|
| 23310 | + currentScope.$emit('$includeContentLoaded', src); |
|---|
| 23311 | + scope.$eval(onloadExp); |
|---|
| 23312 | + }, function() { |
|---|
| 23313 | + if (thisChangeId === changeCounter) { |
|---|
| 23314 | + cleanupLastIncludeContent(); |
|---|
| 23315 | + scope.$emit('$includeContentError', src); |
|---|
| 23316 | + } |
|---|
| 23317 | + }); |
|---|
| 23318 | + scope.$emit('$includeContentRequested', src); |
|---|
| 23319 | + } else { |
|---|
| 23320 | + cleanupLastIncludeContent(); |
|---|
| 23321 | + ctrl.template = null; |
|---|
| 23322 | + } |
|---|
| 23323 | + }); |
|---|
| 23324 | + }; |
|---|
| 23325 | + } |
|---|
| 23326 | + }; |
|---|
| 23327 | +}]; |
|---|
| 23328 | + |
|---|
| 23329 | +// This directive is called during the $transclude call of the first `ngInclude` directive. |
|---|
| 23330 | +// It will replace and compile the content of the element with the loaded template. |
|---|
| 23331 | +// We need this directive so that the element content is already filled when |
|---|
| 23332 | +// the link function of another directive on the same element as ngInclude |
|---|
| 23333 | +// is called. |
|---|
| 23334 | +var ngIncludeFillContentDirective = ['$compile', |
|---|
| 23335 | + function($compile) { |
|---|
| 23336 | + return { |
|---|
| 23337 | + restrict: 'ECA', |
|---|
| 23338 | + priority: -400, |
|---|
| 23339 | + require: 'ngInclude', |
|---|
| 23340 | + link: function(scope, $element, $attr, ctrl) { |
|---|
| 23341 | + if (/SVG/.test($element[0].toString())) { |
|---|
| 23342 | + // WebKit: https://bugs.webkit.org/show_bug.cgi?id=135698 --- SVG elements do not |
|---|
| 23343 | + // support innerHTML, so detect this here and try to generate the contents |
|---|
| 23344 | + // specially. |
|---|
| 23345 | + $element.empty(); |
|---|
| 23346 | + $compile(jqLiteBuildFragment(ctrl.template, document).childNodes)(scope, |
|---|
| 23347 | + function namespaceAdaptedClone(clone) { |
|---|
| 23348 | + $element.append(clone); |
|---|
| 23349 | + }, undefined, undefined, $element); |
|---|
| 23350 | + return; |
|---|
| 23351 | + } |
|---|
| 23352 | + |
|---|
| 23353 | + $element.html(ctrl.template); |
|---|
| 23354 | + $compile($element.contents())(scope); |
|---|
| 23355 | + } |
|---|
| 23356 | + }; |
|---|
| 23357 | + }]; |
|---|
| 23358 | + |
|---|
| 23359 | +/** |
|---|
| 23360 | + * @ngdoc directive |
|---|
| 23361 | + * @name ngInit |
|---|
| 23362 | + * @restrict AC |
|---|
| 23363 | + * |
|---|
| 23364 | + * @description |
|---|
| 23365 | + * The `ngInit` directive allows you to evaluate an expression in the |
|---|
| 23366 | + * current scope. |
|---|
| 23367 | + * |
|---|
| 23368 | + * <div class="alert alert-error"> |
|---|
| 23369 | + * The only appropriate use of `ngInit` is for aliasing special properties of |
|---|
| 23370 | + * {@link ng.directive:ngRepeat `ngRepeat`}, as seen in the demo below. Besides this case, you |
|---|
| 23371 | + * should use {@link guide/controller controllers} rather than `ngInit` |
|---|
| 23372 | + * to initialize values on a scope. |
|---|
| 23373 | + * </div> |
|---|
| 23374 | + * <div class="alert alert-warning"> |
|---|
| 23375 | + * **Note**: If you have assignment in `ngInit` along with {@link ng.$filter `$filter`}, make |
|---|
| 23376 | + * sure you have parenthesis for correct precedence: |
|---|
| 23377 | + * <pre class="prettyprint"> |
|---|
| 23378 | + * <div ng-init="test1 = (data | orderBy:'name')"></div> |
|---|
| 23379 | + * </pre> |
|---|
| 23380 | + * </div> |
|---|
| 23381 | + * |
|---|
| 23382 | + * @priority 450 |
|---|
| 23383 | + * |
|---|
| 23384 | + * @element ANY |
|---|
| 23385 | + * @param {expression} ngInit {@link guide/expression Expression} to eval. |
|---|
| 23386 | + * |
|---|
| 23387 | + * @example |
|---|
| 23388 | + <example module="initExample"> |
|---|
| 23389 | + <file name="index.html"> |
|---|
| 23390 | + <script> |
|---|
| 23391 | + angular.module('initExample', []) |
|---|
| 23392 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 23393 | + $scope.list = [['a', 'b'], ['c', 'd']]; |
|---|
| 23394 | + }]); |
|---|
| 23395 | + </script> |
|---|
| 23396 | + <div ng-controller="ExampleController"> |
|---|
| 23397 | + <div ng-repeat="innerList in list" ng-init="outerIndex = $index"> |
|---|
| 23398 | + <div ng-repeat="value in innerList" ng-init="innerIndex = $index"> |
|---|
| 23399 | + <span class="example-init">list[ {{outerIndex}} ][ {{innerIndex}} ] = {{value}};</span> |
|---|
| 23400 | + </div> |
|---|
| 23401 | + </div> |
|---|
| 23402 | + </div> |
|---|
| 23403 | + </file> |
|---|
| 23404 | + <file name="protractor.js" type="protractor"> |
|---|
| 23405 | + it('should alias index positions', function() { |
|---|
| 23406 | + var elements = element.all(by.css('.example-init')); |
|---|
| 23407 | + expect(elements.get(0).getText()).toBe('list[ 0 ][ 0 ] = a;'); |
|---|
| 23408 | + expect(elements.get(1).getText()).toBe('list[ 0 ][ 1 ] = b;'); |
|---|
| 23409 | + expect(elements.get(2).getText()).toBe('list[ 1 ][ 0 ] = c;'); |
|---|
| 23410 | + expect(elements.get(3).getText()).toBe('list[ 1 ][ 1 ] = d;'); |
|---|
| 23411 | + }); |
|---|
| 23412 | + </file> |
|---|
| 23413 | + </example> |
|---|
| 23414 | + */ |
|---|
| 23415 | +var ngInitDirective = ngDirective({ |
|---|
| 23416 | + priority: 450, |
|---|
| 23417 | + compile: function() { |
|---|
| 23418 | + return { |
|---|
| 23419 | + pre: function(scope, element, attrs) { |
|---|
| 23420 | + scope.$eval(attrs.ngInit); |
|---|
| 23421 | + } |
|---|
| 23422 | + }; |
|---|
| 23423 | + } |
|---|
| 23424 | +}); |
|---|
| 23425 | + |
|---|
| 23426 | +/** |
|---|
| 23427 | + * @ngdoc directive |
|---|
| 23428 | + * @name ngNonBindable |
|---|
| 23429 | + * @restrict AC |
|---|
| 23430 | + * @priority 1000 |
|---|
| 23431 | + * |
|---|
| 23432 | + * @description |
|---|
| 23433 | + * The `ngNonBindable` directive tells Angular not to compile or bind the contents of the current |
|---|
| 23434 | + * DOM element. This is useful if the element contains what appears to be Angular directives and |
|---|
| 23435 | + * bindings but which should be ignored by Angular. This could be the case if you have a site that |
|---|
| 23436 | + * displays snippets of code, for instance. |
|---|
| 23437 | + * |
|---|
| 23438 | + * @element ANY |
|---|
| 23439 | + * |
|---|
| 23440 | + * @example |
|---|
| 23441 | + * In this example there are two locations where a simple interpolation binding (`{{}}`) is present, |
|---|
| 23442 | + * but the one wrapped in `ngNonBindable` is left alone. |
|---|
| 23443 | + * |
|---|
| 23444 | + * @example |
|---|
| 23445 | + <example> |
|---|
| 23446 | + <file name="index.html"> |
|---|
| 23447 | + <div>Normal: {{1 + 2}}</div> |
|---|
| 23448 | + <div ng-non-bindable>Ignored: {{1 + 2}}</div> |
|---|
| 23449 | + </file> |
|---|
| 23450 | + <file name="protractor.js" type="protractor"> |
|---|
| 23451 | + it('should check ng-non-bindable', function() { |
|---|
| 23452 | + expect(element(by.binding('1 + 2')).getText()).toContain('3'); |
|---|
| 23453 | + expect(element.all(by.css('div')).last().getText()).toMatch(/1 \+ 2/); |
|---|
| 23454 | + }); |
|---|
| 23455 | + </file> |
|---|
| 23456 | + </example> |
|---|
| 23457 | + */ |
|---|
| 23458 | +var ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 }); |
|---|
| 23459 | + |
|---|
| 23460 | +/** |
|---|
| 23461 | + * @ngdoc directive |
|---|
| 23462 | + * @name ngPluralize |
|---|
| 23463 | + * @restrict EA |
|---|
| 23464 | + * |
|---|
| 23465 | + * @description |
|---|
| 23466 | + * `ngPluralize` is a directive that displays messages according to en-US localization rules. |
|---|
| 23467 | + * These rules are bundled with angular.js, but can be overridden |
|---|
| 23468 | + * (see {@link guide/i18n Angular i18n} dev guide). You configure ngPluralize directive |
|---|
| 23469 | + * by specifying the mappings between |
|---|
| 23470 | + * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html) |
|---|
| 23471 | + * and the strings to be displayed. |
|---|
| 23472 | + * |
|---|
| 23473 | + * # Plural categories and explicit number rules |
|---|
| 23474 | + * There are two |
|---|
| 23475 | + * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html) |
|---|
| 23476 | + * in Angular's default en-US locale: "one" and "other". |
|---|
| 23477 | + * |
|---|
| 23478 | + * While a plural category may match many numbers (for example, in en-US locale, "other" can match |
|---|
| 23479 | + * any number that is not 1), an explicit number rule can only match one number. For example, the |
|---|
| 23480 | + * explicit number rule for "3" matches the number 3. There are examples of plural categories |
|---|
| 23481 | + * and explicit number rules throughout the rest of this documentation. |
|---|
| 23482 | + * |
|---|
| 23483 | + * # Configuring ngPluralize |
|---|
| 23484 | + * You configure ngPluralize by providing 2 attributes: `count` and `when`. |
|---|
| 23485 | + * You can also provide an optional attribute, `offset`. |
|---|
| 23486 | + * |
|---|
| 23487 | + * The value of the `count` attribute can be either a string or an {@link guide/expression |
|---|
| 23488 | + * Angular expression}; these are evaluated on the current scope for its bound value. |
|---|
| 23489 | + * |
|---|
| 23490 | + * The `when` attribute specifies the mappings between plural categories and the actual |
|---|
| 23491 | + * string to be displayed. The value of the attribute should be a JSON object. |
|---|
| 23492 | + * |
|---|
| 23493 | + * The following example shows how to configure ngPluralize: |
|---|
| 23494 | + * |
|---|
| 23495 | + * ```html |
|---|
| 23496 | + * <ng-pluralize count="personCount" |
|---|
| 23497 | + when="{'0': 'Nobody is viewing.', |
|---|
| 23498 | + * 'one': '1 person is viewing.', |
|---|
| 23499 | + * 'other': '{} people are viewing.'}"> |
|---|
| 23500 | + * </ng-pluralize> |
|---|
| 23501 | + *``` |
|---|
| 23502 | + * |
|---|
| 23503 | + * In the example, `"0: Nobody is viewing."` is an explicit number rule. If you did not |
|---|
| 23504 | + * specify this rule, 0 would be matched to the "other" category and "0 people are viewing" |
|---|
| 23505 | + * would be shown instead of "Nobody is viewing". You can specify an explicit number rule for |
|---|
| 23506 | + * other numbers, for example 12, so that instead of showing "12 people are viewing", you can |
|---|
| 23507 | + * show "a dozen people are viewing". |
|---|
| 23508 | + * |
|---|
| 23509 | + * You can use a set of closed braces (`{}`) as a placeholder for the number that you want substituted |
|---|
| 23510 | + * into pluralized strings. In the previous example, Angular will replace `{}` with |
|---|
| 23511 | + * <span ng-non-bindable>`{{personCount}}`</span>. The closed braces `{}` is a placeholder |
|---|
| 23512 | + * for <span ng-non-bindable>{{numberExpression}}</span>. |
|---|
| 23513 | + * |
|---|
| 23514 | + * # Configuring ngPluralize with offset |
|---|
| 23515 | + * The `offset` attribute allows further customization of pluralized text, which can result in |
|---|
| 23516 | + * a better user experience. For example, instead of the message "4 people are viewing this document", |
|---|
| 23517 | + * you might display "John, Kate and 2 others are viewing this document". |
|---|
| 23518 | + * The offset attribute allows you to offset a number by any desired value. |
|---|
| 23519 | + * Let's take a look at an example: |
|---|
| 23520 | + * |
|---|
| 23521 | + * ```html |
|---|
| 23522 | + * <ng-pluralize count="personCount" offset=2 |
|---|
| 23523 | + * when="{'0': 'Nobody is viewing.', |
|---|
| 23524 | + * '1': '{{person1}} is viewing.', |
|---|
| 23525 | + * '2': '{{person1}} and {{person2}} are viewing.', |
|---|
| 23526 | + * 'one': '{{person1}}, {{person2}} and one other person are viewing.', |
|---|
| 23527 | + * 'other': '{{person1}}, {{person2}} and {} other people are viewing.'}"> |
|---|
| 23528 | + * </ng-pluralize> |
|---|
| 23529 | + * ``` |
|---|
| 23530 | + * |
|---|
| 23531 | + * Notice that we are still using two plural categories(one, other), but we added |
|---|
| 23532 | + * three explicit number rules 0, 1 and 2. |
|---|
| 23533 | + * When one person, perhaps John, views the document, "John is viewing" will be shown. |
|---|
| 23534 | + * When three people view the document, no explicit number rule is found, so |
|---|
| 23535 | + * an offset of 2 is taken off 3, and Angular uses 1 to decide the plural category. |
|---|
| 23536 | + * In this case, plural category 'one' is matched and "John, Mary and one other person are viewing" |
|---|
| 23537 | + * is shown. |
|---|
| 23538 | + * |
|---|
| 23539 | + * Note that when you specify offsets, you must provide explicit number rules for |
|---|
| 23540 | + * numbers from 0 up to and including the offset. If you use an offset of 3, for example, |
|---|
| 23541 | + * you must provide explicit number rules for 0, 1, 2 and 3. You must also provide plural strings for |
|---|
| 23542 | + * plural categories "one" and "other". |
|---|
| 23543 | + * |
|---|
| 23544 | + * @param {string|expression} count The variable to be bound to. |
|---|
| 23545 | + * @param {string} when The mapping between plural category to its corresponding strings. |
|---|
| 23546 | + * @param {number=} offset Offset to deduct from the total number. |
|---|
| 23547 | + * |
|---|
| 23548 | + * @example |
|---|
| 23549 | + <example module="pluralizeExample"> |
|---|
| 23550 | + <file name="index.html"> |
|---|
| 23551 | + <script> |
|---|
| 23552 | + angular.module('pluralizeExample', []) |
|---|
| 23553 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 23554 | + $scope.person1 = 'Igor'; |
|---|
| 23555 | + $scope.person2 = 'Misko'; |
|---|
| 23556 | + $scope.personCount = 1; |
|---|
| 23557 | + }]); |
|---|
| 23558 | + </script> |
|---|
| 23559 | + <div ng-controller="ExampleController"> |
|---|
| 23560 | + Person 1:<input type="text" ng-model="person1" value="Igor" /><br/> |
|---|
| 23561 | + Person 2:<input type="text" ng-model="person2" value="Misko" /><br/> |
|---|
| 23562 | + Number of People:<input type="text" ng-model="personCount" value="1" /><br/> |
|---|
| 23563 | + |
|---|
| 23564 | + <!--- Example with simple pluralization rules for en locale ---> |
|---|
| 23565 | + Without Offset: |
|---|
| 23566 | + <ng-pluralize count="personCount" |
|---|
| 23567 | + when="{'0': 'Nobody is viewing.', |
|---|
| 23568 | + 'one': '1 person is viewing.', |
|---|
| 23569 | + 'other': '{} people are viewing.'}"> |
|---|
| 23570 | + </ng-pluralize><br> |
|---|
| 23571 | + |
|---|
| 23572 | + <!--- Example with offset ---> |
|---|
| 23573 | + With Offset(2): |
|---|
| 23574 | + <ng-pluralize count="personCount" offset=2 |
|---|
| 23575 | + when="{'0': 'Nobody is viewing.', |
|---|
| 23576 | + '1': '{{person1}} is viewing.', |
|---|
| 23577 | + '2': '{{person1}} and {{person2}} are viewing.', |
|---|
| 23578 | + 'one': '{{person1}}, {{person2}} and one other person are viewing.', |
|---|
| 23579 | + 'other': '{{person1}}, {{person2}} and {} other people are viewing.'}"> |
|---|
| 23580 | + </ng-pluralize> |
|---|
| 23581 | + </div> |
|---|
| 23582 | + </file> |
|---|
| 23583 | + <file name="protractor.js" type="protractor"> |
|---|
| 23584 | + it('should show correct pluralized string', function() { |
|---|
| 23585 | + var withoutOffset = element.all(by.css('ng-pluralize')).get(0); |
|---|
| 23586 | + var withOffset = element.all(by.css('ng-pluralize')).get(1); |
|---|
| 23587 | + var countInput = element(by.model('personCount')); |
|---|
| 23588 | + |
|---|
| 23589 | + expect(withoutOffset.getText()).toEqual('1 person is viewing.'); |
|---|
| 23590 | + expect(withOffset.getText()).toEqual('Igor is viewing.'); |
|---|
| 23591 | + |
|---|
| 23592 | + countInput.clear(); |
|---|
| 23593 | + countInput.sendKeys('0'); |
|---|
| 23594 | + |
|---|
| 23595 | + expect(withoutOffset.getText()).toEqual('Nobody is viewing.'); |
|---|
| 23596 | + expect(withOffset.getText()).toEqual('Nobody is viewing.'); |
|---|
| 23597 | + |
|---|
| 23598 | + countInput.clear(); |
|---|
| 23599 | + countInput.sendKeys('2'); |
|---|
| 23600 | + |
|---|
| 23601 | + expect(withoutOffset.getText()).toEqual('2 people are viewing.'); |
|---|
| 23602 | + expect(withOffset.getText()).toEqual('Igor and Misko are viewing.'); |
|---|
| 23603 | + |
|---|
| 23604 | + countInput.clear(); |
|---|
| 23605 | + countInput.sendKeys('3'); |
|---|
| 23606 | + |
|---|
| 23607 | + expect(withoutOffset.getText()).toEqual('3 people are viewing.'); |
|---|
| 23608 | + expect(withOffset.getText()).toEqual('Igor, Misko and one other person are viewing.'); |
|---|
| 23609 | + |
|---|
| 23610 | + countInput.clear(); |
|---|
| 23611 | + countInput.sendKeys('4'); |
|---|
| 23612 | + |
|---|
| 23613 | + expect(withoutOffset.getText()).toEqual('4 people are viewing.'); |
|---|
| 23614 | + expect(withOffset.getText()).toEqual('Igor, Misko and 2 other people are viewing.'); |
|---|
| 23615 | + }); |
|---|
| 23616 | + it('should show data-bound names', function() { |
|---|
| 23617 | + var withOffset = element.all(by.css('ng-pluralize')).get(1); |
|---|
| 23618 | + var personCount = element(by.model('personCount')); |
|---|
| 23619 | + var person1 = element(by.model('person1')); |
|---|
| 23620 | + var person2 = element(by.model('person2')); |
|---|
| 23621 | + personCount.clear(); |
|---|
| 23622 | + personCount.sendKeys('4'); |
|---|
| 23623 | + person1.clear(); |
|---|
| 23624 | + person1.sendKeys('Di'); |
|---|
| 23625 | + person2.clear(); |
|---|
| 23626 | + person2.sendKeys('Vojta'); |
|---|
| 23627 | + expect(withOffset.getText()).toEqual('Di, Vojta and 2 other people are viewing.'); |
|---|
| 23628 | + }); |
|---|
| 23629 | + </file> |
|---|
| 23630 | + </example> |
|---|
| 23631 | + */ |
|---|
| 23632 | +var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interpolate) { |
|---|
| 23633 | + var BRACE = /{}/g; |
|---|
| 23634 | + return { |
|---|
| 23635 | + restrict: 'EA', |
|---|
| 23636 | + link: function(scope, element, attr) { |
|---|
| 23637 | + var numberExp = attr.count, |
|---|
| 23638 | + whenExp = attr.$attr.when && element.attr(attr.$attr.when), // we have {{}} in attrs |
|---|
| 23639 | + offset = attr.offset || 0, |
|---|
| 23640 | + whens = scope.$eval(whenExp) || {}, |
|---|
| 23641 | + whensExpFns = {}, |
|---|
| 23642 | + startSymbol = $interpolate.startSymbol(), |
|---|
| 23643 | + endSymbol = $interpolate.endSymbol(), |
|---|
| 23644 | + isWhen = /^when(Minus)?(.+)$/; |
|---|
| 23645 | + |
|---|
| 23646 | + forEach(attr, function(expression, attributeName) { |
|---|
| 23647 | + if (isWhen.test(attributeName)) { |
|---|
| 23648 | + whens[lowercase(attributeName.replace('when', '').replace('Minus', '-'))] = |
|---|
| 23649 | + element.attr(attr.$attr[attributeName]); |
|---|
| 23650 | + } |
|---|
| 23651 | + }); |
|---|
| 23652 | + forEach(whens, function(expression, key) { |
|---|
| 23653 | + whensExpFns[key] = |
|---|
| 23654 | + $interpolate(expression.replace(BRACE, startSymbol + numberExp + '-' + |
|---|
| 23655 | + offset + endSymbol)); |
|---|
| 23656 | + }); |
|---|
| 23657 | + |
|---|
| 23658 | + scope.$watch(function ngPluralizeWatch() { |
|---|
| 23659 | + var value = parseFloat(scope.$eval(numberExp)); |
|---|
| 23660 | + |
|---|
| 23661 | + if (!isNaN(value)) { |
|---|
| 23662 | + //if explicit number rule such as 1, 2, 3... is defined, just use it. Otherwise, |
|---|
| 23663 | + //check it against pluralization rules in $locale service |
|---|
| 23664 | + if (!(value in whens)) value = $locale.pluralCat(value - offset); |
|---|
| 23665 | + return whensExpFns[value](scope); |
|---|
| 23666 | + } else { |
|---|
| 23667 | + return ''; |
|---|
| 23668 | + } |
|---|
| 23669 | + }, function ngPluralizeWatchAction(newVal) { |
|---|
| 23670 | + element.text(newVal); |
|---|
| 23671 | + }); |
|---|
| 23672 | + } |
|---|
| 23673 | + }; |
|---|
| 23674 | +}]; |
|---|
| 23675 | + |
|---|
| 23676 | +/** |
|---|
| 23677 | + * @ngdoc directive |
|---|
| 23678 | + * @name ngRepeat |
|---|
| 23679 | + * |
|---|
| 23680 | + * @description |
|---|
| 23681 | + * The `ngRepeat` directive instantiates a template once per item from a collection. Each template |
|---|
| 23682 | + * instance gets its own scope, where the given loop variable is set to the current collection item, |
|---|
| 23683 | + * and `$index` is set to the item index or key. |
|---|
| 23684 | + * |
|---|
| 23685 | + * Special properties are exposed on the local scope of each template instance, including: |
|---|
| 23686 | + * |
|---|
| 23687 | + * | Variable | Type | Details | |
|---|
| 23688 | + * |-----------|-----------------|-----------------------------------------------------------------------------| |
|---|
| 23689 | + * | `$index` | {@type number} | iterator offset of the repeated element (0..length-1) | |
|---|
| 23690 | + * | `$first` | {@type boolean} | true if the repeated element is first in the iterator. | |
|---|
| 23691 | + * | `$middle` | {@type boolean} | true if the repeated element is between the first and last in the iterator. | |
|---|
| 23692 | + * | `$last` | {@type boolean} | true if the repeated element is last in the iterator. | |
|---|
| 23693 | + * | `$even` | {@type boolean} | true if the iterator position `$index` is even (otherwise false). | |
|---|
| 23694 | + * | `$odd` | {@type boolean} | true if the iterator position `$index` is odd (otherwise false). | |
|---|
| 23695 | + * |
|---|
| 23696 | + * Creating aliases for these properties is possible with {@link ng.directive:ngInit `ngInit`}. |
|---|
| 23697 | + * This may be useful when, for instance, nesting ngRepeats. |
|---|
| 23698 | + * |
|---|
| 23699 | + * # Special repeat start and end points |
|---|
| 23700 | + * To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending |
|---|
| 23701 | + * the range of the repeater by defining explicit start and end points by using **ng-repeat-start** and **ng-repeat-end** respectively. |
|---|
| 23702 | + * The **ng-repeat-start** directive works the same as **ng-repeat**, but will repeat all the HTML code (including the tag it's defined on) |
|---|
| 23703 | + * up to and including the ending HTML tag where **ng-repeat-end** is placed. |
|---|
| 23704 | + * |
|---|
| 23705 | + * The example below makes use of this feature: |
|---|
| 23706 | + * ```html |
|---|
| 23707 | + * <header ng-repeat-start="item in items"> |
|---|
| 23708 | + * Header {{ item }} |
|---|
| 23709 | + * </header> |
|---|
| 23710 | + * <div class="body"> |
|---|
| 23711 | + * Body {{ item }} |
|---|
| 23712 | + * </div> |
|---|
| 23713 | + * <footer ng-repeat-end> |
|---|
| 23714 | + * Footer {{ item }} |
|---|
| 23715 | + * </footer> |
|---|
| 23716 | + * ``` |
|---|
| 23717 | + * |
|---|
| 23718 | + * And with an input of {@type ['A','B']} for the items variable in the example above, the output will evaluate to: |
|---|
| 23719 | + * ```html |
|---|
| 23720 | + * <header> |
|---|
| 23721 | + * Header A |
|---|
| 23722 | + * </header> |
|---|
| 23723 | + * <div class="body"> |
|---|
| 23724 | + * Body A |
|---|
| 23725 | + * </div> |
|---|
| 23726 | + * <footer> |
|---|
| 23727 | + * Footer A |
|---|
| 23728 | + * </footer> |
|---|
| 23729 | + * <header> |
|---|
| 23730 | + * Header B |
|---|
| 23731 | + * </header> |
|---|
| 23732 | + * <div class="body"> |
|---|
| 23733 | + * Body B |
|---|
| 23734 | + * </div> |
|---|
| 23735 | + * <footer> |
|---|
| 23736 | + * Footer B |
|---|
| 23737 | + * </footer> |
|---|
| 23738 | + * ``` |
|---|
| 23739 | + * |
|---|
| 23740 | + * The custom start and end points for ngRepeat also support all other HTML directive syntax flavors provided in AngularJS (such |
|---|
| 23741 | + * as **data-ng-repeat-start**, **x-ng-repeat-start** and **ng:repeat-start**). |
|---|
| 23742 | + * |
|---|
| 23743 | + * @animations |
|---|
| 23744 | + * **.enter** - when a new item is added to the list or when an item is revealed after a filter |
|---|
| 23745 | + * |
|---|
| 23746 | + * **.leave** - when an item is removed from the list or when an item is filtered out |
|---|
| 23747 | + * |
|---|
| 23748 | + * **.move** - when an adjacent item is filtered out causing a reorder or when the item contents are reordered |
|---|
| 23749 | + * |
|---|
| 23750 | + * @element ANY |
|---|
| 23751 | + * @scope |
|---|
| 23752 | + * @priority 1000 |
|---|
| 23753 | + * @param {repeat_expression} ngRepeat The expression indicating how to enumerate a collection. These |
|---|
| 23754 | + * formats are currently supported: |
|---|
| 23755 | + * |
|---|
| 23756 | + * * `variable in expression` – where variable is the user defined loop variable and `expression` |
|---|
| 23757 | + * is a scope expression giving the collection to enumerate. |
|---|
| 23758 | + * |
|---|
| 23759 | + * For example: `album in artist.albums`. |
|---|
| 23760 | + * |
|---|
| 23761 | + * * `(key, value) in expression` – where `key` and `value` can be any user defined identifiers, |
|---|
| 23762 | + * and `expression` is the scope expression giving the collection to enumerate. |
|---|
| 23763 | + * |
|---|
| 23764 | + * For example: `(name, age) in {'adam':10, 'amalie':12}`. |
|---|
| 23765 | + * |
|---|
| 23766 | + * * `variable in expression track by tracking_expression` – You can also provide an optional tracking function |
|---|
| 23767 | + * which can be used to associate the objects in the collection with the DOM elements. If no tracking function |
|---|
| 23768 | + * is specified the ng-repeat associates elements by identity in the collection. It is an error to have |
|---|
| 23769 | + * more than one tracking function to resolve to the same key. (This would mean that two distinct objects are |
|---|
| 23770 | + * mapped to the same DOM element, which is not possible.) Filters should be applied to the expression, |
|---|
| 23771 | + * before specifying a tracking expression. |
|---|
| 23772 | + * |
|---|
| 23773 | + * For example: `item in items` is equivalent to `item in items track by $id(item)`. This implies that the DOM elements |
|---|
| 23774 | + * will be associated by item identity in the array. |
|---|
| 23775 | + * |
|---|
| 23776 | + * For example: `item in items track by $id(item)`. A built in `$id()` function can be used to assign a unique |
|---|
| 23777 | + * `$$hashKey` property to each item in the array. This property is then used as a key to associated DOM elements |
|---|
| 23778 | + * with the corresponding item in the array by identity. Moving the same object in array would move the DOM |
|---|
| 23779 | + * element in the same way in the DOM. |
|---|
| 23780 | + * |
|---|
| 23781 | + * For example: `item in items track by item.id` is a typical pattern when the items come from the database. In this |
|---|
| 23782 | + * case the object identity does not matter. Two objects are considered equivalent as long as their `id` |
|---|
| 23783 | + * property is same. |
|---|
| 23784 | + * |
|---|
| 23785 | + * For example: `item in items | filter:searchText track by item.id` is a pattern that might be used to apply a filter |
|---|
| 23786 | + * to items in conjunction with a tracking expression. |
|---|
| 23787 | + * |
|---|
| 23788 | + * * `variable in expression as alias_expression` – You can also provide an optional alias expression which will then store the |
|---|
| 23789 | + * intermediate results of the repeater after the filters have been applied. Typically this is used to render a special message |
|---|
| 23790 | + * when a filter is active on the repeater, but the filtered result set is empty. |
|---|
| 23791 | + * |
|---|
| 23792 | + * For example: `item in items | filter:x as results` will store the fragment of the repeated items as `results`, but only after |
|---|
| 23793 | + * the items have been processed through the filter. |
|---|
| 23794 | + * |
|---|
| 23795 | + * @example |
|---|
| 23796 | + * This example initializes the scope to a list of names and |
|---|
| 23797 | + * then uses `ngRepeat` to display every person: |
|---|
| 23798 | + <example module="ngAnimate" deps="angular-animate.js" animations="true"> |
|---|
| 23799 | + <file name="index.html"> |
|---|
| 23800 | + <div ng-init="friends = [ |
|---|
| 23801 | + {name:'John', age:25, gender:'boy'}, |
|---|
| 23802 | + {name:'Jessie', age:30, gender:'girl'}, |
|---|
| 23803 | + {name:'Johanna', age:28, gender:'girl'}, |
|---|
| 23804 | + {name:'Joy', age:15, gender:'girl'}, |
|---|
| 23805 | + {name:'Mary', age:28, gender:'girl'}, |
|---|
| 23806 | + {name:'Peter', age:95, gender:'boy'}, |
|---|
| 23807 | + {name:'Sebastian', age:50, gender:'boy'}, |
|---|
| 23808 | + {name:'Erika', age:27, gender:'girl'}, |
|---|
| 23809 | + {name:'Patrick', age:40, gender:'boy'}, |
|---|
| 23810 | + {name:'Samantha', age:60, gender:'girl'} |
|---|
| 23811 | + ]"> |
|---|
| 23812 | + I have {{friends.length}} friends. They are: |
|---|
| 23813 | + <input type="search" ng-model="q" placeholder="filter friends..." /> |
|---|
| 23814 | + <ul class="example-animate-container"> |
|---|
| 23815 | + <li class="animate-repeat" ng-repeat="friend in friends | filter:q as results"> |
|---|
| 23816 | + [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old. |
|---|
| 23817 | + </li> |
|---|
| 23818 | + <li class="animate-repeat" ng-if="results.length == 0"> |
|---|
| 23819 | + <strong>No results found...</strong> |
|---|
| 23820 | + </li> |
|---|
| 23821 | + </ul> |
|---|
| 23822 | + </div> |
|---|
| 23823 | + </file> |
|---|
| 23824 | + <file name="animations.css"> |
|---|
| 23825 | + .example-animate-container { |
|---|
| 23826 | + background:white; |
|---|
| 23827 | + border:1px solid black; |
|---|
| 23828 | + list-style:none; |
|---|
| 23829 | + margin:0; |
|---|
| 23830 | + padding:0 10px; |
|---|
| 23831 | + } |
|---|
| 23832 | + |
|---|
| 23833 | + .animate-repeat { |
|---|
| 23834 | + line-height:40px; |
|---|
| 23835 | + list-style:none; |
|---|
| 23836 | + box-sizing:border-box; |
|---|
| 23837 | + } |
|---|
| 23838 | + |
|---|
| 23839 | + .animate-repeat.ng-move, |
|---|
| 23840 | + .animate-repeat.ng-enter, |
|---|
| 23841 | + .animate-repeat.ng-leave { |
|---|
| 23842 | + -webkit-transition:all linear 0.5s; |
|---|
| 23843 | + transition:all linear 0.5s; |
|---|
| 23844 | + } |
|---|
| 23845 | + |
|---|
| 23846 | + .animate-repeat.ng-leave.ng-leave-active, |
|---|
| 23847 | + .animate-repeat.ng-move, |
|---|
| 23848 | + .animate-repeat.ng-enter { |
|---|
| 23849 | + opacity:0; |
|---|
| 23850 | + max-height:0; |
|---|
| 23851 | + } |
|---|
| 23852 | + |
|---|
| 23853 | + .animate-repeat.ng-leave, |
|---|
| 23854 | + .animate-repeat.ng-move.ng-move-active, |
|---|
| 23855 | + .animate-repeat.ng-enter.ng-enter-active { |
|---|
| 23856 | + opacity:1; |
|---|
| 23857 | + max-height:40px; |
|---|
| 23858 | + } |
|---|
| 23859 | + </file> |
|---|
| 23860 | + <file name="protractor.js" type="protractor"> |
|---|
| 23861 | + var friends = element.all(by.repeater('friend in friends')); |
|---|
| 23862 | + |
|---|
| 23863 | + it('should render initial data set', function() { |
|---|
| 23864 | + expect(friends.count()).toBe(10); |
|---|
| 23865 | + expect(friends.get(0).getText()).toEqual('[1] John who is 25 years old.'); |
|---|
| 23866 | + expect(friends.get(1).getText()).toEqual('[2] Jessie who is 30 years old.'); |
|---|
| 23867 | + expect(friends.last().getText()).toEqual('[10] Samantha who is 60 years old.'); |
|---|
| 23868 | + expect(element(by.binding('friends.length')).getText()) |
|---|
| 23869 | + .toMatch("I have 10 friends. They are:"); |
|---|
| 23870 | + }); |
|---|
| 23871 | + |
|---|
| 23872 | + it('should update repeater when filter predicate changes', function() { |
|---|
| 23873 | + expect(friends.count()).toBe(10); |
|---|
| 23874 | + |
|---|
| 23875 | + element(by.model('q')).sendKeys('ma'); |
|---|
| 23876 | + |
|---|
| 23877 | + expect(friends.count()).toBe(2); |
|---|
| 23878 | + expect(friends.get(0).getText()).toEqual('[1] Mary who is 28 years old.'); |
|---|
| 23879 | + expect(friends.last().getText()).toEqual('[2] Samantha who is 60 years old.'); |
|---|
| 23880 | + }); |
|---|
| 23881 | + </file> |
|---|
| 23882 | + </example> |
|---|
| 23883 | + */ |
|---|
| 23884 | +var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) { |
|---|
| 23885 | + var NG_REMOVED = '$$NG_REMOVED'; |
|---|
| 23886 | + var ngRepeatMinErr = minErr('ngRepeat'); |
|---|
| 23887 | + |
|---|
| 23888 | + var updateScope = function(scope, index, valueIdentifier, value, keyIdentifier, key, arrayLength) { |
|---|
| 23889 | + // TODO(perf): generate setters to shave off ~40ms or 1-1.5% |
|---|
| 23890 | + scope[valueIdentifier] = value; |
|---|
| 23891 | + if (keyIdentifier) scope[keyIdentifier] = key; |
|---|
| 23892 | + scope.$index = index; |
|---|
| 23893 | + scope.$first = (index === 0); |
|---|
| 23894 | + scope.$last = (index === (arrayLength - 1)); |
|---|
| 23895 | + scope.$middle = !(scope.$first || scope.$last); |
|---|
| 23896 | + // jshint bitwise: false |
|---|
| 23897 | + scope.$odd = !(scope.$even = (index&1) === 0); |
|---|
| 23898 | + // jshint bitwise: true |
|---|
| 23899 | + }; |
|---|
| 23900 | + |
|---|
| 23901 | + var getBlockStart = function(block) { |
|---|
| 23902 | + return block.clone[0]; |
|---|
| 23903 | + }; |
|---|
| 23904 | + |
|---|
| 23905 | + var getBlockEnd = function(block) { |
|---|
| 23906 | + return block.clone[block.clone.length - 1]; |
|---|
| 23907 | + }; |
|---|
| 23908 | + |
|---|
| 23909 | + |
|---|
| 23910 | + return { |
|---|
| 23911 | + restrict: 'A', |
|---|
| 23912 | + multiElement: true, |
|---|
| 23913 | + transclude: 'element', |
|---|
| 23914 | + priority: 1000, |
|---|
| 23915 | + terminal: true, |
|---|
| 23916 | + $$tlb: true, |
|---|
| 23917 | + compile: function ngRepeatCompile($element, $attr) { |
|---|
| 23918 | + var expression = $attr.ngRepeat; |
|---|
| 23919 | + var ngRepeatEndComment = document.createComment(' end ngRepeat: ' + expression + ' '); |
|---|
| 23920 | + |
|---|
| 23921 | + var match = expression.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/); |
|---|
| 23922 | + |
|---|
| 23923 | + if (!match) { |
|---|
| 23924 | + throw ngRepeatMinErr('iexp', "Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.", |
|---|
| 23925 | + expression); |
|---|
| 23926 | + } |
|---|
| 23927 | + |
|---|
| 23928 | + var lhs = match[1]; |
|---|
| 23929 | + var rhs = match[2]; |
|---|
| 23930 | + var aliasAs = match[3]; |
|---|
| 23931 | + var trackByExp = match[4]; |
|---|
| 23932 | + |
|---|
| 23933 | + match = lhs.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/); |
|---|
| 23934 | + |
|---|
| 23935 | + if (!match) { |
|---|
| 23936 | + throw ngRepeatMinErr('iidexp', "'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.", |
|---|
| 23937 | + lhs); |
|---|
| 23938 | + } |
|---|
| 23939 | + var valueIdentifier = match[3] || match[1]; |
|---|
| 23940 | + var keyIdentifier = match[2]; |
|---|
| 23941 | + |
|---|
| 23942 | + if (aliasAs && (!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(aliasAs) || |
|---|
| 23943 | + /^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent)$/.test(aliasAs))) { |
|---|
| 23944 | + throw ngRepeatMinErr('badident', "alias '{0}' is invalid --- must be a valid JS identifier which is not a reserved name.", |
|---|
| 23945 | + aliasAs); |
|---|
| 23946 | + } |
|---|
| 23947 | + |
|---|
| 23948 | + var trackByExpGetter, trackByIdExpFn, trackByIdArrayFn, trackByIdObjFn; |
|---|
| 23949 | + var hashFnLocals = {$id: hashKey}; |
|---|
| 23950 | + |
|---|
| 23951 | + if (trackByExp) { |
|---|
| 23952 | + trackByExpGetter = $parse(trackByExp); |
|---|
| 23953 | + } else { |
|---|
| 23954 | + trackByIdArrayFn = function (key, value) { |
|---|
| 23955 | + return hashKey(value); |
|---|
| 23956 | + }; |
|---|
| 23957 | + trackByIdObjFn = function (key) { |
|---|
| 23958 | + return key; |
|---|
| 23959 | + }; |
|---|
| 23960 | + } |
|---|
| 23961 | + |
|---|
| 23962 | + return function ngRepeatLink($scope, $element, $attr, ctrl, $transclude) { |
|---|
| 23963 | + |
|---|
| 23964 | + if (trackByExpGetter) { |
|---|
| 23965 | + trackByIdExpFn = function(key, value, index) { |
|---|
| 23966 | + // assign key, value, and $index to the locals so that they can be used in hash functions |
|---|
| 23967 | + if (keyIdentifier) hashFnLocals[keyIdentifier] = key; |
|---|
| 23968 | + hashFnLocals[valueIdentifier] = value; |
|---|
| 23969 | + hashFnLocals.$index = index; |
|---|
| 23970 | + return trackByExpGetter($scope, hashFnLocals); |
|---|
| 23971 | + }; |
|---|
| 23972 | + } |
|---|
| 23973 | + |
|---|
| 23974 | + // Store a list of elements from previous run. This is a hash where key is the item from the |
|---|
| 23975 | + // iterator, and the value is objects with following properties. |
|---|
| 23976 | + // - scope: bound scope |
|---|
| 23977 | + // - element: previous element. |
|---|
| 23978 | + // - index: position |
|---|
| 23979 | + // |
|---|
| 23980 | + // We are using no-proto object so that we don't need to guard against inherited props via |
|---|
| 23981 | + // hasOwnProperty. |
|---|
| 23982 | + var lastBlockMap = createMap(); |
|---|
| 23983 | + |
|---|
| 23984 | + //watch props |
|---|
| 23985 | + $scope.$watchCollection(rhs, function ngRepeatAction(collection) { |
|---|
| 23986 | + var index, length, |
|---|
| 23987 | + previousNode = $element[0], // node that cloned nodes should be inserted after |
|---|
| 23988 | + // initialized to the comment node anchor |
|---|
| 23989 | + nextNode, |
|---|
| 23990 | + // Same as lastBlockMap but it has the current state. It will become the |
|---|
| 23991 | + // lastBlockMap on the next iteration. |
|---|
| 23992 | + nextBlockMap = createMap(), |
|---|
| 23993 | + collectionLength, |
|---|
| 23994 | + key, value, // key/value of iteration |
|---|
| 23995 | + trackById, |
|---|
| 23996 | + trackByIdFn, |
|---|
| 23997 | + collectionKeys, |
|---|
| 23998 | + block, // last object information {scope, element, id} |
|---|
| 23999 | + nextBlockOrder, |
|---|
| 24000 | + elementsToRemove; |
|---|
| 24001 | + |
|---|
| 24002 | + if (aliasAs) { |
|---|
| 24003 | + $scope[aliasAs] = collection; |
|---|
| 24004 | + } |
|---|
| 24005 | + |
|---|
| 24006 | + if (isArrayLike(collection)) { |
|---|
| 24007 | + collectionKeys = collection; |
|---|
| 24008 | + trackByIdFn = trackByIdExpFn || trackByIdArrayFn; |
|---|
| 24009 | + } else { |
|---|
| 24010 | + trackByIdFn = trackByIdExpFn || trackByIdObjFn; |
|---|
| 24011 | + // if object, extract keys, sort them and use to determine order of iteration over obj props |
|---|
| 24012 | + collectionKeys = []; |
|---|
| 24013 | + for (var itemKey in collection) { |
|---|
| 24014 | + if (collection.hasOwnProperty(itemKey) && itemKey.charAt(0) != '$') { |
|---|
| 24015 | + collectionKeys.push(itemKey); |
|---|
| 24016 | + } |
|---|
| 24017 | + } |
|---|
| 24018 | + collectionKeys.sort(); |
|---|
| 24019 | + } |
|---|
| 24020 | + |
|---|
| 24021 | + collectionLength = collectionKeys.length; |
|---|
| 24022 | + nextBlockOrder = new Array(collectionLength); |
|---|
| 24023 | + |
|---|
| 24024 | + // locate existing items |
|---|
| 24025 | + for (index = 0; index < collectionLength; index++) { |
|---|
| 24026 | + key = (collection === collectionKeys) ? index : collectionKeys[index]; |
|---|
| 24027 | + value = collection[key]; |
|---|
| 24028 | + trackById = trackByIdFn(key, value, index); |
|---|
| 24029 | + if (lastBlockMap[trackById]) { |
|---|
| 24030 | + // found previously seen block |
|---|
| 24031 | + block = lastBlockMap[trackById]; |
|---|
| 24032 | + delete lastBlockMap[trackById]; |
|---|
| 24033 | + nextBlockMap[trackById] = block; |
|---|
| 24034 | + nextBlockOrder[index] = block; |
|---|
| 24035 | + } else if (nextBlockMap[trackById]) { |
|---|
| 24036 | + // if collision detected. restore lastBlockMap and throw an error |
|---|
| 24037 | + forEach(nextBlockOrder, function (block) { |
|---|
| 24038 | + if (block && block.scope) lastBlockMap[block.id] = block; |
|---|
| 24039 | + }); |
|---|
| 24040 | + throw ngRepeatMinErr('dupes', |
|---|
| 24041 | + "Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}", |
|---|
| 24042 | + expression, trackById, toJson(value)); |
|---|
| 24043 | + } else { |
|---|
| 24044 | + // new never before seen block |
|---|
| 24045 | + nextBlockOrder[index] = {id: trackById, scope: undefined, clone: undefined}; |
|---|
| 24046 | + nextBlockMap[trackById] = true; |
|---|
| 24047 | + } |
|---|
| 24048 | + } |
|---|
| 24049 | + |
|---|
| 24050 | + // remove leftover items |
|---|
| 24051 | + for (var blockKey in lastBlockMap) { |
|---|
| 24052 | + block = lastBlockMap[blockKey]; |
|---|
| 24053 | + elementsToRemove = getBlockNodes(block.clone); |
|---|
| 24054 | + $animate.leave(elementsToRemove); |
|---|
| 24055 | + if (elementsToRemove[0].parentNode) { |
|---|
| 24056 | + // if the element was not removed yet because of pending animation, mark it as deleted |
|---|
| 24057 | + // so that we can ignore it later |
|---|
| 24058 | + for (index = 0, length = elementsToRemove.length; index < length; index++) { |
|---|
| 24059 | + elementsToRemove[index][NG_REMOVED] = true; |
|---|
| 24060 | + } |
|---|
| 24061 | + } |
|---|
| 24062 | + block.scope.$destroy(); |
|---|
| 24063 | + } |
|---|
| 24064 | + |
|---|
| 24065 | + // we are not using forEach for perf reasons (trying to avoid #call) |
|---|
| 24066 | + for (index = 0; index < collectionLength; index++) { |
|---|
| 24067 | + key = (collection === collectionKeys) ? index : collectionKeys[index]; |
|---|
| 24068 | + value = collection[key]; |
|---|
| 24069 | + block = nextBlockOrder[index]; |
|---|
| 24070 | + |
|---|
| 24071 | + if (block.scope) { |
|---|
| 24072 | + // if we have already seen this object, then we need to reuse the |
|---|
| 24073 | + // associated scope/element |
|---|
| 24074 | + |
|---|
| 24075 | + nextNode = previousNode; |
|---|
| 24076 | + |
|---|
| 24077 | + // skip nodes that are already pending removal via leave animation |
|---|
| 24078 | + do { |
|---|
| 24079 | + nextNode = nextNode.nextSibling; |
|---|
| 24080 | + } while (nextNode && nextNode[NG_REMOVED]); |
|---|
| 24081 | + |
|---|
| 24082 | + if (getBlockStart(block) != nextNode) { |
|---|
| 24083 | + // existing item which got moved |
|---|
| 24084 | + $animate.move(getBlockNodes(block.clone), null, jqLite(previousNode)); |
|---|
| 24085 | + } |
|---|
| 24086 | + previousNode = getBlockEnd(block); |
|---|
| 24087 | + updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength); |
|---|
| 24088 | + } else { |
|---|
| 24089 | + // new item which we don't know about |
|---|
| 24090 | + $transclude(function ngRepeatTransclude(clone, scope) { |
|---|
| 24091 | + block.scope = scope; |
|---|
| 24092 | + // http://jsperf.com/clone-vs-createcomment |
|---|
| 24093 | + var endNode = ngRepeatEndComment.cloneNode(false); |
|---|
| 24094 | + clone[clone.length++] = endNode; |
|---|
| 24095 | + |
|---|
| 24096 | + // TODO(perf): support naked previousNode in `enter` to avoid creation of jqLite wrapper? |
|---|
| 24097 | + $animate.enter(clone, null, jqLite(previousNode)); |
|---|
| 24098 | + previousNode = endNode; |
|---|
| 24099 | + // Note: We only need the first/last node of the cloned nodes. |
|---|
| 24100 | + // However, we need to keep the reference to the jqlite wrapper as it might be changed later |
|---|
| 24101 | + // by a directive with templateUrl when its template arrives. |
|---|
| 24102 | + block.clone = clone; |
|---|
| 24103 | + nextBlockMap[block.id] = block; |
|---|
| 24104 | + updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength); |
|---|
| 24105 | + }); |
|---|
| 24106 | + } |
|---|
| 24107 | + } |
|---|
| 24108 | + lastBlockMap = nextBlockMap; |
|---|
| 24109 | + }); |
|---|
| 24110 | + }; |
|---|
| 24111 | + } |
|---|
| 24112 | + }; |
|---|
| 24113 | +}]; |
|---|
| 24114 | + |
|---|
| 24115 | +var NG_HIDE_CLASS = 'ng-hide'; |
|---|
| 24116 | +var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate'; |
|---|
| 24117 | +/** |
|---|
| 24118 | + * @ngdoc directive |
|---|
| 24119 | + * @name ngShow |
|---|
| 24120 | + * |
|---|
| 24121 | + * @description |
|---|
| 24122 | + * The `ngShow` directive shows or hides the given HTML element based on the expression |
|---|
| 24123 | + * provided to the `ngShow` attribute. The element is shown or hidden by removing or adding |
|---|
| 24124 | + * the `.ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined |
|---|
| 24125 | + * in AngularJS and sets the display style to none (using an !important flag). |
|---|
| 24126 | + * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}). |
|---|
| 24127 | + * |
|---|
| 24128 | + * ```html |
|---|
| 24129 | + * <!-- when $scope.myValue is truthy (element is visible) --> |
|---|
| 24130 | + * <div ng-show="myValue"></div> |
|---|
| 24131 | + * |
|---|
| 24132 | + * <!-- when $scope.myValue is falsy (element is hidden) --> |
|---|
| 24133 | + * <div ng-show="myValue" class="ng-hide"></div> |
|---|
| 24134 | + * ``` |
|---|
| 24135 | + * |
|---|
| 24136 | + * When the `ngShow` expression evaluates to a falsy value then the `.ng-hide` CSS class is added to the class |
|---|
| 24137 | + * attribute on the element causing it to become hidden. When truthy, the `.ng-hide` CSS class is removed |
|---|
| 24138 | + * from the element causing the element not to appear hidden. |
|---|
| 24139 | + * |
|---|
| 24140 | + * ## Why is !important used? |
|---|
| 24141 | + * |
|---|
| 24142 | + * You may be wondering why !important is used for the `.ng-hide` CSS class. This is because the `.ng-hide` selector |
|---|
| 24143 | + * can be easily overridden by heavier selectors. For example, something as simple |
|---|
| 24144 | + * as changing the display style on a HTML list item would make hidden elements appear visible. |
|---|
| 24145 | + * This also becomes a bigger issue when dealing with CSS frameworks. |
|---|
| 24146 | + * |
|---|
| 24147 | + * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector |
|---|
| 24148 | + * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the |
|---|
| 24149 | + * styling to change how to hide an element then it is just a matter of using !important in their own CSS code. |
|---|
| 24150 | + * |
|---|
| 24151 | + * ### Overriding `.ng-hide` |
|---|
| 24152 | + * |
|---|
| 24153 | + * By default, the `.ng-hide` class will style the element with `display:none!important`. If you wish to change |
|---|
| 24154 | + * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide` |
|---|
| 24155 | + * class in CSS: |
|---|
| 24156 | + * |
|---|
| 24157 | + * ```css |
|---|
| 24158 | + * .ng-hide { |
|---|
| 24159 | + * /* this is just another form of hiding an element */ |
|---|
| 24160 | + * display:block!important; |
|---|
| 24161 | + * position:absolute; |
|---|
| 24162 | + * top:-9999px; |
|---|
| 24163 | + * left:-9999px; |
|---|
| 24164 | + * } |
|---|
| 24165 | + * ``` |
|---|
| 24166 | + * |
|---|
| 24167 | + * By default you don't need to override in CSS anything and the animations will work around the display style. |
|---|
| 24168 | + * |
|---|
| 24169 | + * ## A note about animations with `ngShow` |
|---|
| 24170 | + * |
|---|
| 24171 | + * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression |
|---|
| 24172 | + * is true and false. This system works like the animation system present with ngClass except that |
|---|
| 24173 | + * you must also include the !important flag to override the display property |
|---|
| 24174 | + * so that you can perform an animation when the element is hidden during the time of the animation. |
|---|
| 24175 | + * |
|---|
| 24176 | + * ```css |
|---|
| 24177 | + * // |
|---|
| 24178 | + * //a working example can be found at the bottom of this page |
|---|
| 24179 | + * // |
|---|
| 24180 | + * .my-element.ng-hide-add, .my-element.ng-hide-remove { |
|---|
| 24181 | + * /* this is required as of 1.3x to properly |
|---|
| 24182 | + * apply all styling in a show/hide animation */ |
|---|
| 24183 | + * transition:0s linear all; |
|---|
| 24184 | + * } |
|---|
| 24185 | + * |
|---|
| 24186 | + * .my-element.ng-hide-add-active, |
|---|
| 24187 | + * .my-element.ng-hide-remove-active { |
|---|
| 24188 | + * /* the transition is defined in the active class */ |
|---|
| 24189 | + * transition:1s linear all; |
|---|
| 24190 | + * } |
|---|
| 24191 | + * |
|---|
| 24192 | + * .my-element.ng-hide-add { ... } |
|---|
| 24193 | + * .my-element.ng-hide-add.ng-hide-add-active { ... } |
|---|
| 24194 | + * .my-element.ng-hide-remove { ... } |
|---|
| 24195 | + * .my-element.ng-hide-remove.ng-hide-remove-active { ... } |
|---|
| 24196 | + * ``` |
|---|
| 24197 | + * |
|---|
| 24198 | + * Keep in mind that, as of AngularJS version 1.3.0-beta.11, there is no need to change the display |
|---|
| 24199 | + * property to block during animation states--ngAnimate will handle the style toggling automatically for you. |
|---|
| 24200 | + * |
|---|
| 24201 | + * @animations |
|---|
| 24202 | + * addClass: `.ng-hide` - happens after the `ngShow` expression evaluates to a truthy value and the just before contents are set to visible |
|---|
| 24203 | + * removeClass: `.ng-hide` - happens after the `ngShow` expression evaluates to a non truthy value and just before the contents are set to hidden |
|---|
| 24204 | + * |
|---|
| 24205 | + * @element ANY |
|---|
| 24206 | + * @param {expression} ngShow If the {@link guide/expression expression} is truthy |
|---|
| 24207 | + * then the element is shown or hidden respectively. |
|---|
| 24208 | + * |
|---|
| 24209 | + * @example |
|---|
| 24210 | + <example module="ngAnimate" deps="angular-animate.js" animations="true"> |
|---|
| 24211 | + <file name="index.html"> |
|---|
| 24212 | + Click me: <input type="checkbox" ng-model="checked"><br/> |
|---|
| 24213 | + <div> |
|---|
| 24214 | + Show: |
|---|
| 24215 | + <div class="check-element animate-show" ng-show="checked"> |
|---|
| 24216 | + <span class="glyphicon glyphicon-thumbs-up"></span> I show up when your checkbox is checked. |
|---|
| 24217 | + </div> |
|---|
| 24218 | + </div> |
|---|
| 24219 | + <div> |
|---|
| 24220 | + Hide: |
|---|
| 24221 | + <div class="check-element animate-show" ng-hide="checked"> |
|---|
| 24222 | + <span class="glyphicon glyphicon-thumbs-down"></span> I hide when your checkbox is checked. |
|---|
| 24223 | + </div> |
|---|
| 24224 | + </div> |
|---|
| 24225 | + </file> |
|---|
| 24226 | + <file name="glyphicons.css"> |
|---|
| 24227 | + @import url(//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-glyphicons.css); |
|---|
| 24228 | + </file> |
|---|
| 24229 | + <file name="animations.css"> |
|---|
| 24230 | + .animate-show { |
|---|
| 24231 | + line-height:20px; |
|---|
| 24232 | + opacity:1; |
|---|
| 24233 | + padding:10px; |
|---|
| 24234 | + border:1px solid black; |
|---|
| 24235 | + background:white; |
|---|
| 24236 | + } |
|---|
| 24237 | + |
|---|
| 24238 | + .animate-show.ng-hide-add.ng-hide-add-active, |
|---|
| 24239 | + .animate-show.ng-hide-remove.ng-hide-remove-active { |
|---|
| 24240 | + -webkit-transition:all linear 0.5s; |
|---|
| 24241 | + transition:all linear 0.5s; |
|---|
| 24242 | + } |
|---|
| 24243 | + |
|---|
| 24244 | + .animate-show.ng-hide { |
|---|
| 24245 | + line-height:0; |
|---|
| 24246 | + opacity:0; |
|---|
| 24247 | + padding:0 10px; |
|---|
| 24248 | + } |
|---|
| 24249 | + |
|---|
| 24250 | + .check-element { |
|---|
| 24251 | + padding:10px; |
|---|
| 24252 | + border:1px solid black; |
|---|
| 24253 | + background:white; |
|---|
| 24254 | + } |
|---|
| 24255 | + </file> |
|---|
| 24256 | + <file name="protractor.js" type="protractor"> |
|---|
| 24257 | + var thumbsUp = element(by.css('span.glyphicon-thumbs-up')); |
|---|
| 24258 | + var thumbsDown = element(by.css('span.glyphicon-thumbs-down')); |
|---|
| 24259 | + |
|---|
| 24260 | + it('should check ng-show / ng-hide', function() { |
|---|
| 24261 | + expect(thumbsUp.isDisplayed()).toBeFalsy(); |
|---|
| 24262 | + expect(thumbsDown.isDisplayed()).toBeTruthy(); |
|---|
| 24263 | + |
|---|
| 24264 | + element(by.model('checked')).click(); |
|---|
| 24265 | + |
|---|
| 24266 | + expect(thumbsUp.isDisplayed()).toBeTruthy(); |
|---|
| 24267 | + expect(thumbsDown.isDisplayed()).toBeFalsy(); |
|---|
| 24268 | + }); |
|---|
| 24269 | + </file> |
|---|
| 24270 | + </example> |
|---|
| 24271 | + */ |
|---|
| 24272 | +var ngShowDirective = ['$animate', function($animate) { |
|---|
| 24273 | + return { |
|---|
| 24274 | + restrict: 'A', |
|---|
| 24275 | + multiElement: true, |
|---|
| 24276 | + link: function(scope, element, attr) { |
|---|
| 24277 | + scope.$watch(attr.ngShow, function ngShowWatchAction(value){ |
|---|
| 24278 | + // we're adding a temporary, animation-specific class for ng-hide since this way |
|---|
| 24279 | + // we can control when the element is actually displayed on screen without having |
|---|
| 24280 | + // to have a global/greedy CSS selector that breaks when other animations are run. |
|---|
| 24281 | + // Read: https://github.com/angular/angular.js/issues/9103#issuecomment-58335845 |
|---|
| 24282 | + $animate[value ? 'removeClass' : 'addClass'](element, NG_HIDE_CLASS, { |
|---|
| 24283 | + tempClasses : NG_HIDE_IN_PROGRESS_CLASS |
|---|
| 24284 | + }); |
|---|
| 24285 | + }); |
|---|
| 24286 | + } |
|---|
| 24287 | + }; |
|---|
| 24288 | +}]; |
|---|
| 24289 | + |
|---|
| 24290 | + |
|---|
| 24291 | +/** |
|---|
| 24292 | + * @ngdoc directive |
|---|
| 24293 | + * @name ngHide |
|---|
| 24294 | + * |
|---|
| 24295 | + * @description |
|---|
| 24296 | + * The `ngHide` directive shows or hides the given HTML element based on the expression |
|---|
| 24297 | + * provided to the `ngHide` attribute. The element is shown or hidden by removing or adding |
|---|
| 24298 | + * the `ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined |
|---|
| 24299 | + * in AngularJS and sets the display style to none (using an !important flag). |
|---|
| 24300 | + * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}). |
|---|
| 24301 | + * |
|---|
| 24302 | + * ```html |
|---|
| 24303 | + * <!-- when $scope.myValue is truthy (element is hidden) --> |
|---|
| 24304 | + * <div ng-hide="myValue" class="ng-hide"></div> |
|---|
| 24305 | + * |
|---|
| 24306 | + * <!-- when $scope.myValue is falsy (element is visible) --> |
|---|
| 24307 | + * <div ng-hide="myValue"></div> |
|---|
| 24308 | + * ``` |
|---|
| 24309 | + * |
|---|
| 24310 | + * When the `ngHide` expression evaluates to a truthy value then the `.ng-hide` CSS class is added to the class |
|---|
| 24311 | + * attribute on the element causing it to become hidden. When falsy, the `.ng-hide` CSS class is removed |
|---|
| 24312 | + * from the element causing the element not to appear hidden. |
|---|
| 24313 | + * |
|---|
| 24314 | + * ## Why is !important used? |
|---|
| 24315 | + * |
|---|
| 24316 | + * You may be wondering why !important is used for the `.ng-hide` CSS class. This is because the `.ng-hide` selector |
|---|
| 24317 | + * can be easily overridden by heavier selectors. For example, something as simple |
|---|
| 24318 | + * as changing the display style on a HTML list item would make hidden elements appear visible. |
|---|
| 24319 | + * This also becomes a bigger issue when dealing with CSS frameworks. |
|---|
| 24320 | + * |
|---|
| 24321 | + * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector |
|---|
| 24322 | + * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the |
|---|
| 24323 | + * styling to change how to hide an element then it is just a matter of using !important in their own CSS code. |
|---|
| 24324 | + * |
|---|
| 24325 | + * ### Overriding `.ng-hide` |
|---|
| 24326 | + * |
|---|
| 24327 | + * By default, the `.ng-hide` class will style the element with `display:none!important`. If you wish to change |
|---|
| 24328 | + * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide` |
|---|
| 24329 | + * class in CSS: |
|---|
| 24330 | + * |
|---|
| 24331 | + * ```css |
|---|
| 24332 | + * .ng-hide { |
|---|
| 24333 | + * /* this is just another form of hiding an element */ |
|---|
| 24334 | + * display:block!important; |
|---|
| 24335 | + * position:absolute; |
|---|
| 24336 | + * top:-9999px; |
|---|
| 24337 | + * left:-9999px; |
|---|
| 24338 | + * } |
|---|
| 24339 | + * ``` |
|---|
| 24340 | + * |
|---|
| 24341 | + * By default you don't need to override in CSS anything and the animations will work around the display style. |
|---|
| 24342 | + * |
|---|
| 24343 | + * ## A note about animations with `ngHide` |
|---|
| 24344 | + * |
|---|
| 24345 | + * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression |
|---|
| 24346 | + * is true and false. This system works like the animation system present with ngClass, except that the `.ng-hide` |
|---|
| 24347 | + * CSS class is added and removed for you instead of your own CSS class. |
|---|
| 24348 | + * |
|---|
| 24349 | + * ```css |
|---|
| 24350 | + * // |
|---|
| 24351 | + * //a working example can be found at the bottom of this page |
|---|
| 24352 | + * // |
|---|
| 24353 | + * .my-element.ng-hide-add, .my-element.ng-hide-remove { |
|---|
| 24354 | + * transition:0.5s linear all; |
|---|
| 24355 | + * } |
|---|
| 24356 | + * |
|---|
| 24357 | + * .my-element.ng-hide-add { ... } |
|---|
| 24358 | + * .my-element.ng-hide-add.ng-hide-add-active { ... } |
|---|
| 24359 | + * .my-element.ng-hide-remove { ... } |
|---|
| 24360 | + * .my-element.ng-hide-remove.ng-hide-remove-active { ... } |
|---|
| 24361 | + * ``` |
|---|
| 24362 | + * |
|---|
| 24363 | + * Keep in mind that, as of AngularJS version 1.3.0-beta.11, there is no need to change the display |
|---|
| 24364 | + * property to block during animation states--ngAnimate will handle the style toggling automatically for you. |
|---|
| 24365 | + * |
|---|
| 24366 | + * @animations |
|---|
| 24367 | + * removeClass: `.ng-hide` - happens after the `ngHide` expression evaluates to a truthy value and just before the contents are set to hidden |
|---|
| 24368 | + * addClass: `.ng-hide` - happens after the `ngHide` expression evaluates to a non truthy value and just before the contents are set to visible |
|---|
| 24369 | + * |
|---|
| 24370 | + * @element ANY |
|---|
| 24371 | + * @param {expression} ngHide If the {@link guide/expression expression} is truthy then |
|---|
| 24372 | + * the element is shown or hidden respectively. |
|---|
| 24373 | + * |
|---|
| 24374 | + * @example |
|---|
| 24375 | + <example module="ngAnimate" deps="angular-animate.js" animations="true"> |
|---|
| 24376 | + <file name="index.html"> |
|---|
| 24377 | + Click me: <input type="checkbox" ng-model="checked"><br/> |
|---|
| 24378 | + <div> |
|---|
| 24379 | + Show: |
|---|
| 24380 | + <div class="check-element animate-hide" ng-show="checked"> |
|---|
| 24381 | + <span class="glyphicon glyphicon-thumbs-up"></span> I show up when your checkbox is checked. |
|---|
| 24382 | + </div> |
|---|
| 24383 | + </div> |
|---|
| 24384 | + <div> |
|---|
| 24385 | + Hide: |
|---|
| 24386 | + <div class="check-element animate-hide" ng-hide="checked"> |
|---|
| 24387 | + <span class="glyphicon glyphicon-thumbs-down"></span> I hide when your checkbox is checked. |
|---|
| 24388 | + </div> |
|---|
| 24389 | + </div> |
|---|
| 24390 | + </file> |
|---|
| 24391 | + <file name="glyphicons.css"> |
|---|
| 24392 | + @import url(//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-glyphicons.css); |
|---|
| 24393 | + </file> |
|---|
| 24394 | + <file name="animations.css"> |
|---|
| 24395 | + .animate-hide { |
|---|
| 24396 | + -webkit-transition:all linear 0.5s; |
|---|
| 24397 | + transition:all linear 0.5s; |
|---|
| 24398 | + line-height:20px; |
|---|
| 24399 | + opacity:1; |
|---|
| 24400 | + padding:10px; |
|---|
| 24401 | + border:1px solid black; |
|---|
| 24402 | + background:white; |
|---|
| 24403 | + } |
|---|
| 24404 | + |
|---|
| 24405 | + .animate-hide.ng-hide { |
|---|
| 24406 | + line-height:0; |
|---|
| 24407 | + opacity:0; |
|---|
| 24408 | + padding:0 10px; |
|---|
| 24409 | + } |
|---|
| 24410 | + |
|---|
| 24411 | + .check-element { |
|---|
| 24412 | + padding:10px; |
|---|
| 24413 | + border:1px solid black; |
|---|
| 24414 | + background:white; |
|---|
| 24415 | + } |
|---|
| 24416 | + </file> |
|---|
| 24417 | + <file name="protractor.js" type="protractor"> |
|---|
| 24418 | + var thumbsUp = element(by.css('span.glyphicon-thumbs-up')); |
|---|
| 24419 | + var thumbsDown = element(by.css('span.glyphicon-thumbs-down')); |
|---|
| 24420 | + |
|---|
| 24421 | + it('should check ng-show / ng-hide', function() { |
|---|
| 24422 | + expect(thumbsUp.isDisplayed()).toBeFalsy(); |
|---|
| 24423 | + expect(thumbsDown.isDisplayed()).toBeTruthy(); |
|---|
| 24424 | + |
|---|
| 24425 | + element(by.model('checked')).click(); |
|---|
| 24426 | + |
|---|
| 24427 | + expect(thumbsUp.isDisplayed()).toBeTruthy(); |
|---|
| 24428 | + expect(thumbsDown.isDisplayed()).toBeFalsy(); |
|---|
| 24429 | + }); |
|---|
| 24430 | + </file> |
|---|
| 24431 | + </example> |
|---|
| 24432 | + */ |
|---|
| 24433 | +var ngHideDirective = ['$animate', function($animate) { |
|---|
| 24434 | + return { |
|---|
| 24435 | + restrict: 'A', |
|---|
| 24436 | + multiElement: true, |
|---|
| 24437 | + link: function(scope, element, attr) { |
|---|
| 24438 | + scope.$watch(attr.ngHide, function ngHideWatchAction(value){ |
|---|
| 24439 | + // The comment inside of the ngShowDirective explains why we add and |
|---|
| 24440 | + // remove a temporary class for the show/hide animation |
|---|
| 24441 | + $animate[value ? 'addClass' : 'removeClass'](element,NG_HIDE_CLASS, { |
|---|
| 24442 | + tempClasses : NG_HIDE_IN_PROGRESS_CLASS |
|---|
| 24443 | + }); |
|---|
| 24444 | + }); |
|---|
| 24445 | + } |
|---|
| 24446 | + }; |
|---|
| 24447 | +}]; |
|---|
| 24448 | + |
|---|
| 24449 | +/** |
|---|
| 24450 | + * @ngdoc directive |
|---|
| 24451 | + * @name ngStyle |
|---|
| 24452 | + * @restrict AC |
|---|
| 24453 | + * |
|---|
| 24454 | + * @description |
|---|
| 24455 | + * The `ngStyle` directive allows you to set CSS style on an HTML element conditionally. |
|---|
| 24456 | + * |
|---|
| 24457 | + * @element ANY |
|---|
| 24458 | + * @param {expression} ngStyle |
|---|
| 24459 | + * |
|---|
| 24460 | + * {@link guide/expression Expression} which evals to an |
|---|
| 24461 | + * object whose keys are CSS style names and values are corresponding values for those CSS |
|---|
| 24462 | + * keys. |
|---|
| 24463 | + * |
|---|
| 24464 | + * Since some CSS style names are not valid keys for an object, they must be quoted. |
|---|
| 24465 | + * See the 'background-color' style in the example below. |
|---|
| 24466 | + * |
|---|
| 24467 | + * @example |
|---|
| 24468 | + <example> |
|---|
| 24469 | + <file name="index.html"> |
|---|
| 24470 | + <input type="button" value="set color" ng-click="myStyle={color:'red'}"> |
|---|
| 24471 | + <input type="button" value="set background" ng-click="myStyle={'background-color':'blue'}"> |
|---|
| 24472 | + <input type="button" value="clear" ng-click="myStyle={}"> |
|---|
| 24473 | + <br/> |
|---|
| 24474 | + <span ng-style="myStyle">Sample Text</span> |
|---|
| 24475 | + <pre>myStyle={{myStyle}}</pre> |
|---|
| 24476 | + </file> |
|---|
| 24477 | + <file name="style.css"> |
|---|
| 24478 | + span { |
|---|
| 24479 | + color: black; |
|---|
| 24480 | + } |
|---|
| 24481 | + </file> |
|---|
| 24482 | + <file name="protractor.js" type="protractor"> |
|---|
| 24483 | + var colorSpan = element(by.css('span')); |
|---|
| 24484 | + |
|---|
| 24485 | + it('should check ng-style', function() { |
|---|
| 24486 | + expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)'); |
|---|
| 24487 | + element(by.css('input[value=\'set color\']')).click(); |
|---|
| 24488 | + expect(colorSpan.getCssValue('color')).toBe('rgba(255, 0, 0, 1)'); |
|---|
| 24489 | + element(by.css('input[value=clear]')).click(); |
|---|
| 24490 | + expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)'); |
|---|
| 24491 | + }); |
|---|
| 24492 | + </file> |
|---|
| 24493 | + </example> |
|---|
| 24494 | + */ |
|---|
| 24495 | +var ngStyleDirective = ngDirective(function(scope, element, attr) { |
|---|
| 24496 | + scope.$watch(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) { |
|---|
| 24497 | + if (oldStyles && (newStyles !== oldStyles)) { |
|---|
| 24498 | + forEach(oldStyles, function(val, style) { element.css(style, '');}); |
|---|
| 24499 | + } |
|---|
| 24500 | + if (newStyles) element.css(newStyles); |
|---|
| 24501 | + }, true); |
|---|
| 24502 | +}); |
|---|
| 24503 | + |
|---|
| 24504 | +/** |
|---|
| 24505 | + * @ngdoc directive |
|---|
| 24506 | + * @name ngSwitch |
|---|
| 24507 | + * @restrict EA |
|---|
| 24508 | + * |
|---|
| 24509 | + * @description |
|---|
| 24510 | + * The `ngSwitch` directive is used to conditionally swap DOM structure on your template based on a scope expression. |
|---|
| 24511 | + * Elements within `ngSwitch` but without `ngSwitchWhen` or `ngSwitchDefault` directives will be preserved at the location |
|---|
| 24512 | + * as specified in the template. |
|---|
| 24513 | + * |
|---|
| 24514 | + * The directive itself works similar to ngInclude, however, instead of downloading template code (or loading it |
|---|
| 24515 | + * from the template cache), `ngSwitch` simply chooses one of the nested elements and makes it visible based on which element |
|---|
| 24516 | + * matches the value obtained from the evaluated expression. In other words, you define a container element |
|---|
| 24517 | + * (where you place the directive), place an expression on the **`on="..."` attribute** |
|---|
| 24518 | + * (or the **`ng-switch="..."` attribute**), define any inner elements inside of the directive and place |
|---|
| 24519 | + * a when attribute per element. The when attribute is used to inform ngSwitch which element to display when the on |
|---|
| 24520 | + * expression is evaluated. If a matching expression is not found via a when attribute then an element with the default |
|---|
| 24521 | + * attribute is displayed. |
|---|
| 24522 | + * |
|---|
| 24523 | + * <div class="alert alert-info"> |
|---|
| 24524 | + * Be aware that the attribute values to match against cannot be expressions. They are interpreted |
|---|
| 24525 | + * as literal string values to match against. |
|---|
| 24526 | + * For example, **`ng-switch-when="someVal"`** will match against the string `"someVal"` not against the |
|---|
| 24527 | + * value of the expression `$scope.someVal`. |
|---|
| 24528 | + * </div> |
|---|
| 24529 | + |
|---|
| 24530 | + * @animations |
|---|
| 24531 | + * enter - happens after the ngSwitch contents change and the matched child element is placed inside the container |
|---|
| 24532 | + * leave - happens just after the ngSwitch contents change and just before the former contents are removed from the DOM |
|---|
| 24533 | + * |
|---|
| 24534 | + * @usage |
|---|
| 24535 | + * |
|---|
| 24536 | + * ``` |
|---|
| 24537 | + * <ANY ng-switch="expression"> |
|---|
| 24538 | + * <ANY ng-switch-when="matchValue1">...</ANY> |
|---|
| 24539 | + * <ANY ng-switch-when="matchValue2">...</ANY> |
|---|
| 24540 | + * <ANY ng-switch-default>...</ANY> |
|---|
| 24541 | + * </ANY> |
|---|
| 24542 | + * ``` |
|---|
| 24543 | + * |
|---|
| 24544 | + * |
|---|
| 24545 | + * @scope |
|---|
| 24546 | + * @priority 1200 |
|---|
| 24547 | + * @param {*} ngSwitch|on expression to match against <tt>ng-switch-when</tt>. |
|---|
| 24548 | + * On child elements add: |
|---|
| 24549 | + * |
|---|
| 24550 | + * * `ngSwitchWhen`: the case statement to match against. If match then this |
|---|
| 24551 | + * case will be displayed. If the same match appears multiple times, all the |
|---|
| 24552 | + * elements will be displayed. |
|---|
| 24553 | + * * `ngSwitchDefault`: the default case when no other case match. If there |
|---|
| 24554 | + * are multiple default cases, all of them will be displayed when no other |
|---|
| 24555 | + * case match. |
|---|
| 24556 | + * |
|---|
| 24557 | + * |
|---|
| 24558 | + * @example |
|---|
| 24559 | + <example module="switchExample" deps="angular-animate.js" animations="true"> |
|---|
| 24560 | + <file name="index.html"> |
|---|
| 24561 | + <div ng-controller="ExampleController"> |
|---|
| 24562 | + <select ng-model="selection" ng-options="item for item in items"> |
|---|
| 24563 | + </select> |
|---|
| 24564 | + <tt>selection={{selection}}</tt> |
|---|
| 24565 | + <hr/> |
|---|
| 24566 | + <div class="animate-switch-container" |
|---|
| 24567 | + ng-switch on="selection"> |
|---|
| 24568 | + <div class="animate-switch" ng-switch-when="settings">Settings Div</div> |
|---|
| 24569 | + <div class="animate-switch" ng-switch-when="home">Home Span</div> |
|---|
| 24570 | + <div class="animate-switch" ng-switch-default>default</div> |
|---|
| 24571 | + </div> |
|---|
| 24572 | + </div> |
|---|
| 24573 | + </file> |
|---|
| 24574 | + <file name="script.js"> |
|---|
| 24575 | + angular.module('switchExample', ['ngAnimate']) |
|---|
| 24576 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 24577 | + $scope.items = ['settings', 'home', 'other']; |
|---|
| 24578 | + $scope.selection = $scope.items[0]; |
|---|
| 24579 | + }]); |
|---|
| 24580 | + </file> |
|---|
| 24581 | + <file name="animations.css"> |
|---|
| 24582 | + .animate-switch-container { |
|---|
| 24583 | + position:relative; |
|---|
| 24584 | + background:white; |
|---|
| 24585 | + border:1px solid black; |
|---|
| 24586 | + height:40px; |
|---|
| 24587 | + overflow:hidden; |
|---|
| 24588 | + } |
|---|
| 24589 | + |
|---|
| 24590 | + .animate-switch { |
|---|
| 24591 | + padding:10px; |
|---|
| 24592 | + } |
|---|
| 24593 | + |
|---|
| 24594 | + .animate-switch.ng-animate { |
|---|
| 24595 | + -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; |
|---|
| 24596 | + transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; |
|---|
| 24597 | + |
|---|
| 24598 | + position:absolute; |
|---|
| 24599 | + top:0; |
|---|
| 24600 | + left:0; |
|---|
| 24601 | + right:0; |
|---|
| 24602 | + bottom:0; |
|---|
| 24603 | + } |
|---|
| 24604 | + |
|---|
| 24605 | + .animate-switch.ng-leave.ng-leave-active, |
|---|
| 24606 | + .animate-switch.ng-enter { |
|---|
| 24607 | + top:-50px; |
|---|
| 24608 | + } |
|---|
| 24609 | + .animate-switch.ng-leave, |
|---|
| 24610 | + .animate-switch.ng-enter.ng-enter-active { |
|---|
| 24611 | + top:0; |
|---|
| 24612 | + } |
|---|
| 24613 | + </file> |
|---|
| 24614 | + <file name="protractor.js" type="protractor"> |
|---|
| 24615 | + var switchElem = element(by.css('[ng-switch]')); |
|---|
| 24616 | + var select = element(by.model('selection')); |
|---|
| 24617 | + |
|---|
| 24618 | + it('should start in settings', function() { |
|---|
| 24619 | + expect(switchElem.getText()).toMatch(/Settings Div/); |
|---|
| 24620 | + }); |
|---|
| 24621 | + it('should change to home', function() { |
|---|
| 24622 | + select.all(by.css('option')).get(1).click(); |
|---|
| 24623 | + expect(switchElem.getText()).toMatch(/Home Span/); |
|---|
| 24624 | + }); |
|---|
| 24625 | + it('should select default', function() { |
|---|
| 24626 | + select.all(by.css('option')).get(2).click(); |
|---|
| 24627 | + expect(switchElem.getText()).toMatch(/default/); |
|---|
| 24628 | + }); |
|---|
| 24629 | + </file> |
|---|
| 24630 | + </example> |
|---|
| 24631 | + */ |
|---|
| 24632 | +var ngSwitchDirective = ['$animate', function($animate) { |
|---|
| 24633 | + return { |
|---|
| 24634 | + restrict: 'EA', |
|---|
| 24635 | + require: 'ngSwitch', |
|---|
| 24636 | + |
|---|
| 24637 | + // asks for $scope to fool the BC controller module |
|---|
| 24638 | + controller: ['$scope', function ngSwitchController() { |
|---|
| 24639 | + this.cases = {}; |
|---|
| 24640 | + }], |
|---|
| 24641 | + link: function(scope, element, attr, ngSwitchController) { |
|---|
| 24642 | + var watchExpr = attr.ngSwitch || attr.on, |
|---|
| 24643 | + selectedTranscludes = [], |
|---|
| 24644 | + selectedElements = [], |
|---|
| 24645 | + previousLeaveAnimations = [], |
|---|
| 24646 | + selectedScopes = []; |
|---|
| 24647 | + |
|---|
| 24648 | + var spliceFactory = function(array, index) { |
|---|
| 24649 | + return function() { array.splice(index, 1); }; |
|---|
| 24650 | + }; |
|---|
| 24651 | + |
|---|
| 24652 | + scope.$watch(watchExpr, function ngSwitchWatchAction(value) { |
|---|
| 24653 | + var i, ii; |
|---|
| 24654 | + for (i = 0, ii = previousLeaveAnimations.length; i < ii; ++i) { |
|---|
| 24655 | + $animate.cancel(previousLeaveAnimations[i]); |
|---|
| 24656 | + } |
|---|
| 24657 | + previousLeaveAnimations.length = 0; |
|---|
| 24658 | + |
|---|
| 24659 | + for (i = 0, ii = selectedScopes.length; i < ii; ++i) { |
|---|
| 24660 | + var selected = getBlockNodes(selectedElements[i].clone); |
|---|
| 24661 | + selectedScopes[i].$destroy(); |
|---|
| 24662 | + var promise = previousLeaveAnimations[i] = $animate.leave(selected); |
|---|
| 24663 | + promise.then(spliceFactory(previousLeaveAnimations, i)); |
|---|
| 24664 | + } |
|---|
| 24665 | + |
|---|
| 24666 | + selectedElements.length = 0; |
|---|
| 24667 | + selectedScopes.length = 0; |
|---|
| 24668 | + |
|---|
| 24669 | + if ((selectedTranscludes = ngSwitchController.cases['!' + value] || ngSwitchController.cases['?'])) { |
|---|
| 24670 | + forEach(selectedTranscludes, function(selectedTransclude) { |
|---|
| 24671 | + selectedTransclude.transclude(function(caseElement, selectedScope) { |
|---|
| 24672 | + selectedScopes.push(selectedScope); |
|---|
| 24673 | + var anchor = selectedTransclude.element; |
|---|
| 24674 | + caseElement[caseElement.length++] = document.createComment(' end ngSwitchWhen: '); |
|---|
| 24675 | + var block = { clone: caseElement }; |
|---|
| 24676 | + |
|---|
| 24677 | + selectedElements.push(block); |
|---|
| 24678 | + $animate.enter(caseElement, anchor.parent(), anchor); |
|---|
| 24679 | + }); |
|---|
| 24680 | + }); |
|---|
| 24681 | + } |
|---|
| 24682 | + }); |
|---|
| 24683 | + } |
|---|
| 24684 | + }; |
|---|
| 24685 | +}]; |
|---|
| 24686 | + |
|---|
| 24687 | +var ngSwitchWhenDirective = ngDirective({ |
|---|
| 24688 | + transclude: 'element', |
|---|
| 24689 | + priority: 1200, |
|---|
| 24690 | + require: '^ngSwitch', |
|---|
| 24691 | + multiElement: true, |
|---|
| 24692 | + link: function(scope, element, attrs, ctrl, $transclude) { |
|---|
| 24693 | + ctrl.cases['!' + attrs.ngSwitchWhen] = (ctrl.cases['!' + attrs.ngSwitchWhen] || []); |
|---|
| 24694 | + ctrl.cases['!' + attrs.ngSwitchWhen].push({ transclude: $transclude, element: element }); |
|---|
| 24695 | + } |
|---|
| 24696 | +}); |
|---|
| 24697 | + |
|---|
| 24698 | +var ngSwitchDefaultDirective = ngDirective({ |
|---|
| 24699 | + transclude: 'element', |
|---|
| 24700 | + priority: 1200, |
|---|
| 24701 | + require: '^ngSwitch', |
|---|
| 24702 | + multiElement: true, |
|---|
| 24703 | + link: function(scope, element, attr, ctrl, $transclude) { |
|---|
| 24704 | + ctrl.cases['?'] = (ctrl.cases['?'] || []); |
|---|
| 24705 | + ctrl.cases['?'].push({ transclude: $transclude, element: element }); |
|---|
| 24706 | + } |
|---|
| 24707 | +}); |
|---|
| 24708 | + |
|---|
| 24709 | +/** |
|---|
| 24710 | + * @ngdoc directive |
|---|
| 24711 | + * @name ngTransclude |
|---|
| 24712 | + * @restrict EAC |
|---|
| 24713 | + * |
|---|
| 24714 | + * @description |
|---|
| 24715 | + * Directive that marks the insertion point for the transcluded DOM of the nearest parent directive that uses transclusion. |
|---|
| 24716 | + * |
|---|
| 24717 | + * Any existing content of the element that this directive is placed on will be removed before the transcluded content is inserted. |
|---|
| 24718 | + * |
|---|
| 24719 | + * @element ANY |
|---|
| 24720 | + * |
|---|
| 24721 | + * @example |
|---|
| 24722 | + <example module="transcludeExample"> |
|---|
| 24723 | + <file name="index.html"> |
|---|
| 24724 | + <script> |
|---|
| 24725 | + angular.module('transcludeExample', []) |
|---|
| 24726 | + .directive('pane', function(){ |
|---|
| 24727 | + return { |
|---|
| 24728 | + restrict: 'E', |
|---|
| 24729 | + transclude: true, |
|---|
| 24730 | + scope: { title:'@' }, |
|---|
| 24731 | + template: '<div style="border: 1px solid black;">' + |
|---|
| 24732 | + '<div style="background-color: gray">{{title}}</div>' + |
|---|
| 24733 | + '<ng-transclude></ng-transclude>' + |
|---|
| 24734 | + '</div>' |
|---|
| 24735 | + }; |
|---|
| 24736 | + }) |
|---|
| 24737 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 24738 | + $scope.title = 'Lorem Ipsum'; |
|---|
| 24739 | + $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...'; |
|---|
| 24740 | + }]); |
|---|
| 24741 | + </script> |
|---|
| 24742 | + <div ng-controller="ExampleController"> |
|---|
| 24743 | + <input ng-model="title"><br> |
|---|
| 24744 | + <textarea ng-model="text"></textarea> <br/> |
|---|
| 24745 | + <pane title="{{title}}">{{text}}</pane> |
|---|
| 24746 | + </div> |
|---|
| 24747 | + </file> |
|---|
| 24748 | + <file name="protractor.js" type="protractor"> |
|---|
| 24749 | + it('should have transcluded', function() { |
|---|
| 24750 | + var titleElement = element(by.model('title')); |
|---|
| 24751 | + titleElement.clear(); |
|---|
| 24752 | + titleElement.sendKeys('TITLE'); |
|---|
| 24753 | + var textElement = element(by.model('text')); |
|---|
| 24754 | + textElement.clear(); |
|---|
| 24755 | + textElement.sendKeys('TEXT'); |
|---|
| 24756 | + expect(element(by.binding('title')).getText()).toEqual('TITLE'); |
|---|
| 24757 | + expect(element(by.binding('text')).getText()).toEqual('TEXT'); |
|---|
| 24758 | + }); |
|---|
| 24759 | + </file> |
|---|
| 24760 | + </example> |
|---|
| 24761 | + * |
|---|
| 24762 | + */ |
|---|
| 24763 | +var ngTranscludeDirective = ngDirective({ |
|---|
| 24764 | + restrict: 'EAC', |
|---|
| 24765 | + link: function($scope, $element, $attrs, controller, $transclude) { |
|---|
| 24766 | + if (!$transclude) { |
|---|
| 24767 | + throw minErr('ngTransclude')('orphan', |
|---|
| 24768 | + 'Illegal use of ngTransclude directive in the template! ' + |
|---|
| 24769 | + 'No parent directive that requires a transclusion found. ' + |
|---|
| 24770 | + 'Element: {0}', |
|---|
| 24771 | + startingTag($element)); |
|---|
| 24772 | + } |
|---|
| 24773 | + |
|---|
| 24774 | + $transclude(function(clone) { |
|---|
| 24775 | + $element.empty(); |
|---|
| 24776 | + $element.append(clone); |
|---|
| 24777 | + }); |
|---|
| 24778 | + } |
|---|
| 24779 | +}); |
|---|
| 24780 | + |
|---|
| 24781 | +/** |
|---|
| 24782 | + * @ngdoc directive |
|---|
| 24783 | + * @name script |
|---|
| 24784 | + * @restrict E |
|---|
| 24785 | + * |
|---|
| 24786 | + * @description |
|---|
| 24787 | + * Load the content of a `<script>` element into {@link ng.$templateCache `$templateCache`}, so that the |
|---|
| 24788 | + * template can be used by {@link ng.directive:ngInclude `ngInclude`}, |
|---|
| 24789 | + * {@link ngRoute.directive:ngView `ngView`}, or {@link guide/directive directives}. The type of the |
|---|
| 24790 | + * `<script>` element must be specified as `text/ng-template`, and a cache name for the template must be |
|---|
| 24791 | + * assigned through the element's `id`, which can then be used as a directive's `templateUrl`. |
|---|
| 24792 | + * |
|---|
| 24793 | + * @param {string} type Must be set to `'text/ng-template'`. |
|---|
| 24794 | + * @param {string} id Cache name of the template. |
|---|
| 24795 | + * |
|---|
| 24796 | + * @example |
|---|
| 24797 | + <example> |
|---|
| 24798 | + <file name="index.html"> |
|---|
| 24799 | + <script type="text/ng-template" id="/tpl.html"> |
|---|
| 24800 | + Content of the template. |
|---|
| 24801 | + </script> |
|---|
| 24802 | + |
|---|
| 24803 | + <a ng-click="currentTpl='/tpl.html'" id="tpl-link">Load inlined template</a> |
|---|
| 24804 | + <div id="tpl-content" ng-include src="currentTpl"></div> |
|---|
| 24805 | + </file> |
|---|
| 24806 | + <file name="protractor.js" type="protractor"> |
|---|
| 24807 | + it('should load template defined inside script tag', function() { |
|---|
| 24808 | + element(by.css('#tpl-link')).click(); |
|---|
| 24809 | + expect(element(by.css('#tpl-content')).getText()).toMatch(/Content of the template/); |
|---|
| 24810 | + }); |
|---|
| 24811 | + </file> |
|---|
| 24812 | + </example> |
|---|
| 24813 | + */ |
|---|
| 24814 | +var scriptDirective = ['$templateCache', function($templateCache) { |
|---|
| 24815 | + return { |
|---|
| 24816 | + restrict: 'E', |
|---|
| 24817 | + terminal: true, |
|---|
| 24818 | + compile: function(element, attr) { |
|---|
| 24819 | + if (attr.type == 'text/ng-template') { |
|---|
| 24820 | + var templateUrl = attr.id, |
|---|
| 24821 | + // IE is not consistent, in scripts we have to read .text but in other nodes we have to read .textContent |
|---|
| 24822 | + text = element[0].text; |
|---|
| 24823 | + |
|---|
| 24824 | + $templateCache.put(templateUrl, text); |
|---|
| 24825 | + } |
|---|
| 24826 | + } |
|---|
| 24827 | + }; |
|---|
| 24828 | +}]; |
|---|
| 24829 | + |
|---|
| 24830 | +var ngOptionsMinErr = minErr('ngOptions'); |
|---|
| 24831 | +/** |
|---|
| 24832 | + * @ngdoc directive |
|---|
| 24833 | + * @name select |
|---|
| 24834 | + * @restrict E |
|---|
| 24835 | + * |
|---|
| 24836 | + * @description |
|---|
| 24837 | + * HTML `SELECT` element with angular data-binding. |
|---|
| 24838 | + * |
|---|
| 24839 | + * # `ngOptions` |
|---|
| 24840 | + * |
|---|
| 24841 | + * The `ngOptions` attribute can be used to dynamically generate a list of `<option>` |
|---|
| 24842 | + * elements for the `<select>` element using the array or object obtained by evaluating the |
|---|
| 24843 | + * `ngOptions` comprehension_expression. |
|---|
| 24844 | + * |
|---|
| 24845 | + * When an item in the `<select>` menu is selected, the array element or object property |
|---|
| 24846 | + * represented by the selected option will be bound to the model identified by the `ngModel` |
|---|
| 24847 | + * directive. |
|---|
| 24848 | + * |
|---|
| 24849 | + * <div class="alert alert-warning"> |
|---|
| 24850 | + * **Note:** `ngModel` compares by reference, not value. This is important when binding to an |
|---|
| 24851 | + * array of objects. See an example [in this jsfiddle](http://jsfiddle.net/qWzTb/). |
|---|
| 24852 | + * </div> |
|---|
| 24853 | + * |
|---|
| 24854 | + * Optionally, a single hard-coded `<option>` element, with the value set to an empty string, can |
|---|
| 24855 | + * be nested into the `<select>` element. This element will then represent the `null` or "not selected" |
|---|
| 24856 | + * option. See example below for demonstration. |
|---|
| 24857 | + * |
|---|
| 24858 | + * <div class="alert alert-warning"> |
|---|
| 24859 | + * **Note:** `ngOptions` provides an iterator facility for the `<option>` element which should be used instead |
|---|
| 24860 | + * of {@link ng.directive:ngRepeat ngRepeat} when you want the |
|---|
| 24861 | + * `select` model to be bound to a non-string value. This is because an option element can only |
|---|
| 24862 | + * be bound to string values at present. |
|---|
| 24863 | + * </div> |
|---|
| 24864 | + * |
|---|
| 24865 | + * <div class="alert alert-info"> |
|---|
| 24866 | + * **Note:** Using `select as` will bind the result of the `select as` expression to the model, but |
|---|
| 24867 | + * the value of the `<select>` and `<option>` html elements will be either the index (for array data sources) |
|---|
| 24868 | + * or property name (for object data sources) of the value within the collection. |
|---|
| 24869 | + * </div> |
|---|
| 24870 | + * |
|---|
| 24871 | + * **Note:** Using `select as` together with `trackexpr` is not recommended. |
|---|
| 24872 | + * Reasoning: |
|---|
| 24873 | + * - Example: <select ng-options="item.subItem as item.label for item in values track by item.id" ng-model="selected"> |
|---|
| 24874 | + * values: [{id: 1, label: 'aLabel', subItem: {name: 'aSubItem'}}, {id: 2, label: 'bLabel', subItem: {name: 'bSubItem'}}], |
|---|
| 24875 | + * $scope.selected = {name: 'aSubItem'}; |
|---|
| 24876 | + * - track by is always applied to `value`, with the purpose of preserving the selection, |
|---|
| 24877 | + * (to `item` in this case) |
|---|
| 24878 | + * - to calculate whether an item is selected we do the following: |
|---|
| 24879 | + * 1. apply `track by` to the values in the array, e.g. |
|---|
| 24880 | + * In the example: [1,2] |
|---|
| 24881 | + * 2. apply `track by` to the already selected value in `ngModel`: |
|---|
| 24882 | + * In the example: this is not possible, as `track by` refers to `item.id`, but the selected |
|---|
| 24883 | + * value from `ngModel` is `{name: aSubItem}`. |
|---|
| 24884 | + * |
|---|
| 24885 | + * @param {string} ngModel Assignable angular expression to data-bind to. |
|---|
| 24886 | + * @param {string=} name Property name of the form under which the control is published. |
|---|
| 24887 | + * @param {string=} required The control is considered valid only if value is entered. |
|---|
| 24888 | + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to |
|---|
| 24889 | + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of |
|---|
| 24890 | + * `required` when you want to data-bind to the `required` attribute. |
|---|
| 24891 | + * @param {comprehension_expression=} ngOptions in one of the following forms: |
|---|
| 24892 | + * |
|---|
| 24893 | + * * for array data sources: |
|---|
| 24894 | + * * `label` **`for`** `value` **`in`** `array` |
|---|
| 24895 | + * * `select` **`as`** `label` **`for`** `value` **`in`** `array` |
|---|
| 24896 | + * * `label` **`group by`** `group` **`for`** `value` **`in`** `array` |
|---|
| 24897 | + * * `select` **`as`** `label` **`group by`** `group` **`for`** `value` **`in`** `array` **`track by`** `trackexpr` |
|---|
| 24898 | + * * for object data sources: |
|---|
| 24899 | + * * `label` **`for (`**`key` **`,`** `value`**`) in`** `object` |
|---|
| 24900 | + * * `select` **`as`** `label` **`for (`**`key` **`,`** `value`**`) in`** `object` |
|---|
| 24901 | + * * `label` **`group by`** `group` **`for (`**`key`**`,`** `value`**`) in`** `object` |
|---|
| 24902 | + * * `select` **`as`** `label` **`group by`** `group` |
|---|
| 24903 | + * **`for` `(`**`key`**`,`** `value`**`) in`** `object` |
|---|
| 24904 | + * |
|---|
| 24905 | + * Where: |
|---|
| 24906 | + * |
|---|
| 24907 | + * * `array` / `object`: an expression which evaluates to an array / object to iterate over. |
|---|
| 24908 | + * * `value`: local variable which will refer to each item in the `array` or each property value |
|---|
| 24909 | + * of `object` during iteration. |
|---|
| 24910 | + * * `key`: local variable which will refer to a property name in `object` during iteration. |
|---|
| 24911 | + * * `label`: The result of this expression will be the label for `<option>` element. The |
|---|
| 24912 | + * `expression` will most likely refer to the `value` variable (e.g. `value.propertyName`). |
|---|
| 24913 | + * * `select`: The result of this expression will be bound to the model of the parent `<select>` |
|---|
| 24914 | + * element. If not specified, `select` expression will default to `value`. |
|---|
| 24915 | + * * `group`: The result of this expression will be used to group options using the `<optgroup>` |
|---|
| 24916 | + * DOM element. |
|---|
| 24917 | + * * `trackexpr`: Used when working with an array of objects. The result of this expression will be |
|---|
| 24918 | + * used to identify the objects in the array. The `trackexpr` will most likely refer to the |
|---|
| 24919 | + * `value` variable (e.g. `value.propertyName`). With this the selection is preserved |
|---|
| 24920 | + * even when the options are recreated (e.g. reloaded from the server). |
|---|
| 24921 | + * |
|---|
| 24922 | + * @example |
|---|
| 24923 | + <example module="selectExample"> |
|---|
| 24924 | + <file name="index.html"> |
|---|
| 24925 | + <script> |
|---|
| 24926 | + angular.module('selectExample', []) |
|---|
| 24927 | + .controller('ExampleController', ['$scope', function($scope) { |
|---|
| 24928 | + $scope.colors = [ |
|---|
| 24929 | + {name:'black', shade:'dark'}, |
|---|
| 24930 | + {name:'white', shade:'light'}, |
|---|
| 24931 | + {name:'red', shade:'dark'}, |
|---|
| 24932 | + {name:'blue', shade:'dark'}, |
|---|
| 24933 | + {name:'yellow', shade:'light'} |
|---|
| 24934 | + ]; |
|---|
| 24935 | + $scope.myColor = $scope.colors[2]; // red |
|---|
| 24936 | + }]); |
|---|
| 24937 | + </script> |
|---|
| 24938 | + <div ng-controller="ExampleController"> |
|---|
| 24939 | + <ul> |
|---|
| 24940 | + <li ng-repeat="color in colors"> |
|---|
| 24941 | + Name: <input ng-model="color.name"> |
|---|
| 24942 | + [<a href ng-click="colors.splice($index, 1)">X</a>] |
|---|
| 24943 | + </li> |
|---|
| 24944 | + <li> |
|---|
| 24945 | + [<a href ng-click="colors.push({})">add</a>] |
|---|
| 24946 | + </li> |
|---|
| 24947 | + </ul> |
|---|
| 24948 | + <hr/> |
|---|
| 24949 | + Color (null not allowed): |
|---|
| 24950 | + <select ng-model="myColor" ng-options="color.name for color in colors"></select><br> |
|---|
| 24951 | + |
|---|
| 24952 | + Color (null allowed): |
|---|
| 24953 | + <span class="nullable"> |
|---|
| 24954 | + <select ng-model="myColor" ng-options="color.name for color in colors"> |
|---|
| 24955 | + <option value="">-- choose color --</option> |
|---|
| 24956 | + </select> |
|---|
| 24957 | + </span><br/> |
|---|
| 24958 | + |
|---|
| 24959 | + Color grouped by shade: |
|---|
| 24960 | + <select ng-model="myColor" ng-options="color.name group by color.shade for color in colors"> |
|---|
| 24961 | + </select><br/> |
|---|
| 24962 | + |
|---|
| 24963 | + |
|---|
| 24964 | + Select <a href ng-click="myColor = { name:'not in list', shade: 'other' }">bogus</a>.<br> |
|---|
| 24965 | + <hr/> |
|---|
| 24966 | + Currently selected: {{ {selected_color:myColor} }} |
|---|
| 24967 | + <div style="border:solid 1px black; height:20px" |
|---|
| 24968 | + ng-style="{'background-color':myColor.name}"> |
|---|
| 24969 | + </div> |
|---|
| 24970 | + </div> |
|---|
| 24971 | + </file> |
|---|
| 24972 | + <file name="protractor.js" type="protractor"> |
|---|
| 24973 | + it('should check ng-options', function() { |
|---|
| 24974 | + expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('red'); |
|---|
| 24975 | + element.all(by.model('myColor')).first().click(); |
|---|
| 24976 | + element.all(by.css('select[ng-model="myColor"] option')).first().click(); |
|---|
| 24977 | + expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('black'); |
|---|
| 24978 | + element(by.css('.nullable select[ng-model="myColor"]')).click(); |
|---|
| 24979 | + element.all(by.css('.nullable select[ng-model="myColor"] option')).first().click(); |
|---|
| 24980 | + expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('null'); |
|---|
| 24981 | + }); |
|---|
| 24982 | + </file> |
|---|
| 24983 | + </example> |
|---|
| 24984 | + */ |
|---|
| 24985 | + |
|---|
| 24986 | +var ngOptionsDirective = valueFn({ |
|---|
| 24987 | + restrict: 'A', |
|---|
| 24988 | + terminal: true |
|---|
| 24989 | +}); |
|---|
| 24990 | + |
|---|
| 24991 | +// jshint maxlen: false |
|---|
| 24992 | +var selectDirective = ['$compile', '$parse', function($compile, $parse) { |
|---|
| 24993 | + //000011111111110000000000022222222220000000000000000000003333333333000000000000004444444444444440000000005555555555555550000000666666666666666000000000000000777777777700000000000000000008888888888 |
|---|
| 24994 | + var NG_OPTIONS_REGEXP = /^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/, |
|---|
| 24995 | + nullModelCtrl = {$setViewValue: noop}; |
|---|
| 24996 | +// jshint maxlen: 100 |
|---|
| 24997 | + |
|---|
| 24998 | + return { |
|---|
| 24999 | + restrict: 'E', |
|---|
| 25000 | + require: ['select', '?ngModel'], |
|---|
| 25001 | + controller: ['$element', '$scope', '$attrs', function($element, $scope, $attrs) { |
|---|
| 25002 | + var self = this, |
|---|
| 25003 | + optionsMap = {}, |
|---|
| 25004 | + ngModelCtrl = nullModelCtrl, |
|---|
| 25005 | + nullOption, |
|---|
| 25006 | + unknownOption; |
|---|
| 25007 | + |
|---|
| 25008 | + |
|---|
| 25009 | + self.databound = $attrs.ngModel; |
|---|
| 25010 | + |
|---|
| 25011 | + |
|---|
| 25012 | + self.init = function(ngModelCtrl_, nullOption_, unknownOption_) { |
|---|
| 25013 | + ngModelCtrl = ngModelCtrl_; |
|---|
| 25014 | + nullOption = nullOption_; |
|---|
| 25015 | + unknownOption = unknownOption_; |
|---|
| 25016 | + }; |
|---|
| 25017 | + |
|---|
| 25018 | + |
|---|
| 25019 | + self.addOption = function(value, element) { |
|---|
| 25020 | + assertNotHasOwnProperty(value, '"option value"'); |
|---|
| 25021 | + optionsMap[value] = true; |
|---|
| 25022 | + |
|---|
| 25023 | + if (ngModelCtrl.$viewValue == value) { |
|---|
| 25024 | + $element.val(value); |
|---|
| 25025 | + if (unknownOption.parent()) unknownOption.remove(); |
|---|
| 25026 | + } |
|---|
| 25027 | + // Workaround for https://code.google.com/p/chromium/issues/detail?id=381459 |
|---|
| 25028 | + // Adding an <option selected="selected"> element to a <select required="required"> should |
|---|
| 25029 | + // automatically select the new element |
|---|
| 25030 | + if (element && element[0].hasAttribute('selected')) { |
|---|
| 25031 | + element[0].selected = true; |
|---|
| 25032 | + } |
|---|
| 25033 | + }; |
|---|
| 25034 | + |
|---|
| 25035 | + |
|---|
| 25036 | + self.removeOption = function(value) { |
|---|
| 25037 | + if (this.hasOption(value)) { |
|---|
| 25038 | + delete optionsMap[value]; |
|---|
| 25039 | + if (ngModelCtrl.$viewValue == value) { |
|---|
| 25040 | + this.renderUnknownOption(value); |
|---|
| 25041 | + } |
|---|
| 25042 | + } |
|---|
| 25043 | + }; |
|---|
| 25044 | + |
|---|
| 25045 | + |
|---|
| 25046 | + self.renderUnknownOption = function(val) { |
|---|
| 25047 | + var unknownVal = '? ' + hashKey(val) + ' ?'; |
|---|
| 25048 | + unknownOption.val(unknownVal); |
|---|
| 25049 | + $element.prepend(unknownOption); |
|---|
| 25050 | + $element.val(unknownVal); |
|---|
| 25051 | + unknownOption.prop('selected', true); // needed for IE |
|---|
| 25052 | + }; |
|---|
| 25053 | + |
|---|
| 25054 | + |
|---|
| 25055 | + self.hasOption = function(value) { |
|---|
| 25056 | + return optionsMap.hasOwnProperty(value); |
|---|
| 25057 | + }; |
|---|
| 25058 | + |
|---|
| 25059 | + $scope.$on('$destroy', function() { |
|---|
| 25060 | + // disable unknown option so that we don't do work when the whole select is being destroyed |
|---|
| 25061 | + self.renderUnknownOption = noop; |
|---|
| 25062 | + }); |
|---|
| 25063 | + }], |
|---|
| 25064 | + |
|---|
| 25065 | + link: function(scope, element, attr, ctrls) { |
|---|
| 25066 | + // if ngModel is not defined, we don't need to do anything |
|---|
| 25067 | + if (!ctrls[1]) return; |
|---|
| 25068 | + |
|---|
| 25069 | + var selectCtrl = ctrls[0], |
|---|
| 25070 | + ngModelCtrl = ctrls[1], |
|---|
| 25071 | + multiple = attr.multiple, |
|---|
| 25072 | + optionsExp = attr.ngOptions, |
|---|
| 25073 | + nullOption = false, // if false, user will not be able to select it (used by ngOptions) |
|---|
| 25074 | + emptyOption, |
|---|
| 25075 | + renderScheduled = false, |
|---|
| 25076 | + // we can't just jqLite('<option>') since jqLite is not smart enough |
|---|
| 25077 | + // to create it in <select> and IE barfs otherwise. |
|---|
| 25078 | + optionTemplate = jqLite(document.createElement('option')), |
|---|
| 25079 | + optGroupTemplate =jqLite(document.createElement('optgroup')), |
|---|
| 25080 | + unknownOption = optionTemplate.clone(); |
|---|
| 25081 | + |
|---|
| 25082 | + // find "null" option |
|---|
| 25083 | + for(var i = 0, children = element.children(), ii = children.length; i < ii; i++) { |
|---|
| 25084 | + if (children[i].value === '') { |
|---|
| 25085 | + emptyOption = nullOption = children.eq(i); |
|---|
| 25086 | + break; |
|---|
| 25087 | + } |
|---|
| 25088 | + } |
|---|
| 25089 | + |
|---|
| 25090 | + selectCtrl.init(ngModelCtrl, nullOption, unknownOption); |
|---|
| 25091 | + |
|---|
| 25092 | + // required validator |
|---|
| 25093 | + if (multiple) { |
|---|
| 25094 | + ngModelCtrl.$isEmpty = function(value) { |
|---|
| 25095 | + return !value || value.length === 0; |
|---|
| 25096 | + }; |
|---|
| 25097 | + } |
|---|
| 25098 | + |
|---|
| 25099 | + if (optionsExp) setupAsOptions(scope, element, ngModelCtrl); |
|---|
| 25100 | + else if (multiple) setupAsMultiple(scope, element, ngModelCtrl); |
|---|
| 25101 | + else setupAsSingle(scope, element, ngModelCtrl, selectCtrl); |
|---|
| 25102 | + |
|---|
| 25103 | + |
|---|
| 25104 | + //////////////////////////// |
|---|
| 25105 | + |
|---|
| 25106 | + |
|---|
| 25107 | + |
|---|
| 25108 | + function setupAsSingle(scope, selectElement, ngModelCtrl, selectCtrl) { |
|---|
| 25109 | + ngModelCtrl.$render = function() { |
|---|
| 25110 | + var viewValue = ngModelCtrl.$viewValue; |
|---|
| 25111 | + |
|---|
| 25112 | + if (selectCtrl.hasOption(viewValue)) { |
|---|
| 25113 | + if (unknownOption.parent()) unknownOption.remove(); |
|---|
| 25114 | + selectElement.val(viewValue); |
|---|
| 25115 | + if (viewValue === '') emptyOption.prop('selected', true); // to make IE9 happy |
|---|
| 25116 | + } else { |
|---|
| 25117 | + if (isUndefined(viewValue) && emptyOption) { |
|---|
| 25118 | + selectElement.val(''); |
|---|
| 25119 | + } else { |
|---|
| 25120 | + selectCtrl.renderUnknownOption(viewValue); |
|---|
| 25121 | + } |
|---|
| 25122 | + } |
|---|
| 25123 | + }; |
|---|
| 25124 | + |
|---|
| 25125 | + selectElement.on('change', function() { |
|---|
| 25126 | + scope.$apply(function() { |
|---|
| 25127 | + if (unknownOption.parent()) unknownOption.remove(); |
|---|
| 25128 | + ngModelCtrl.$setViewValue(selectElement.val()); |
|---|
| 25129 | + }); |
|---|
| 25130 | + }); |
|---|
| 25131 | + } |
|---|
| 25132 | + |
|---|
| 25133 | + function setupAsMultiple(scope, selectElement, ctrl) { |
|---|
| 25134 | + var lastView; |
|---|
| 25135 | + ctrl.$render = function() { |
|---|
| 25136 | + var items = new HashMap(ctrl.$viewValue); |
|---|
| 25137 | + forEach(selectElement.find('option'), function(option) { |
|---|
| 25138 | + option.selected = isDefined(items.get(option.value)); |
|---|
| 25139 | + }); |
|---|
| 25140 | + }; |
|---|
| 25141 | + |
|---|
| 25142 | + // we have to do it on each watch since ngModel watches reference, but |
|---|
| 25143 | + // we need to work of an array, so we need to see if anything was inserted/removed |
|---|
| 25144 | + scope.$watch(function selectMultipleWatch() { |
|---|
| 25145 | + if (!equals(lastView, ctrl.$viewValue)) { |
|---|
| 25146 | + lastView = shallowCopy(ctrl.$viewValue); |
|---|
| 25147 | + ctrl.$render(); |
|---|
| 25148 | + } |
|---|
| 25149 | + }); |
|---|
| 25150 | + |
|---|
| 25151 | + selectElement.on('change', function() { |
|---|
| 25152 | + scope.$apply(function() { |
|---|
| 25153 | + var array = []; |
|---|
| 25154 | + forEach(selectElement.find('option'), function(option) { |
|---|
| 25155 | + if (option.selected) { |
|---|
| 25156 | + array.push(option.value); |
|---|
| 25157 | + } |
|---|
| 25158 | + }); |
|---|
| 25159 | + ctrl.$setViewValue(array); |
|---|
| 25160 | + }); |
|---|
| 25161 | + }); |
|---|
| 25162 | + } |
|---|
| 25163 | + |
|---|
| 25164 | + function setupAsOptions(scope, selectElement, ctrl) { |
|---|
| 25165 | + var match; |
|---|
| 25166 | + |
|---|
| 25167 | + if (!(match = optionsExp.match(NG_OPTIONS_REGEXP))) { |
|---|
| 25168 | + throw ngOptionsMinErr('iexp', |
|---|
| 25169 | + "Expected expression in form of " + |
|---|
| 25170 | + "'_select_ (as _label_)? for (_key_,)?_value_ in _collection_'" + |
|---|
| 25171 | + " but got '{0}'. Element: {1}", |
|---|
| 25172 | + optionsExp, startingTag(selectElement)); |
|---|
| 25173 | + } |
|---|
| 25174 | + |
|---|
| 25175 | + var displayFn = $parse(match[2] || match[1]), |
|---|
| 25176 | + valueName = match[4] || match[6], |
|---|
| 25177 | + selectAs = / as /.test(match[0]) && match[1], |
|---|
| 25178 | + selectAsFn = selectAs ? $parse(selectAs) : null, |
|---|
| 25179 | + keyName = match[5], |
|---|
| 25180 | + groupByFn = $parse(match[3] || ''), |
|---|
| 25181 | + valueFn = $parse(match[2] ? match[1] : valueName), |
|---|
| 25182 | + valuesFn = $parse(match[7]), |
|---|
| 25183 | + track = match[8], |
|---|
| 25184 | + trackFn = track ? $parse(match[8]) : null, |
|---|
| 25185 | + // This is an array of array of existing option groups in DOM. |
|---|
| 25186 | + // We try to reuse these if possible |
|---|
| 25187 | + // - optionGroupsCache[0] is the options with no option group |
|---|
| 25188 | + // - optionGroupsCache[?][0] is the parent: either the SELECT or OPTGROUP element |
|---|
| 25189 | + optionGroupsCache = [[{element: selectElement, label:''}]], |
|---|
| 25190 | + //re-usable object to represent option's locals |
|---|
| 25191 | + locals = {}; |
|---|
| 25192 | + |
|---|
| 25193 | + if (nullOption) { |
|---|
| 25194 | + // compile the element since there might be bindings in it |
|---|
| 25195 | + $compile(nullOption)(scope); |
|---|
| 25196 | + |
|---|
| 25197 | + // remove the class, which is added automatically because we recompile the element and it |
|---|
| 25198 | + // becomes the compilation root |
|---|
| 25199 | + nullOption.removeClass('ng-scope'); |
|---|
| 25200 | + |
|---|
| 25201 | + // we need to remove it before calling selectElement.empty() because otherwise IE will |
|---|
| 25202 | + // remove the label from the element. wtf? |
|---|
| 25203 | + nullOption.remove(); |
|---|
| 25204 | + } |
|---|
| 25205 | + |
|---|
| 25206 | + // clear contents, we'll add what's needed based on the model |
|---|
| 25207 | + selectElement.empty(); |
|---|
| 25208 | + |
|---|
| 25209 | + selectElement.on('change', selectionChanged); |
|---|
| 25210 | + |
|---|
| 25211 | + ctrl.$render = render; |
|---|
| 25212 | + |
|---|
| 25213 | + scope.$watchCollection(valuesFn, scheduleRendering); |
|---|
| 25214 | + scope.$watchCollection(getLabels, scheduleRendering); |
|---|
| 25215 | + |
|---|
| 25216 | + if (multiple) { |
|---|
| 25217 | + scope.$watchCollection(function() { return ctrl.$modelValue; }, scheduleRendering); |
|---|
| 25218 | + } |
|---|
| 25219 | + |
|---|
| 25220 | + // ------------------------------------------------------------------ // |
|---|
| 25221 | + |
|---|
| 25222 | + function callExpression(exprFn, key, value) { |
|---|
| 25223 | + locals[valueName] = value; |
|---|
| 25224 | + if (keyName) locals[keyName] = key; |
|---|
| 25225 | + return exprFn(scope, locals); |
|---|
| 25226 | + } |
|---|
| 25227 | + |
|---|
| 25228 | + function selectionChanged() { |
|---|
| 25229 | + scope.$apply(function() { |
|---|
| 25230 | + var optionGroup, |
|---|
| 25231 | + collection = valuesFn(scope) || [], |
|---|
| 25232 | + key, value, optionElement, index, groupIndex, length, groupLength, trackIndex; |
|---|
| 25233 | + var viewValue; |
|---|
| 25234 | + if (multiple) { |
|---|
| 25235 | + viewValue = []; |
|---|
| 25236 | + forEach(selectElement.val(), function(selectedKey) { |
|---|
| 25237 | + viewValue.push(getViewValue(selectedKey, collection[selectedKey])); |
|---|
| 25238 | + }); |
|---|
| 25239 | + } else { |
|---|
| 25240 | + var selectedKey = selectElement.val(); |
|---|
| 25241 | + viewValue = getViewValue(selectedKey, collection[selectedKey]); |
|---|
| 25242 | + } |
|---|
| 25243 | + ctrl.$setViewValue(viewValue); |
|---|
| 25244 | + render(); |
|---|
| 25245 | + }); |
|---|
| 25246 | + } |
|---|
| 25247 | + |
|---|
| 25248 | + function getViewValue(key, value) { |
|---|
| 25249 | + if (key === '?') { |
|---|
| 25250 | + return undefined; |
|---|
| 25251 | + } else if (key === '') { |
|---|
| 25252 | + return null; |
|---|
| 25253 | + } else { |
|---|
| 25254 | + var viewValueFn = selectAsFn ? selectAsFn : valueFn; |
|---|
| 25255 | + return callExpression(viewValueFn, key, value); |
|---|
| 25256 | + } |
|---|
| 25257 | + } |
|---|
| 25258 | + |
|---|
| 25259 | + function getLabels() { |
|---|
| 25260 | + var values = valuesFn(scope); |
|---|
| 25261 | + var toDisplay; |
|---|
| 25262 | + if (values && isArray(values)) { |
|---|
| 25263 | + toDisplay = new Array(values.length); |
|---|
| 25264 | + for (var i = 0, ii = values.length; i < ii; i++) { |
|---|
| 25265 | + toDisplay[i] = callExpression(displayFn, i, values[i]); |
|---|
| 25266 | + } |
|---|
| 25267 | + return toDisplay; |
|---|
| 25268 | + } else if (values) { |
|---|
| 25269 | + // TODO: Add a test for this case |
|---|
| 25270 | + toDisplay = {}; |
|---|
| 25271 | + for (var prop in values) { |
|---|
| 25272 | + if (values.hasOwnProperty(prop)) { |
|---|
| 25273 | + toDisplay[prop] = callExpression(displayFn, prop, values[prop]); |
|---|
| 25274 | + } |
|---|
| 25275 | + } |
|---|
| 25276 | + } |
|---|
| 25277 | + return toDisplay; |
|---|
| 25278 | + } |
|---|
| 25279 | + |
|---|
| 25280 | + function createIsSelectedFn(viewValue) { |
|---|
| 25281 | + var selectedSet; |
|---|
| 25282 | + if (multiple) { |
|---|
| 25283 | + if (trackFn && isArray(viewValue)) { |
|---|
| 25284 | + |
|---|
| 25285 | + selectedSet = new HashMap([]); |
|---|
| 25286 | + for (var trackIndex = 0; trackIndex < viewValue.length; trackIndex++) { |
|---|
| 25287 | + // tracking by key |
|---|
| 25288 | + selectedSet.put(callExpression(trackFn, null, viewValue[trackIndex]), true); |
|---|
| 25289 | + } |
|---|
| 25290 | + } else { |
|---|
| 25291 | + selectedSet = new HashMap(viewValue); |
|---|
| 25292 | + } |
|---|
| 25293 | + } else if (trackFn) { |
|---|
| 25294 | + viewValue = callExpression(trackFn, null, viewValue); |
|---|
| 25295 | + } |
|---|
| 25296 | + |
|---|
| 25297 | + return function isSelected(key, value) { |
|---|
| 25298 | + var compareValueFn; |
|---|
| 25299 | + if (trackFn) { |
|---|
| 25300 | + compareValueFn = trackFn; |
|---|
| 25301 | + } else if (selectAsFn) { |
|---|
| 25302 | + compareValueFn = selectAsFn; |
|---|
| 25303 | + } else { |
|---|
| 25304 | + compareValueFn = valueFn; |
|---|
| 25305 | + } |
|---|
| 25306 | + |
|---|
| 25307 | + if (multiple) { |
|---|
| 25308 | + return isDefined(selectedSet.remove(callExpression(compareValueFn, key, value))); |
|---|
| 25309 | + } else { |
|---|
| 25310 | + return viewValue == callExpression(compareValueFn, key, value); |
|---|
| 25311 | + } |
|---|
| 25312 | + }; |
|---|
| 25313 | + } |
|---|
| 25314 | + |
|---|
| 25315 | + function scheduleRendering() { |
|---|
| 25316 | + if (!renderScheduled) { |
|---|
| 25317 | + scope.$$postDigest(render); |
|---|
| 25318 | + renderScheduled = true; |
|---|
| 25319 | + } |
|---|
| 25320 | + } |
|---|
| 25321 | + |
|---|
| 25322 | + /** |
|---|
| 25323 | + * A new labelMap is created with each render. |
|---|
| 25324 | + * This function is called for each existing option with added=false, |
|---|
| 25325 | + * and each new option with added=true. |
|---|
| 25326 | + * - Labels that are passed to this method twice, |
|---|
| 25327 | + * (once with added=true and once with added=false) will end up with a value of 0, and |
|---|
| 25328 | + * will cause no change to happen to the corresponding option. |
|---|
| 25329 | + * - Labels that are passed to this method only once with added=false will end up with a |
|---|
| 25330 | + * value of -1 and will eventually be passed to selectCtrl.removeOption() |
|---|
| 25331 | + * - Labels that are passed to this method only once with added=true will end up with a |
|---|
| 25332 | + * value of 1 and will eventually be passed to selectCtrl.addOption() |
|---|
| 25333 | + */ |
|---|
| 25334 | + function updateLabelMap(labelMap, label, added) { |
|---|
| 25335 | + labelMap[label] = labelMap[label] || 0; |
|---|
| 25336 | + labelMap[label] += (added ? 1 : -1); |
|---|
| 25337 | + } |
|---|
| 25338 | + |
|---|
| 25339 | + function render() { |
|---|
| 25340 | + renderScheduled = false; |
|---|
| 25341 | + |
|---|
| 25342 | + // Temporary location for the option groups before we render them |
|---|
| 25343 | + var optionGroups = {'':[]}, |
|---|
| 25344 | + optionGroupNames = [''], |
|---|
| 25345 | + optionGroupName, |
|---|
| 25346 | + optionGroup, |
|---|
| 25347 | + option, |
|---|
| 25348 | + existingParent, existingOptions, existingOption, |
|---|
| 25349 | + viewValue = ctrl.$viewValue, |
|---|
| 25350 | + values = valuesFn(scope) || [], |
|---|
| 25351 | + keys = keyName ? sortedKeys(values) : values, |
|---|
| 25352 | + key, |
|---|
| 25353 | + value, |
|---|
| 25354 | + groupLength, length, |
|---|
| 25355 | + groupIndex, index, |
|---|
| 25356 | + labelMap = {}, |
|---|
| 25357 | + selected, |
|---|
| 25358 | + isSelected = createIsSelectedFn(viewValue), |
|---|
| 25359 | + anySelected = false, |
|---|
| 25360 | + lastElement, |
|---|
| 25361 | + element, |
|---|
| 25362 | + label; |
|---|
| 25363 | + |
|---|
| 25364 | + // We now build up the list of options we need (we merge later) |
|---|
| 25365 | + for (index = 0; length = keys.length, index < length; index++) { |
|---|
| 25366 | + key = index; |
|---|
| 25367 | + if (keyName) { |
|---|
| 25368 | + key = keys[index]; |
|---|
| 25369 | + if ( key.charAt(0) === '$' ) continue; |
|---|
| 25370 | + } |
|---|
| 25371 | + value = values[key]; |
|---|
| 25372 | + |
|---|
| 25373 | + optionGroupName = callExpression(groupByFn, key, value) || ''; |
|---|
| 25374 | + if (!(optionGroup = optionGroups[optionGroupName])) { |
|---|
| 25375 | + optionGroup = optionGroups[optionGroupName] = []; |
|---|
| 25376 | + optionGroupNames.push(optionGroupName); |
|---|
| 25377 | + } |
|---|
| 25378 | + |
|---|
| 25379 | + selected = isSelected(key, value); |
|---|
| 25380 | + anySelected = anySelected || selected; |
|---|
| 25381 | + |
|---|
| 25382 | + label = callExpression(displayFn, key, value); // what will be seen by the user |
|---|
| 25383 | + |
|---|
| 25384 | + // doing displayFn(scope, locals) || '' overwrites zero values |
|---|
| 25385 | + label = isDefined(label) ? label : ''; |
|---|
| 25386 | + optionGroup.push({ |
|---|
| 25387 | + // either the index into array or key from object |
|---|
| 25388 | + id: (keyName ? keys[index] : index), |
|---|
| 25389 | + label: label, |
|---|
| 25390 | + selected: selected // determine if we should be selected |
|---|
| 25391 | + }); |
|---|
| 25392 | + } |
|---|
| 25393 | + if (!multiple) { |
|---|
| 25394 | + if (nullOption || viewValue === null) { |
|---|
| 25395 | + // insert null option if we have a placeholder, or the model is null |
|---|
| 25396 | + optionGroups[''].unshift({id:'', label:'', selected:!anySelected}); |
|---|
| 25397 | + } else if (!anySelected) { |
|---|
| 25398 | + // option could not be found, we have to insert the undefined item |
|---|
| 25399 | + optionGroups[''].unshift({id:'?', label:'', selected:true}); |
|---|
| 25400 | + } |
|---|
| 25401 | + } |
|---|
| 25402 | + |
|---|
| 25403 | + // Now we need to update the list of DOM nodes to match the optionGroups we computed above |
|---|
| 25404 | + for (groupIndex = 0, groupLength = optionGroupNames.length; |
|---|
| 25405 | + groupIndex < groupLength; |
|---|
| 25406 | + groupIndex++) { |
|---|
| 25407 | + // current option group name or '' if no group |
|---|
| 25408 | + optionGroupName = optionGroupNames[groupIndex]; |
|---|
| 25409 | + |
|---|
| 25410 | + // list of options for that group. (first item has the parent) |
|---|
| 25411 | + optionGroup = optionGroups[optionGroupName]; |
|---|
| 25412 | + |
|---|
| 25413 | + if (optionGroupsCache.length <= groupIndex) { |
|---|
| 25414 | + // we need to grow the optionGroups |
|---|
| 25415 | + existingParent = { |
|---|
| 25416 | + element: optGroupTemplate.clone().attr('label', optionGroupName), |
|---|
| 25417 | + label: optionGroup.label |
|---|
| 25418 | + }; |
|---|
| 25419 | + existingOptions = [existingParent]; |
|---|
| 25420 | + optionGroupsCache.push(existingOptions); |
|---|
| 25421 | + selectElement.append(existingParent.element); |
|---|
| 25422 | + } else { |
|---|
| 25423 | + existingOptions = optionGroupsCache[groupIndex]; |
|---|
| 25424 | + existingParent = existingOptions[0]; // either SELECT (no group) or OPTGROUP element |
|---|
| 25425 | + |
|---|
| 25426 | + // update the OPTGROUP label if not the same. |
|---|
| 25427 | + if (existingParent.label != optionGroupName) { |
|---|
| 25428 | + existingParent.element.attr('label', existingParent.label = optionGroupName); |
|---|
| 25429 | + } |
|---|
| 25430 | + } |
|---|
| 25431 | + |
|---|
| 25432 | + lastElement = null; // start at the beginning |
|---|
| 25433 | + for(index = 0, length = optionGroup.length; index < length; index++) { |
|---|
| 25434 | + option = optionGroup[index]; |
|---|
| 25435 | + if ((existingOption = existingOptions[index+1])) { |
|---|
| 25436 | + // reuse elements |
|---|
| 25437 | + lastElement = existingOption.element; |
|---|
| 25438 | + if (existingOption.label !== option.label) { |
|---|
| 25439 | + updateLabelMap(labelMap, existingOption.label, false); |
|---|
| 25440 | + updateLabelMap(labelMap, option.label, true); |
|---|
| 25441 | + lastElement.text(existingOption.label = option.label); |
|---|
| 25442 | + } |
|---|
| 25443 | + if (existingOption.id !== option.id) { |
|---|
| 25444 | + lastElement.val(existingOption.id = option.id); |
|---|
| 25445 | + } |
|---|
| 25446 | + // lastElement.prop('selected') provided by jQuery has side-effects |
|---|
| 25447 | + if (lastElement[0].selected !== option.selected) { |
|---|
| 25448 | + lastElement.prop('selected', (existingOption.selected = option.selected)); |
|---|
| 25449 | + if (msie) { |
|---|
| 25450 | + // See #7692 |
|---|
| 25451 | + // The selected item wouldn't visually update on IE without this. |
|---|
| 25452 | + // Tested on Win7: IE9, IE10 and IE11. Future IEs should be tested as well |
|---|
| 25453 | + lastElement.prop('selected', existingOption.selected); |
|---|
| 25454 | + } |
|---|
| 25455 | + } |
|---|
| 25456 | + } else { |
|---|
| 25457 | + // grow elements |
|---|
| 25458 | + |
|---|
| 25459 | + // if it's a null option |
|---|
| 25460 | + if (option.id === '' && nullOption) { |
|---|
| 25461 | + // put back the pre-compiled element |
|---|
| 25462 | + element = nullOption; |
|---|
| 25463 | + } else { |
|---|
| 25464 | + // jQuery(v1.4.2) Bug: We should be able to chain the method calls, but |
|---|
| 25465 | + // in this version of jQuery on some browser the .text() returns a string |
|---|
| 25466 | + // rather then the element. |
|---|
| 25467 | + (element = optionTemplate.clone()) |
|---|
| 25468 | + .val(option.id) |
|---|
| 25469 | + .prop('selected', option.selected) |
|---|
| 25470 | + .attr('selected', option.selected) |
|---|
| 25471 | + .text(option.label); |
|---|
| 25472 | + } |
|---|
| 25473 | + |
|---|
| 25474 | + existingOptions.push(existingOption = { |
|---|
| 25475 | + element: element, |
|---|
| 25476 | + label: option.label, |
|---|
| 25477 | + id: option.id, |
|---|
| 25478 | + selected: option.selected |
|---|
| 25479 | + }); |
|---|
| 25480 | + updateLabelMap(labelMap, option.label, true); |
|---|
| 25481 | + if (lastElement) { |
|---|
| 25482 | + lastElement.after(element); |
|---|
| 25483 | + } else { |
|---|
| 25484 | + existingParent.element.append(element); |
|---|
| 25485 | + } |
|---|
| 25486 | + lastElement = element; |
|---|
| 25487 | + } |
|---|
| 25488 | + } |
|---|
| 25489 | + // remove any excessive OPTIONs in a group |
|---|
| 25490 | + index++; // increment since the existingOptions[0] is parent element not OPTION |
|---|
| 25491 | + while(existingOptions.length > index) { |
|---|
| 25492 | + option = existingOptions.pop(); |
|---|
| 25493 | + updateLabelMap(labelMap, option.label, false); |
|---|
| 25494 | + option.element.remove(); |
|---|
| 25495 | + } |
|---|
| 25496 | + forEach(labelMap, function (count, label) { |
|---|
| 25497 | + if (count > 0) { |
|---|
| 25498 | + selectCtrl.addOption(label); |
|---|
| 25499 | + } else if (count < 0) { |
|---|
| 25500 | + selectCtrl.removeOption(label); |
|---|
| 25501 | + } |
|---|
| 25502 | + }); |
|---|
| 25503 | + } |
|---|
| 25504 | + // remove any excessive OPTGROUPs from select |
|---|
| 25505 | + while(optionGroupsCache.length > groupIndex) { |
|---|
| 25506 | + optionGroupsCache.pop()[0].element.remove(); |
|---|
| 25507 | + } |
|---|
| 25508 | + } |
|---|
| 25509 | + } |
|---|
| 25510 | + } |
|---|
| 25511 | + }; |
|---|
| 25512 | +}]; |
|---|
| 25513 | + |
|---|
| 25514 | +var optionDirective = ['$interpolate', function($interpolate) { |
|---|
| 25515 | + var nullSelectCtrl = { |
|---|
| 25516 | + addOption: noop, |
|---|
| 25517 | + removeOption: noop |
|---|
| 25518 | + }; |
|---|
| 25519 | + |
|---|
| 25520 | + return { |
|---|
| 25521 | + restrict: 'E', |
|---|
| 25522 | + priority: 100, |
|---|
| 25523 | + compile: function(element, attr) { |
|---|
| 25524 | + if (isUndefined(attr.value)) { |
|---|
| 25525 | + var interpolateFn = $interpolate(element.text(), true); |
|---|
| 25526 | + if (!interpolateFn) { |
|---|
| 25527 | + attr.$set('value', element.text()); |
|---|
| 25528 | + } |
|---|
| 25529 | + } |
|---|
| 25530 | + |
|---|
| 25531 | + return function (scope, element, attr) { |
|---|
| 25532 | + var selectCtrlName = '$selectController', |
|---|
| 25533 | + parent = element.parent(), |
|---|
| 25534 | + selectCtrl = parent.data(selectCtrlName) || |
|---|
| 25535 | + parent.parent().data(selectCtrlName); // in case we are in optgroup |
|---|
| 25536 | + |
|---|
| 25537 | + if (!selectCtrl || !selectCtrl.databound) { |
|---|
| 25538 | + selectCtrl = nullSelectCtrl; |
|---|
| 25539 | + } |
|---|
| 25540 | + |
|---|
| 25541 | + if (interpolateFn) { |
|---|
| 25542 | + scope.$watch(interpolateFn, function interpolateWatchAction(newVal, oldVal) { |
|---|
| 25543 | + attr.$set('value', newVal); |
|---|
| 25544 | + if (oldVal !== newVal) { |
|---|
| 25545 | + selectCtrl.removeOption(oldVal); |
|---|
| 25546 | + } |
|---|
| 25547 | + selectCtrl.addOption(newVal, element); |
|---|
| 25548 | + }); |
|---|
| 25549 | + } else { |
|---|
| 25550 | + selectCtrl.addOption(attr.value, element); |
|---|
| 25551 | + } |
|---|
| 25552 | + |
|---|
| 25553 | + element.on('$destroy', function() { |
|---|
| 25554 | + selectCtrl.removeOption(attr.value); |
|---|
| 25555 | + }); |
|---|
| 25556 | + }; |
|---|
| 25557 | + } |
|---|
| 25558 | + }; |
|---|
| 25559 | +}]; |
|---|
| 25560 | + |
|---|
| 25561 | +var styleDirective = valueFn({ |
|---|
| 25562 | + restrict: 'E', |
|---|
| 25563 | + terminal: false |
|---|
| 25564 | +}); |
|---|
| 25565 | + |
|---|
| 25566 | + if (window.angular.bootstrap) { |
|---|
| 25567 | + //AngularJS is already loaded, so we can return here... |
|---|
| 25568 | + console.log('WARNING: Tried to load angular more than once.'); |
|---|
| 25569 | + return; |
|---|
| 25570 | + } |
|---|
| 25571 | + |
|---|
| 25572 | + //try to bind to jquery now so that one can write jqLite(document).ready() |
|---|
| 25573 | + //but we will rebind on bootstrap again. |
|---|
| 25574 | + bindJQuery(); |
|---|
| 25575 | + |
|---|
| 25576 | + publishExternalAPI(angular); |
|---|
| 25577 | + |
|---|
| 25578 | + jqLite(document).ready(function() { |
|---|
| 25579 | + angularInit(document, bootstrap); |
|---|
| 25580 | + }); |
|---|
| 25581 | + |
|---|
| 25582 | +})(window, document); |
|---|
| 25583 | + |
|---|
| 25584 | +!window.angular.$$csp() && window.angular.element(document).find('head').prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}</style>'); |
|---|
| .. | .. |
|---|
| 1 | +/* |
|---|
| 2 | + AngularJS v1.3.0 |
|---|
| 3 | + (c) 2010-2014 Google, Inc. http://angularjs.org |
|---|
| 4 | + License: MIT |
|---|
| 5 | +*/ |
|---|
| 6 | +(function(S,X,u){'use strict';function y(b){return function(){var a=arguments[0],c;c="["+(b?b+":":"")+a+"] http://errors.angularjs.org/1.3.0/"+(b?b+"/":"")+a;for(a=1;a<arguments.length;a++){c=c+(1==a?"?":"&")+"p"+(a-1)+"=";var d=encodeURIComponent,e;e=arguments[a];e="function"==typeof e?e.toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof e?"undefined":"string"!=typeof e?JSON.stringify(e):e;c+=d(e)}return Error(c)}}function Ra(b){if(null==b||Sa(b))return!1;var a=b.length;return b.nodeType=== |
|---|
| 7 | +ka&&a?!0:I(b)||B(b)||0===a||"number"===typeof a&&0<a&&a-1 in b}function r(b,a,c){var d,e;if(b)if(F(b))for(d in b)"prototype"==d||"length"==d||"name"==d||b.hasOwnProperty&&!b.hasOwnProperty(d)||a.call(c,b[d],d,b);else if(B(b)||Ra(b)){var f="object"!==typeof b;d=0;for(e=b.length;d<e;d++)(f||d in b)&&a.call(c,b[d],d,b)}else if(b.forEach&&b.forEach!==r)b.forEach(a,c,b);else for(d in b)b.hasOwnProperty(d)&&a.call(c,b[d],d,b);return b}function ic(b){var a=[],c;for(c in b)b.hasOwnProperty(c)&&a.push(c); |
|---|
| 8 | +return a.sort()}function zd(b,a,c){for(var d=ic(b),e=0;e<d.length;e++)a.call(c,b[d[e]],d[e]);return d}function jc(b){return function(a,c){b(c,a)}}function Ad(){return++hb}function kc(b,a){a?b.$$hashKey=a:delete b.$$hashKey}function E(b){for(var a=b.$$hashKey,c=1,d=arguments.length;c<d;c++){var e=arguments[c];if(e)for(var f=Object.keys(e),g=0,k=f.length;g<k;g++){var h=f[g];b[h]=e[h]}}kc(b,a);return b}function ba(b){return parseInt(b,10)}function lc(b,a){return E(new (E(function(){},{prototype:b})), |
|---|
| 9 | +a)}function A(){}function Ta(b){return b}function da(b){return function(){return b}}function w(b){return"undefined"===typeof b}function z(b){return"undefined"!==typeof b}function G(b){return null!==b&&"object"===typeof b}function I(b){return"string"===typeof b}function W(b){return"number"===typeof b}function ea(b){return"[object Date]"===Ia.call(b)}function F(b){return"function"===typeof b}function ib(b){return"[object RegExp]"===Ia.call(b)}function Sa(b){return b&&b.window===b}function Ua(b){return b&& |
|---|
| 10 | +b.$evalAsync&&b.$watch}function Va(b){return"boolean"===typeof b}function mc(b){return!(!b||!(b.nodeName||b.prop&&b.attr&&b.find))}function Bd(b){var a={};b=b.split(",");var c;for(c=0;c<b.length;c++)a[b[c]]=!0;return a}function pa(b){return N(b.nodeName||b[0].nodeName)}function Wa(b,a){var c=b.indexOf(a);0<=c&&b.splice(c,1);return a}function Ca(b,a,c,d){if(Sa(b)||Ua(b))throw Xa("cpws");if(a){if(b===a)throw Xa("cpi");c=c||[];d=d||[];if(G(b)){var e=c.indexOf(b);if(-1!==e)return d[e];c.push(b);d.push(a)}if(B(b))for(var f= |
|---|
| 11 | +a.length=0;f<b.length;f++)e=Ca(b[f],null,c,d),G(b[f])&&(c.push(b[f]),d.push(e)),a.push(e);else{var g=a.$$hashKey;B(a)?a.length=0:r(a,function(b,c){delete a[c]});for(f in b)b.hasOwnProperty(f)&&(e=Ca(b[f],null,c,d),G(b[f])&&(c.push(b[f]),d.push(e)),a[f]=e);kc(a,g)}}else if(a=b)B(b)?a=Ca(b,[],c,d):ea(b)?a=new Date(b.getTime()):ib(b)?(a=new RegExp(b.source,b.toString().match(/[^\/]*$/)[0]),a.lastIndex=b.lastIndex):G(b)&&(e=Object.create(Object.getPrototypeOf(b)),a=Ca(b,e,c,d));return a}function qa(b, |
|---|
| 12 | +a){if(B(b)){a=a||[];for(var c=0,d=b.length;c<d;c++)a[c]=b[c]}else if(G(b))for(c in a=a||{},b)if("$"!==c.charAt(0)||"$"!==c.charAt(1))a[c]=b[c];return a||b}function la(b,a){if(b===a)return!0;if(null===b||null===a)return!1;if(b!==b&&a!==a)return!0;var c=typeof b,d;if(c==typeof a&&"object"==c)if(B(b)){if(!B(a))return!1;if((c=b.length)==a.length){for(d=0;d<c;d++)if(!la(b[d],a[d]))return!1;return!0}}else{if(ea(b))return ea(a)?la(b.getTime(),a.getTime()):!1;if(ib(b)&&ib(a))return b.toString()==a.toString(); |
|---|
| 13 | +if(Ua(b)||Ua(a)||Sa(b)||Sa(a)||B(a))return!1;c={};for(d in b)if("$"!==d.charAt(0)&&!F(b[d])){if(!la(b[d],a[d]))return!1;c[d]=!0}for(d in a)if(!c.hasOwnProperty(d)&&"$"!==d.charAt(0)&&a[d]!==u&&!F(a[d]))return!1;return!0}return!1}function jb(b,a,c){return b.concat(Ya.call(a,c))}function nc(b,a){var c=2<arguments.length?Ya.call(arguments,2):[];return!F(a)||a instanceof RegExp?a:c.length?function(){return arguments.length?a.apply(b,c.concat(Ya.call(arguments,0))):a.apply(b,c)}:function(){return arguments.length? |
|---|
| 14 | +a.apply(b,arguments):a.call(b)}}function Cd(b,a){var c=a;"string"===typeof b&&"$"===b.charAt(0)&&"$"===b.charAt(1)?c=u:Sa(a)?c="$WINDOW":a&&X===a?c="$DOCUMENT":Ua(a)&&(c="$SCOPE");return c}function ra(b,a){return"undefined"===typeof b?u:JSON.stringify(b,Cd,a?" ":null)}function oc(b){return I(b)?JSON.parse(b):b}function sa(b){b=D(b).clone();try{b.empty()}catch(a){}var c=D("<div>").append(b).html();try{return b[0].nodeType===kb?N(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+ |
|---|
| 15 | +N(b)})}catch(d){return N(c)}}function pc(b){try{return decodeURIComponent(b)}catch(a){}}function qc(b){var a={},c,d;r((b||"").split("&"),function(b){b&&(c=b.replace(/\+/g,"%20").split("="),d=pc(c[0]),z(d)&&(b=z(c[1])?pc(c[1]):!0,Hb.call(a,d)?B(a[d])?a[d].push(b):a[d]=[a[d],b]:a[d]=b))});return a}function Ib(b){var a=[];r(b,function(b,d){B(b)?r(b,function(b){a.push(Da(d,!0)+(!0===b?"":"="+Da(b,!0)))}):a.push(Da(d,!0)+(!0===b?"":"="+Da(b,!0)))});return a.length?a.join("&"):""}function lb(b){return Da(b, |
|---|
| 16 | +!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function Da(b,a){return encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,a?"%20":"+")}function Dd(b,a){var c,d,e=mb.length;b=D(b);for(d=0;d<e;++d)if(c=mb[d]+a,I(c=b.attr(c)))return c;return null}function Ed(b,a){var c,d,e={};r(mb,function(a){a+="app";!c&&b.hasAttribute&&b.hasAttribute(a)&&(c=b,d=b.getAttribute(a))});r(mb,function(a){a+="app"; |
|---|
| 17 | +var e;!c&&(e=b.querySelector("["+a.replace(":","\\:")+"]"))&&(c=e,d=e.getAttribute(a))});c&&(e.strictDi=null!==Dd(c,"strict-di"),a(c,d?[d]:[],e))}function rc(b,a,c){G(c)||(c={});c=E({strictDi:!1},c);var d=function(){b=D(b);if(b.injector()){var d=b[0]===X?"document":sa(b);throw Xa("btstrpd",d.replace(/</,"<").replace(/>/,">"));}a=a||[];a.unshift(["$provide",function(a){a.value("$rootElement",b)}]);c.debugInfoEnabled&&a.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]);a.unshift("ng"); |
|---|
| 18 | +d=Jb(a,c.strictDi);d.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return d},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;S&&e.test(S.name)&&(c.debugInfoEnabled=!0,S.name=S.name.replace(e,""));if(S&&!f.test(S.name))return d();S.name=S.name.replace(f,"");ta.resumeBootstrap=function(b){r(b,function(b){a.push(b)});d()}}function Fd(){S.name="NG_ENABLE_DEBUG_INFO!"+S.name;S.location.reload()}function Gd(b){return ta.element(b).injector().get("$$testability")} |
|---|
| 19 | +function Kb(b,a){a=a||"_";return b.replace(Hd,function(b,d){return(d?a:"")+b.toLowerCase()})}function Id(){var b;sc||((ma=S.jQuery)&&ma.fn.on?(D=ma,E(ma.fn,{scope:Ja.scope,isolateScope:Ja.isolateScope,controller:Ja.controller,injector:Ja.injector,inheritedData:Ja.inheritedData}),b=ma.cleanData,ma.cleanData=function(a){var c;if(Lb)Lb=!1;else for(var d=0,e;null!=(e=a[d]);d++)(c=ma._data(e,"events"))&&c.$destroy&&ma(e).triggerHandler("$destroy");b(a)}):D=R,ta.element=D,sc=!0)}function Mb(b,a,c){if(!b)throw Xa("areq", |
|---|
| 20 | +a||"?",c||"required");return b}function nb(b,a,c){c&&B(b)&&(b=b[b.length-1]);Mb(F(b),a,"not a function, got "+(b&&"object"===typeof b?b.constructor.name||"Object":typeof b));return b}function Ka(b,a){if("hasOwnProperty"===b)throw Xa("badname",a);}function tc(b,a,c){if(!a)return b;a=a.split(".");for(var d,e=b,f=a.length,g=0;g<f;g++)d=a[g],b&&(b=(e=b)[d]);return!c&&F(b)?nc(e,b):b}function ob(b){var a=b[0];b=b[b.length-1];var c=[a];do{a=a.nextSibling;if(!a)break;c.push(a)}while(a!==b);return D(c)}function wa(){return Object.create(null)} |
|---|
| 21 | +function Jd(b){function a(a,b,c){return a[b]||(a[b]=c())}var c=y("$injector"),d=y("ng");b=a(b,"angular",Object);b.$$minErr=b.$$minErr||y;return a(b,"module",function(){var b={};return function(f,g,k){if("hasOwnProperty"===f)throw d("badname","module");g&&b.hasOwnProperty(f)&&(b[f]=null);return a(b,f,function(){function a(c,d,e,f){f||(f=b);return function(){f[e||"push"]([c,d,arguments]);return n}}if(!g)throw c("nomod",f);var b=[],d=[],e=[],p=a("$injector","invoke","push",d),n={_invokeQueue:b,_configBlocks:d, |
|---|
| 22 | +_runBlocks:e,requires:g,name:f,provider:a("$provide","provider"),factory:a("$provide","factory"),service:a("$provide","service"),value:a("$provide","value"),constant:a("$provide","constant","unshift"),animation:a("$animateProvider","register"),filter:a("$filterProvider","register"),controller:a("$controllerProvider","register"),directive:a("$compileProvider","directive"),config:p,run:function(a){e.push(a);return this}};k&&p(k);return n})}})}function Kd(b){E(b,{bootstrap:rc,copy:Ca,extend:E,equals:la, |
|---|
| 23 | +element:D,forEach:r,injector:Jb,noop:A,bind:nc,toJson:ra,fromJson:oc,identity:Ta,isUndefined:w,isDefined:z,isString:I,isFunction:F,isObject:G,isNumber:W,isElement:mc,isArray:B,version:Ld,isDate:ea,lowercase:N,uppercase:pb,callbacks:{counter:0},getTestability:Gd,$$minErr:y,$$csp:Za,reloadWithDebugInfo:Fd});$a=Jd(S);try{$a("ngLocale")}catch(a){$a("ngLocale",[]).provider("$locale",Md)}$a("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:Nd});a.provider("$compile",uc).directive({a:Od, |
|---|
| 24 | +input:vc,textarea:vc,form:Pd,script:Qd,select:Rd,style:Sd,option:Td,ngBind:Ud,ngBindHtml:Vd,ngBindTemplate:Wd,ngClass:Xd,ngClassEven:Yd,ngClassOdd:Zd,ngCloak:$d,ngController:ae,ngForm:be,ngHide:ce,ngIf:de,ngInclude:ee,ngInit:fe,ngNonBindable:ge,ngPluralize:he,ngRepeat:ie,ngShow:je,ngStyle:ke,ngSwitch:le,ngSwitchWhen:me,ngSwitchDefault:ne,ngOptions:oe,ngTransclude:pe,ngModel:qe,ngList:re,ngChange:se,pattern:wc,ngPattern:wc,required:xc,ngRequired:xc,minlength:yc,ngMinlength:yc,maxlength:zc,ngMaxlength:zc, |
|---|
| 25 | +ngValue:te,ngModelOptions:ue}).directive({ngInclude:ve}).directive(qb).directive(Ac);a.provider({$anchorScroll:we,$animate:xe,$browser:ye,$cacheFactory:ze,$controller:Ae,$document:Be,$exceptionHandler:Ce,$filter:Bc,$interpolate:De,$interval:Ee,$http:Fe,$httpBackend:Ge,$location:He,$log:Ie,$parse:Je,$rootScope:Ke,$q:Le,$$q:Me,$sce:Ne,$sceDelegate:Oe,$sniffer:Pe,$templateCache:Qe,$templateRequest:Re,$$testability:Se,$timeout:Te,$window:Ue,$$rAF:Ve,$$asyncCallback:We})}])}function ab(b){return b.replace(Xe, |
|---|
| 26 | +function(a,b,d,e){return e?d.toUpperCase():d}).replace(Ye,"Moz$1")}function Cc(b){b=b.nodeType;return b===ka||!b||9===b}function Dc(b,a){var c,d,e=a.createDocumentFragment(),f=[];if(Nb.test(b)){c=c||e.appendChild(a.createElement("div"));d=(Ze.exec(b)||["",""])[1].toLowerCase();d=ha[d]||ha._default;c.innerHTML=d[1]+b.replace($e,"<$1></$2>")+d[2];for(d=d[0];d--;)c=c.lastChild;f=jb(f,c.childNodes);c=e.firstChild;c.textContent=""}else f.push(a.createTextNode(b));e.textContent="";e.innerHTML="";r(f,function(a){e.appendChild(a)}); |
|---|
| 27 | +return e}function R(b){if(b instanceof R)return b;var a;I(b)&&(b=U(b),a=!0);if(!(this instanceof R)){if(a&&"<"!=b.charAt(0))throw Ob("nosel");return new R(b)}if(a){a=X;var c;b=(c=af.exec(b))?[a.createElement(c[1])]:(c=Dc(b,a))?c.childNodes:[]}Ec(this,b)}function Pb(b){return b.cloneNode(!0)}function rb(b,a){a||sb(b);if(b.querySelectorAll)for(var c=b.querySelectorAll("*"),d=0,e=c.length;d<e;d++)sb(c[d])}function Fc(b,a,c,d){if(z(d))throw Ob("offargs");var e=(d=tb(b))&&d.events,f=d&&d.handle;if(f)if(a)r(a.split(" "), |
|---|
| 28 | +function(a){if(z(c)){var d=e[a];Wa(d||[],c);if(d&&0<d.length)return}b.removeEventListener(a,f,!1);delete e[a]});else for(a in e)"$destroy"!==a&&b.removeEventListener(a,f,!1),delete e[a]}function sb(b,a){var c=b.ng339,d=c&&ub[c];d&&(a?delete d.data[a]:(d.handle&&(d.events.$destroy&&d.handle({},"$destroy"),Fc(b)),delete ub[c],b.ng339=u))}function tb(b,a){var c=b.ng339,c=c&&ub[c];a&&!c&&(b.ng339=c=++bf,c=ub[c]={events:{},data:{},handle:u});return c}function Qb(b,a,c){if(Cc(b)){var d=z(c),e=!d&&a&&!G(a), |
|---|
| 29 | +f=!a;b=(b=tb(b,!e))&&b.data;if(d)b[a]=c;else{if(f)return b;if(e)return b&&b[a];E(b,a)}}}function Rb(b,a){return b.getAttribute?-1<(" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+a+" "):!1}function Sb(b,a){a&&b.setAttribute&&r(a.split(" "),function(a){b.setAttribute("class",U((" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+U(a)+" "," ")))})}function Tb(b,a){if(a&&b.setAttribute){var c=(" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," "); |
|---|
| 30 | +r(a.split(" "),function(a){a=U(a);-1===c.indexOf(" "+a+" ")&&(c+=a+" ")});b.setAttribute("class",U(c))}}function Ec(b,a){if(a)if(a.nodeType)b[b.length++]=a;else{var c=a.length;if("number"===typeof c&&a.window!==a){if(c)for(var d=0;d<c;d++)b[b.length++]=a[d]}else b[b.length++]=a}}function Gc(b,a){return vb(b,"$"+(a||"ngController")+"Controller")}function vb(b,a,c){9==b.nodeType&&(b=b.documentElement);for(a=B(a)?a:[a];b;){for(var d=0,e=a.length;d<e;d++)if((c=D.data(b,a[d]))!==u)return c;b=b.parentNode|| |
|---|
| 31 | +11===b.nodeType&&b.host}}function Hc(b){for(rb(b,!0);b.firstChild;)b.removeChild(b.firstChild)}function Ic(b,a){a||rb(b);var c=b.parentNode;c&&c.removeChild(b)}function cf(b,a){a=a||S;if("complete"===a.document.readyState)a.setTimeout(b);else D(a).on("load",b)}function Jc(b,a){var c=wb[a.toLowerCase()];return c&&Kc[pa(b)]&&c}function df(b,a){var c=b.nodeName;return("INPUT"===c||"TEXTAREA"===c)&&Lc[a]}function ef(b,a){var c=function(c,e){c.isDefaultPrevented=function(){return c.defaultPrevented};var f= |
|---|
| 32 | +a[e||c.type],g=f?f.length:0;if(g){if(w(c.immediatePropagationStopped)){var k=c.stopImmediatePropagation;c.stopImmediatePropagation=function(){c.immediatePropagationStopped=!0;c.stopPropagation&&c.stopPropagation();k&&k.call(c)}}c.isImmediatePropagationStopped=function(){return!0===c.immediatePropagationStopped};1<g&&(f=qa(f));for(var h=0;h<g;h++)c.isImmediatePropagationStopped()||f[h].call(b,c)}};c.elem=b;return c}function La(b,a){var c=b&&b.$$hashKey;if(c)return"function"===typeof c&&(c=b.$$hashKey()), |
|---|
| 33 | +c;c=typeof b;return c="function"==c||"object"==c&&null!==b?b.$$hashKey=c+":"+(a||Ad)():c+":"+b}function bb(b,a){if(a){var c=0;this.nextUid=function(){return++c}}r(b,this.put,this)}function ff(b){return(b=b.toString().replace(Mc,"").match(Nc))?"function("+(b[1]||"").replace(/[\s\r\n]+/," ")+")":"fn"}function Ub(b,a,c){var d;if("function"===typeof b){if(!(d=b.$inject)){d=[];if(b.length){if(a)throw I(c)&&c||(c=b.name||ff(b)),Ea("strictdi",c);a=b.toString().replace(Mc,"");a=a.match(Nc);r(a[1].split(gf), |
|---|
| 34 | +function(a){a.replace(hf,function(a,b,c){d.push(c)})})}b.$inject=d}}else B(b)?(a=b.length-1,nb(b[a],"fn"),d=b.slice(0,a)):nb(b,"fn",!0);return d}function Jb(b,a){function c(a){return function(b,c){if(G(b))r(b,jc(a));else return a(b,c)}}function d(a,b){Ka(a,"service");if(F(b)||B(b))b=p.instantiate(b);if(!b.$get)throw Ea("pget",a);return q[a+"Provider"]=b}function e(a,b){return function(){var c=s.invoke(b,this,u,a);if(w(c))throw Ea("undef",a);return c}}function f(a,b,c){return d(a,{$get:!1!==c?e(a, |
|---|
| 35 | +b):b})}function g(a){var b=[],c;r(a,function(a){function d(a){var b,c;b=0;for(c=a.length;b<c;b++){var e=a[b],f=p.get(e[0]);f[e[1]].apply(f,e[2])}}if(!m.get(a)){m.put(a,!0);try{I(a)?(c=$a(a),b=b.concat(g(c.requires)).concat(c._runBlocks),d(c._invokeQueue),d(c._configBlocks)):F(a)?b.push(p.invoke(a)):B(a)?b.push(p.invoke(a)):nb(a,"module")}catch(e){throw B(a)&&(a=a[a.length-1]),e.message&&e.stack&&-1==e.stack.indexOf(e.message)&&(e=e.message+"\n"+e.stack),Ea("modulerr",a,e.stack||e.message||e);}}}); |
|---|
| 36 | +return b}function k(b,c){function d(a){if(b.hasOwnProperty(a)){if(b[a]===h)throw Ea("cdep",a+" <- "+l.join(" <- "));return b[a]}try{return l.unshift(a),b[a]=h,b[a]=c(a)}catch(e){throw b[a]===h&&delete b[a],e;}finally{l.shift()}}function e(b,c,f,g){"string"===typeof f&&(g=f,f=null);var h=[];g=Ub(b,a,g);var k,l,n;l=0;for(k=g.length;l<k;l++){n=g[l];if("string"!==typeof n)throw Ea("itkn",n);h.push(f&&f.hasOwnProperty(n)?f[n]:d(n))}B(b)&&(b=b[k]);return b.apply(c,h)}return{invoke:e,instantiate:function(a, |
|---|
| 37 | +b,c){var d=function(){};d.prototype=(B(a)?a[a.length-1]:a).prototype;d=new d;a=e(a,d,b,c);return G(a)||F(a)?a:d},get:d,annotate:Ub,has:function(a){return q.hasOwnProperty(a+"Provider")||b.hasOwnProperty(a)}}}a=!0===a;var h={},l=[],m=new bb([],!0),q={$provide:{provider:c(d),factory:c(f),service:c(function(a,b){return f(a,["$injector",function(a){return a.instantiate(b)}])}),value:c(function(a,b){return f(a,da(b),!1)}),constant:c(function(a,b){Ka(a,"constant");q[a]=b;n[a]=b}),decorator:function(a,b){var c= |
|---|
| 38 | +p.get(a+"Provider"),d=c.$get;c.$get=function(){var a=s.invoke(d,c);return s.invoke(b,null,{$delegate:a})}}}},p=q.$injector=k(q,function(){throw Ea("unpr",l.join(" <- "));}),n={},s=n.$injector=k(n,function(a){var b=p.get(a+"Provider");return s.invoke(b.$get,b,u,a)});r(g(b),function(a){s.invoke(a||A)});return s}function we(){var b=!0;this.disableAutoScrolling=function(){b=!1};this.$get=["$window","$location","$rootScope",function(a,c,d){function e(a){var b=null;Array.prototype.some.call(a,function(a){if("a"=== |
|---|
| 39 | +pa(a))return b=a,!0});return b}function f(b){if(b){b.scrollIntoView();var c;c=g.yOffset;F(c)?c=c():mc(c)?(c=c[0],c="fixed"!==a.getComputedStyle(c).position?0:c.getBoundingClientRect().bottom):W(c)||(c=0);c&&(b=b.getBoundingClientRect().top,a.scrollBy(0,b-c))}else a.scrollTo(0,0)}function g(){var a=c.hash(),b;a?(b=k.getElementById(a))?f(b):(b=e(k.getElementsByName(a)))?f(b):"top"===a&&f(null):f(null)}var k=a.document;b&&d.$watch(function(){return c.hash()},function(a,b){a===b&&""===a||cf(function(){d.$evalAsync(g)})}); |
|---|
| 40 | +return g}]}function We(){this.$get=["$$rAF","$timeout",function(b,a){return b.supported?function(a){return b(a)}:function(b){return a(b,0,!1)}}]}function jf(b,a,c,d){function e(a){try{a.apply(null,Ya.call(arguments,1))}finally{if(x--,0===x)for(;t.length;)try{t.pop()()}catch(b){c.error(b)}}}function f(a,b){(function xa(){r(T,function(a){a()});C=b(xa,a)})()}function g(){k();h()}function k(){M=b.history.state;M=w(M)?null:M;la(M,V)&&(M=V);V=M}function h(){if(H!==m.url()||P!==M)H=m.url(),P=M,r(O,function(a){a(m.url(), |
|---|
| 41 | +M)})}function l(a){try{return decodeURIComponent(a)}catch(b){return a}}var m=this,q=a[0],p=b.location,n=b.history,s=b.setTimeout,J=b.clearTimeout,v={};m.isMock=!1;var x=0,t=[];m.$$completeOutstandingRequest=e;m.$$incOutstandingRequestCount=function(){x++};m.notifyWhenNoOutstandingRequests=function(a){r(T,function(a){a()});0===x?a():t.push(a)};var T=[],C;m.addPollFn=function(a){w(C)&&f(100,s);T.push(a);return a};var M,P,H=p.href,Q=a.find("base"),aa=null;k();P=M;m.url=function(a,c,e){w(e)&&(e=null); |
|---|
| 42 | +p!==b.location&&(p=b.location);n!==b.history&&(n=b.history);if(a){var f=P===e;if(H!==a||d.history&&!f){var g=H&&Fa(H)===Fa(a);H=a;P=e;!d.history||g&&f?(g||(aa=a),c?p.replace(a):p.href=a):(n[c?"replaceState":"pushState"](e,"",a),k(),P=M);return m}}else return aa||p.href.replace(/%27/g,"'")};m.state=function(){return M};var O=[],K=!1,V=null;m.onUrlChange=function(a){if(!K){if(d.history)D(b).on("popstate",g);D(b).on("hashchange",g);K=!0}O.push(a);return a};m.$$checkUrlChange=h;m.baseHref=function(){var a= |
|---|
| 43 | +Q.attr("href");return a?a.replace(/^(https?\:)?\/\/[^\/]*/,""):""};var ca={},Ma="",fa=m.baseHref();m.cookies=function(a,b){var d,e,f,g;if(a)b===u?q.cookie=encodeURIComponent(a)+"=;path="+fa+";expires=Thu, 01 Jan 1970 00:00:00 GMT":I(b)&&(d=(q.cookie=encodeURIComponent(a)+"="+encodeURIComponent(b)+";path="+fa).length+1,4096<d&&c.warn("Cookie '"+a+"' possibly not set or overflowed because it was too large ("+d+" > 4096 bytes)!"));else{if(q.cookie!==Ma)for(Ma=q.cookie,d=Ma.split("; "),ca={},f=0;f<d.length;f++)e= |
|---|
| 44 | +d[f],g=e.indexOf("="),0<g&&(a=l(e.substring(0,g)),ca[a]===u&&(ca[a]=l(e.substring(g+1))));return ca}};m.defer=function(a,b){var c;x++;c=s(function(){delete v[c];e(a)},b||0);v[c]=!0;return c};m.defer.cancel=function(a){return v[a]?(delete v[a],J(a),e(A),!0):!1}}function ye(){this.$get=["$window","$log","$sniffer","$document",function(b,a,c,d){return new jf(b,d,a,c)}]}function ze(){this.$get=function(){function b(b,d){function e(a){a!=q&&(p?p==a&&(p=a.n):p=a,f(a.n,a.p),f(a,q),q=a,q.n=null)}function f(a, |
|---|
| 45 | +b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(b in a)throw y("$cacheFactory")("iid",b);var g=0,k=E({},d,{id:b}),h={},l=d&&d.capacity||Number.MAX_VALUE,m={},q=null,p=null;return a[b]={put:function(a,b){if(l<Number.MAX_VALUE){var c=m[a]||(m[a]={key:a});e(c)}if(!w(b))return a in h||g++,h[a]=b,g>l&&this.remove(p.key),b},get:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;e(b)}return h[a]},remove:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;b==q&&(q=b.p);b==p&&(p=b.n);f(b.n,b.p);delete m[a]}delete h[a]; |
|---|
| 46 | +g--},removeAll:function(){h={};g=0;m={};q=p=null},destroy:function(){m=k=h=null;delete a[b]},info:function(){return E({},k,{size:g})}}}var a={};b.info=function(){var b={};r(a,function(a,e){b[e]=a.info()});return b};b.get=function(b){return a[b]};return b}}function Qe(){this.$get=["$cacheFactory",function(b){return b("templates")}]}function uc(b,a){function c(a,b){var c=/^\s*([@=&])(\??)\s*(\w*)\s*$/,d={};r(a,function(a,e){var f=a.match(c);if(!f)throw ia("iscp",b,e,a);d[e]={attrName:f[3]||e,mode:f[1], |
|---|
| 47 | +optional:"?"===f[2]}});return d}var d={},e=/^\s*directive\:\s*([\d\w_\-]+)\s+(.*)$/,f=/(([\d\w_\-]+)(?:\:([^;]+))?;?)/,g=Bd("ngSrc,ngSrcset,src,srcset"),k=/^(?:(\^\^?)?(\?)?(\^\^?)?)?/,h=/^(on[a-z]+|formaction)$/;this.directive=function q(a,e){Ka(a,"directive");I(a)?(Mb(e,"directiveFactory"),d.hasOwnProperty(a)||(d[a]=[],b.factory(a+"Directive",["$injector","$exceptionHandler",function(b,e){var f=[];r(d[a],function(d,g){try{var h=b.invoke(d);F(h)?h={compile:da(h)}:!h.compile&&h.link&&(h.compile=da(h.link)); |
|---|
| 48 | +h.priority=h.priority||0;h.index=g;h.name=h.name||a;h.require=h.require||h.controller&&h.name;h.restrict=h.restrict||"EA";G(h.scope)&&(h.$$isolateBindings=c(h.scope,h.name));f.push(h)}catch(k){e(k)}});return f}])),d[a].push(e)):r(a,jc(q));return this};this.aHrefSanitizationWhitelist=function(b){return z(b)?(a.aHrefSanitizationWhitelist(b),this):a.aHrefSanitizationWhitelist()};this.imgSrcSanitizationWhitelist=function(b){return z(b)?(a.imgSrcSanitizationWhitelist(b),this):a.imgSrcSanitizationWhitelist()}; |
|---|
| 49 | +var l=!0;this.debugInfoEnabled=function(a){return z(a)?(l=a,this):l};this.$get=["$injector","$interpolate","$exceptionHandler","$templateRequest","$parse","$controller","$rootScope","$document","$sce","$animate","$$sanitizeUri",function(a,b,c,s,J,v,x,t,T,C,M){function P(a,b){try{a.addClass(b)}catch(c){}}function H(a,b,c,d,e){a instanceof D||(a=D(a));r(a,function(b,c){b.nodeType==kb&&b.nodeValue.match(/\S+/)&&(a[c]=D(b).wrap("<span></span>").parent()[0])});var f=Q(a,b,a,c,d,e);H.$$addScopeClass(a); |
|---|
| 50 | +var g=null;return function(b,c,d,e,h){Mb(b,"scope");g||(g=(h=h&&h[0])?"foreignobject"!==pa(h)&&h.toString().match(/SVG/)?"svg":"html":"html");h="html"!==g?D(S(g,D("<div>").append(a).html())):c?Ja.clone.call(a):a;if(d)for(var k in d)h.data("$"+k+"Controller",d[k].instance);H.$$addScopeInfo(h,b);c&&c(h,b);f&&f(b,h,h,e);return h}}function Q(a,b,c,d,e,f){function g(a,c,d,e){var f,k,l,p,n,t,s;if(q)for(s=Array(c.length),p=0;p<h.length;p+=3)f=h[p],s[f]=c[f];else s=c;p=0;for(n=h.length;p<n;)k=s[h[p++]],c= |
|---|
| 51 | +h[p++],f=h[p++],c?(c.scope?(l=a.$new(),H.$$addScopeInfo(D(k),l)):l=a,t=c.transcludeOnThisElement?aa(a,c.transclude,e,c.elementTranscludeOnThisElement):!c.templateOnThisElement&&e?e:!e&&b?aa(a,b):null,c(f,l,k,d,t)):f&&f(a,k.childNodes,u,e)}for(var h=[],k,l,p,n,q,t=0;t<a.length;t++){k=new Xb;l=O(a[t],[],k,0===t?d:u,e);(f=l.length?ca(l,a[t],k,b,c,null,[],[],f):null)&&f.scope&&H.$$addScopeClass(k.$$element);k=f&&f.terminal||!(p=a[t].childNodes)||!p.length?null:Q(p,f?(f.transcludeOnThisElement||!f.templateOnThisElement)&& |
|---|
| 52 | +f.transclude:b);if(f||k)h.push(t,f,k),n=!0,q=q||f;f=null}return n?g:null}function aa(a,b,c,d){return function(d,e,f,g,h){d||(d=a.$new(!1,h),d.$$transcluded=!0);return b(d,e,f,c,g)}}function O(b,c,g,h,k){var l=g.$attr,p;switch(b.nodeType){case ka:fa(c,ua(pa(b)),"E",h,k);for(var n,t,s,v=b.attributes,J=0,T=v&&v.length;J<T;J++){var M=!1,C=!1;n=v[J];p=n.name;n=U(n.value);t=ua(p);if(s=ya.test(t))p=Kb(t.substr(6),"-");var H=t.replace(/(Start|End)$/,""),P;a:{var O=H;if(d.hasOwnProperty(O)){P=void 0;for(var O= |
|---|
| 53 | +a.get(O+"Directive"),r=0,aa=O.length;r<aa;r++)if(P=O[r],P.multiElement){P=!0;break a}}P=!1}P&&t===H+"Start"&&(M=p,C=p.substr(0,p.length-5)+"end",p=p.substr(0,p.length-6));t=ua(p.toLowerCase());l[t]=p;if(s||!g.hasOwnProperty(t))g[t]=n,Jc(b,t)&&(g[t]=!0);R(b,c,n,t,s);fa(c,t,"A",h,k,M,C)}b=b.className;if(I(b)&&""!==b)for(;p=f.exec(b);)t=ua(p[2]),fa(c,t,"C",h,k)&&(g[t]=U(p[3])),b=b.substr(p.index+p[0].length);break;case kb:Y(c,b.nodeValue);break;case 8:try{if(p=e.exec(b.nodeValue))t=ua(p[1]),fa(c,t,"M", |
|---|
| 54 | +h,k)&&(g[t]=U(p[2]))}catch(x){}}c.sort(y);return c}function K(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ia("uterdir",b,c);a.nodeType==ka&&(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&e--);d.push(a);a=a.nextSibling}while(0<e)}else d.push(a);return D(d)}function V(a,b,c){return function(d,e,f,g,h){e=K(e[0],b,c);return a(d,e,f,g,h)}}function ca(a,d,e,f,g,h,l,q,t){function s(a,b,c,d){if(a){c&&(a=V(a,c,d));a.require=L.require;a.directiveName=ga;if(Q===L||L.$$isolateScope)a= |
|---|
| 55 | +Z(a,{isolateScope:!0});l.push(a)}if(b){c&&(b=V(b,c,d));b.require=L.require;b.directiveName=ga;if(Q===L||L.$$isolateScope)b=Z(b,{isolateScope:!0});q.push(b)}}function T(a,b,c,d){var e,f="data",g=!1,h=c,l;if(I(b)){if(l=b.match(k),b=b.substring(l[0].length),l[3]&&(l[1]?l[3]=null:l[1]=l[3]),"^"===l[1]?f="inheritedData":"^^"===l[1]&&(f="inheritedData",h=c.parent()),"?"===l[2]&&(g=!0),e=null,d&&"data"===f&&(e=d[b])&&(e=e.instance),e=e||h[f]("$"+b+"Controller"),!e&&!g)throw ia("ctreq",b,a);}else B(b)&&(e= |
|---|
| 56 | +[],r(b,function(b){e.push(T(a,b,c,d))}));return e}function M(a,c,f,g,h){function k(a,b,c){var d;Ua(a)||(c=b,b=a,a=u);E&&(d=P);c||(c=E?O.parent():O);return h(a,b,d,c,Wb)}var n,t,s,C,P,xb,O,K;d===f?(K=e,O=e.$$element):(O=D(f),K=new Xb(O,e));Q&&(C=c.$new(!0));xb=h&&k;aa&&(x={},P={},r(aa,function(a){var b={$scope:a===Q||a.$$isolateScope?C:c,$element:O,$attrs:K,$transclude:xb};s=a.controller;"@"==s&&(s=K[a.name]);b=v(s,b,!0,a.controllerAs);P[a.name]=b;E||O.data("$"+a.name+"Controller",b.instance);x[a.name]= |
|---|
| 57 | +b}));if(Q){H.$$addScopeInfo(O,C,!0,!(ca&&(ca===Q||ca===Q.$$originalDirective)));H.$$addScopeClass(O,!0);g=x&&x[Q.name];var V=C;g&&g.identifier&&!0===Q.bindToController&&(V=g.instance);r(C.$$isolateBindings=Q.$$isolateBindings,function(a,d){var e=a.attrName,f=a.optional,g,h,k,l;switch(a.mode){case "@":K.$observe(e,function(a){V[d]=a});K.$$observers[e].$$scope=c;K[e]&&(V[d]=b(K[e])(c));break;case "=":if(f&&!K[e])break;h=J(K[e]);l=h.literal?la:function(a,b){return a===b||a!==a&&b!==b};k=h.assign||function(){g= |
|---|
| 58 | +V[d]=h(c);throw ia("nonassign",K[e],Q.name);};g=V[d]=h(c);f=function(a){l(a,V[d])||(l(a,g)?k(c,a=V[d]):V[d]=a);return g=a};f.$stateful=!0;f=c.$watch(J(K[e],f),null,h.literal);C.$on("$destroy",f);break;case "&":h=J(K[e]),V[d]=function(a){return h(c,a)}}})}x&&(r(x,function(a){a()}),x=null);g=0;for(n=l.length;g<n;g++)t=l[g],$(t,t.isolateScope?C:c,O,K,t.require&&T(t.directiveName,t.require,O,P),xb);var Wb=c;Q&&(Q.template||null===Q.templateUrl)&&(Wb=C);a&&a(Wb,f.childNodes,u,h);for(g=q.length-1;0<=g;g--)t= |
|---|
| 59 | +q[g],$(t,t.isolateScope?C:c,O,K,t.require&&T(t.directiveName,t.require,O,P),xb)}t=t||{};for(var C=-Number.MAX_VALUE,P,aa=t.controllerDirectives,x,Q=t.newIsolateScopeDirective,ca=t.templateDirective,fa=t.nonTlbTranscludeDirective,Na=!1,A=!1,E=t.hasElementTranscludeDirective,Y=e.$$element=D(d),L,ga,y,Ga=f,N,R=0,ya=a.length;R<ya;R++){L=a[R];var W=L.$$start,Vb=L.$$end;W&&(Y=K(d,W,Vb));y=u;if(C>L.priority)break;if(y=L.scope)L.templateUrl||(G(y)?(xa("new/isolated scope",Q||P,L,Y),Q=L):xa("new/isolated scope", |
|---|
| 60 | +Q,L,Y)),P=P||L;ga=L.name;!L.templateUrl&&L.controller&&(y=L.controller,aa=aa||{},xa("'"+ga+"' controller",aa[ga],L,Y),aa[ga]=L);if(y=L.transclude)Na=!0,L.$$tlb||(xa("transclusion",fa,L,Y),fa=L),"element"==y?(E=!0,C=L.priority,y=Y,Y=e.$$element=D(X.createComment(" "+ga+": "+e[ga]+" ")),d=Y[0],yb(g,Ya.call(y,0),d),Ga=H(y,f,C,h&&h.name,{nonTlbTranscludeDirective:fa})):(y=D(Pb(d)).contents(),Y.empty(),Ga=H(y,f));if(L.template)if(A=!0,xa("template",ca,L,Y),ca=L,y=F(L.template)?L.template(Y,e):L.template, |
|---|
| 61 | +y=Oc(y),L.replace){h=L;y=Nb.test(y)?Pc(S(L.templateNamespace,U(y))):[];d=y[0];if(1!=y.length||d.nodeType!==ka)throw ia("tplrt",ga,"");yb(g,Y,d);ya={$attr:{}};y=O(d,[],ya);var ba=a.splice(R+1,a.length-(R+1));Q&&Ma(y);a=a.concat(y).concat(ba);z(e,ya);ya=a.length}else Y.html(y);if(L.templateUrl)A=!0,xa("template",ca,L,Y),ca=L,L.replace&&(h=L),M=w(a.splice(R,a.length-R),Y,e,g,Na&&Ga,l,q,{controllerDirectives:aa,newIsolateScopeDirective:Q,templateDirective:ca,nonTlbTranscludeDirective:fa}),ya=a.length; |
|---|
| 62 | +else if(L.compile)try{N=L.compile(Y,e,Ga),F(N)?s(null,N,W,Vb):N&&s(N.pre,N.post,W,Vb)}catch(kf){c(kf,sa(Y))}L.terminal&&(M.terminal=!0,C=Math.max(C,L.priority))}M.scope=P&&!0===P.scope;M.transcludeOnThisElement=Na;M.elementTranscludeOnThisElement=E;M.templateOnThisElement=A;M.transclude=Ga;t.hasElementTranscludeDirective=E;return M}function Ma(a){for(var b=0,c=a.length;b<c;b++)a[b]=lc(a[b],{$$isolateScope:!0})}function fa(b,e,f,g,h,k,l){if(e===h)return null;h=null;if(d.hasOwnProperty(e)){var p;e= |
|---|
| 63 | +a.get(e+"Directive");for(var t=0,s=e.length;t<s;t++)try{p=e[t],(g===u||g>p.priority)&&-1!=p.restrict.indexOf(f)&&(k&&(p=lc(p,{$$start:k,$$end:l})),b.push(p),h=p)}catch(v){c(v)}}return h}function z(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;r(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&b[e]!==d&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});r(b,function(b,f){"class"==f?(P(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):"style"==f?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+ |
|---|
| 64 | +";":"")+b):"$"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function w(a,b,c,d,e,f,g,h){var k=[],l,p,n=b[0],t=a.shift(),q=E({},t,{templateUrl:null,transclude:null,replace:null,$$originalDirective:t}),v=F(t.templateUrl)?t.templateUrl(b,c):t.templateUrl,J=t.templateNamespace;b.empty();s(T.getTrustedResourceUrl(v)).then(function(s){var C,T;s=Oc(s);if(t.replace){s=Nb.test(s)?Pc(S(J,U(s))):[];C=s[0];if(1!=s.length||C.nodeType!==ka)throw ia("tplrt",t.name,v);s={$attr:{}};yb(d,b,C);var M=O(C, |
|---|
| 65 | +[],s);G(t.scope)&&Ma(M);a=M.concat(a);z(c,s)}else C=n,b.html(s);a.unshift(q);l=ca(a,C,c,e,b,t,f,g,h);r(d,function(a,c){a==C&&(d[c]=b[0])});for(p=Q(b[0].childNodes,e);k.length;){s=k.shift();T=k.shift();var H=k.shift(),K=k.shift(),M=b[0];if(!s.$$destroyed){if(T!==n){var x=T.className;h.hasElementTranscludeDirective&&t.replace||(M=Pb(C));yb(H,D(T),M);P(D(M),x)}T=l.transcludeOnThisElement?aa(s,l.transclude,K):K;l(p,s,M,d,T)}}k=null});return function(a,b,c,d,e){a=e;b.$$destroyed||(k?(k.push(b),k.push(c), |
|---|
| 66 | +k.push(d),k.push(a)):(l.transcludeOnThisElement&&(a=aa(b,l.transclude,e)),l(p,b,c,d,a)))}}function y(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.name<b.name?-1:1:a.index-b.index}function xa(a,b,c,d){if(b)throw ia("multidir",b.name,c.name,a,sa(d));}function Y(a,c){var d=b(c,!0);d&&a.push({priority:0,compile:function(a){a=a.parent();var b=!!a.length;b&&H.$$addBindingClass(a);return function(a,c){var e=c.parent();b||H.$$addBindingClass(e);H.$$addBindingInfo(e,d.expressions);a.$watch(d, |
|---|
| 67 | +function(a){c[0].nodeValue=a})}}})}function S(a,b){a=N(a||"html");switch(a){case "svg":case "math":var c=X.createElement("div");c.innerHTML="<"+a+">"+b+"</"+a+">";return c.childNodes[0].childNodes;default:return b}}function Ga(a,b){if("srcdoc"==b)return T.HTML;var c=pa(a);if("xlinkHref"==b||"form"==c&&"action"==b||"img"!=c&&("src"==b||"ngSrc"==b))return T.RESOURCE_URL}function R(a,c,d,e,f){var k=b(d,!0);if(k){if("multiple"===e&&"select"===pa(a))throw ia("selmulti",sa(a));c.push({priority:100,compile:function(){return{pre:function(c, |
|---|
| 68 | +d,l){d=l.$$observers||(l.$$observers={});if(h.test(e))throw ia("nodomevents");l[e]&&(k=b(l[e],!0,Ga(a,e),g[e]||f))&&(l[e]=k(c),(d[e]||(d[e]=[])).$$inter=!0,(l.$$observers&&l.$$observers[e].$$scope||c).$watch(k,function(a,b){"class"===e&&a!=b?l.$updateClass(a,b):l.$set(e,a)}))}}}})}}function yb(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g<h;g++)if(a[g]==d){a[g++]=c;h=g+e-1;for(var k=a.length;g<k;g++,h++)h<k?a[g]=a[h]:delete a[g];a.length-=e-1;a.context===d&&(a.context= |
|---|
| 69 | +c);break}f&&f.replaceChild(c,d);a=X.createDocumentFragment();a.appendChild(d);D(c).data(D(d).data());ma?(Lb=!0,ma.cleanData([d])):delete D.cache[d[D.expando]];d=1;for(e=b.length;d<e;d++)f=b[d],D(f).remove(),a.appendChild(f),delete b[d];b[0]=c;b.length=1}function Z(a,b){return E(function(){return a.apply(null,arguments)},a,b)}function $(a,b,d,e,f,g){try{a(b,d,e,f,g)}catch(h){c(h,sa(d))}}var Xb=function(a,b){if(b){var c=Object.keys(b),d,e,f;d=0;for(e=c.length;d<e;d++)f=c[d],this[f]=b[f]}else this.$attr= |
|---|
| 70 | +{};this.$$element=a};Xb.prototype={$normalize:ua,$addClass:function(a){a&&0<a.length&&C.addClass(this.$$element,a)},$removeClass:function(a){a&&0<a.length&&C.removeClass(this.$$element,a)},$updateClass:function(a,b){var c=Qc(a,b);c&&c.length&&C.addClass(this.$$element,c);(c=Qc(b,a))&&c.length&&C.removeClass(this.$$element,c)},$set:function(a,b,d,e){var f=this.$$element[0],g=Jc(f,a),h=df(f,a),f=a;g?(this.$$element.prop(a,b),e=g):h&&(this[h]=b,f=h);this[a]=b;e?this.$attr[a]=e:(e=this.$attr[a])||(this.$attr[a]= |
|---|
| 71 | +e=Kb(a,"-"));g=pa(this.$$element);if("a"===g&&"href"===a||"img"===g&&"src"===a)this[a]=b=M(b,"src"===a);else if("img"===g&&"srcset"===a){for(var g="",h=U(b),k=/(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/,k=/\s/.test(h)?k:/(,)/,h=h.split(k),k=Math.floor(h.length/2),l=0;l<k;l++)var p=2*l,g=g+M(U(h[p]),!0),g=g+(" "+U(h[p+1]));h=U(h[2*l]).split(/\s/);g+=M(U(h[0]),!0);2===h.length&&(g+=" "+U(h[1]));this[a]=b=g}!1!==d&&(null===b||b===u?this.$$element.removeAttr(e):this.$$element.attr(e,b));(a=this.$$observers)&& |
|---|
| 72 | +r(a[f],function(a){try{a(b)}catch(d){c(d)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers=wa()),e=d[a]||(d[a]=[]);e.push(b);x.$evalAsync(function(){e.$$inter||b(c[a])});return function(){Wa(e,b)}}};var ga=b.startSymbol(),Na=b.endSymbol(),Oc="{{"==ga||"}}"==Na?Ta:function(a){return a.replace(/\{\{/g,ga).replace(/}}/g,Na)},ya=/^ngAttr[A-Z]/;H.$$addBindingInfo=l?function(a,b){var c=a.data("$binding")||[];B(b)?c=c.concat(b):c.push(b);a.data("$binding",c)}:A;H.$$addBindingClass=l? |
|---|
| 73 | +function(a){P(a,"ng-binding")}:A;H.$$addScopeInfo=l?function(a,b,c,d){a.data(c?d?"$isolateScopeNoTemplate":"$isolateScope":"$scope",b)}:A;H.$$addScopeClass=l?function(a,b){P(a,b?"ng-isolate-scope":"ng-scope")}:A;return H}]}function ua(b){return ab(b.replace(lf,""))}function Qc(b,a){var c="",d=b.split(/\s+/),e=a.split(/\s+/),f=0;a:for(;f<d.length;f++){for(var g=d[f],k=0;k<e.length;k++)if(g==e[k])continue a;c+=(0<c.length?" ":"")+g}return c}function Pc(b){b=D(b);var a=b.length;if(1>=a)return b;for(;a--;)8=== |
|---|
| 74 | +b[a].nodeType&&mf.call(b,a,1);return b}function Ae(){var b={},a=!1,c=/^(\S+)(\s+as\s+(\w+))?$/;this.register=function(a,c){Ka(a,"controller");G(a)?E(b,a):b[a]=c};this.allowGlobals=function(){a=!0};this.$get=["$injector","$window",function(d,e){function f(a,b,c,d){if(!a||!G(a.$scope))throw y("$controller")("noscp",d,b);a.$scope[b]=c}return function(g,k,h,l){var m,q,p;h=!0===h;l&&I(l)&&(p=l);I(g)&&(l=g.match(c),q=l[1],p=p||l[3],g=b.hasOwnProperty(q)?b[q]:tc(k.$scope,q,!0)||(a?tc(e,q,!0):u),nb(g,q,!0)); |
|---|
| 75 | +if(h)return h=function(){},h.prototype=(B(g)?g[g.length-1]:g).prototype,m=new h,p&&f(k,p,m,q||g.name),E(function(){d.invoke(g,m,k,q);return m},{instance:m,identifier:p});m=d.instantiate(g,k,q);p&&f(k,p,m,q||g.name);return m}}]}function Be(){this.$get=["$window",function(b){return D(b.document)}]}function Ce(){this.$get=["$log",function(b){return function(a,c){b.error.apply(b,arguments)}}]}function Rc(b){var a={},c,d,e;if(!b)return a;r(b.split("\n"),function(b){e=b.indexOf(":");c=N(U(b.substr(0,e))); |
|---|
| 76 | +d=U(b.substr(e+1));c&&(a[c]=a[c]?a[c]+", "+d:d)});return a}function Sc(b){var a=G(b)?b:u;return function(c){a||(a=Rc(b));return c?a[N(c)]||null:a}}function Tc(b,a,c){if(F(c))return c(b,a);r(c,function(c){b=c(b,a)});return b}function Fe(){var b=/^\s*(\[|\{[^\{])/,a=/[\}\]]\s*$/,c=/^\)\]\}',?\n/,d={"Content-Type":"application/json;charset=utf-8"},e=this.defaults={transformResponse:[function(d,e){if(I(d)){d=d.replace(c,"");var f=e("Content-Type");if(f&&0===f.indexOf("application/json")||b.test(d)&&a.test(d))d= |
|---|
| 77 | +oc(d)}return d}],transformRequest:[function(a){return G(a)&&"[object File]"!==Ia.call(a)&&"[object Blob]"!==Ia.call(a)?ra(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:qa(d),put:qa(d),patch:qa(d)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN"},f=!1;this.useApplyAsync=function(a){return z(a)?(f=!!a,this):f};var g=this.interceptors=[];this.$get=["$httpBackend","$browser","$cacheFactory","$rootScope","$q","$injector",function(a,b,c,d,q,p){function n(a){function b(a){var d= |
|---|
| 78 | +E({},a);d.data=a.data?Tc(a.data,a.headers,c.transformResponse):a.data;a=a.status;return 200<=a&&300>a?d:q.reject(d)}var c={method:"get",transformRequest:e.transformRequest,transformResponse:e.transformResponse},d=function(a){var b=e.headers,c=E({},a.headers),d,f,b=E({},b.common,b[N(a.method)]);a:for(d in b){a=N(d);for(f in c)if(N(f)===a)continue a;c[d]=b[d]}(function(a){var b;r(a,function(c,d){F(c)&&(b=c(),null!=b?a[d]=b:delete a[d])})})(c);return c}(a);E(c,a);c.headers=d;c.method=pb(c.method);var f= |
|---|
| 79 | +[function(a){d=a.headers;var c=Tc(a.data,Sc(d),a.transformRequest);w(c)&&r(d,function(a,b){"content-type"===N(b)&&delete d[b]});w(a.withCredentials)&&!w(e.withCredentials)&&(a.withCredentials=e.withCredentials);return s(a,c,d).then(b,b)},u],g=q.when(c);for(r(x,function(a){(a.request||a.requestError)&&f.unshift(a.request,a.requestError);(a.response||a.responseError)&&f.push(a.response,a.responseError)});f.length;){a=f.shift();var h=f.shift(),g=g.then(a,h)}g.success=function(a){g.then(function(b){a(b.data, |
|---|
| 80 | +b.status,b.headers,c)});return g};g.error=function(a){g.then(null,function(b){a(b.data,b.status,b.headers,c)});return g};return g}function s(c,g,l){function p(a,b,c,e){function g(){s(b,a,c,e)}O&&(200<=a&&300>a?O.put(V,[a,b,Rc(c),e]):O.remove(V));f?d.$applyAsync(g):(g(),d.$$phase||d.$apply())}function s(a,b,d,e){b=Math.max(b,0);(200<=b&&300>b?x.resolve:x.reject)({data:a,status:b,headers:Sc(d),config:c,statusText:e})}function H(){var a=n.pendingRequests.indexOf(c);-1!==a&&n.pendingRequests.splice(a, |
|---|
| 81 | +1)}var x=q.defer(),r=x.promise,O,K,V=J(c.url,c.params);n.pendingRequests.push(c);r.then(H,H);!c.cache&&!e.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(O=G(c.cache)?c.cache:G(e.cache)?e.cache:v);if(O)if(K=O.get(V),z(K)){if(K&&F(K.then))return K.then(H,H),K;B(K)?s(K[1],K[0],qa(K[2]),K[3]):s(K,200,{},"OK")}else O.put(V,r);w(K)&&((K=Uc(c.url)?b.cookies()[c.xsrfCookieName||e.xsrfCookieName]:u)&&(l[c.xsrfHeaderName||e.xsrfHeaderName]=K),a(c.method,V,g,p,l,c.timeout,c.withCredentials,c.responseType)); |
|---|
| 82 | +return r}function J(a,b){if(!b)return a;var c=[];zd(b,function(a,b){null===a||w(a)||(B(a)||(a=[a]),r(a,function(a){G(a)&&(a=ea(a)?a.toISOString():ra(a));c.push(Da(b)+"="+Da(a))}))});0<c.length&&(a+=(-1==a.indexOf("?")?"?":"&")+c.join("&"));return a}var v=c("$http"),x=[];r(g,function(a){x.unshift(I(a)?p.get(a):p.invoke(a))});n.pendingRequests=[];(function(a){r(arguments,function(a){n[a]=function(b,c){return n(E(c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){r(arguments,function(a){n[a]= |
|---|
| 83 | +function(b,c,d){return n(E(d||{},{method:a,url:b,data:c}))}})})("post","put","patch");n.defaults=e;return n}]}function nf(){return new S.XMLHttpRequest}function Ge(){this.$get=["$browser","$window","$document",function(b,a,c){return of(b,nf,b.defer,a.angular.callbacks,c[0])}]}function of(b,a,c,d,e){function f(a,b,c){var f=e.createElement("script"),m=null;f.type="text/javascript";f.src=a;f.async=!0;m=function(a){f.removeEventListener("load",m,!1);f.removeEventListener("error",m,!1);e.body.removeChild(f); |
|---|
| 84 | +f=null;var g=-1,n="unknown";a&&("load"!==a.type||d[b].called||(a={type:"error"}),n=a.type,g="error"===a.type?404:200);c&&c(g,n)};f.addEventListener("load",m,!1);f.addEventListener("error",m,!1);e.body.appendChild(f);return m}return function(e,k,h,l,m,q,p,n){function s(){x&&x();t&&t.abort()}function J(a,d,e,f,g){C&&c.cancel(C);x=t=null;a(d,e,f,g);b.$$completeOutstandingRequest(A)}b.$$incOutstandingRequestCount();k=k||b.url();if("jsonp"==N(e)){var v="_"+(d.counter++).toString(36);d[v]=function(a){d[v].data= |
|---|
| 85 | +a;d[v].called=!0};var x=f(k.replace("JSON_CALLBACK","angular.callbacks."+v),v,function(a,b){J(l,a,d[v].data,"",b);d[v]=A})}else{var t=a();t.open(e,k,!0);r(m,function(a,b){z(a)&&t.setRequestHeader(b,a)});t.onload=function(){var a=t.statusText||"",b="response"in t?t.response:t.responseText,c=1223===t.status?204:t.status;0===c&&(c=b?200:"file"==za(k).protocol?404:0);J(l,c,b,t.getAllResponseHeaders(),a)};e=function(){J(l,-1,null,null,"")};t.onerror=e;t.onabort=e;p&&(t.withCredentials=!0);if(n)try{t.responseType= |
|---|
| 86 | +n}catch(T){if("json"!==n)throw T;}t.send(h||null)}if(0<q)var C=c(s,q);else q&&F(q.then)&&q.then(s)}}function De(){var b="{{",a="}}";this.startSymbol=function(a){return a?(b=a,this):b};this.endSymbol=function(b){return b?(a=b,this):a};this.$get=["$parse","$exceptionHandler","$sce",function(c,d,e){function f(a){return"\\\\\\"+a}function g(f,g,n,s){function J(c){return c.replace(l,b).replace(m,a)}function v(a){try{var b;var c=n?e.getTrusted(n,a):e.valueOf(a);if(null==c)b="";else{switch(typeof c){case "string":break; |
|---|
| 87 | +case "number":c=""+c;break;default:c=ra(c)}b=c}return b}catch(g){a=Yb("interr",f,g.toString()),d(a)}}s=!!s;for(var x,t,T=0,C=[],M=[],P=f.length,H=[],r=[];T<P;)if(-1!=(x=f.indexOf(b,T))&&-1!=(t=f.indexOf(a,x+k)))T!==x&&H.push(J(f.substring(T,x))),T=f.substring(x+k,t),C.push(T),M.push(c(T,v)),T=t+h,r.push(H.length),H.push("");else{T!==P&&H.push(J(f.substring(T)));break}if(n&&1<H.length)throw Yb("noconcat",f);if(!g||C.length){var u=function(a){for(var b=0,c=C.length;b<c;b++){if(s&&w(a[b]))return;H[r[b]]= |
|---|
| 88 | +a[b]}return H.join("")};return E(function(a){var b=0,c=C.length,e=Array(c);try{for(;b<c;b++)e[b]=M[b](a);return u(e)}catch(g){a=Yb("interr",f,g.toString()),d(a)}},{exp:f,expressions:C,$$watchDelegate:function(a,b,c){var d;return a.$watchGroup(M,function(c,e){var f=u(c);F(b)&&b.call(this,f,c!==e?d:f,a);d=f},c)}})}}var k=b.length,h=a.length,l=new RegExp(b.replace(/./g,f),"g"),m=new RegExp(a.replace(/./g,f),"g");g.startSymbol=function(){return b};g.endSymbol=function(){return a};return g}]}function Ee(){this.$get= |
|---|
| 89 | +["$rootScope","$window","$q","$$q",function(b,a,c,d){function e(e,k,h,l){var m=a.setInterval,q=a.clearInterval,p=0,n=z(l)&&!l,s=(n?d:c).defer(),J=s.promise;h=z(h)?h:0;J.then(null,null,e);J.$$intervalId=m(function(){s.notify(p++);0<h&&p>=h&&(s.resolve(p),q(J.$$intervalId),delete f[J.$$intervalId]);n||b.$apply()},k);f[J.$$intervalId]=s;return J}var f={};e.cancel=function(b){return b&&b.$$intervalId in f?(f[b.$$intervalId].reject("canceled"),a.clearInterval(b.$$intervalId),delete f[b.$$intervalId],!0): |
|---|
| 90 | +!1};return e}]}function Md(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"\u00a4",posSuf:"",negPre:"(\u00a4",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January February March April May June July August September October November December".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "), |
|---|
| 91 | +DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a",short:"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(b){return 1===b?"one":"other"}}}}function Zb(b){b=b.split("/");for(var a=b.length;a--;)b[a]=lb(b[a]);return b.join("/")}function Vc(b,a,c){b=za(b,c);a.$$protocol= |
|---|
| 92 | +b.protocol;a.$$host=b.hostname;a.$$port=ba(b.port)||pf[b.protocol]||null}function Wc(b,a,c){var d="/"!==b.charAt(0);d&&(b="/"+b);b=za(b,c);a.$$path=decodeURIComponent(d&&"/"===b.pathname.charAt(0)?b.pathname.substring(1):b.pathname);a.$$search=qc(b.search);a.$$hash=decodeURIComponent(b.hash);a.$$path&&"/"!=a.$$path.charAt(0)&&(a.$$path="/"+a.$$path)}function va(b,a){if(0===a.indexOf(b))return a.substr(b.length)}function Fa(b){var a=b.indexOf("#");return-1==a?b:b.substr(0,a)}function $b(b){return b.substr(0, |
|---|
| 93 | +Fa(b).lastIndexOf("/")+1)}function ac(b,a){this.$$html5=!0;a=a||"";var c=$b(b);Vc(b,this,b);this.$$parse=function(a){var e=va(c,a);if(!I(e))throw cb("ipthprfx",a,c);Wc(e,this,b);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Ib(this.$$search),b=this.$$hash?"#"+lb(this.$$hash):"";this.$$url=Zb(this.$$path)+(a?"?"+a:"")+b;this.$$absUrl=c+this.$$url.substr(1)};this.$$parseLinkUrl=function(d,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;(f=va(b,d))!==u? |
|---|
| 94 | +(g=f,g=(f=va(a,f))!==u?c+(va("/",f)||f):b+g):(f=va(c,d))!==u?g=c+f:c==d+"/"&&(g=c);g&&this.$$parse(g);return!!g}}function bc(b,a){var c=$b(b);Vc(b,this,b);this.$$parse=function(d){var e=va(b,d)||va(c,d),e="#"==e.charAt(0)?va(a,e):this.$$html5?e:"";if(!I(e))throw cb("ihshprfx",d,a);Wc(e,this,b);d=this.$$path;var f=/^\/[A-Z]:(\/.*)/;0===e.indexOf(b)&&(e=e.replace(b,""));f.exec(e)||(d=(e=f.exec(d))?e[1]:d);this.$$path=d;this.$$compose()};this.$$compose=function(){var c=Ib(this.$$search),e=this.$$hash? |
|---|
| 95 | +"#"+lb(this.$$hash):"";this.$$url=Zb(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=b+(this.$$url?a+this.$$url:"")};this.$$parseLinkUrl=function(a,c){return Fa(b)==Fa(a)?(this.$$parse(a),!0):!1}}function Xc(b,a){this.$$html5=!0;bc.apply(this,arguments);var c=$b(b);this.$$parseLinkUrl=function(d,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;b==Fa(d)?f=d:(g=va(c,d))?f=b+a+g:c===d+"/"&&(f=c);f&&this.$$parse(f);return!!f};this.$$compose=function(){var c=Ib(this.$$search),e=this.$$hash?"#"+lb(this.$$hash): |
|---|
| 96 | +"";this.$$url=Zb(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=b+a+this.$$url}}function zb(b){return function(){return this[b]}}function Yc(b,a){return function(c){if(w(c))return this[b];this[b]=a(c);this.$$compose();return this}}function He(){var b="",a={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(a){return z(a)?(b=a,this):b};this.html5Mode=function(b){return Va(b)?(a.enabled=b,this):G(b)?(Va(b.enabled)&&(a.enabled=b.enabled),Va(b.requireBase)&&(a.requireBase=b.requireBase),Va(b.rewriteLinks)&& |
|---|
| 97 | +(a.rewriteLinks=b.rewriteLinks),this):a};this.$get=["$rootScope","$browser","$sniffer","$rootElement",function(c,d,e,f){function g(a,b,c){var e=h.url(),f=h.$$state;try{d.url(a,b,c),h.$$state=d.state()}catch(g){throw h.url(e),h.$$state=f,g;}}function k(a,b){c.$broadcast("$locationChangeSuccess",h.absUrl(),a,h.$$state,b)}var h,l;l=d.baseHref();var m=d.url(),q;if(a.enabled){if(!l&&a.requireBase)throw cb("nobase");q=m.substring(0,m.indexOf("/",m.indexOf("//")+2))+(l||"/");l=e.history?ac:Xc}else q=Fa(m), |
|---|
| 98 | +l=bc;h=new l(q,"#"+b);h.$$parseLinkUrl(m,m);h.$$state=d.state();var p=/^\s*(javascript|mailto):/i;f.on("click",function(b){if(a.rewriteLinks&&!b.ctrlKey&&!b.metaKey&&2!=b.which){for(var e=D(b.target);"a"!==pa(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var g=e.prop("href"),k=e.attr("href")||e.attr("xlink:href");G(g)&&"[object SVGAnimatedString]"===g.toString()&&(g=za(g.animVal).href);p.test(g)||!g||e.attr("target")||b.isDefaultPrevented()||!h.$$parseLinkUrl(g,k)||(b.preventDefault(),h.absUrl()!= |
|---|
| 99 | +d.url()&&(c.$apply(),S.angular["ff-684208-preventDefault"]=!0))}});h.absUrl()!=m&&d.url(h.absUrl(),!0);var n=!0;d.onUrlChange(function(a,b){c.$evalAsync(function(){var d=h.absUrl(),e=h.$$state;h.$$parse(a);h.$$state=b;c.$broadcast("$locationChangeStart",a,d,b,e).defaultPrevented?(h.$$parse(d),h.$$state=e,g(d,!1,e)):(n=!1,k(d,e))});c.$$phase||c.$digest()});c.$watch(function(){var a=d.url(),b=d.state(),f=h.$$replace,l=a!==h.absUrl()||h.$$html5&&e.history&&b!==h.$$state;if(n||l)n=!1,c.$evalAsync(function(){c.$broadcast("$locationChangeStart", |
|---|
| 100 | +h.absUrl(),a,h.$$state,b).defaultPrevented?(h.$$parse(a),h.$$state=b):(l&&g(h.absUrl(),f,b===h.$$state?null:h.$$state),k(a,b))});h.$$replace=!1});return h}]}function Ie(){var b=!0,a=this;this.debugEnabled=function(a){return z(a)?(b=a,this):b};this.$get=["$window",function(c){function d(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=c.console|| |
|---|
| 101 | +{},e=b[a]||b.log||A;a=!1;try{a=!!e.apply}catch(h){}return a?function(){var a=[];r(arguments,function(b){a.push(d(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){b&&c.apply(a,arguments)}}()}}]}function na(b,a){if("__defineGetter__"===b||"__defineSetter__"===b||"__lookupGetter__"===b||"__lookupSetter__"===b||"__proto__"===b)throw oa("isecfld",a);return b}function Aa(b,a){if(b){if(b.constructor=== |
|---|
| 102 | +b)throw oa("isecfn",a);if(b.window===b)throw oa("isecwindow",a);if(b.children&&(b.nodeName||b.prop&&b.attr&&b.find))throw oa("isecdom",a);if(b===Object)throw oa("isecobj",a);}return b}function cc(b){return b.constant}function Oa(b,a,c,d){Aa(b,d);a=a.split(".");for(var e,f=0;1<a.length;f++){e=na(a.shift(),d);var g=Aa(b[e],d);g||(g={},b[e]=g);b=g}e=na(a.shift(),d);Aa(b[e],d);return b[e]=c}function Zc(b,a,c,d,e,f){na(b,f);na(a,f);na(c,f);na(d,f);na(e,f);return function(f,k){var h=k&&k.hasOwnProperty(b)? |
|---|
| 103 | +k:f;if(null==h)return h;h=h[b];if(!a)return h;if(null==h)return u;h=h[a];if(!c)return h;if(null==h)return u;h=h[c];if(!d)return h;if(null==h)return u;h=h[d];return e?null==h?u:h=h[e]:h}}function $c(b,a,c){var d=ad[b];if(d)return d;var e=b.split("."),f=e.length;if(a.csp)d=6>f?Zc(e[0],e[1],e[2],e[3],e[4],c):function(a,b){var d=0,g;do g=Zc(e[d++],e[d++],e[d++],e[d++],e[d++],c)(a,b),b=u,a=g;while(d<f);return g};else{var g="";r(e,function(a,b){na(a,c);g+="if(s == null) return undefined;\ns="+(b?"s":'((l&&l.hasOwnProperty("'+ |
|---|
| 104 | +a+'"))?l:s)')+"."+a+";\n"});g+="return s;";a=new Function("s","l",g);a.toString=da(g);d=a}d.sharedGetter=!0;d.assign=function(a,c){return Oa(a,b,c,b)};return ad[b]=d}function Je(){var b=wa(),a={csp:!1};this.$get=["$filter","$sniffer",function(c,d){function e(a){var b=a;a.sharedGetter&&(b=function(b,c){return a(b,c)},b.literal=a.literal,b.constant=a.constant,b.assign=a.assign);return b}function f(a,b){for(var c=0,d=a.length;c<d;c++){var e=a[c];e.constant||(e.inputs?f(e.inputs,b):-1===b.indexOf(e)&& |
|---|
| 105 | +b.push(e))}return b}function g(a,b){return null==a||null==b?a===b:"object"===typeof a&&(a=a.valueOf(),"object"===typeof a)?!1:a===b||a!==a&&b!==b}function k(a,b,c,d){var e=d.$$inputs||(d.$$inputs=f(d.inputs,[])),h;if(1===e.length){var k=g,e=e[0];return a.$watch(function(a){var b=e(a);g(b,k)||(h=d(a),k=b&&b.valueOf());return h},b,c)}for(var l=[],m=0,q=e.length;m<q;m++)l[m]=g;return a.$watch(function(a){for(var b=!1,c=0,f=e.length;c<f;c++){var k=e[c](a);if(b||(b=!g(k,l[c])))l[c]=k&&k.valueOf()}b&&(h= |
|---|
| 106 | +d(a));return h},b,c)}function h(a,b,c,d){var e,f;return e=a.$watch(function(a){return d(a)},function(a,c,d){f=a;F(b)&&b.apply(this,arguments);z(a)&&d.$$postDigest(function(){z(f)&&e()})},c)}function l(a,b,c,d){function e(a){var b=!0;r(a,function(a){z(a)||(b=!1)});return b}var f,g;return f=a.$watch(function(a){return d(a)},function(a,c,d){g=a;F(b)&&b.call(this,a,c,d);e(a)&&d.$$postDigest(function(){e(g)&&f()})},c)}function m(a,b,c,d){var e;return e=a.$watch(function(a){return d(a)},function(a,c,d){F(b)&& |
|---|
| 107 | +b.apply(this,arguments);e()},c)}function q(a,b){if(!b)return a;var c=function(c,d){var e=a(c,d),f=b(e,c,d);return z(e)?f:e};a.$$watchDelegate&&a.$$watchDelegate!==k?c.$$watchDelegate=a.$$watchDelegate:b.$stateful||(c.$$watchDelegate=k,c.inputs=[a]);return c}a.csp=d.csp;return function(d,f){var g,J,v;switch(typeof d){case "string":return v=d=d.trim(),g=b[v],g||(":"===d.charAt(0)&&":"===d.charAt(1)&&(J=!0,d=d.substring(2)),g=new dc(a),g=(new db(g,c,a)).parse(d),g.constant?g.$$watchDelegate=m:J?(g=e(g), |
|---|
| 108 | +g.$$watchDelegate=g.literal?l:h):g.inputs&&(g.$$watchDelegate=k),b[v]=g),q(g,f);case "function":return q(d,f);default:return q(A,f)}}}]}function Le(){this.$get=["$rootScope","$exceptionHandler",function(b,a){return bd(function(a){b.$evalAsync(a)},a)}]}function Me(){this.$get=["$browser","$exceptionHandler",function(b,a){return bd(function(a){b.defer(a)},a)}]}function bd(b,a){function c(a,b,c){function d(b){return function(c){e||(e=!0,b.call(a,c))}}var e=!1;return[d(b),d(c)]}function d(){this.$$state= |
|---|
| 109 | +{status:0}}function e(a,b){return function(c){b.call(a,c)}}function f(c){!c.processScheduled&&c.pending&&(c.processScheduled=!0,b(function(){var b,d,e;e=c.pending;c.processScheduled=!1;c.pending=u;for(var f=0,g=e.length;f<g;++f){d=e[f][0];b=e[f][c.status];try{F(b)?d.resolve(b(c.value)):1===c.status?d.resolve(c.value):d.reject(c.value)}catch(h){d.reject(h),a(h)}}}))}function g(){this.promise=new d;this.resolve=e(this,this.resolve);this.reject=e(this,this.reject);this.notify=e(this,this.notify)}var k= |
|---|
| 110 | +y("$q",TypeError);d.prototype={then:function(a,b,c){var d=new g;this.$$state.pending=this.$$state.pending||[];this.$$state.pending.push([d,a,b,c]);0<this.$$state.status&&f(this.$$state);return d.promise},"catch":function(a){return this.then(null,a)},"finally":function(a,b){return this.then(function(b){return l(b,!0,a)},function(b){return l(b,!1,a)},b)}};g.prototype={resolve:function(a){this.promise.$$state.status||(a===this.promise?this.$$reject(k("qcycle",a)):this.$$resolve(a))},$$resolve:function(b){var d, |
|---|
| 111 | +e;e=c(this,this.$$resolve,this.$$reject);try{if(G(b)||F(b))d=b&&b.then;F(d)?(this.promise.$$state.status=-1,d.call(b,e[0],e[1],this.notify)):(this.promise.$$state.value=b,this.promise.$$state.status=1,f(this.promise.$$state))}catch(g){e[1](g),a(g)}},reject:function(a){this.promise.$$state.status||this.$$reject(a)},$$reject:function(a){this.promise.$$state.value=a;this.promise.$$state.status=2;f(this.promise.$$state)},notify:function(c){var d=this.promise.$$state.pending;0>=this.promise.$$state.status&& |
|---|
| 112 | +d&&d.length&&b(function(){for(var b,e,f=0,g=d.length;f<g;f++){e=d[f][0];b=d[f][3];try{e.notify(F(b)?b(c):c)}catch(h){a(h)}}})}};var h=function(a,b){var c=new g;b?c.resolve(a):c.reject(a);return c.promise},l=function(a,b,c){var d=null;try{F(c)&&(d=c())}catch(e){return h(e,!1)}return d&&F(d.then)?d.then(function(){return h(a,b)},function(a){return h(a,!1)}):h(a,b)},m=function(a,b,c,d){var e=new g;e.resolve(a);return e.promise.then(b,c,d)},q=function n(a){if(!F(a))throw k("norslvr",a);if(!(this instanceof |
|---|
| 113 | +n))return new n(a);var b=new g;a(function(a){b.resolve(a)},function(a){b.reject(a)});return b.promise};q.defer=function(){return new g};q.reject=function(a){var b=new g;b.reject(a);return b.promise};q.when=m;q.all=function(a){var b=new g,c=0,d=B(a)?[]:{};r(a,function(a,e){c++;m(a).then(function(a){d.hasOwnProperty(e)||(d[e]=a,--c||b.resolve(d))},function(a){d.hasOwnProperty(e)||b.reject(a)})});0===c&&b.resolve(d);return b.promise};return q}function Ve(){this.$get=["$window","$timeout",function(b, |
|---|
| 114 | +a){var c=b.requestAnimationFrame||b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame,d=b.cancelAnimationFrame||b.webkitCancelAnimationFrame||b.mozCancelAnimationFrame||b.webkitCancelRequestAnimationFrame,e=!!c,f=e?function(a){var b=c(a);return function(){d(b)}}:function(b){var c=a(b,16.66,!1);return function(){a.cancel(c)}};f.supported=e;return f}]}function Ke(){var b=10,a=y("$rootScope"),c=null,d=null;this.digestTtl=function(a){arguments.length&&(b=a);return b};this.$get=["$injector","$exceptionHandler", |
|---|
| 115 | +"$parse","$browser",function(e,f,g,k){function h(){this.$id=++hb;this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null;this.$root=this;this.$$destroyed=!1;this.$$listeners={};this.$$listenerCount={};this.$$isolateBindings=null}function l(b){if(s.$$phase)throw a("inprog",s.$$phase);s.$$phase=b}function m(a,b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function q(){}function p(){for(;x.length;)try{x.shift()()}catch(a){f(a)}d= |
|---|
| 116 | +null}function n(){null===d&&(d=k.defer(function(){s.$apply(p)}))}h.prototype={constructor:h,$new:function(a,b){function c(){d.$$destroyed=!0}var d;b=b||this;a?(d=new h,d.$root=this.$root):(this.$$ChildScope||(this.$$ChildScope=function(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null;this.$$listeners={};this.$$listenerCount={};this.$id=++hb;this.$$ChildScope=null},this.$$ChildScope.prototype=this),d=new this.$$ChildScope);d.$parent=b;d.$$prevSibling=b.$$childTail;b.$$childHead? |
|---|
| 117 | +(b.$$childTail.$$nextSibling=d,b.$$childTail=d):b.$$childHead=b.$$childTail=d;(a||b!=this)&&d.$on("$destroy",c);return d},$watch:function(a,b,d){var e=g(a);if(e.$$watchDelegate)return e.$$watchDelegate(this,b,d,e);var f=this.$$watchers,h={fn:b,last:q,get:e,exp:a,eq:!!d};c=null;F(b)||(h.fn=A);f||(f=this.$$watchers=[]);f.unshift(h);return function(){Wa(f,h);c=null}},$watchGroup:function(a,b){function c(){h=!1;k?(k=!1,b(e,e,g)):b(e,d,g)}var d=Array(a.length),e=Array(a.length),f=[],g=this,h=!1,k=!0;if(!a.length){var l= |
|---|
| 118 | +!0;g.$evalAsync(function(){l&&b(e,e,g)});return function(){l=!1}}if(1===a.length)return this.$watch(a[0],function(a,c,f){e[0]=a;d[0]=c;b(e,a===c?e:d,f)});r(a,function(a,b){var k=g.$watch(a,function(a,f){e[b]=a;d[b]=f;h||(h=!0,g.$evalAsync(c))});f.push(k)});return function(){for(;f.length;)f.shift()()}},$watchCollection:function(a,b){function c(a){e=a;var b,d,g,h;if(G(e))if(Ra(e))for(f!==p&&(f=p,s=f.length=0,l++),a=e.length,s!==a&&(l++,f.length=s=a),b=0;b<a;b++)h=f[b],g=e[b],d=h!==h&&g!==g,d||h=== |
|---|
| 119 | +g||(l++,f[b]=g);else{f!==n&&(f=n={},s=0,l++);a=0;for(b in e)e.hasOwnProperty(b)&&(a++,g=e[b],h=f[b],b in f?(d=h!==h&&g!==g,d||h===g||(l++,f[b]=g)):(s++,f[b]=g,l++));if(s>a)for(b in l++,f)e.hasOwnProperty(b)||(s--,delete f[b])}else f!==e&&(f=e,l++);return l}c.$stateful=!0;var d=this,e,f,h,k=1<b.length,l=0,m=g(a,c),p=[],n={},q=!0,s=0;return this.$watch(m,function(){q?(q=!1,b(e,e,d)):b(e,h,d);if(k)if(G(e))if(Ra(e)){h=Array(e.length);for(var a=0;a<e.length;a++)h[a]=e[a]}else for(a in h={},e)Hb.call(e, |
|---|
| 120 | +a)&&(h[a]=e[a]);else h=e})},$digest:function(){var e,g,h,m,n,r,Q=b,x,O=[],K,u,z;l("$digest");k.$$checkUrlChange();this===s&&null!==d&&(k.defer.cancel(d),p());c=null;do{r=!1;for(x=this;J.length;){try{z=J.shift(),z.scope.$eval(z.expression)}catch(y){f(y)}c=null}a:do{if(m=x.$$watchers)for(n=m.length;n--;)try{if(e=m[n])if((g=e.get(x))!==(h=e.last)&&!(e.eq?la(g,h):"number"===typeof g&&"number"===typeof h&&isNaN(g)&&isNaN(h)))r=!0,c=e,e.last=e.eq?Ca(g,null):g,e.fn(g,h===q?g:h,x),5>Q&&(K=4-Q,O[K]||(O[K]= |
|---|
| 121 | +[]),u=F(e.exp)?"fn: "+(e.exp.name||e.exp.toString()):e.exp,u+="; newVal: "+ra(g)+"; oldVal: "+ra(h),O[K].push(u));else if(e===c){r=!1;break a}}catch(D){f(D)}if(!(m=x.$$childHead||x!==this&&x.$$nextSibling))for(;x!==this&&!(m=x.$$nextSibling);)x=x.$parent}while(x=m);if((r||J.length)&&!Q--)throw s.$$phase=null,a("infdig",b,ra(O));}while(r||J.length);for(s.$$phase=null;v.length;)try{v.shift()()}catch(A){f(A)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed= |
|---|
| 122 | +!0;if(this!==s){for(var b in this.$$listenerCount)m(this,this.$$listenerCount[b],b);a.$$childHead==this&&(a.$$childHead=this.$$nextSibling);a.$$childTail==this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling);this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=A;this.$on=this.$watch=this.$watchGroup=function(){return A};this.$$listeners={};this.$parent= |
|---|
| 123 | +this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=this.$root=this.$$watchers=null}}},$eval:function(a,b){return g(a)(this,b)},$evalAsync:function(a){s.$$phase||J.length||k.defer(function(){J.length&&s.$digest()});J.push({scope:this,expression:a})},$$postDigest:function(a){v.push(a)},$apply:function(a){try{return l("$apply"),this.$eval(a)}catch(b){f(b)}finally{s.$$phase=null;try{s.$digest()}catch(c){throw f(c),c;}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&& |
|---|
| 124 | +x.push(b);n()},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){c[c.indexOf(b)]=null;m(e,1,a)}},$emit:function(a,b){var c=[],d,e=this,g=!1,h={name:a,targetScope:e,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=jb([h],arguments,1),l,m;do{d=e.$$listeners[a]||c;h.currentScope=e; |
|---|
| 125 | +l=0;for(m=d.length;l<m;l++)if(d[l])try{d[l].apply(null,k)}catch(p){f(p)}else d.splice(l,1),l--,m--;if(g)return h.currentScope=null,h;e=e.$parent}while(e);h.currentScope=null;return h},$broadcast:function(a,b){var c=this,d=this,e={name:a,targetScope:this,preventDefault:function(){e.defaultPrevented=!0},defaultPrevented:!1};if(!this.$$listenerCount[a])return e;for(var g=jb([e],arguments,1),h,k;c=d;){e.currentScope=c;d=c.$$listeners[a]||[];h=0;for(k=d.length;h<k;h++)if(d[h])try{d[h].apply(null,g)}catch(l){f(l)}else d.splice(h, |
|---|
| 126 | +1),h--,k--;if(!(d=c.$$listenerCount[a]&&c.$$childHead||c!==this&&c.$$nextSibling))for(;c!==this&&!(d=c.$$nextSibling);)c=c.$parent}e.currentScope=null;return e}};var s=new h,J=s.$$asyncQueue=[],v=s.$$postDigestQueue=[],x=s.$$applyAsyncQueue=[];return s}]}function Nd(){var b=/^\s*(https?|ftp|mailto|tel|file):/,a=/^\s*((https?|ftp|file|blob):|data:image\/)/;this.aHrefSanitizationWhitelist=function(a){return z(a)?(b=a,this):b};this.imgSrcSanitizationWhitelist=function(b){return z(b)?(a=b,this):a};this.$get= |
|---|
| 127 | +function(){return function(c,d){var e=d?a:b,f;f=za(c).href;return""===f||f.match(e)?c:"unsafe:"+f}}}function qf(b){if("self"===b)return b;if(I(b)){if(-1<b.indexOf("***"))throw Ba("iwcard",b);b=b.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08").replace("\\*\\*",".*").replace("\\*","[^:/.?&;]*");return new RegExp("^"+b+"$")}if(ib(b))return new RegExp("^"+b.source+"$");throw Ba("imatcher");}function cd(b){var a=[];z(b)&&r(b,function(b){a.push(qf(b))});return a}function Oe(){this.SCE_CONTEXTS= |
|---|
| 128 | +ja;var b=["self"],a=[];this.resourceUrlWhitelist=function(a){arguments.length&&(b=cd(a));return b};this.resourceUrlBlacklist=function(b){arguments.length&&(a=cd(b));return a};this.$get=["$injector",function(c){function d(a,b){return"self"===a?Uc(b):!!a.exec(b.href)}function e(a){var b=function(a){this.$$unwrapTrustedValue=function(){return a}};a&&(b.prototype=new a);b.prototype.valueOf=function(){return this.$$unwrapTrustedValue()};b.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()}; |
|---|
| 129 | +return b}var f=function(a){throw Ba("unsafe");};c.has("$sanitize")&&(f=c.get("$sanitize"));var g=e(),k={};k[ja.HTML]=e(g);k[ja.CSS]=e(g);k[ja.URL]=e(g);k[ja.JS]=e(g);k[ja.RESOURCE_URL]=e(k[ja.URL]);return{trustAs:function(a,b){var c=k.hasOwnProperty(a)?k[a]:null;if(!c)throw Ba("icontext",a,b);if(null===b||b===u||""===b)return b;if("string"!==typeof b)throw Ba("itype",a);return new c(b)},getTrusted:function(c,e){if(null===e||e===u||""===e)return e;var g=k.hasOwnProperty(c)?k[c]:null;if(g&&e instanceof |
|---|
| 130 | +g)return e.$$unwrapTrustedValue();if(c===ja.RESOURCE_URL){var g=za(e.toString()),q,p,n=!1;q=0;for(p=b.length;q<p;q++)if(d(b[q],g)){n=!0;break}if(n)for(q=0,p=a.length;q<p;q++)if(d(a[q],g)){n=!1;break}if(n)return e;throw Ba("insecurl",e.toString());}if(c===ja.HTML)return f(e);throw Ba("unsafe");},valueOf:function(a){return a instanceof g?a.$$unwrapTrustedValue():a}}}]}function Ne(){var b=!0;this.enabled=function(a){arguments.length&&(b=!!a);return b};this.$get=["$document","$parse","$sceDelegate",function(a, |
|---|
| 131 | +c,d){if(b&&8>a[0].documentMode)throw Ba("iequirks");var e=qa(ja);e.isEnabled=function(){return b};e.trustAs=d.trustAs;e.getTrusted=d.getTrusted;e.valueOf=d.valueOf;b||(e.trustAs=e.getTrusted=function(a,b){return b},e.valueOf=Ta);e.parseAs=function(a,b){var d=c(b);return d.literal&&d.constant?d:c(b,function(b){return e.getTrusted(a,b)})};var f=e.parseAs,g=e.getTrusted,k=e.trustAs;r(ja,function(a,b){var c=N(b);e[ab("parse_as_"+c)]=function(b){return f(a,b)};e[ab("get_trusted_"+c)]=function(b){return g(a, |
|---|
| 132 | +b)};e[ab("trust_as_"+c)]=function(b){return k(a,b)}});return e}]}function Pe(){this.$get=["$window","$document",function(b,a){var c={},d=ba((/android (\d+)/.exec(N((b.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((b.navigator||{}).userAgent),f=a[0]||{},g,k=/^(Moz|webkit|O|ms)(?=[A-Z])/,h=f.body&&f.body.style,l=!1,m=!1;if(h){for(var q in h)if(l=k.exec(q)){g=l[0];g=g.substr(0,1).toUpperCase()+g.substr(1);break}g||(g="WebkitOpacity"in h&&"webkit");l=!!("transition"in h||g+"Transition"in h);m=!!("animation"in |
|---|
| 133 | +h||g+"Animation"in h);!d||l&&m||(l=I(f.body.style.webkitTransition),m=I(f.body.style.webkitAnimation))}return{history:!(!b.history||!b.history.pushState||4>d||e),hasEvent:function(a){if("input"==a&&9==Pa)return!1;if(w(c[a])){var b=f.createElement("div");c[a]="on"+a in b}return c[a]},csp:Za(),vendorPrefix:g,transitions:l,animations:m,android:d}}]}function Re(){this.$get=["$templateCache","$http","$q",function(b,a,c){function d(e,f){function g(){k.totalPendingRequests--;if(!f)throw ia("tpload",e);return c.reject()} |
|---|
| 134 | +var k=d;k.totalPendingRequests++;return a.get(e,{cache:b}).then(function(a){a=a.data;if(!a||0===a.length)return g();k.totalPendingRequests--;b.put(e,a);return a},g)}d.totalPendingRequests=0;return d}]}function Se(){this.$get=["$rootScope","$browser","$location",function(b,a,c){return{findBindings:function(a,b,c){a=a.getElementsByClassName("ng-binding");var g=[];r(a,function(a){var d=ta.element(a).data("$binding");d&&r(d,function(d){c?(new RegExp("(^|\\s)"+b+"(\\s|\\||$)")).test(d)&&g.push(a):-1!= |
|---|
| 135 | +d.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,c){for(var g=["ng-","data-ng-","ng\\:"],k=0;k<g.length;++k){var h=a.querySelectorAll("["+g[k]+"model"+(c?"=":"*=")+'"'+b+'"]');if(h.length)return h}},getLocation:function(){return c.url()},setLocation:function(a){a!==c.url()&&(c.url(a),b.$digest())},whenStable:function(b){a.notifyWhenNoOutstandingRequests(b)}}}]}function Te(){this.$get=["$rootScope","$browser","$q","$$q","$exceptionHandler",function(b,a,c,d,e){function f(f,h,l){var m=z(l)&& |
|---|
| 136 | +!l,q=(m?d:c).defer(),p=q.promise;h=a.defer(function(){try{q.resolve(f())}catch(a){q.reject(a),e(a)}finally{delete g[p.$$timeoutId]}m||b.$apply()},h);p.$$timeoutId=h;g[h]=q;return p}var g={};f.cancel=function(b){return b&&b.$$timeoutId in g?(g[b.$$timeoutId].reject("canceled"),delete g[b.$$timeoutId],a.defer.cancel(b.$$timeoutId)):!1};return f}]}function za(b,a){var c=b;Pa&&(Z.setAttribute("href",c),c=Z.href);Z.setAttribute("href",c);return{href:Z.href,protocol:Z.protocol?Z.protocol.replace(/:$/,""): |
|---|
| 137 | +"",host:Z.host,search:Z.search?Z.search.replace(/^\?/,""):"",hash:Z.hash?Z.hash.replace(/^#/,""):"",hostname:Z.hostname,port:Z.port,pathname:"/"===Z.pathname.charAt(0)?Z.pathname:"/"+Z.pathname}}function Uc(b){b=I(b)?za(b):b;return b.protocol===dd.protocol&&b.host===dd.host}function Ue(){this.$get=da(S)}function Bc(b){function a(c,d){if(G(c)){var e={};r(c,function(b,c){e[c]=a(c,b)});return e}return b.factory(c+"Filter",d)}this.register=a;this.$get=["$injector",function(a){return function(b){return a.get(b+ |
|---|
| 138 | +"Filter")}}];a("currency",ed);a("date",fd);a("filter",rf);a("json",sf);a("limitTo",tf);a("lowercase",uf);a("number",gd);a("orderBy",hd);a("uppercase",vf)}function rf(){return function(b,a,c){if(!B(b))return b;var d=typeof c,e=[];e.check=function(a,b){for(var c=0;c<e.length;c++)if(!e[c](a,b))return!1;return!0};"function"!==d&&(c="boolean"===d&&c?function(a,b){return ta.equals(a,b)}:function(a,b){if(a&&b&&"object"===typeof a&&"object"===typeof b){for(var d in a)if("$"!==d.charAt(0)&&Hb.call(a,d)&&c(a[d], |
|---|
| 139 | +b[d]))return!0;return!1}b=(""+b).toLowerCase();return-1<(""+a).toLowerCase().indexOf(b)});var f=function(a,b){if("string"===typeof b&&"!"===b.charAt(0))return!f(a,b.substr(1));switch(typeof a){case "boolean":case "number":case "string":return c(a,b);case "object":switch(typeof b){case "object":return c(a,b);default:for(var d in a)if("$"!==d.charAt(0)&&f(a[d],b))return!0}return!1;case "array":for(d=0;d<a.length;d++)if(f(a[d],b))return!0;return!1;default:return!1}};switch(typeof a){case "boolean":case "number":case "string":a= |
|---|
| 140 | +{$:a};case "object":for(var g in a)(function(b){"undefined"!==typeof a[b]&&e.push(function(c){return f("$"==b?c:c&&c[b],a[b])})})(g);break;case "function":e.push(a);break;default:return b}d=[];for(g=0;g<b.length;g++){var k=b[g];e.check(k,g)&&d.push(k)}return d}}function ed(b){var a=b.NUMBER_FORMATS;return function(b,d,e){w(d)&&(d=a.CURRENCY_SYM);w(e)&&(e=2);return null==b?b:id(b,a.PATTERNS[1],a.GROUP_SEP,a.DECIMAL_SEP,e).replace(/\u00A4/g,d)}}function gd(b){var a=b.NUMBER_FORMATS;return function(b, |
|---|
| 141 | +d){return null==b?b:id(b,a.PATTERNS[0],a.GROUP_SEP,a.DECIMAL_SEP,d)}}function id(b,a,c,d,e){if(!isFinite(b)||G(b))return"";var f=0>b;b=Math.abs(b);var g=b+"",k="",h=[],l=!1;if(-1!==g.indexOf("e")){var m=g.match(/([\d\.]+)e(-?)(\d+)/);m&&"-"==m[2]&&m[3]>e+1?(g="0",b=0):(k=g,l=!0)}if(l)0<e&&-1<b&&1>b&&(k=b.toFixed(e));else{g=(g.split(jd)[1]||"").length;w(e)&&(e=Math.min(Math.max(a.minFrac,g),a.maxFrac));b=+(Math.round(+(b.toString()+"e"+e)).toString()+"e"+-e);0===b&&(f=!1);b=(""+b).split(jd);g=b[0]; |
|---|
| 142 | +b=b[1]||"";var m=0,q=a.lgSize,p=a.gSize;if(g.length>=q+p)for(m=g.length-q,l=0;l<m;l++)0===(m-l)%p&&0!==l&&(k+=c),k+=g.charAt(l);for(l=m;l<g.length;l++)0===(g.length-l)%q&&0!==l&&(k+=c),k+=g.charAt(l);for(;b.length<e;)b+="0";e&&"0"!==e&&(k+=d+b.substr(0,e))}h.push(f?a.negPre:a.posPre);h.push(k);h.push(f?a.negSuf:a.posSuf);return h.join("")}function Ab(b,a,c){var d="";0>b&&(d="-",b=-b);for(b=""+b;b.length<a;)b="0"+b;c&&(b=b.substr(b.length-a));return d+b}function $(b,a,c,d){c=c||0;return function(e){e= |
|---|
| 143 | +e["get"+b]();if(0<c||e>-c)e+=c;0===e&&-12==c&&(e=12);return Ab(e,a,d)}}function Bb(b,a){return function(c,d){var e=c["get"+b](),f=pb(a?"SHORT"+b:b);return d[f][e]}}function kd(b){var a=(new Date(b,0,1)).getDay();return new Date(b,0,(4>=a?5:12)-a)}function ld(b){return function(a){var c=kd(a.getFullYear());a=+new Date(a.getFullYear(),a.getMonth(),a.getDate()+(4-a.getDay()))-+c;a=1+Math.round(a/6048E5);return Ab(a,b)}}function fd(b){function a(a){var b;if(b=a.match(c)){a=new Date(0);var f=0,g=0,k=b[8]? |
|---|
| 144 | +a.setUTCFullYear:a.setFullYear,h=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=ba(b[9]+b[10]),g=ba(b[9]+b[11]));k.call(a,ba(b[1]),ba(b[2])-1,ba(b[3]));f=ba(b[4]||0)-f;g=ba(b[5]||0)-g;k=ba(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));h.call(a,f,g,k,b)}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,e,f){var g="",k=[],h,l;e=e||"mediumDate";e=b.DATETIME_FORMATS[e]||e;I(c)&&(c=wf.test(c)?ba(c):a(c));W(c)&&(c=new Date(c)); |
|---|
| 145 | +if(!ea(c))return c;for(;e;)(l=xf.exec(e))?(k=jb(k,l,1),e=k.pop()):(k.push(e),e=null);f&&"UTC"===f&&(c=new Date(c.getTime()),c.setMinutes(c.getMinutes()+c.getTimezoneOffset()));r(k,function(a){h=yf[a];g+=h?h(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function sf(){return function(b){return ra(b,!0)}}function tf(){return function(b,a){W(b)&&(b=b.toString());if(!B(b)&&!I(b))return b;a=Infinity===Math.abs(Number(a))?Number(a):ba(a);if(I(b))return a?0<=a?b.slice(0,a): |
|---|
| 146 | +b.slice(a,b.length):"";var c=[],d,e;a>b.length?a=b.length:a<-b.length&&(a=-b.length);0<a?(d=0,e=a):(d=b.length+a,e=b.length);for(;d<e;d++)c.push(b[d]);return c}}function hd(b){return function(a,c,d){function e(a,b){return b?function(b,c){return a(c,b)}:a}function f(a,b){var c=typeof a,d=typeof b;return c==d?(ea(a)&&ea(b)&&(a=a.valueOf(),b=b.valueOf()),"string"==c&&(a=a.toLowerCase(),b=b.toLowerCase()),a===b?0:a<b?-1:1):c<d?-1:1}if(!Ra(a))return a;c=B(c)?c:[c];0===c.length&&(c=["+"]);c=c.map(function(a){var c= |
|---|
| 147 | +!1,d=a||Ta;if(I(a)){if("+"==a.charAt(0)||"-"==a.charAt(0))c="-"==a.charAt(0),a=a.substring(1);if(""===a)return e(function(a,b){return f(a,b)},c);d=b(a);if(d.constant){var g=d();return e(function(a,b){return f(a[g],b[g])},c)}}return e(function(a,b){return f(d(a),d(b))},c)});for(var g=[],k=0;k<a.length;k++)g.push(a[k]);return g.sort(e(function(a,b){for(var d=0;d<c.length;d++){var e=c[d](a,b);if(0!==e)return e}return 0},d))}}function Ha(b){F(b)&&(b={link:b});b.restrict=b.restrict||"AC";return da(b)} |
|---|
| 148 | +function md(b,a,c,d,e){var f=this,g=[],k=f.$$parentForm=b.parent().controller("form")||Cb;f.$error={};f.$$success={};f.$pending=u;f.$name=e(a.name||a.ngForm||"")(c);f.$dirty=!1;f.$pristine=!0;f.$valid=!0;f.$invalid=!1;f.$submitted=!1;k.$addControl(f);f.$rollbackViewValue=function(){r(g,function(a){a.$rollbackViewValue()})};f.$commitViewValue=function(){r(g,function(a){a.$commitViewValue()})};f.$addControl=function(a){Ka(a.$name,"input");g.push(a);a.$name&&(f[a.$name]=a)};f.$$renameControl=function(a, |
|---|
| 149 | +b){var c=a.$name;f[c]===a&&delete f[c];f[b]=a;a.$name=b};f.$removeControl=function(a){a.$name&&f[a.$name]===a&&delete f[a.$name];r(f.$pending,function(b,c){f.$setValidity(c,null,a)});r(f.$error,function(b,c){f.$setValidity(c,null,a)});Wa(g,a)};nd({ctrl:this,$element:b,set:function(a,b,c){var d=a[b];d?-1===d.indexOf(c)&&d.push(c):a[b]=[c]},unset:function(a,b,c){var d=a[b];d&&(Wa(d,c),0===d.length&&delete a[b])},parentForm:k,$animate:d});f.$setDirty=function(){d.removeClass(b,Qa);d.addClass(b,Db);f.$dirty= |
|---|
| 150 | +!0;f.$pristine=!1;k.$setDirty()};f.$setPristine=function(){d.setClass(b,Qa,Db+" ng-submitted");f.$dirty=!1;f.$pristine=!0;f.$submitted=!1;r(g,function(a){a.$setPristine()})};f.$setUntouched=function(){r(g,function(a){a.$setUntouched()})};f.$setSubmitted=function(){d.addClass(b,"ng-submitted");f.$submitted=!0;k.$setSubmitted()}}function ec(b){b.$formatters.push(function(a){return b.$isEmpty(a)?a:a.toString()})}function eb(b,a,c,d,e,f){a.prop("validity");var g=a[0].placeholder,k={},h=N(a[0].type);if(!e.android){var l= |
|---|
| 151 | +!1;a.on("compositionstart",function(a){l=!0});a.on("compositionend",function(){l=!1;m()})}var m=function(b){if(!l){var e=a.val(),f=b&&b.type;Pa&&"input"===(b||k).type&&a[0].placeholder!==g?g=a[0].placeholder:("password"===h||c.ngTrim&&"false"===c.ngTrim||(e=U(e)),(d.$viewValue!==e||""===e&&d.$$hasNativeValidators)&&d.$setViewValue(e,f))}};if(e.hasEvent("input"))a.on("input",m);else{var q,p=function(a){q||(q=f.defer(function(){m(a);q=null}))};a.on("keydown",function(a){var b=a.keyCode;91===b||15<b&& |
|---|
| 152 | +19>b||37<=b&&40>=b||p(a)});if(e.hasEvent("paste"))a.on("paste cut",p)}a.on("change",m);d.$render=function(){a.val(d.$isEmpty(d.$modelValue)?"":d.$viewValue)}}function Eb(b,a){return function(c,d){var e,f;if(ea(c))return c;if(I(c)){'"'==c.charAt(0)&&'"'==c.charAt(c.length-1)&&(c=c.substring(1,c.length-1));if(zf.test(c))return new Date(c);b.lastIndex=0;if(e=b.exec(c))return e.shift(),f=d?{yyyy:d.getFullYear(),MM:d.getMonth()+1,dd:d.getDate(),HH:d.getHours(),mm:d.getMinutes(),ss:d.getSeconds(),sss:d.getMilliseconds()/ |
|---|
| 153 | +1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},r(e,function(b,c){c<a.length&&(f[a[c]]=+b)}),new Date(f.yyyy,f.MM-1,f.dd,f.HH,f.mm,f.ss||0,1E3*f.sss||0)}return NaN}}function fb(b,a,c,d){return function(e,f,g,k,h,l,m){function q(a){return z(a)?ea(a)?a:c(a):u}od(e,f,g,k);eb(e,f,g,k,h,l);var p=k&&k.$options&&k.$options.timezone,n;k.$$parserName=b;k.$parsers.push(function(b){return k.$isEmpty(b)?null:a.test(b)?(b=c(b,n),"UTC"===p&&b.setMinutes(b.getMinutes()-b.getTimezoneOffset()),b):u});k.$formatters.push(function(a){if(k.$isEmpty(a))n= |
|---|
| 154 | +null;else{if(!ea(a))throw Fb("datefmt",a);if((n=a)&&"UTC"===p){var b=6E4*n.getTimezoneOffset();n=new Date(n.getTime()+b)}return m("date")(a,d,p)}return""});if(z(g.min)||g.ngMin){var s;k.$validators.min=function(a){return k.$isEmpty(a)||w(s)||c(a)>=s};g.$observe("min",function(a){s=q(a);k.$validate()})}if(z(g.max)||g.ngMax){var r;k.$validators.max=function(a){return k.$isEmpty(a)||w(r)||c(a)<=r};g.$observe("max",function(a){r=q(a);k.$validate()})}k.$isEmpty=function(a){return!a||a.getTime&&a.getTime()!== |
|---|
| 155 | +a.getTime()}}}function od(b,a,c,d){(d.$$hasNativeValidators=G(a[0].validity))&&d.$parsers.push(function(b){var c=a.prop("validity")||{};return c.badInput&&!c.typeMismatch?u:b})}function pd(b,a,c,d,e){if(z(d)){b=b(d);if(!b.constant)throw y("ngModel")("constexpr",c,d);return b(a)}return e}function nd(b){function a(a,b){b&&!f[a]?(l.addClass(e,a),f[a]=!0):!b&&f[a]&&(l.removeClass(e,a),f[a]=!1)}function c(b,c){b=b?"-"+Kb(b,"-"):"";a(gb+b,!0===c);a(qd+b,!1===c)}var d=b.ctrl,e=b.$element,f={},g=b.set,k= |
|---|
| 156 | +b.unset,h=b.parentForm,l=b.$animate;f[qd]=!(f[gb]=e.hasClass(gb));d.$setValidity=function(b,e,f){e===u?(d.$pending||(d.$pending={}),g(d.$pending,b,f)):(d.$pending&&k(d.$pending,b,f),rd(d.$pending)&&(d.$pending=u));Va(e)?e?(k(d.$error,b,f),g(d.$$success,b,f)):(g(d.$error,b,f),k(d.$$success,b,f)):(k(d.$error,b,f),k(d.$$success,b,f));d.$pending?(a(sd,!0),d.$valid=d.$invalid=u,c("",null)):(a(sd,!1),d.$valid=rd(d.$error),d.$invalid=!d.$valid,c("",d.$valid));e=d.$pending&&d.$pending[b]?u:d.$error[b]?!1: |
|---|
| 157 | +d.$$success[b]?!0:null;c(b,e);h.$setValidity(b,e,d)}}function rd(b){if(b)for(var a in b)return!1;return!0}function fc(b,a){b="ngClass"+b;return["$animate",function(c){function d(a,b){var c=[],d=0;a:for(;d<a.length;d++){for(var e=a[d],m=0;m<b.length;m++)if(e==b[m])continue a;c.push(e)}return c}function e(a){if(!B(a)){if(I(a))return a.split(" ");if(G(a)){var b=[];r(a,function(a,c){a&&(b=b.concat(c.split(" ")))});return b}}return a}return{restrict:"AC",link:function(f,g,k){function h(a,b){var c=g.data("$classCounts")|| |
|---|
| 158 | +{},d=[];r(a,function(a){if(0<b||c[a])c[a]=(c[a]||0)+b,c[a]===+(0<b)&&d.push(a)});g.data("$classCounts",c);return d.join(" ")}function l(b){if(!0===a||f.$index%2===a){var l=e(b||[]);if(!m){var n=h(l,1);k.$addClass(n)}else if(!la(b,m)){var s=e(m),n=d(l,s),l=d(s,l),n=h(n,1),l=h(l,-1);n&&n.length&&c.addClass(g,n);l&&l.length&&c.removeClass(g,l)}}m=qa(b)}var m;f.$watch(k[b],l,!0);k.$observe("class",function(a){l(f.$eval(k[b]))});"ngClass"!==b&&f.$watch("$index",function(c,d){var g=c&1;if(g!==(d&1)){var l= |
|---|
| 159 | +e(f.$eval(k[b]));g===a?(g=h(l,1),k.$addClass(g)):(g=h(l,-1),k.$removeClass(g))}})}}}]}var Af=/^\/(.+)\/([a-z]*)$/,N=function(b){return I(b)?b.toLowerCase():b},Hb=Object.prototype.hasOwnProperty,pb=function(b){return I(b)?b.toUpperCase():b},Pa,D,ma,Ya=[].slice,mf=[].splice,Bf=[].push,Ia=Object.prototype.toString,Xa=y("ng"),ta=S.angular||(S.angular={}),$a,hb=0;Pa=X.documentMode;A.$inject=[];Ta.$inject=[];var B=Array.isArray,U=function(b){return I(b)?b.trim():b},Za=function(){if(z(Za.isActive_))return Za.isActive_; |
|---|
| 160 | +var b=!(!X.querySelector("[ng-csp]")&&!X.querySelector("[data-ng-csp]"));if(!b)try{new Function("")}catch(a){b=!0}return Za.isActive_=b},mb=["ng-","data-ng-","ng:","x-ng-"],Hd=/[A-Z]/g,sc=!1,Lb,ka=1,kb=3,Ld={full:"1.3.0",major:1,minor:3,dot:0,codeName:"superluminal-nudge"};R.expando="ng339";var ub=R.cache={},bf=1;R._data=function(b){return this.cache[b[this.expando]]||{}};var Xe=/([\:\-\_]+(.))/g,Ye=/^moz([A-Z])/,Cf={mouseleave:"mouseout",mouseenter:"mouseover"},Ob=y("jqLite"),af=/^<(\w+)\s*\/?>(?:<\/\1>|)$/, |
|---|
| 161 | +Nb=/<|&#?\w+;/,Ze=/<([\w:]+)/,$e=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ha={option:[1,'<select multiple="multiple">',"</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ha.optgroup=ha.option;ha.tbody=ha.tfoot=ha.colgroup=ha.caption=ha.thead;ha.th=ha.td;var Ja=R.prototype={ready:function(b){function a(){c||(c= |
|---|
| 162 | +!0,b())}var c=!1;"complete"===X.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),R(S).on("load",a),this.on("DOMContentLoaded",a))},toString:function(){var b=[];r(this,function(a){b.push(""+a)});return"["+b.join(", ")+"]"},eq:function(b){return 0<=b?D(this[b]):D(this[this.length+b])},length:0,push:Bf,sort:[].sort,splice:[].splice},wb={};r("multiple selected checked disabled readOnly required open".split(" "),function(b){wb[N(b)]=b});var Kc={};r("input select option textarea button form details".split(" "), |
|---|
| 163 | +function(b){Kc[b]=!0});var Lc={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"};r({data:Qb,removeData:sb},function(b,a){R[a]=b});r({data:Qb,inheritedData:vb,scope:function(b){return D.data(b,"$scope")||vb(b.parentNode||b,["$isolateScope","$scope"])},isolateScope:function(b){return D.data(b,"$isolateScope")||D.data(b,"$isolateScopeNoTemplate")},controller:Gc,injector:function(b){return vb(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:Rb, |
|---|
| 164 | +css:function(b,a,c){a=ab(a);if(z(c))b.style[a]=c;else return b.style[a]},attr:function(b,a,c){var d=N(a);if(wb[d])if(z(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||A).specified?d:u;else if(z(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?u:b},prop:function(b,a,c){if(z(c))b[a]=c;else return b[a]},text:function(){function b(a,b){if(w(b)){var d=a.nodeType;return d===ka||d===kb?a.textContent:""}a.textContent= |
|---|
| 165 | +b}b.$dv="";return b}(),val:function(b,a){if(w(a)){if(b.multiple&&"select"===pa(b)){var c=[];r(b.options,function(a){a.selected&&c.push(a.value||a.text)});return 0===c.length?null:c}return b.value}b.value=a},html:function(b,a){if(w(a))return b.innerHTML;rb(b,!0);b.innerHTML=a},empty:Hc},function(b,a){R.prototype[a]=function(a,d){var e,f,g=this.length;if(b!==Hc&&(2==b.length&&b!==Rb&&b!==Gc?a:d)===u){if(G(a)){for(e=0;e<g;e++)if(b===Qb)b(this[e],a);else for(f in a)b(this[e],f,a[f]);return this}e=b.$dv; |
|---|
| 166 | +g=e===u?Math.min(g,1):g;for(f=0;f<g;f++){var k=b(this[f],a,d);e=e?e+k:k}return e}for(e=0;e<g;e++)b(this[e],a,d);return this}});r({removeData:sb,on:function a(c,d,e,f){if(z(f))throw Ob("onargs");if(Cc(c)){var g=tb(c,!0);f=g.events;var k=g.handle;k||(k=g.handle=ef(c,f));for(var g=0<=d.indexOf(" ")?d.split(" "):[d],h=g.length;h--;){d=g[h];var l=f[d];l||(f[d]=[],"mouseenter"===d||"mouseleave"===d?a(c,Cf[d],function(a){var c=a.relatedTarget;c&&(c===this||this.contains(c))||k(a,d)}):"$destroy"!==d&&c.addEventListener(d, |
|---|
| 167 | +k,!1),l=f[d]);l.push(e)}}},off:Fc,one:function(a,c,d){a=D(a);a.on(c,function f(){a.off(c,d);a.off(c,f)});a.on(c,d)},replaceWith:function(a,c){var d,e=a.parentNode;rb(a);r(new R(c),function(c){d?e.insertBefore(c,d.nextSibling):e.replaceChild(c,a);d=c})},children:function(a){var c=[];r(a.childNodes,function(a){a.nodeType===ka&&c.push(a)});return c},contents:function(a){return a.contentDocument||a.childNodes||[]},append:function(a,c){var d=a.nodeType;if(d===ka||11===d){c=new R(c);for(var d=0,e=c.length;d< |
|---|
| 168 | +e;d++)a.appendChild(c[d])}},prepend:function(a,c){if(a.nodeType===ka){var d=a.firstChild;r(new R(c),function(c){a.insertBefore(c,d)})}},wrap:function(a,c){c=D(c).eq(0).clone()[0];var d=a.parentNode;d&&d.replaceChild(c,a);c.appendChild(a)},remove:Ic,detach:function(a){Ic(a,!0)},after:function(a,c){var d=a,e=a.parentNode;c=new R(c);for(var f=0,g=c.length;f<g;f++){var k=c[f];e.insertBefore(k,d.nextSibling);d=k}},addClass:Tb,removeClass:Sb,toggleClass:function(a,c,d){c&&r(c.split(" "),function(c){var f= |
|---|
| 169 | +d;w(f)&&(f=!Rb(a,c));(f?Tb:Sb)(a,c)})},parent:function(a){return(a=a.parentNode)&&11!==a.nodeType?a:null},next:function(a){return a.nextElementSibling},find:function(a,c){return a.getElementsByTagName?a.getElementsByTagName(c):[]},clone:Pb,triggerHandler:function(a,c,d){var e,f,g=c.type||c,k=tb(a);if(k=(k=k&&k.events)&&k[g])e={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return!0===this.defaultPrevented},stopImmediatePropagation:function(){this.immediatePropagationStopped= |
|---|
| 170 | +!0},isImmediatePropagationStopped:function(){return!0===this.immediatePropagationStopped},stopPropagation:A,type:g,target:a},c.type&&(e=E(e,c)),c=qa(k),f=d?[e].concat(d):[e],r(c,function(c){e.isImmediatePropagationStopped()||c.apply(a,f)})}},function(a,c){R.prototype[c]=function(c,e,f){for(var g,k=0,h=this.length;k<h;k++)w(g)?(g=a(this[k],c,e,f),z(g)&&(g=D(g))):Ec(g,a(this[k],c,e,f));return z(g)?g:this};R.prototype.bind=R.prototype.on;R.prototype.unbind=R.prototype.off});bb.prototype={put:function(a, |
|---|
| 171 | +c){this[La(a,this.nextUid)]=c},get:function(a){return this[La(a,this.nextUid)]},remove:function(a){var c=this[a=La(a,this.nextUid)];delete this[a];return c}};var Nc=/^function\s*[^\(]*\(\s*([^\)]*)\)/m,gf=/,/,hf=/^\s*(_?)(\S+?)\1\s*$/,Mc=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Ea=y("$injector");Jb.$$annotate=Ub;var Df=y("$animate"),xe=["$provide",function(a){this.$$selectors={};this.register=function(c,d){var e=c+"-animation";if(c&&"."!=c.charAt(0))throw Df("notcsel",c);this.$$selectors[c.substr(1)]=e; |
|---|
| 172 | +a.factory(e,d)};this.classNameFilter=function(a){1===arguments.length&&(this.$$classNameFilter=a instanceof RegExp?a:null);return this.$$classNameFilter};this.$get=["$$q","$$asyncCallback","$rootScope",function(a,d,e){function f(d){var f,g=a.defer();g.promise.$$cancelFn=function(){f&&f()};e.$$postDigest(function(){f=d(function(){g.resolve()})});return g.promise}function g(a,c){var d=[],e=[],f=wa();r((a.attr("class")||"").split(/\s+/),function(a){f[a]=!0});r(c,function(a,c){var g=f[c];!1===a&&g?e.push(c): |
|---|
| 173 | +!0!==a||g||d.push(c)});return 0<d.length+e.length&&[d.length?d:null,e.length?e:null]}function k(a,c,d){for(var e=0,f=c.length;e<f;++e)a[c[e]]=d}function h(){m||(m=a.defer(),d(function(){m.resolve();m=null}));return m.promise}function l(a,c){if(ta.isObject(c)){var d=E(c.from||{},c.to||{});a.css(d)}}var m;return{animate:function(a,c,d){l(a,{from:c,to:d});return h()},enter:function(a,c,d,e){l(a,e);d?d.after(a):c.prepend(a);return h()},leave:function(a,c){a.remove();return h()},move:function(a,c,d,e){return this.enter(a, |
|---|
| 174 | +c,d,e)},addClass:function(a,c,d){return this.setClass(a,c,[],d)},$$addClassImmediately:function(a,c,d){a=D(a);c=I(c)?c:B(c)?c.join(" "):"";r(a,function(a){Tb(a,c)});l(a,d);return h()},removeClass:function(a,c,d){return this.setClass(a,[],c,d)},$$removeClassImmediately:function(a,c,d){a=D(a);c=I(c)?c:B(c)?c.join(" "):"";r(a,function(a){Sb(a,c)});l(a,d);return h()},setClass:function(a,c,d,e){var h=this,l=!1;a=D(a);var m=a.data("$$animateClasses");m?e&&m.options&&(m.options=ta.extend(m.options||{},e)): |
|---|
| 175 | +(m={classes:{},options:e},l=!0);e=m.classes;c=B(c)?c:c.split(" ");d=B(d)?d:d.split(" ");k(e,c,!0);k(e,d,!1);l&&(m.promise=f(function(c){var d=a.data("$$animateClasses");a.removeData("$$animateClasses");if(d){var e=g(a,d.classes);e&&h.$$setClassImmediately(a,e[0],e[1],d.options)}c()}),a.data("$$animateClasses",m));return m.promise},$$setClassImmediately:function(a,c,d,e){c&&this.$$addClassImmediately(a,c);d&&this.$$removeClassImmediately(a,d);l(a,e);return h()},enabled:A,cancel:A}}]}],ia=y("$compile"); |
|---|
| 176 | +uc.$inject=["$provide","$$sanitizeUriProvider"];var lf=/^(x[\:\-_]|data[\:\-_])/i,Yb=y("$interpolate"),Ef=/^([^\?#]*)(\?([^#]*))?(#(.*))?$/,pf={http:80,https:443,ftp:21},cb=y("$location"),Ff={$$html5:!1,$$replace:!1,absUrl:zb("$$absUrl"),url:function(a){if(w(a))return this.$$url;a=Ef.exec(a);a[1]&&this.path(decodeURIComponent(a[1]));(a[2]||a[1])&&this.search(a[3]||"");this.hash(a[5]||"");return this},protocol:zb("$$protocol"),host:zb("$$host"),port:zb("$$port"),path:Yc("$$path",function(a){a=null!== |
|---|
| 177 | +a?a.toString():"";return"/"==a.charAt(0)?a:"/"+a}),search:function(a,c){switch(arguments.length){case 0:return this.$$search;case 1:if(I(a)||W(a))a=a.toString(),this.$$search=qc(a);else if(G(a))a=Ca(a,{}),r(a,function(c,e){null==c&&delete a[e]}),this.$$search=a;else throw cb("isrcharg");break;default:w(c)||null===c?delete this.$$search[a]:this.$$search[a]=c}this.$$compose();return this},hash:Yc("$$hash",function(a){return null!==a?a.toString():""}),replace:function(){this.$$replace=!0;return this}}; |
|---|
| 178 | +r([Xc,bc,ac],function(a){a.prototype=Object.create(Ff);a.prototype.state=function(c){if(!arguments.length)return this.$$state;if(a!==ac||!this.$$html5)throw cb("nostate");this.$$state=w(c)?null:c;return this}});var oa=y("$parse"),Gf=Function.prototype.call,Hf=Function.prototype.apply,If=Function.prototype.bind,Gb=wa();r({"null":function(){return null},"true":function(){return!0},"false":function(){return!1},undefined:function(){}},function(a,c){a.constant=a.literal=a.sharedGetter=!0;Gb[c]=a});Gb["this"]= |
|---|
| 179 | +function(a){return a};Gb["this"].sharedGetter=!0;var gc=E(wa(),{"+":function(a,c,d,e){d=d(a,c);e=e(a,c);return z(d)?z(e)?d+e:d:z(e)?e:u},"-":function(a,c,d,e){d=d(a,c);e=e(a,c);return(z(d)?d:0)-(z(e)?e:0)},"*":function(a,c,d,e){return d(a,c)*e(a,c)},"/":function(a,c,d,e){return d(a,c)/e(a,c)},"%":function(a,c,d,e){return d(a,c)%e(a,c)},"===":function(a,c,d,e){return d(a,c)===e(a,c)},"!==":function(a,c,d,e){return d(a,c)!==e(a,c)},"==":function(a,c,d,e){return d(a,c)==e(a,c)},"!=":function(a,c,d,e){return d(a, |
|---|
| 180 | +c)!=e(a,c)},"<":function(a,c,d,e){return d(a,c)<e(a,c)},">":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a,c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"!":function(a,c,d){return!d(a,c)},"=":!0,"|":!0}),Jf={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},dc=function(a){this.options=a};dc.prototype={constructor:dc,lex:function(a){this.text=a;this.index=0;this.ch=u; |
|---|
| 181 | +for(this.tokens=[];this.index<this.text.length;)if(this.ch=this.text.charAt(this.index),this.is("\"'"))this.readString(this.ch);else if(this.isNumber(this.ch)||this.is(".")&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdent(this.ch))this.readIdent();else if(this.is("(){}[].,;:?"))this.tokens.push({index:this.index,text:this.ch}),this.index++;else if(this.isWhitespace(this.ch))this.index++;else{a=this.ch+this.peek();var c=a+this.peek(2),d=gc[this.ch],e=gc[a],f=gc[c];f?(this.tokens.push({index:this.index, |
|---|
| 182 | +text:c,fn:f}),this.index+=3):e?(this.tokens.push({index:this.index,text:a,fn:e}),this.index+=2):d?(this.tokens.push({index:this.index,text:this.ch,fn:d}),this.index+=1):this.throwError("Unexpected next character ",this.index,this.index+1)}return this.tokens},is:function(a){return-1!==a.indexOf(this.ch)},peek:function(a){a=a||1;return this.index+a<this.text.length?this.text.charAt(this.index+a):!1},isNumber:function(a){return"0"<=a&&"9">=a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"=== |
|---|
| 183 | +a||"\n"===a||"\v"===a||"\u00a0"===a},isIdent:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,c,d){d=d||this.index;c=z(c)?"s "+c+"-"+this.index+" ["+this.text.substring(c,d)+"]":" "+d;throw oa("lexerr",a,c,this.text);},readNumber:function(){for(var a="",c=this.index;this.index<this.text.length;){var d=N(this.text.charAt(this.index));if("."==d||this.isNumber(d))a+=d;else{var e=this.peek();if("e"== |
|---|
| 184 | +d&&this.isExpOperator(e))a+=d;else if(this.isExpOperator(d)&&e&&this.isNumber(e)&&"e"==a.charAt(a.length-1))a+=d;else if(!this.isExpOperator(d)||e&&this.isNumber(e)||"e"!=a.charAt(a.length-1))break;else this.throwError("Invalid exponent")}this.index++}a*=1;this.tokens.push({index:c,text:a,constant:!0,fn:function(){return a}})},readIdent:function(){for(var a=this.text,c="",d=this.index,e,f,g,k;this.index<this.text.length;){k=this.text.charAt(this.index);if("."===k||this.isIdent(k)||this.isNumber(k))"."=== |
|---|
| 185 | +k&&(e=this.index),c+=k;else break;this.index++}e&&"."===c[c.length-1]&&(this.index--,c=c.slice(0,-1),e=c.lastIndexOf("."),-1===e&&(e=u));if(e)for(f=this.index;f<this.text.length;){k=this.text.charAt(f);if("("===k){g=c.substr(e-d+1);c=c.substr(0,e-d);this.index=f;break}if(this.isWhitespace(k))f++;else break}this.tokens.push({index:d,text:c,fn:Gb[c]||$c(c,this.options,a)});g&&(this.tokens.push({index:e,text:"."}),this.tokens.push({index:e+1,text:g}))},readString:function(a){var c=this.index;this.index++; |
|---|
| 186 | +for(var d="",e=a,f=!1;this.index<this.text.length;){var g=this.text.charAt(this.index),e=e+g;if(f)"u"===g?(f=this.text.substring(this.index+1,this.index+5),f.match(/[\da-f]{4}/i)||this.throwError("Invalid unicode escape [\\u"+f+"]"),this.index+=4,d+=String.fromCharCode(parseInt(f,16))):d+=Jf[g]||g,f=!1;else if("\\"===g)f=!0;else{if(g===a){this.index++;this.tokens.push({index:c,text:e,string:d,constant:!0,fn:function(){return d}});return}d+=g}this.index++}this.throwError("Unterminated quote",c)}}; |
|---|
| 187 | +var db=function(a,c,d){this.lexer=a;this.$filter=c;this.options=d};db.ZERO=E(function(){return 0},{sharedGetter:!0,constant:!0});db.prototype={constructor:db,parse:function(a){this.text=a;this.tokens=this.lexer.lex(a);a=this.statements();0!==this.tokens.length&&this.throwError("is an unexpected token",this.tokens[0]);a.literal=!!a.literal;a.constant=!!a.constant;return a},primary:function(){var a;if(this.expect("("))a=this.filterChain(),this.consume(")");else if(this.expect("["))a=this.arrayDeclaration(); |
|---|
| 188 | +else if(this.expect("{"))a=this.object();else{var c=this.expect();(a=c.fn)||this.throwError("not a primary expression",c);c.constant&&(a.constant=!0,a.literal=!0)}for(var d;c=this.expect("(","[",".");)"("===c.text?(a=this.functionCall(a,d),d=null):"["===c.text?(d=a,a=this.objectIndex(a)):"."===c.text?(d=a,a=this.fieldAccess(a)):this.throwError("IMPOSSIBLE");return a},throwError:function(a,c){throw oa("syntax",c.text,a,c.index+1,this.text,this.text.substring(c.index));},peekToken:function(){if(0=== |
|---|
| 189 | +this.tokens.length)throw oa("ueoe",this.text);return this.tokens[0]},peek:function(a,c,d,e){if(0<this.tokens.length){var f=this.tokens[0],g=f.text;if(g===a||g===c||g===d||g===e||!(a||c||d||e))return f}return!1},expect:function(a,c,d,e){return(a=this.peek(a,c,d,e))?(this.tokens.shift(),a):!1},consume:function(a){this.expect(a)||this.throwError("is unexpected, expecting ["+a+"]",this.peek())},unaryFn:function(a,c){return E(function(d,e){return a(d,e,c)},{constant:c.constant,inputs:[c]})},binaryFn:function(a, |
|---|
| 190 | +c,d,e){return E(function(e,g){return c(e,g,a,d)},{constant:a.constant&&d.constant,inputs:!e&&[a,d]})},statements:function(){for(var a=[];;)if(0<this.tokens.length&&!this.peek("}",")",";","]")&&a.push(this.filterChain()),!this.expect(";"))return 1===a.length?a[0]:function(c,d){for(var e,f=0,g=a.length;f<g;f++)e=a[f](c,d);return e}},filterChain:function(){for(var a=this.expression();this.expect("|");)a=this.filter(a);return a},filter:function(a){var c=this.expect(),d=this.$filter(c.text),e,f;if(this.peek(":"))for(e= |
|---|
| 191 | +[],f=[];this.expect(":");)e.push(this.expression());c=[a].concat(e||[]);return E(function(c,k){var h=a(c,k);if(f){f[0]=h;for(h=e.length;h--;)f[h+1]=e[h](c,k);return d.apply(u,f)}return d(h)},{constant:!d.$stateful&&c.every(cc),inputs:!d.$stateful&&c})},expression:function(){return this.assignment()},assignment:function(){var a=this.ternary(),c,d;return(d=this.expect("="))?(a.assign||this.throwError("implies assignment but ["+this.text.substring(0,d.index)+"] can not be assigned to",d),c=this.ternary(), |
|---|
| 192 | +E(function(d,f){return a.assign(d,c(d,f),f)},{inputs:[a,c]})):a},ternary:function(){var a=this.logicalOR(),c,d;if(d=this.expect("?")){c=this.assignment();if(d=this.expect(":")){var e=this.assignment();return E(function(d,g){return a(d,g)?c(d,g):e(d,g)},{constant:a.constant&&c.constant&&e.constant})}this.throwError("expected :",d)}return a},logicalOR:function(){for(var a=this.logicalAND(),c;c=this.expect("||");)a=this.binaryFn(a,c.fn,this.logicalAND(),!0);return a},logicalAND:function(){var a=this.equality(), |
|---|
| 193 | +c;if(c=this.expect("&&"))a=this.binaryFn(a,c.fn,this.logicalAND(),!0);return a},equality:function(){var a=this.relational(),c;if(c=this.expect("==","!=","===","!=="))a=this.binaryFn(a,c.fn,this.equality());return a},relational:function(){var a=this.additive(),c;if(c=this.expect("<",">","<=",">="))a=this.binaryFn(a,c.fn,this.relational());return a},additive:function(){for(var a=this.multiplicative(),c;c=this.expect("+","-");)a=this.binaryFn(a,c.fn,this.multiplicative());return a},multiplicative:function(){for(var a= |
|---|
| 194 | +this.unary(),c;c=this.expect("*","/","%");)a=this.binaryFn(a,c.fn,this.unary());return a},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn(db.ZERO,a.fn,this.unary()):(a=this.expect("!"))?this.unaryFn(a.fn,this.unary()):this.primary()},fieldAccess:function(a){var c=this.text,d=this.expect().text,e=$c(d,this.options,c);return E(function(c,d,k){return e(k||a(c,d))},{assign:function(e,g,k){(k=a(e,k))||a.assign(e,k={});return Oa(k,d,g,c)}})},objectIndex:function(a){var c= |
|---|
| 195 | +this.text,d=this.expression();this.consume("]");return E(function(e,f){var g=a(e,f),k=d(e,f);na(k,c);return g?Aa(g[k],c):u},{assign:function(e,f,g){var k=na(d(e,g),c);(g=Aa(a(e,g),c))||a.assign(e,g={});return g[k]=f}})},functionCall:function(a,c){var d=[];if(")"!==this.peekToken().text){do d.push(this.expression());while(this.expect(","))}this.consume(")");var e=this.text,f=d.length?[]:null;return function(g,k){var h=c?c(g,k):g,l=a(g,k,h)||A;if(f)for(var m=d.length;m--;)f[m]=Aa(d[m](g,k),e);Aa(h, |
|---|
| 196 | +e);if(l){if(l.constructor===l)throw oa("isecfn",e);if(l===Gf||l===Hf||l===If)throw oa("isecff",e);}h=l.apply?l.apply(h,f):l(f[0],f[1],f[2],f[3],f[4]);return Aa(h,e)}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;var c=this.expression();a.push(c)}while(this.expect(","))}this.consume("]");return E(function(c,e){for(var f=[],g=0,k=a.length;g<k;g++)f.push(a[g](c,e));return f},{literal:!0,constant:a.every(cc),inputs:a})},object:function(){var a=[],c=[]; |
|---|
| 197 | +if("}"!==this.peekToken().text){do{if(this.peek("}"))break;var d=this.expect();a.push(d.string||d.text);this.consume(":");d=this.expression();c.push(d)}while(this.expect(","))}this.consume("}");return E(function(d,f){for(var g={},k=0,h=c.length;k<h;k++)g[a[k]]=c[k](d,f);return g},{literal:!0,constant:c.every(cc),inputs:c})}};var ad=wa(),Ba=y("$sce"),ja={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},ia=y("$compile"),Z=X.createElement("a"),dd=za(S.location.href,!0);Bc.$inject= |
|---|
| 198 | +["$provide"];ed.$inject=["$locale"];gd.$inject=["$locale"];var jd=".",yf={yyyy:$("FullYear",4),yy:$("FullYear",2,0,!0),y:$("FullYear",1),MMMM:Bb("Month"),MMM:Bb("Month",!0),MM:$("Month",2,1),M:$("Month",1,1),dd:$("Date",2),d:$("Date",1),HH:$("Hours",2),H:$("Hours",1),hh:$("Hours",2,-12),h:$("Hours",1,-12),mm:$("Minutes",2),m:$("Minutes",1),ss:$("Seconds",2),s:$("Seconds",1),sss:$("Milliseconds",3),EEEE:Bb("Day"),EEE:Bb("Day",!0),a:function(a,c){return 12>a.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){a= |
|---|
| 199 | +-1*a.getTimezoneOffset();return a=(0<=a?"+":"")+(Ab(Math[0<a?"floor":"ceil"](a/60),2)+Ab(Math.abs(a%60),2))},ww:ld(2),w:ld(1)},xf=/((?:[^yMdHhmsaZEw']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|w+))(.*)/,wf=/^\-?\d+$/;fd.$inject=["$locale"];var uf=da(N),vf=da(pb);hd.$inject=["$parse"];var Od=da({restrict:"E",compile:function(a,c){if(!c.href&&!c.xlinkHref&&!c.name)return function(a,c){var f="[object SVGAnimatedString]"===Ia.call(c.prop("href"))?"xlink:href":"href";c.on("click",function(a){c.attr(f)|| |
|---|
| 200 | +a.preventDefault()})}}}),qb={};r(wb,function(a,c){if("multiple"!=a){var d=ua("ng-"+c);qb[d]=function(){return{restrict:"A",priority:100,link:function(a,f,g){a.$watch(g[d],function(a){g.$set(c,!!a)})}}}}});r(Lc,function(a,c){qb[c]=function(){return{priority:100,link:function(a,e,f){if("ngPattern"===c&&"/"==f.ngPattern.charAt(0)&&(e=f.ngPattern.match(Af))){f.$set("ngPattern",new RegExp(e[1],e[2]));return}a.$watch(f[c],function(a){f.$set(c,a)})}}}});r(["src","srcset","href"],function(a){var c=ua("ng-"+ |
|---|
| 201 | +a);qb[c]=function(){return{priority:99,link:function(d,e,f){var g=a,k=a;"href"===a&&"[object SVGAnimatedString]"===Ia.call(e.prop("href"))&&(k="xlinkHref",f.$attr[k]="xlink:href",g=null);f.$observe(c,function(c){c?(f.$set(k,c),Pa&&g&&e.prop(g,f[k])):"href"===a&&f.$set(k,null)})}}}});var Cb={$addControl:A,$$renameControl:function(a,c){a.$name=c},$removeControl:A,$setValidity:A,$setDirty:A,$setPristine:A,$setSubmitted:A};md.$inject=["$element","$attrs","$scope","$animate","$interpolate"];var td=function(a){return["$timeout", |
|---|
| 202 | +function(c){return{name:"form",restrict:a?"EAC":"E",controller:md,compile:function(a){a.addClass(Qa).addClass(gb);return{pre:function(a,d,g,k){if(!("action"in g)){var h=function(c){a.$apply(function(){k.$commitViewValue();k.$setSubmitted()});c.preventDefault?c.preventDefault():c.returnValue=!1};d[0].addEventListener("submit",h,!1);d.on("$destroy",function(){c(function(){d[0].removeEventListener("submit",h,!1)},0,!1)})}var l=k.$$parentForm,m=k.$name;m&&(Oa(a,m,k,m),g.$observe(g.name?"name":"ngForm", |
|---|
| 203 | +function(c){m!==c&&(Oa(a,m,u,m),m=c,Oa(a,m,k,m),l.$$renameControl(k,m))}));d.on("$destroy",function(){l.$removeControl(k);m&&Oa(a,m,u,m);E(k,Cb)})}}}}}]},Pd=td(),be=td(!0),zf=/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/,Kf=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,Lf=/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,Mf=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,ud=/^(\d{4})-(\d{2})-(\d{2})$/, |
|---|
| 204 | +vd=/^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,hc=/^(\d{4})-W(\d\d)$/,wd=/^(\d{4})-(\d\d)$/,xd=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Nf=/(\s+|^)default(\s+|$)/,Fb=new y("ngModel"),yd={text:function(a,c,d,e,f,g){eb(a,c,d,e,f,g);ec(e)},date:fb("date",ud,Eb(ud,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":fb("datetimelocal",vd,Eb(vd,"yyyy MM dd HH mm ss sss".split(" ")),"yyyy-MM-ddTHH:mm:ss.sss"),time:fb("time",xd,Eb(xd,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:fb("week", |
|---|
| 205 | +hc,function(a,c){if(ea(a))return a;if(I(a)){hc.lastIndex=0;var d=hc.exec(a);if(d){var e=+d[1],f=+d[2],g=d=0,k=0,h=0,l=kd(e),f=7*(f-1);c&&(d=c.getHours(),g=c.getMinutes(),k=c.getSeconds(),h=c.getMilliseconds());return new Date(e,0,l.getDate()+f,d,g,k,h)}}return NaN},"yyyy-Www"),month:fb("month",wd,Eb(wd,["yyyy","MM"]),"yyyy-MM"),number:function(a,c,d,e,f,g){od(a,c,d,e);eb(a,c,d,e,f,g);e.$$parserName="number";e.$parsers.push(function(a){return e.$isEmpty(a)?null:Mf.test(a)?parseFloat(a):u});e.$formatters.push(function(a){if(!e.$isEmpty(a)){if(!W(a))throw Fb("numfmt", |
|---|
| 206 | +a);a=a.toString()}return a});if(d.min||d.ngMin){var k;e.$validators.min=function(a){return e.$isEmpty(a)||w(k)||a>=k};d.$observe("min",function(a){z(a)&&!W(a)&&(a=parseFloat(a,10));k=W(a)&&!isNaN(a)?a:u;e.$validate()})}if(d.max||d.ngMax){var h;e.$validators.max=function(a){return e.$isEmpty(a)||w(h)||a<=h};d.$observe("max",function(a){z(a)&&!W(a)&&(a=parseFloat(a,10));h=W(a)&&!isNaN(a)?a:u;e.$validate()})}},url:function(a,c,d,e,f,g){eb(a,c,d,e,f,g);ec(e);e.$$parserName="url";e.$validators.url=function(a){return e.$isEmpty(a)|| |
|---|
| 207 | +Kf.test(a)}},email:function(a,c,d,e,f,g){eb(a,c,d,e,f,g);ec(e);e.$$parserName="email";e.$validators.email=function(a){return e.$isEmpty(a)||Lf.test(a)}},radio:function(a,c,d,e){w(d.name)&&c.attr("name",++hb);c.on("click",function(a){c[0].checked&&e.$setViewValue(d.value,a&&a.type)});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e,f,g,k,h){var l=pd(h,a,"ngTrueValue",d.ngTrueValue,!0),m=pd(h,a,"ngFalseValue",d.ngFalseValue,!1);c.on("click", |
|---|
| 208 | +function(a){e.$setViewValue(c[0].checked,a&&a.type)});e.$render=function(){c[0].checked=e.$viewValue};e.$isEmpty=function(a){return a!==l};e.$formatters.push(function(a){return la(a,l)});e.$parsers.push(function(a){return a?l:m})},hidden:A,button:A,submit:A,reset:A,file:A},vc=["$browser","$sniffer","$filter","$parse",function(a,c,d,e){return{restrict:"E",require:["?ngModel"],link:{pre:function(f,g,k,h){h[0]&&(yd[N(k.type)]||yd.text)(f,g,k,h[0],c,a,d,e)}}}}],gb="ng-valid",qd="ng-invalid",Qa="ng-pristine", |
|---|
| 209 | +Db="ng-dirty",sd="ng-pending",Of=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,c,d,e,f,g,k,h,l,m){this.$modelValue=this.$viewValue=Number.NaN;this.$validators={};this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success={};this.$pending=u;this.$name=m(d.name|| |
|---|
| 210 | +"",!1)(a);var q=f(d.ngModel),p=null,n=this,s=function(){var c=q(a);n.$options&&n.$options.getterSetter&&F(c)&&(c=c());return c},J=function(c){var d;n.$options&&n.$options.getterSetter&&F(d=q(a))?d(n.$modelValue):q.assign(a,n.$modelValue)};this.$$setOptions=function(a){n.$options=a;if(!(q.assign||a&&a.getterSetter))throw Fb("nonassign",d.ngModel,sa(e));};this.$render=A;this.$isEmpty=function(a){return w(a)||""===a||null===a||a!==a};var v=e.inheritedData("$formController")||Cb,x=0;nd({ctrl:this,$element:e, |
|---|
| 211 | +set:function(a,c){a[c]=!0},unset:function(a,c){delete a[c]},parentForm:v,$animate:g});this.$setPristine=function(){n.$dirty=!1;n.$pristine=!0;g.removeClass(e,Db);g.addClass(e,Qa)};this.$setUntouched=function(){n.$touched=!1;n.$untouched=!0;g.setClass(e,"ng-untouched","ng-touched")};this.$setTouched=function(){n.$touched=!0;n.$untouched=!1;g.setClass(e,"ng-touched","ng-untouched")};this.$rollbackViewValue=function(){k.cancel(p);n.$viewValue=n.$$lastCommittedViewValue;n.$render()};this.$validate=function(){W(n.$modelValue)&& |
|---|
| 212 | +isNaN(n.$modelValue)||this.$$parseAndValidate()};this.$$runValidators=function(a,c,d,e){function f(){var a=!0;r(n.$validators,function(e,f){var g=e(c,d);a=a&&g;h(f,g)});return a?!0:(r(n.$asyncValidators,function(a,c){h(c,null)}),!1)}function g(){var a=[],e=!0;r(n.$asyncValidators,function(f,g){var k=f(c,d);if(!k||!F(k.then))throw Fb("$asyncValidators",k);h(g,u);a.push(k.then(function(){h(g,!0)},function(a){e=!1;h(g,!1)}))});a.length?l.all(a).then(function(){k(e)},A):k(!0)}function h(a,c){m===x&&n.$setValidity(a, |
|---|
| 213 | +c)}function k(a){m===x&&e(a)}x++;var m=x;(function(a){var c=n.$$parserName||"parse";if(a===u)h(c,null);else if(h(c,a),!a)return r(n.$validators,function(a,c){h(c,null)}),r(n.$asyncValidators,function(a,c){h(c,null)}),!1;return!0})(a)?f()?g():k(!1):k(!1)};this.$commitViewValue=function(){var a=n.$viewValue;k.cancel(p);if(n.$$lastCommittedViewValue!==a||""===a&&n.$$hasNativeValidators)n.$$lastCommittedViewValue=a,n.$pristine&&(n.$dirty=!0,n.$pristine=!1,g.removeClass(e,Qa),g.addClass(e,Db),v.$setDirty()), |
|---|
| 214 | +this.$$parseAndValidate()};this.$$parseAndValidate=function(){var a=n.$$lastCommittedViewValue,c=a,d=w(c)?u:!0;if(d)for(var e=0;e<n.$parsers.length;e++)if(c=n.$parsers[e](c),w(c)){d=!1;break}W(n.$modelValue)&&isNaN(n.$modelValue)&&(n.$modelValue=s());var f=n.$modelValue,g=n.$options&&n.$options.allowInvalid;g&&(n.$modelValue=c,n.$modelValue!==f&&n.$$writeModelToScope());n.$$runValidators(d,c,a,function(a){g||(n.$modelValue=a?c:u,n.$modelValue!==f&&n.$$writeModelToScope())})};this.$$writeModelToScope= |
|---|
| 215 | +function(){J(n.$modelValue);r(n.$viewChangeListeners,function(a){try{a()}catch(d){c(d)}})};this.$setViewValue=function(a,c){n.$viewValue=a;n.$options&&!n.$options.updateOnDefault||n.$$debounceViewValueCommit(c)};this.$$debounceViewValueCommit=function(c){var d=0,e=n.$options;e&&z(e.debounce)&&(e=e.debounce,W(e)?d=e:W(e[c])?d=e[c]:W(e["default"])&&(d=e["default"]));k.cancel(p);d?p=k(function(){n.$commitViewValue()},d):h.$$phase?n.$commitViewValue():a.$apply(function(){n.$commitViewValue()})};a.$watch(function(){var a= |
|---|
| 216 | +s();if(a!==n.$modelValue){n.$modelValue=a;for(var c=n.$formatters,d=c.length,e=a;d--;)e=c[d](e);n.$viewValue!==e&&(n.$viewValue=n.$$lastCommittedViewValue=e,n.$render(),n.$$runValidators(u,a,e,A))}return a})}],qe=function(){return{restrict:"A",require:["ngModel","^?form","^?ngModelOptions"],controller:Of,priority:1,compile:function(a){a.addClass(Qa).addClass("ng-untouched").addClass(gb);return{pre:function(a,d,e,f){var g=f[0],k=f[1]||Cb;g.$$setOptions(f[2]&&f[2].$options);k.$addControl(g);e.$observe("name", |
|---|
| 217 | +function(a){g.$name!==a&&k.$$renameControl(g,a)});a.$on("$destroy",function(){k.$removeControl(g)})},post:function(a,d,e,f){var g=f[0];if(g.$options&&g.$options.updateOn)d.on(g.$options.updateOn,function(a){g.$$debounceViewValueCommit(a&&a.type)});d.on("blur",function(d){g.$touched||a.$apply(function(){g.$setTouched()})})}}}}},se=da({restrict:"A",require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),xc=function(){return{restrict:"A",require:"?ngModel", |
|---|
| 218 | +link:function(a,c,d,e){e&&(d.required=!0,e.$validators.required=function(a){return!d.required||!e.$isEmpty(a)},d.$observe("required",function(){e.$validate()}))}}},wc=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){if(e){var f,g=d.ngPattern||d.pattern;d.$observe("pattern",function(a){I(a)&&0<a.length&&(a=new RegExp(a));if(a&&!a.test)throw y("ngPattern")("noregexp",g,a,sa(c));f=a||u;e.$validate()});e.$validators.pattern=function(a){return e.$isEmpty(a)||w(f)||f.test(a)}}}}}, |
|---|
| 219 | +zc=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){if(e){var f=0;d.$observe("maxlength",function(a){f=ba(a)||0;e.$validate()});e.$validators.maxlength=function(a,c){return e.$isEmpty(a)||c.length<=f}}}}},yc=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){if(e){var f=0;d.$observe("minlength",function(a){f=ba(a)||0;e.$validate()});e.$validators.minlength=function(a,c){return e.$isEmpty(a)||c.length>=f}}}}},re=function(){return{restrict:"A",priority:100, |
|---|
| 220 | +require:"ngModel",link:function(a,c,d,e){var f=c.attr(d.$attr.ngList)||", ",g="false"!==d.ngTrim,k=g?U(f):f;e.$parsers.push(function(a){if(!w(a)){var c=[];a&&r(a.split(k),function(a){a&&c.push(g?U(a):a)});return c}});e.$formatters.push(function(a){return B(a)?a.join(f):u});e.$isEmpty=function(a){return!a||!a.length}}}},Pf=/^(true|false|\d+)$/,te=function(){return{restrict:"A",priority:100,compile:function(a,c){return Pf.test(c.ngValue)?function(a,c,f){f.$set("value",a.$eval(f.ngValue))}:function(a, |
|---|
| 221 | +c,f){a.$watch(f.ngValue,function(a){f.$set("value",a)})}}}},ue=function(){return{restrict:"A",controller:["$scope","$attrs",function(a,c){var d=this;this.$options=a.$eval(c.ngModelOptions);this.$options.updateOn!==u?(this.$options.updateOnDefault=!1,this.$options.updateOn=U(this.$options.updateOn.replace(Nf,function(){d.$options.updateOnDefault=!0;return" "}))):this.$options.updateOnDefault=!0}]}},Ud=["$compile",function(a){return{restrict:"AC",compile:function(c){a.$$addBindingClass(c);return function(c, |
|---|
| 222 | +e,f){a.$$addBindingInfo(e,f.ngBind);e=e[0];c.$watch(f.ngBind,function(a){e.textContent=a===u?"":a})}}}}],Wd=["$interpolate","$compile",function(a,c){return{compile:function(d){c.$$addBindingClass(d);return function(d,f,g){d=a(f.attr(g.$attr.ngBindTemplate));c.$$addBindingInfo(f,d.expressions);f=f[0];g.$observe("ngBindTemplate",function(a){f.textContent=a===u?"":a})}}}}],Vd=["$sce","$parse","$compile",function(a,c,d){return{restrict:"A",compile:function(e,f){var g=c(f.ngBindHtml),k=c(f.ngBindHtml, |
|---|
| 223 | +function(a){return(a||"").toString()});d.$$addBindingClass(e);return function(c,e,f){d.$$addBindingInfo(e,f.ngBindHtml);c.$watch(k,function(){e.html(a.getTrustedHtml(g(c))||"")})}}}}],Xd=fc("",!0),Zd=fc("Odd",0),Yd=fc("Even",1),$d=Ha({compile:function(a,c){c.$set("ngCloak",u);a.removeClass("ng-cloak")}}),ae=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],Ac={},Qf={blur:!0,focus:!0};r("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "), |
|---|
| 224 | +function(a){var c=ua("ng-"+a);Ac[c]=["$parse","$rootScope",function(d,e){return{restrict:"A",compile:function(f,g){var k=d(g[c]);return function(c,d){d.on(a,function(d){var f=function(){k(c,{$event:d})};Qf[a]&&e.$$phase?c.$evalAsync(f):c.$apply(f)})}}}}]});var de=["$animate",function(a){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(c,d,e,f,g){var k,h,l;c.$watch(e.ngIf,function(c){c?h||g(function(c,f){h=f;c[c.length++]=X.createComment(" end ngIf: "+ |
|---|
| 225 | +e.ngIf+" ");k={clone:c};a.enter(c,d.parent(),d)}):(l&&(l.remove(),l=null),h&&(h.$destroy(),h=null),k&&(l=ob(k.clone),a.leave(l).then(function(){l=null}),k=null))})}}}],ee=["$templateRequest","$anchorScroll","$animate","$sce",function(a,c,d,e){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:ta.noop,compile:function(f,g){var k=g.ngInclude||g.src,h=g.onload||"",l=g.autoscroll;return function(f,g,p,n,r){var u=0,v,x,t,y=function(){x&&(x.remove(),x=null);v&&(v.$destroy(), |
|---|
| 226 | +v=null);t&&(d.leave(t).then(function(){x=null}),x=t,t=null)};f.$watch(e.parseAsResourceUrl(k),function(e){var k=function(){!z(l)||l&&!f.$eval(l)||c()},p=++u;e?(a(e,!0).then(function(a){if(p===u){var c=f.$new();n.template=a;a=r(c,function(a){y();d.enter(a,null,g).then(k)});v=c;t=a;v.$emit("$includeContentLoaded",e);f.$eval(h)}},function(){p===u&&(y(),f.$emit("$includeContentError",e))}),f.$emit("$includeContentRequested",e)):(y(),n.template=null)})}}}}],ve=["$compile",function(a){return{restrict:"ECA", |
|---|
| 227 | +priority:-400,require:"ngInclude",link:function(c,d,e,f){/SVG/.test(d[0].toString())?(d.empty(),a(Dc(f.template,X).childNodes)(c,function(a){d.append(a)},u,u,d)):(d.html(f.template),a(d.contents())(c))}}}],fe=Ha({priority:450,compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),ge=Ha({terminal:!0,priority:1E3}),he=["$locale","$interpolate",function(a,c){var d=/{}/g;return{restrict:"EA",link:function(e,f,g){var k=g.count,h=g.$attr.when&&f.attr(g.$attr.when),l=g.offset||0,m=e.$eval(h)|| |
|---|
| 228 | +{},q={},p=c.startSymbol(),n=c.endSymbol(),s=/^when(Minus)?(.+)$/;r(g,function(a,c){s.test(c)&&(m[N(c.replace("when","").replace("Minus","-"))]=f.attr(g.$attr[c]))});r(m,function(a,e){q[e]=c(a.replace(d,p+k+"-"+l+n))});e.$watch(function(){var c=parseFloat(e.$eval(k));if(isNaN(c))return"";c in m||(c=a.pluralCat(c-l));return q[c](e)},function(a){f.text(a)})}}}],ie=["$parse","$animate",function(a,c){var d=y("ngRepeat"),e=function(a,c,d,e,l,m,q){a[d]=e;l&&(a[l]=m);a.$index=c;a.$first=0===c;a.$last=c=== |
|---|
| 229 | +q-1;a.$middle=!(a.$first||a.$last);a.$odd=!(a.$even=0===(c&1))};return{restrict:"A",multiElement:!0,transclude:"element",priority:1E3,terminal:!0,$$tlb:!0,compile:function(f,g){var k=g.ngRepeat,h=X.createComment(" end ngRepeat: "+k+" "),l=k.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);if(!l)throw d("iexp",k);var m=l[1],q=l[2],p=l[3],n=l[4],l=m.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);if(!l)throw d("iidexp",m);var s=l[3]||l[1],J= |
|---|
| 230 | +l[2];if(p&&(!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(p)||/^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent)$/.test(p)))throw d("badident",p);var v,x,t,y,z={$id:La};n?v=a(n):(t=function(a,c){return La(c)},y=function(a){return a});return function(a,f,g,l,n){v&&(x=function(c,d,e){J&&(z[J]=c);z[s]=d;z.$index=e;return v(a,z)});var m=wa();a.$watchCollection(q,function(g){var l,q,z=f[0],H,v=wa(),C,Q,A,E,w,B,F;p&&(a[p]=g);if(Ra(g))w=g,q=x||t;else{q=x||y;w=[];for(F in g)g.hasOwnProperty(F)&& |
|---|
| 231 | +"$"!=F.charAt(0)&&w.push(F);w.sort()}C=w.length;F=Array(C);for(l=0;l<C;l++)if(Q=g===w?l:w[l],A=g[Q],E=q(Q,A,l),m[E])B=m[E],delete m[E],v[E]=B,F[l]=B;else{if(v[E])throw r(F,function(a){a&&a.scope&&(m[a.id]=a)}),d("dupes",k,E,ra(A));F[l]={id:E,scope:u,clone:u};v[E]=!0}for(H in m){B=m[H];E=ob(B.clone);c.leave(E);if(E[0].parentNode)for(l=0,q=E.length;l<q;l++)E[l].$$NG_REMOVED=!0;B.scope.$destroy()}for(l=0;l<C;l++)if(Q=g===w?l:w[l],A=g[Q],B=F[l],B.scope){H=z;do H=H.nextSibling;while(H&&H.$$NG_REMOVED); |
|---|
| 232 | +B.clone[0]!=H&&c.move(ob(B.clone),null,D(z));z=B.clone[B.clone.length-1];e(B.scope,l,s,A,J,Q,C)}else n(function(a,d){B.scope=d;var f=h.cloneNode(!1);a[a.length++]=f;c.enter(a,null,D(z));z=f;B.clone=a;v[B.id]=B;e(B.scope,l,s,A,J,Q,C)});m=v})}}}}],je=["$animate",function(a){return{restrict:"A",multiElement:!0,link:function(c,d,e){c.$watch(e.ngShow,function(c){a[c?"removeClass":"addClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],ce=["$animate",function(a){return{restrict:"A",multiElement:!0, |
|---|
| 233 | +link:function(c,d,e){c.$watch(e.ngHide,function(c){a[c?"addClass":"removeClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],ke=Ha(function(a,c,d){a.$watch(d.ngStyle,function(a,d){d&&a!==d&&r(d,function(a,d){c.css(d,"")});a&&c.css(a)},!0)}),le=["$animate",function(a){return{restrict:"EA",require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(c,d,e,f){var g=[],k=[],h=[],l=[],m=function(a,c){return function(){a.splice(c,1)}};c.$watch(e.ngSwitch||e.on,function(c){var d, |
|---|
| 234 | +e;d=0;for(e=h.length;d<e;++d)a.cancel(h[d]);d=h.length=0;for(e=l.length;d<e;++d){var s=ob(k[d].clone);l[d].$destroy();(h[d]=a.leave(s)).then(m(h,d))}k.length=0;l.length=0;(g=f.cases["!"+c]||f.cases["?"])&&r(g,function(c){c.transclude(function(d,e){l.push(e);var f=c.element;d[d.length++]=X.createComment(" end ngSwitchWhen: ");k.push({clone:d});a.enter(d,f.parent(),f)})})})}}}],me=Ha({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,c,d,e,f){e.cases["!"+d.ngSwitchWhen]= |
|---|
| 235 | +e.cases["!"+d.ngSwitchWhen]||[];e.cases["!"+d.ngSwitchWhen].push({transclude:f,element:c})}}),ne=Ha({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,c,d,e,f){e.cases["?"]=e.cases["?"]||[];e.cases["?"].push({transclude:f,element:c})}}),pe=Ha({restrict:"EAC",link:function(a,c,d,e,f){if(!f)throw y("ngTransclude")("orphan",sa(c));f(function(a){c.empty();c.append(a)})}}),Qd=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(c,d){"text/ng-template"== |
|---|
| 236 | +d.type&&a.put(d.id,c[0].text)}}}],Rf=y("ngOptions"),oe=da({restrict:"A",terminal:!0}),Rd=["$compile","$parse",function(a,c){var d=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,e={$setViewValue:A};return{restrict:"E",require:["select","?ngModel"],controller:["$element","$scope","$attrs",function(a,c,d){var h=this,l={},m=e,q;h.databound=d.ngModel; |
|---|
| 237 | +h.init=function(a,c,d){m=a;q=d};h.addOption=function(c,d){Ka(c,'"option value"');l[c]=!0;m.$viewValue==c&&(a.val(c),q.parent()&&q.remove());d&&d[0].hasAttribute("selected")&&(d[0].selected=!0)};h.removeOption=function(a){this.hasOption(a)&&(delete l[a],m.$viewValue==a&&this.renderUnknownOption(a))};h.renderUnknownOption=function(c){c="? "+La(c)+" ?";q.val(c);a.prepend(q);a.val(c);q.prop("selected",!0)};h.hasOption=function(a){return l.hasOwnProperty(a)};c.$on("$destroy",function(){h.renderUnknownOption= |
|---|
| 238 | +A})}],link:function(e,g,k,h){function l(a,c,d,e){d.$render=function(){var a=d.$viewValue;e.hasOption(a)?(C.parent()&&C.remove(),c.val(a),""===a&&v.prop("selected",!0)):w(a)&&v?c.val(""):e.renderUnknownOption(a)};c.on("change",function(){a.$apply(function(){C.parent()&&C.remove();d.$setViewValue(c.val())})})}function m(a,c,d){var e;d.$render=function(){var a=new bb(d.$viewValue);r(c.find("option"),function(c){c.selected=z(a.get(c.value))})};a.$watch(function(){la(e,d.$viewValue)||(e=qa(d.$viewValue), |
|---|
| 239 | +d.$render())});c.on("change",function(){a.$apply(function(){var a=[];r(c.find("option"),function(c){c.selected&&a.push(c.value)});d.$setViewValue(a)})})}function q(e,f,g){function h(a,c,d){N[A]=d;F&&(N[F]=c);return a(e,N)}function k(a){var c;if(n)if(G&&B(a)){c=new bb([]);for(var d=0;d<a.length;d++)c.put(h(G,null,a[d]),!0)}else c=new bb(a);else G&&(a=h(G,null,a));return function(d,e){var f;f=G?G:w?w:I;return n?z(c.remove(h(f,d,e))):a==h(f,d,e)}}function l(){x||(e.$$postDigest(q),x=!0)}function m(a, |
|---|
| 240 | +c,d){a[c]=a[c]||0;a[c]+=d?1:-1}function q(){x=!1;var a={"":[]},c=[""],d,l,s,u,v;s=g.$viewValue;u=P(e)||[];var A=F?ic(u):u,w,B,D,I,G,N={};I=k(s);v=!1;var S;for(G=0;D=A.length,G<D;G++){w=G;if(F&&(w=A[G],"$"===w.charAt(0)))continue;B=u[w];d=h(M,w,B)||"";(l=a[d])||(l=a[d]=[],c.push(d));d=I(w,B);v=v||d;w=h(C,w,B);w=z(w)?w:"";l.push({id:F?A[G]:G,label:w,selected:d})}n||(y||null===s?a[""].unshift({id:"",label:"",selected:!v}):v||a[""].unshift({id:"?",label:"",selected:!0}));I=0;for(A=c.length;I<A;I++){d= |
|---|
| 241 | +c[I];l=a[d];R.length<=I?(s={element:E.clone().attr("label",d),label:l.label},u=[s],R.push(u),f.append(s.element)):(u=R[I],s=u[0],s.label!=d&&s.element.attr("label",s.label=d));w=null;G=0;for(D=l.length;G<D;G++)d=l[G],(v=u[G+1])?(w=v.element,v.label!==d.label&&(m(N,v.label,!1),m(N,d.label,!0),w.text(v.label=d.label)),v.id!==d.id&&w.val(v.id=d.id),w[0].selected!==d.selected&&(w.prop("selected",v.selected=d.selected),Pa&&w.prop("selected",v.selected))):(""===d.id&&y?S=y:(S=t.clone()).val(d.id).prop("selected", |
|---|
| 242 | +d.selected).attr("selected",d.selected).text(d.label),u.push(v={element:S,label:d.label,id:d.id,selected:d.selected}),m(N,d.label,!0),w?w.after(S):s.element.append(S),w=S);for(G++;u.length>G;)d=u.pop(),m(N,d.label,!1),d.element.remove();r(N,function(a,c){0<a?p.addOption(c):0>a&&p.removeOption(c)})}for(;R.length>I;)R.pop()[0].element.remove()}var v;if(!(v=s.match(d)))throw Rf("iexp",s,sa(f));var C=c(v[2]||v[1]),A=v[4]||v[6],D=/ as /.test(v[0])&&v[1],w=D?c(D):null,F=v[5],M=c(v[3]||""),I=c(v[2]?v[1]: |
|---|
| 243 | +A),P=c(v[7]),G=v[8]?c(v[8]):null,R=[[{element:f,label:""}]],N={};y&&(a(y)(e),y.removeClass("ng-scope"),y.remove());f.empty();f.on("change",function(){e.$apply(function(){var a=P(e)||[],c;if(n)c=[],r(f.val(),function(d){c.push("?"===d?u:""===d?null:h(w?w:I,d,a[d]))});else{var d=f.val();c="?"===d?u:""===d?null:h(w?w:I,d,a[d])}g.$setViewValue(c);q()})});g.$render=q;e.$watchCollection(P,l);e.$watchCollection(function(){var a=P(e),c;if(a&&B(a)){c=Array(a.length);for(var d=0,f=a.length;d<f;d++)c[d]=h(C, |
|---|
| 244 | +d,a[d])}else if(a)for(d in c={},a)a.hasOwnProperty(d)&&(c[d]=h(C,d,a[d]));return c},l);n&&e.$watchCollection(function(){return g.$modelValue},l)}if(h[1]){var p=h[0];h=h[1];var n=k.multiple,s=k.ngOptions,y=!1,v,x=!1,t=D(X.createElement("option")),E=D(X.createElement("optgroup")),C=t.clone();k=0;for(var A=g.children(),F=A.length;k<F;k++)if(""===A[k].value){v=y=A.eq(k);break}p.init(h,y,C);n&&(h.$isEmpty=function(a){return!a||0===a.length});s?q(e,g,h):n?m(e,g,h):l(e,g,h,p)}}}}],Td=["$interpolate",function(a){var c= |
|---|
| 245 | +{addOption:A,removeOption:A};return{restrict:"E",priority:100,compile:function(d,e){if(w(e.value)){var f=a(d.text(),!0);f||e.$set("value",d.text())}return function(a,d,e){var l=d.parent(),m=l.data("$selectController")||l.parent().data("$selectController");m&&m.databound||(m=c);f?a.$watch(f,function(a,c){e.$set("value",a);c!==a&&m.removeOption(c);m.addOption(a,d)}):m.addOption(e.value,d);d.on("$destroy",function(){m.removeOption(e.value)})}}}}],Sd=da({restrict:"E",terminal:!1});S.angular.bootstrap? |
|---|
| 246 | +console.log("WARNING: Tried to load angular more than once."):(Id(),Kd(ta),D(X).ready(function(){Ed(X,rc)}))})(window,document);!window.angular.$$csp()&&window.angular.element(document).find("head").prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}</style>'); |
|---|
| 247 | +//# sourceMappingURL=angular.min.js.map |
|---|
| .. | .. |
|---|
| 1 | +{ |
|---|
| 2 | +"version":3, |
|---|
| 3 | +"file":"angular.min.js", |
|---|
| 4 | +"lineCount":246, |
|---|
| 5 | +"mappings":"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", |
|---|
| 6 | +"sources":["angular.js"], |
|---|
| 7 | +"names":["window","document","undefined","minErr","isArrayLike","obj","isWindow","length","nodeType","NODE_TYPE_ELEMENT","isString","isArray","forEach","iterator","context","key","isFunction","hasOwnProperty","call","isPrimitive","sortedKeys","keys","push","sort","forEachSorted","i","reverseParams","iteratorFn","value","nextUid","uid","setHashKey","h","$$hashKey","extend","dst","ii","arguments","Object","j","jj","int","str","parseInt","inherit","parent","extra","prototype","noop","identity","$","valueFn","isUndefined","isDefined","isObject","isNumber","isDate","toString","isRegExp","isScope","$evalAsync","$watch","isBoolean","isElement","node","nodeName","prop","attr","find","makeMap","items","split","nodeName_","element","lowercase","arrayRemove","array","index","indexOf","splice","copy","source","destination","stackSource","stackDest","ngMinErr","result","Date","getTime","RegExp","match","lastIndex","emptyObject","create","getPrototypeOf","shallowCopy","src","charAt","equals","o1","o2","t1","t2","keySet","concat","array1","array2","slice","bind","self","fn","curryArgs","startIndex","apply","toJsonReplacer","val","toJson","pretty","JSON","stringify","fromJson","json","parse","startingTag","jqLite","clone","empty","e","elemHtml","append","html","NODE_TYPE_TEXT","replace","tryDecodeURIComponent","decodeURIComponent","parseKeyValue","keyValue","key_value","toKeyValue","parts","arrayValue","encodeUriQuery","join","encodeUriSegment","pctEncodeSpaces","encodeURIComponent","getNgAttribute","ngAttr","ngAttrPrefixes","angularInit","bootstrap","appElement","module","config","prefix","name","hasAttribute","getAttribute","candidate","querySelector","strictDi","modules","defaultConfig","doBootstrap","injector","tag","unshift","$provide","debugInfoEnabled","$compileProvider","createInjector","invoke","bootstrapApply","scope","compile","$apply","data","NG_ENABLE_DEBUG_INFO","NG_DEFER_BOOTSTRAP","test","angular","resumeBootstrap","angular.resumeBootstrap","extraModules","reloadWithDebugInfo","location","reload","getTestability","rootElement","get","snake_case","separator","SNAKE_CASE_REGEXP","letter","pos","toLowerCase","bindJQuery","originalCleanData","bindJQueryFired","jQuery","on","JQLitePrototype","isolateScope","controller","inheritedData","cleanData","jQuery.cleanData","elems","events","skipDestroyOnNextJQueryCleanData","elem","_data","$destroy","triggerHandler","JQLite","assertArg","arg","reason","assertArgFn","acceptArrayAnnotation","constructor","assertNotHasOwnProperty","getter","path","bindFnToScope","lastInstance","len","getBlockNodes","nodes","endNode","blockNodes","nextSibling","createMap","setupModuleLoader","ensure","factory","$injectorMinErr","$$minErr","requires","configFn","invokeLater","provider","method","insertMethod","queue","invokeQueue","moduleInstance","configBlocks","runBlocks","_invokeQueue","_configBlocks","_runBlocks","service","constant","animation","filter","directive","run","block","publishExternalAPI","version","uppercase","counter","csp","angularModule","$LocaleProvider","ngModule","$$sanitizeUri","$$SanitizeUriProvider","$CompileProvider","a","htmlAnchorDirective","input","inputDirective","textarea","form","formDirective","script","scriptDirective","select","selectDirective","style","styleDirective","option","optionDirective","ngBind","ngBindDirective","ngBindHtml","ngBindHtmlDirective","ngBindTemplate","ngBindTemplateDirective","ngClass","ngClassDirective","ngClassEven","ngClassEvenDirective","ngClassOdd","ngClassOddDirective","ngCloak","ngCloakDirective","ngController","ngControllerDirective","ngForm","ngFormDirective","ngHide","ngHideDirective","ngIf","ngIfDirective","ngInclude","ngIncludeDirective","ngInit","ngInitDirective","ngNonBindable","ngNonBindableDirective","ngPluralize","ngPluralizeDirective","ngRepeat","ngRepeatDirective","ngShow","ngShowDirective","ngStyle","ngStyleDirective","ngSwitch","ngSwitchDirective","ngSwitchWhen","ngSwitchWhenDirective","ngSwitchDefault","ngSwitchDefaultDirective","ngOptions","ngOptionsDirective","ngTransclude","ngTranscludeDirective","ngModel","ngModelDirective","ngList","ngListDirective","ngChange","ngChangeDirective","pattern","patternDirective","ngPattern","required","requiredDirective","ngRequired","minlength","minlengthDirective","ngMinlength","maxlength","maxlengthDirective","ngMaxlength","ngValue","ngValueDirective","ngModelOptions","ngModelOptionsDirective","ngIncludeFillContentDirective","ngAttributeAliasDirectives","ngEventDirectives","$anchorScroll","$AnchorScrollProvider","$animate","$AnimateProvider","$browser","$BrowserProvider","$cacheFactory","$CacheFactoryProvider","$controller","$ControllerProvider","$document","$DocumentProvider","$exceptionHandler","$ExceptionHandlerProvider","$filter","$FilterProvider","$interpolate","$InterpolateProvider","$interval","$IntervalProvider","$http","$HttpProvider","$httpBackend","$HttpBackendProvider","$location","$LocationProvider","$log","$LogProvider","$parse","$ParseProvider","$rootScope","$RootScopeProvider","$q","$QProvider","$$q","$$QProvider","$sce","$SceProvider","$sceDelegate","$SceDelegateProvider","$sniffer","$SnifferProvider","$templateCache","$TemplateCacheProvider","$templateRequest","$TemplateRequestProvider","$$testability","$$TestabilityProvider","$timeout","$TimeoutProvider","$window","$WindowProvider","$$rAF","$$RAFProvider","$$asyncCallback","$$AsyncCallbackProvider","camelCase","SPECIAL_CHARS_REGEXP","_","offset","toUpperCase","MOZ_HACK_REGEXP","jqLiteAcceptsData","NODE_TYPE_DOCUMENT","jqLiteBuildFragment","tmp","fragment","createDocumentFragment","HTML_REGEXP","appendChild","createElement","TAG_NAME_REGEXP","exec","wrap","wrapMap","_default","innerHTML","XHTML_TAG_REGEXP","lastChild","childNodes","firstChild","textContent","createTextNode","argIsString","trim","jqLiteMinErr","parsed","SINGLE_TAG_REGEXP","jqLiteAddNodes","jqLiteClone","cloneNode","jqLiteDealoc","onlyDescendants","jqLiteRemoveData","querySelectorAll","descendants","l","jqLiteOff","type","unsupported","expandoStore","jqLiteExpandoStore","handle","listenerFns","removeEventListener","expandoId","ng339","jqCache","createIfNecessary","jqId","jqLiteData","isSimpleSetter","isSimpleGetter","massGetter","jqLiteHasClass","selector","jqLiteRemoveClass","cssClasses","setAttribute","cssClass","jqLiteAddClass","existingClasses","root","elements","jqLiteController","jqLiteInheritedData","documentElement","names","parentNode","NODE_TYPE_DOCUMENT_FRAGMENT","host","jqLiteEmpty","removeChild","jqLiteRemove","keepData","jqLiteDocumentLoaded","action","win","readyState","setTimeout","getBooleanAttrName","booleanAttr","BOOLEAN_ATTR","BOOLEAN_ELEMENTS","getAliasedAttrName","ALIASED_ATTR","createEventHandler","eventHandler","event","isDefaultPrevented","event.isDefaultPrevented","defaultPrevented","eventFns","eventFnsLength","immediatePropagationStopped","originalStopImmediatePropagation","stopImmediatePropagation","event.stopImmediatePropagation","stopPropagation","isImmediatePropagationStopped","event.isImmediatePropagationStopped","hashKey","nextUidFn","objType","HashMap","isolatedUid","this.nextUid","put","anonFn","args","fnText","STRIP_COMMENTS","FN_ARGS","annotate","$inject","argDecl","FN_ARG_SPLIT","FN_ARG","all","underscore","last","modulesToLoad","supportObject","delegate","provider_","providerInjector","instantiate","$get","providerCache","providerSuffix","enforceReturnValue","enforcedReturnValue","instanceInjector","factoryFn","enforce","loadModules","moduleFn","runInvokeQueue","invokeArgs","loadedModules","message","stack","createInternalInjector","cache","getService","serviceName","INSTANTIATING","err","shift","locals","Type","Constructor","instance","returnedValue","has","$injector","instanceCache","decorator","decorFn","origProvider","orig$get","origProvider.$get","origInstance","$delegate","servicename","autoScrollingEnabled","disableAutoScrolling","this.disableAutoScrolling","getFirstAnchor","list","Array","some","scrollTo","scrollIntoView","scroll","yOffset","getComputedStyle","position","getBoundingClientRect","bottom","elemTop","top","scrollBy","hash","elm","getElementById","getElementsByName","autoScrollWatch","autoScrollWatchAction","newVal","oldVal","supported","Browser","completeOutstandingRequest","outstandingRequestCount","outstandingRequestCallbacks","pop","error","startPoller","interval","check","pollFns","pollFn","pollTimeout","cacheStateAndFireUrlChange","cacheState","fireUrlChange","cachedState","history","state","lastCachedState","lastBrowserUrl","url","lastHistoryState","urlChangeListeners","listener","safeDecodeURIComponent","rawDocument","clearTimeout","pendingDeferIds","isMock","$$completeOutstandingRequest","$$incOutstandingRequestCount","self.$$incOutstandingRequestCount","notifyWhenNoOutstandingRequests","self.notifyWhenNoOutstandingRequests","callback","addPollFn","self.addPollFn","href","baseElement","reloadLocation","self.url","sameState","sameBase","stripHash","self.state","urlChangeInit","onUrlChange","self.onUrlChange","$$checkUrlChange","baseHref","self.baseHref","lastCookies","lastCookieString","cookiePath","cookies","self.cookies","cookieLength","cookie","warn","cookieArray","substring","defer","self.defer","delay","timeoutId","cancel","self.defer.cancel","deferId","this.$get","cacheFactory","cacheId","options","refresh","entry","freshEnd","staleEnd","n","link","p","nextEntry","prevEntry","caches","size","stats","id","capacity","Number","MAX_VALUE","lruHash","lruEntry","remove","removeAll","destroy","info","cacheFactory.info","cacheFactory.get","$$sanitizeUriProvider","parseIsolateBindings","directiveName","LOCAL_REGEXP","bindings","definition","scopeName","$compileMinErr","attrName","mode","optional","hasDirectives","COMMENT_DIRECTIVE_REGEXP","CLASS_DIRECTIVE_REGEXP","ALL_OR_NOTHING_ATTRS","REQUIRE_PREFIX_REGEXP","EVENT_HANDLER_ATTR_REGEXP","this.directive","registerDirective","directiveFactory","Suffix","directives","priority","require","restrict","$$isolateBindings","aHrefSanitizationWhitelist","this.aHrefSanitizationWhitelist","regexp","imgSrcSanitizationWhitelist","this.imgSrcSanitizationWhitelist","this.debugInfoEnabled","enabled","safeAddClass","$element","className","addClass","$compileNodes","transcludeFn","maxPriority","ignoreDirective","previousCompileContext","nodeValue","compositeLinkFn","compileNodes","$$addScopeClass","namespace","publicLinkFn","cloneConnectFn","transcludeControllers","parentBoundTranscludeFn","futureParentElement","$linkNode","wrapTemplate","controllerName","$$addScopeInfo","nodeList","$rootElement","childLinkFn","childScope","childBoundTranscludeFn","stableNodeList","nodeLinkFnFound","linkFns","idx","nodeLinkFn","$new","transcludeOnThisElement","createBoundTranscludeFn","transclude","elementTranscludeOnThisElement","templateOnThisElement","attrs","linkFnFound","Attributes","collectDirectives","applyDirectivesToNode","$$element","terminal","previousBoundTranscludeFn","elementTransclusion","boundTranscludeFn","transcludedScope","cloneFn","controllers","containingScope","$$transcluded","attrsMap","$attr","addDirective","directiveNormalize","nName","isNgAttr","nAttrs","attributes","attrStartName","attrEndName","ngAttrName","NG_ATTR_BINDING","substr","directiveNName","multiElement","addAttrInterpolateDirective","addTextInterpolateDirective","NODE_TYPE_COMMENT","byPriority","groupScan","attrStart","attrEnd","depth","groupElementsLinkFnWrapper","linkFn","compileNode","templateAttrs","jqCollection","originalReplaceDirective","preLinkFns","postLinkFns","addLinkFns","pre","post","newIsolateScopeDirective","$$isolateScope","cloneAndAnnotateFn","getControllers","elementControllers","retrievalMethod","$searchElement","linkNode","controllersBoundTransclude","cloneAttachFn","hasElementTranscludeDirective","scopeToChild","controllerDirectives","$scope","$attrs","$transclude","controllerInstance","controllerAs","templateDirective","$$originalDirective","isolateScopeController","isolateBindingContext","identifier","bindToController","lastValue","parentGet","parentSet","compare","$observe","$$observers","$$scope","literal","b","assign","parentValueWatch","parentValue","$stateful","unwatch","$on","invokeLinkFn","template","templateUrl","terminalPriority","newScopeDirective","nonTlbTranscludeDirective","hasTranscludeDirective","hasTemplate","$compileNode","$template","childTranscludeFn","$$start","$$end","directiveValue","assertNoDuplicate","$$tlb","createComment","replaceWith","replaceDirective","contents","denormalizeTemplate","removeComments","templateNamespace","newTemplateAttrs","templateDirectives","unprocessedDirectives","markDirectivesAsIsolate","mergeTemplateAttributes","compileTemplateUrl","Math","max","tDirectives","startAttrName","endAttrName","srcAttr","dstAttr","$set","tAttrs","linkQueue","afterTemplateNodeLinkFn","afterTemplateChildLinkFn","beforeTemplateCompileNode","origAsyncDirective","derivedSyncDirective","getTrustedResourceUrl","then","content","tempTemplateAttrs","beforeTemplateLinkNode","linkRootElement","$$destroyed","oldClasses","delayedNodeLinkFn","ignoreChildLinkFn","diff","what","previousDirective","text","interpolateFn","textInterpolateCompileFn","templateNode","templateNodeParent","hasCompileParent","$$addBindingClass","textInterpolateLinkFn","$$addBindingInfo","expressions","interpolateFnWatchAction","wrapper","getTrustedContext","attrNormalizedName","HTML","RESOURCE_URL","allOrNothing","attrInterpolatePreLinkFn","$$inter","newValue","oldValue","$updateClass","elementsToRemove","newNode","firstElementToRemove","removeCount","j2","replaceChild","expando","k","kk","annotation","attributesToCopy","$normalize","$addClass","classVal","$removeClass","removeClass","newClasses","toAdd","tokenDifference","toRemove","writeAttr","booleanKey","aliasedKey","observer","trimmedSrcset","srcPattern","rawUris","nbrUrisWith2parts","floor","innerIdx","lastTuple","removeAttr","listeners","startSymbol","endSymbol","binding","isolated","noTemplate","dataName","PREFIX_REGEXP","str1","str2","values","tokens1","tokens2","token","jqNodes","globals","CNTRL_REG","register","this.register","allowGlobals","this.allowGlobals","addIdentifier","expression","later","ident","exception","cause","parseHeaders","headers","line","headersGetter","headersObj","transformData","fns","JSON_START","JSON_END","PROTECTION_PREFIX","CONTENT_TYPE_APPLICATION_JSON","defaults","transformResponse","defaultHttpResponseTransform","contentType","APPLICATION_JSON","transformRequest","d","common","patch","xsrfCookieName","xsrfHeaderName","useApplyAsync","this.useApplyAsync","interceptorFactories","interceptors","requestConfig","response","resp","status","reject","mergeHeaders","defHeaders","reqHeaders","defHeaderName","reqHeaderName","lowercaseDefHeaderName","execHeaders","headerContent","headerFn","header","chain","serverRequest","reqData","withCredentials","sendReq","promise","when","reversedInterceptors","interceptor","request","requestError","responseError","thenFn","rejectFn","success","promise.success","promise.error","done","headersString","statusText","resolveHttpPromise","resolvePromise","$applyAsync","$$phase","deferred","resolve","removePendingReq","pendingRequests","cachedResp","buildUrl","params","defaultCache","xsrfValue","urlIsSameOrigin","timeout","responseType","v","toISOString","interceptorFactory","createShortMethods","createShortMethodsWithData","createXhr","XMLHttpRequest","createHttpBackend","callbacks","$browserDefer","jsonpReq","callbackId","async","body","called","addEventListener","timeoutRequest","jsonpDone","xhr","abort","completeRequest","open","setRequestHeader","onload","xhr.onload","responseText","urlResolve","protocol","getAllResponseHeaders","onerror","onabort","send","this.startSymbol","this.endSymbol","escape","ch","mustHaveExpression","trustedContext","unescapeText","escapedStartRegexp","escapedEndRegexp","parseStringifyInterceptor","getTrusted","valueOf","newErr","$interpolateMinErr","endIndex","parseFns","textLength","expressionPositions","startSymbolLength","exp","endSymbolLength","compute","interpolationFn","$$watchDelegate","objectEquality","$watchGroup","interpolateFnWatcher","oldValues","currValue","$interpolate.startSymbol","$interpolate.endSymbol","count","invokeApply","setInterval","clearInterval","iteration","skipApply","$$intervalId","tick","notify","intervals","interval.cancel","NUMBER_FORMATS","DECIMAL_SEP","GROUP_SEP","PATTERNS","minInt","minFrac","maxFrac","posPre","posSuf","negPre","negSuf","gSize","lgSize","CURRENCY_SYM","DATETIME_FORMATS","MONTH","SHORTMONTH","DAY","SHORTDAY","AMPMS","medium","short","fullDate","longDate","mediumDate","shortDate","mediumTime","shortTime","pluralCat","num","encodePath","segments","parseAbsoluteUrl","absoluteUrl","locationObj","appBase","parsedUrl","$$protocol","$$host","hostname","$$port","port","DEFAULT_PORTS","parseAppUrl","relativeUrl","prefixed","$$path","pathname","$$search","search","$$hash","beginsWith","begin","whole","stripFile","lastIndexOf","LocationHtml5Url","basePrefix","$$html5","appBaseNoFile","$$parse","this.$$parse","pathUrl","$locationMinErr","$$compose","this.$$compose","$$url","$$absUrl","$$parseLinkUrl","this.$$parseLinkUrl","relHref","appUrl","prevAppUrl","rewrittenUrl","LocationHashbangUrl","hashPrefix","withoutBaseUrl","withoutHashUrl","windowsFilePathExp","firstPathSegmentMatch","LocationHashbangInHtml5Url","locationGetter","property","locationGetterSetter","preprocess","html5Mode","requireBase","rewriteLinks","this.hashPrefix","this.html5Mode","setBrowserUrlWithFallback","oldUrl","oldState","$$state","afterLocationChange","$broadcast","absUrl","LocationMode","initialUrl","IGNORE_URI_REGEXP","ctrlKey","metaKey","which","target","absHref","animVal","preventDefault","initializing","newUrl","newState","$digest","$locationWatch","currentReplace","$$replace","urlOrStateChanged","debug","debugEnabled","this.debugEnabled","flag","formatError","Error","sourceURL","consoleLog","console","logFn","log","hasApply","arg1","arg2","ensureSafeMemberName","fullExpression","$parseMinErr","ensureSafeObject","children","isConstant","setter","setValue","fullExp","propertyObj","cspSafeGetterFn","key0","key1","key2","key3","key4","cspSafeGetter","pathVal","getterFn","getterFnCache","pathKeys","pathKeysLength","code","evaledFnGetter","Function","sharedGetter","fn.assign","$parseOptions","wrapSharedExpression","wrapped","collectExpressionInputs","inputs","expressionInputDirtyCheck","oldValueOfValue","inputsWatchDelegate","parsedExpression","inputExpressions","$$inputs","lastResult","oldInputValue","expressionInputWatch","newInputValue","oldInputValueOfValues","expressionInputsWatch","changed","oneTimeWatchDelegate","oneTimeWatch","oneTimeListener","old","$$postDigest","oneTimeLiteralWatchDelegate","isAllDefined","allDefined","constantWatchDelegate","constantWatch","constantListener","addInterceptor","interceptorFn","oneTime","cacheKey","lexer","Lexer","parser","Parser","qFactory","nextTick","exceptionHandler","callOnce","resolveFn","Promise","simpleBind","scheduleProcessQueue","processScheduled","pending","Deferred","$qMinErr","TypeError","onFulfilled","onRejected","progressBack","catch","finally","handleCallback","$$reject","$$resolve","progress","makePromise","resolved","isResolved","callbackOutput","errback","$Q","Q","resolver","promises","results","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","cancelAnimationFrame","webkitCancelAnimationFrame","mozCancelAnimationFrame","webkitCancelRequestAnimationFrame","rafSupported","raf","timer","TTL","$rootScopeMinErr","lastDirtyWatch","applyAsyncId","digestTtl","this.digestTtl","Scope","$id","$parent","$$watchers","$$nextSibling","$$prevSibling","$$childHead","$$childTail","$root","$$listeners","$$listenerCount","beginPhase","phase","decrementListenerCount","current","initWatchVal","flushApplyAsync","applyAsyncQueue","scheduleApplyAsync","isolate","destroyChild","child","$$ChildScope","this.$$ChildScope","watchExp","watcher","eq","deregisterWatch","watchExpressions","watchGroupAction","changeReactionScheduled","firstRun","newValues","deregisterFns","shouldCall","deregisterWatchGroup","expr","unwatchFn","watchGroupSubAction","$watchCollection","$watchCollectionInterceptor","_value","bothNaN","newItem","oldItem","internalArray","oldLength","changeDetected","newLength","internalObject","veryOldValue","trackVeryOldValue","changeDetector","initRun","$watchCollectionAction","watch","watchers","dirty","ttl","watchLog","logIdx","logMsg","asyncTask","asyncQueue","$eval","isNaN","next","postDigestQueue","eventName","this.$watchGroup","$applyAsyncExpression","namedListeners","$emit","targetScope","listenerArgs","currentScope","$$asyncQueue","$$postDigestQueue","$$applyAsyncQueue","sanitizeUri","uri","isImage","regex","normalizedVal","adjustMatcher","matcher","$sceMinErr","adjustMatchers","matchers","adjustedMatchers","SCE_CONTEXTS","resourceUrlWhitelist","resourceUrlBlacklist","this.resourceUrlWhitelist","this.resourceUrlBlacklist","matchUrl","generateHolderType","Base","holderType","trustedValue","$$unwrapTrustedValue","this.$$unwrapTrustedValue","holderType.prototype.valueOf","holderType.prototype.toString","htmlSanitizer","trustedValueHolderBase","byType","CSS","URL","JS","trustAs","maybeTrusted","allowed","this.enabled","documentMode","sce","isEnabled","sce.isEnabled","sce.getTrusted","parseAs","sce.parseAs","enumValue","lName","eventSupport","android","userAgent","navigator","boxee","vendorPrefix","vendorRegex","bodyStyle","transitions","animations","webkitTransition","webkitAnimation","pushState","hasEvent","msie","divElm","handleRequestFn","tpl","ignoreRequestError","handleError","totalPendingRequests","testability","testability.findBindings","opt_exactMatch","getElementsByClassName","matches","dataBinding","bindingName","testability.findModels","prefixes","attributeEquals","testability.getLocation","testability.setLocation","testability.whenStable","deferreds","$$timeoutId","timeout.cancel","base","urlParsingNode","requestUrl","originUrl","filters","suffix","currencyFilter","dateFilter","filterFilter","jsonFilter","limitToFilter","lowercaseFilter","numberFilter","orderByFilter","uppercaseFilter","comparator","comparatorType","predicates","predicates.check","objKey","filtered","$locale","formats","amount","currencySymbol","fractionSize","formatNumber","number","groupSep","decimalSep","isFinite","isNegative","abs","numStr","formatedText","hasExponent","toFixed","fractionLen","min","round","fraction","lgroup","group","padNumber","digits","neg","dateGetter","date","dateStrGetter","shortForm","getFirstThursdayOfYear","year","dayOfWeekOnFirst","getDay","weekGetter","firstThurs","getFullYear","thisThurs","getMonth","getDate","jsonStringToDate","string","R_ISO8601_STR","tzHour","tzMin","dateSetter","setUTCFullYear","setFullYear","timeSetter","setUTCHours","setHours","m","s","ms","parseFloat","format","timezone","NUMBER_STRING","DATE_FORMATS_SPLIT","setMinutes","getMinutes","getTimezoneOffset","DATE_FORMATS","object","limit","Infinity","out","sortPredicate","reverseOrder","reverseComparator","comp","descending","v1","v2","map","predicate","arrayCopy","ngDirective","FormController","controls","parentForm","$$parentForm","nullFormCtrl","$error","$$success","$pending","$name","$dirty","$pristine","$valid","$invalid","$submitted","$addControl","$rollbackViewValue","form.$rollbackViewValue","control","$commitViewValue","form.$commitViewValue","form.$addControl","$$renameControl","form.$$renameControl","newName","oldName","$removeControl","form.$removeControl","$setValidity","addSetValidityMethod","ctrl","set","unset","$setDirty","form.$setDirty","PRISTINE_CLASS","DIRTY_CLASS","$setPristine","form.$setPristine","setClass","SUBMITTED_CLASS","$setUntouched","form.$setUntouched","$setSubmitted","form.$setSubmitted","stringBasedInputType","$formatters","$isEmpty","baseInputType","VALIDITY_STATE_PROPERTY","placeholder","noevent","composing","ev","ngTrim","$viewValue","$$hasNativeValidators","$setViewValue","deferListener","keyCode","$render","ctrl.$render","$modelValue","createDateParser","mapping","iso","ISO_DATE_REGEXP","yyyy","MM","dd","HH","getHours","mm","ss","getSeconds","sss","getMilliseconds","part","NaN","createDateInputType","parseDate","dynamicDateInputType","parseObservedDateValue","badInputChecker","$options","previousDate","$$parserName","$parsers","parsedDate","$ngModelMinErr","timezoneOffset","ngMin","minVal","$validators","ctrl.$validators.min","$validate","ngMax","maxVal","ctrl.$validators.max","ctrl.$isEmpty","validity","badInput","typeMismatch","parseConstantExpr","fallback","parseFn","cachedToggleClass","switchValue","classCache","toggleValidationCss","validationErrorKey","isValid","VALID_CLASS","INVALID_CLASS","hasClass","setValidity","isObjectEmpty","PENDING_CLASS","combinedState","classDirective","arrayDifference","arrayClasses","classes","digestClassCounts","classCounts","classesToUpdate","ngClassWatchAction","$index","old$index","mod","REGEX_STRING_REGEXP","isActive_","active","full","major","minor","dot","codeName","JQLite._data","MOUSE_EVENT_MAP","mouseleave","mouseenter","optgroup","tbody","tfoot","colgroup","caption","thead","th","td","ready","trigger","fired","removeData","removeAttribute","css","lowercasedName","specified","getNamedItem","ret","getText","$dv","multiple","selected","nodeCount","jqLiteOn","types","related","relatedTarget","contains","off","one","onFn","replaceNode","insertBefore","contentDocument","prepend","wrapNode","detach","after","newElement","toggleClass","condition","classCondition","nextElementSibling","getElementsByTagName","extraParameters","dummyEvent","handlerArgs","eventFnsCopy","arg3","unbind","$$annotate","$animateMinErr","$$selectors","classNameFilter","this.classNameFilter","$$classNameFilter","runAnimationPostDigest","cancelFn","$$cancelFn","defer.promise.$$cancelFn","ngAnimatePostDigest","ngAnimateNotifyComplete","resolveElementClasses","hasClasses","cachedClassManipulation","op","asyncPromise","currentDefer","applyStyles","styles","from","to","animate","enter","leave","move","$$addClassImmediately","$$removeClassImmediately","add","createdCache","STORAGE_KEY","$$setClassImmediately","PATH_MATCH","locationPrototype","paramValue","Location","Location.prototype.state","CALL","APPLY","BIND","CONSTANTS","null","true","false","constantGetter","OPERATORS","+","-","*","/","%","===","!==","==","!=","<",">","<=",">=","&&","||","!","ESCAPE","lex","tokens","is","readString","peek","readNumber","isIdent","readIdent","isWhitespace","ch2","ch3","fn2","fn3","throwError","chars","isExpOperator","start","end","colStr","peekCh","lastDot","peekIndex","methodName","quote","rawString","hex","String","fromCharCode","rep","ZERO","statements","primary","expect","filterChain","consume","arrayDeclaration","functionCall","objectIndex","fieldAccess","msg","peekToken","e1","e2","e3","e4","t","unaryFn","right","$parseUnaryFn","binaryFn","left","isBranching","$parseBinaryFn","$parseStatements","inputFn","argsFn","$parseFilter","every","assignment","ternary","$parseAssignment","logicalOR","middle","$parseTernary","logicalAND","equality","relational","additive","multiplicative","unary","field","$parseFieldAccess","o","indexFn","$parseObjectIndex","fnGetter","contextGetter","expressionText","$parseFunctionCall","elementFns","elementFn","$parseArrayLiteral","valueFns","$parseObjectLiteral","yy","y","MMMM","MMM","M","H","hh","EEEE","EEE","ampmGetter","Z","timeZoneGetter","zone","paddedZone","ww","w","xlinkHref","propName","normalized","ngBooleanAttrWatchAction","htmlAttr","ngAttrAliasWatchAction","nullFormRenameControl","formDirectiveFactory","isNgForm","ngFormCompile","formElement","ngFormPreLink","handleFormSubmission","returnValue","parentFormCtrl","alias","URL_REGEXP","EMAIL_REGEXP","NUMBER_REGEXP","DATE_REGEXP","DATETIMELOCAL_REGEXP","WEEK_REGEXP","MONTH_REGEXP","TIME_REGEXP","DEFAULT_REGEXP","inputType","textInputType","weekParser","isoWeek","existingDate","week","minutes","hours","seconds","milliseconds","addDays","numberInputType","urlInputType","ctrl.$validators.url","emailInputType","email","ctrl.$validators.email","radioInputType","checked","checkboxInputType","trueValue","ngTrueValue","falseValue","ngFalseValue","ctrls","NgModelController","$asyncValidators","$viewChangeListeners","$untouched","$touched","parsedNgModel","pendingDebounce","ngModelGet","modelValue","getterSetter","ngModelSet","$$setOptions","this.$$setOptions","this.$isEmpty","currentValidationRunId","this.$setPristine","this.$setUntouched","UNTOUCHED_CLASS","TOUCHED_CLASS","$setTouched","this.$setTouched","this.$rollbackViewValue","$$lastCommittedViewValue","this.$validate","$$parseAndValidate","$$runValidators","this.$$runValidators","parseValid","viewValue","doneCallback","processSyncValidators","syncValidatorsValid","validator","processAsyncValidators","validatorPromises","allValid","validationDone","localValidationRunId","processParseErrors","errorKey","this.$commitViewValue","this.$$parseAndValidate","parserValid","prevModelValue","allowInvalid","$$writeModelToScope","this.$$writeModelToScope","this.$setViewValue","updateOnDefault","$$debounceViewValueCommit","this.$$debounceViewValueCommit","debounceDelay","debounce","ngModelWatch","formatters","ngModelCompile","ngModelPreLink","modelCtrl","formCtrl","ngModelPostLink","updateOn","ctrl.$validators.required","patternExp","ctrl.$validators.pattern","ctrl.$validators.maxlength","ctrl.$validators.minlength","trimValues","CONSTANT_VALUE_REGEXP","tplAttr","ngValueConstantLink","ngValueLink","valueWatchAction","that","$compile","ngBindCompile","templateElement","ngBindLink","ngBindWatchAction","ngBindTemplateCompile","ngBindTemplateLink","ngBindHtmlCompile","tElement","ngBindHtmlGetter","ngBindHtmlWatch","getStringValue","ngBindHtmlLink","ngBindHtmlWatchAction","getTrustedHtml","forceAsyncEvents","ngEventHandler","$event","previousElements","ngIfWatchAction","newScope","srcExp","onloadExp","autoScrollExp","autoscroll","changeCounter","previousElement","currentElement","cleanupLastIncludeContent","parseAsResourceUrl","ngIncludeWatchAction","afterAnimation","thisChangeId","namespaceAdaptedClone","BRACE","numberExp","whenExp","whens","whensExpFns","isWhen","attributeName","ngPluralizeWatch","ngPluralizeWatchAction","ngRepeatMinErr","updateScope","valueIdentifier","keyIdentifier","arrayLength","$first","$last","$middle","$odd","$even","ngRepeatCompile","ngRepeatEndComment","lhs","rhs","aliasAs","trackByExp","trackByExpGetter","trackByIdExpFn","trackByIdArrayFn","trackByIdObjFn","hashFnLocals","ngRepeatLink","lastBlockMap","ngRepeatAction","collection","previousNode","nextNode","nextBlockMap","collectionLength","trackById","collectionKeys","nextBlockOrder","trackByIdFn","itemKey","blockKey","ngRepeatTransclude","ngShowWatchAction","NG_HIDE_CLASS","tempClasses","NG_HIDE_IN_PROGRESS_CLASS","ngHideWatchAction","ngStyleWatchAction","newStyles","oldStyles","ngSwitchController","cases","selectedTranscludes","selectedElements","previousLeaveAnimations","selectedScopes","spliceFactory","ngSwitchWatchAction","selectedTransclude","caseElement","selectedScope","anchor","ngOptionsMinErr","NG_OPTIONS_REGEXP","nullModelCtrl","optionsMap","ngModelCtrl","unknownOption","databound","init","self.init","ngModelCtrl_","nullOption_","unknownOption_","addOption","self.addOption","removeOption","self.removeOption","hasOption","renderUnknownOption","self.renderUnknownOption","unknownVal","self.hasOption","setupAsSingle","selectElement","selectCtrl","ngModelCtrl.$render","emptyOption","setupAsMultiple","lastView","selectMultipleWatch","setupAsOptions","callExpression","exprFn","valueName","keyName","createIsSelectedFn","selectedSet","trackFn","trackIndex","isSelected","compareValueFn","selectAsFn","scheduleRendering","renderScheduled","render","updateLabelMap","labelMap","label","added","optionGroups","optionGroupNames","optionGroupName","optionGroup","existingParent","existingOptions","existingOption","valuesFn","groupIndex","anySelected","groupByFn","displayFn","nullOption","groupLength","optionGroupsCache","optGroupTemplate","lastElement","optionTemplate","optionsExp","selectAs","track","selectionChanged","selectedKey","viewValueFn","getLabels","toDisplay","ngModelCtrl.$isEmpty","nullSelectCtrl","selectCtrlName","interpolateWatchAction","$$csp"] |
|---|
| 8 | +} |
|---|
| .. | .. |
|---|
| 1 | +// Generated by CoffeeScript 1.6.2 |
|---|
| 2 | +(function() { |
|---|
| 3 | + var __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; |
|---|
| 4 | + |
|---|
| 5 | + angular.module('localytics.directives', []); |
|---|
| 6 | + |
|---|
| 7 | + angular.module('localytics.directives').directive('chosen', function() { |
|---|
| 8 | + var CHOSEN_OPTION_WHITELIST, NG_OPTIONS_REGEXP, isEmpty, snakeCase; |
|---|
| 9 | + |
|---|
| 10 | + NG_OPTIONS_REGEXP = /^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\s+(.*?))?$/; |
|---|
| 11 | + CHOSEN_OPTION_WHITELIST = ['noResultsText', 'allowSingleDeselect', 'disableSearchThreshold', 'disableSearch', 'enableSplitWordSearch', 'inheritSelectClasses', 'maxSelectedOptions', 'placeholderTextMultiple', 'placeholderTextSingle', 'searchContains', 'singleBackstrokeDelete', 'displayDisabledOptions', 'displaySelectedOptions', 'width']; |
|---|
| 12 | + snakeCase = function(input) { |
|---|
| 13 | + return input.replace(/[A-Z]/g, function($1) { |
|---|
| 14 | + return "_" + ($1.toLowerCase()); |
|---|
| 15 | + }); |
|---|
| 16 | + }; |
|---|
| 17 | + isEmpty = function(value) { |
|---|
| 18 | + var key; |
|---|
| 19 | + |
|---|
| 20 | + if (angular.isArray(value)) { |
|---|
| 21 | + return value.length === 0; |
|---|
| 22 | + } else if (angular.isObject(value)) { |
|---|
| 23 | + for (key in value) { |
|---|
| 24 | + if (value.hasOwnProperty(key)) { |
|---|
| 25 | + return false; |
|---|
| 26 | + } |
|---|
| 27 | + } |
|---|
| 28 | + } |
|---|
| 29 | + return true; |
|---|
| 30 | + }; |
|---|
| 31 | + return { |
|---|
| 32 | + restrict: 'A', |
|---|
| 33 | + require: '?ngModel', |
|---|
| 34 | + terminal: true, |
|---|
| 35 | + link: function(scope, element, attr, ngModel) { |
|---|
| 36 | + var chosen, defaultText, disableWithMessage, empty, initOrUpdate, match, options, origRender, removeEmptyMessage, startLoading, stopLoading, valuesExpr, viewWatch; |
|---|
| 37 | + |
|---|
| 38 | + element.addClass('localytics-chosen'); |
|---|
| 39 | + options = scope.$eval(attr.chosen) || {}; |
|---|
| 40 | + angular.forEach(attr, function(value, key) { |
|---|
| 41 | + if (__indexOf.call(CHOSEN_OPTION_WHITELIST, key) >= 0) { |
|---|
| 42 | + return options[snakeCase(key)] = scope.$eval(value); |
|---|
| 43 | + } |
|---|
| 44 | + }); |
|---|
| 45 | + startLoading = function() { |
|---|
| 46 | + return element.addClass('loading').attr('disabled', true).trigger('chosen:updated'); |
|---|
| 47 | + }; |
|---|
| 48 | + stopLoading = function() { |
|---|
| 49 | + return element.removeClass('loading').attr('disabled', false).trigger('chosen:updated'); |
|---|
| 50 | + }; |
|---|
| 51 | + chosen = null; |
|---|
| 52 | + defaultText = null; |
|---|
| 53 | + empty = false; |
|---|
| 54 | + initOrUpdate = function() { |
|---|
| 55 | + if (chosen) { |
|---|
| 56 | + return element.trigger('chosen:updated'); |
|---|
| 57 | + } else { |
|---|
| 58 | + chosen = element.chosen(options).data('chosen'); |
|---|
| 59 | + return defaultText = chosen.default_text; |
|---|
| 60 | + } |
|---|
| 61 | + }; |
|---|
| 62 | + removeEmptyMessage = function() { |
|---|
| 63 | + empty = false; |
|---|
| 64 | + return element.attr('data-placeholder', defaultText); |
|---|
| 65 | + }; |
|---|
| 66 | + disableWithMessage = function() { |
|---|
| 67 | + empty = true; |
|---|
| 68 | + return element.attr('data-placeholder', chosen.results_none_found).attr('disabled', true).trigger('chosen:updated'); |
|---|
| 69 | + }; |
|---|
| 70 | + if (ngModel) { |
|---|
| 71 | + origRender = ngModel.$render; |
|---|
| 72 | + ngModel.$render = function() { |
|---|
| 73 | + origRender(); |
|---|
| 74 | + return initOrUpdate(); |
|---|
| 75 | + }; |
|---|
| 76 | + if (attr.multiple) { |
|---|
| 77 | + viewWatch = function() { |
|---|
| 78 | + return ngModel.$viewValue; |
|---|
| 79 | + }; |
|---|
| 80 | + scope.$watch(viewWatch, ngModel.$render, true); |
|---|
| 81 | + } |
|---|
| 82 | + } else { |
|---|
| 83 | + initOrUpdate(); |
|---|
| 84 | + } |
|---|
| 85 | + attr.$observe('disabled', function() { |
|---|
| 86 | + return element.trigger('chosen:updated'); |
|---|
| 87 | + }); |
|---|
| 88 | + if (attr.ngOptions && ngModel) { |
|---|
| 89 | + match = attr.ngOptions.match(NG_OPTIONS_REGEXP); |
|---|
| 90 | + valuesExpr = match[7]; |
|---|
| 91 | + return scope.$watchCollection(valuesExpr, function(newVal, oldVal) { |
|---|
| 92 | + if (angular.isUndefined(newVal)) { |
|---|
| 93 | + return startLoading(); |
|---|
| 94 | + } else { |
|---|
| 95 | + if (empty) { |
|---|
| 96 | + removeEmptyMessage(); |
|---|
| 97 | + } |
|---|
| 98 | + stopLoading(); |
|---|
| 99 | + if (isEmpty(newVal)) { |
|---|
| 100 | + return disableWithMessage(); |
|---|
| 101 | + } |
|---|
| 102 | + } |
|---|
| 103 | + }); |
|---|
| 104 | + } |
|---|
| 105 | + } |
|---|
| 106 | + }; |
|---|
| 107 | + }); |
|---|
| 108 | + |
|---|
| 109 | +}).call(this); |
|---|
| .. | .. |
|---|
| 1 | +'use strict'; |
|---|
| 2 | + |
|---|
| 3 | +/* |
|---|
| 4 | + * AngularJS Toaster |
|---|
| 5 | + * Version: 0.4.1 |
|---|
| 6 | + * |
|---|
| 7 | + * Copyright 2013 Jiri Kavulak. |
|---|
| 8 | + * All Rights Reserved. |
|---|
| 9 | + * Use, reproduction, distribution, and modification of this code is subject to the terms and |
|---|
| 10 | + * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php |
|---|
| 11 | + * |
|---|
| 12 | + * Author: Jiri Kavulak |
|---|
| 13 | + * Related to project of John Papa and Hans Fjällemark |
|---|
| 14 | + */ |
|---|
| 15 | + |
|---|
| 16 | +angular.module('toaster',[] ) |
|---|
| 17 | +.service('toaster', ['$rootScope', function ($rootScope) { |
|---|
| 18 | + this.pop = function (type, title, body, timeout, bodyOutputType) { |
|---|
| 19 | + this.toast = { |
|---|
| 20 | + type: type, |
|---|
| 21 | + title: title, |
|---|
| 22 | + body: body, |
|---|
| 23 | + timeout: timeout, |
|---|
| 24 | + bodyOutputType: bodyOutputType |
|---|
| 25 | + }; |
|---|
| 26 | + $rootScope.$broadcast('toaster-newToast'); |
|---|
| 27 | + }; |
|---|
| 28 | +}]) |
|---|
| 29 | +.constant('toasterConfig', { |
|---|
| 30 | + 'tap-to-dismiss': true, |
|---|
| 31 | + 'newest-on-top': true, |
|---|
| 32 | + //'fade-in': 1000, // done in css |
|---|
| 33 | + //'on-fade-in': undefined, // not implemented |
|---|
| 34 | + //'fade-out': 1000, // done in css |
|---|
| 35 | + // 'on-fade-out': undefined, // not implemented |
|---|
| 36 | + //'extended-time-out': 1000, // not implemented |
|---|
| 37 | + 'time-out': 5000, // Set timeOut and extendedTimeout to 0 to make it sticky |
|---|
| 38 | + 'icon-classes': { |
|---|
| 39 | + error: 'toast-error', |
|---|
| 40 | + info: 'toast-info', |
|---|
| 41 | + success: 'toast-success', |
|---|
| 42 | + warning: 'toast-warning' |
|---|
| 43 | + }, |
|---|
| 44 | + 'body-output-type': '', // Options: '', 'trustedHtml', 'template' |
|---|
| 45 | + 'body-template': 'toasterBodyTmpl.html', |
|---|
| 46 | + 'icon-class': 'toast-info', |
|---|
| 47 | + 'position-class': 'toast-top-right', |
|---|
| 48 | + 'title-class': 'toast-title', |
|---|
| 49 | + 'message-class': 'toast-message' |
|---|
| 50 | + }) |
|---|
| 51 | +.directive('toasterContainer', ['$compile', '$timeout', '$sce', 'toasterConfig', 'toaster', |
|---|
| 52 | +function ($compile, $timeout, $sce, toasterConfig, toaster) { |
|---|
| 53 | + return { |
|---|
| 54 | + replace: true, |
|---|
| 55 | + restrict: 'EA', |
|---|
| 56 | + link: function (scope, elm, attrs){ |
|---|
| 57 | + |
|---|
| 58 | + var id = 0; |
|---|
| 59 | + |
|---|
| 60 | + var mergedConfig = toasterConfig; |
|---|
| 61 | + if (attrs.toasterOptions) { |
|---|
| 62 | + angular.extend(mergedConfig, scope.$eval(attrs.toasterOptions)); |
|---|
| 63 | + } |
|---|
| 64 | + |
|---|
| 65 | + scope.config = { |
|---|
| 66 | + position: mergedConfig['position-class'], |
|---|
| 67 | + title: mergedConfig['title-class'], |
|---|
| 68 | + message: mergedConfig['message-class'], |
|---|
| 69 | + tap: mergedConfig['tap-to-dismiss'] |
|---|
| 70 | + }; |
|---|
| 71 | + |
|---|
| 72 | + function addToast (toast){ |
|---|
| 73 | + toast.type = mergedConfig['icon-classes'][toast.type]; |
|---|
| 74 | + if (!toast.type) |
|---|
| 75 | + toast.type = mergedConfig['icon-class']; |
|---|
| 76 | + |
|---|
| 77 | + id++; |
|---|
| 78 | + angular.extend(toast, { id: id }); |
|---|
| 79 | + |
|---|
| 80 | + switch(toast.bodyOutputType) |
|---|
| 81 | + { |
|---|
| 82 | + case 'trustedHtml': |
|---|
| 83 | + toast.html = $sce.trustAsHtml(toast.body); |
|---|
| 84 | + break; |
|---|
| 85 | + case 'template': |
|---|
| 86 | + toast.bodyTemplate = mergedConfig['body-template']; |
|---|
| 87 | + break; |
|---|
| 88 | + } |
|---|
| 89 | + |
|---|
| 90 | + var timeout = typeof(toast.timeout) == "number" ? toast.timeout : mergedConfig['time-out']; |
|---|
| 91 | + if (timeout > 0) |
|---|
| 92 | + setTimeout(toast, timeout); |
|---|
| 93 | + |
|---|
| 94 | + if (mergedConfig['newest-on-top'] === true) |
|---|
| 95 | + scope.toasters.unshift(toast); |
|---|
| 96 | + else |
|---|
| 97 | + scope.toasters.push(toast); |
|---|
| 98 | + } |
|---|
| 99 | + |
|---|
| 100 | + function setTimeout(toast, time){ |
|---|
| 101 | + toast.timeout= $timeout(function (){ |
|---|
| 102 | + scope.removeToast(toast.id); |
|---|
| 103 | + }, time); |
|---|
| 104 | + } |
|---|
| 105 | + |
|---|
| 106 | + scope.toasters = []; |
|---|
| 107 | + scope.$on('toaster-newToast', function () { |
|---|
| 108 | + addToast(toaster.toast); |
|---|
| 109 | + }); |
|---|
| 110 | + }, |
|---|
| 111 | + controller: ['$scope', '$element', '$attrs', function($scope, $element, $attrs) { |
|---|
| 112 | + |
|---|
| 113 | + $scope.stopTimer = function(toast){ |
|---|
| 114 | + if(toast.timeout) |
|---|
| 115 | + $timeout.cancel(toast.timeout); |
|---|
| 116 | + }; |
|---|
| 117 | + |
|---|
| 118 | + $scope.removeToast = function (id){ |
|---|
| 119 | + var i = 0; |
|---|
| 120 | + for (i; i < $scope.toasters.length; i++){ |
|---|
| 121 | + if($scope.toasters[i].id === id) |
|---|
| 122 | + break; |
|---|
| 123 | + } |
|---|
| 124 | + $scope.toasters.splice(i, 1); |
|---|
| 125 | + }; |
|---|
| 126 | + |
|---|
| 127 | + $scope.remove = function(id){ |
|---|
| 128 | + if ($scope.config.tap === true){ |
|---|
| 129 | + $scope.removeToast(id); |
|---|
| 130 | + } |
|---|
| 131 | + }; |
|---|
| 132 | + }], |
|---|
| 133 | + template: |
|---|
| 134 | + '<div id="toast-container" ng-class="config.position">' + |
|---|
| 135 | + '<div ng-repeat="toaster in toasters" class="toast" ng-class="toaster.type" ng-click="remove(toaster.id)" ng-mouseover="stopTimer(toaster)">' + |
|---|
| 136 | + '<div ng-class="config.title">{{toaster.title}}</div>' + |
|---|
| 137 | + '<div ng-class="config.message" ng-switch on="toaster.bodyOutputType">' + |
|---|
| 138 | + '<div ng-switch-when="trustedHtml" ng-bind-html="toaster.html"></div>' + |
|---|
| 139 | + '<div ng-switch-when="template"><div ng-include="toaster.bodyTemplate"></div></div>' + |
|---|
| 140 | + '<div ng-switch-default >{{toaster.body}}</div>' + |
|---|
| 141 | + '</div>' + |
|---|
| 142 | + '</div>' + |
|---|
| 143 | + '</div>' |
|---|
| 144 | + }; |
|---|
| 145 | +}]); |
|---|
| .. | .. |
|---|
| 1 | +(function() { |
|---|
| 2 | + 'use strict'; |
|---|
| 3 | + |
|---|
| 4 | + /* |
|---|
| 5 | + * Catalogs module |
|---|
| 6 | + */ |
|---|
| 7 | + |
|---|
| 8 | + angular |
|---|
| 9 | + .module('catalogs', [ 'ngResource' ]) |
|---|
| 10 | + |
|---|
| 11 | + .service( |
|---|
| 12 | + 'Catalogs', |
|---|
| 13 | + [ |
|---|
| 14 | + '$rootScope', |
|---|
| 15 | + '$http', |
|---|
| 16 | + '$resource', |
|---|
| 17 | + '$q', |
|---|
| 18 | + function($rootScope, $http, $resource, $q) { |
|---|
| 19 | + var resources = { |
|---|
| 20 | + application : $resource( |
|---|
| 21 | + '/application/:appId', { |
|---|
| 22 | + appId : '@id' |
|---|
| 23 | + }), |
|---|
| 24 | + user : $resource('/user/:userId', { |
|---|
| 25 | + userId : '@username' |
|---|
| 26 | + }), |
|---|
| 27 | + organization : $resource( |
|---|
| 28 | + '/organization/:orgId', { |
|---|
| 29 | + orgId : '@id' |
|---|
| 30 | + }), |
|---|
| 31 | + licensetype : $resource( |
|---|
| 32 | + '/licensetype/:licenseTypeId', { |
|---|
| 33 | + licenseTypeId : '@id' |
|---|
| 34 | + }) |
|---|
| 35 | + } |
|---|
| 36 | + |
|---|
| 37 | + var _metadata = null; |
|---|
| 38 | + var _current = null; |
|---|
| 39 | + |
|---|
| 40 | + var _list = function() { |
|---|
| 41 | + return $http.get('/js/catalogs.json') |
|---|
| 42 | + .success(function(data) { |
|---|
| 43 | + _metadata = data; |
|---|
| 44 | + }) |
|---|
| 45 | + } |
|---|
| 46 | + this.init = function() { |
|---|
| 47 | + if (_metadata) { |
|---|
| 48 | + console.debug('Catalogs already initilizated'); |
|---|
| 49 | + var defer = $q.defer(); |
|---|
| 50 | + defer.resolve(_metadata); |
|---|
| 51 | + return defer.promise; |
|---|
| 52 | + } |
|---|
| 53 | + return _list(); |
|---|
| 54 | + } |
|---|
| 55 | + this.getList = function() { |
|---|
| 56 | + return _metadata; |
|---|
| 57 | + } |
|---|
| 58 | + this.getName = function(index) { |
|---|
| 59 | + if (index === undefined) |
|---|
| 60 | + return _current ? _current.name : ''; |
|---|
| 61 | + return _metadata ? _metadata[index].name |
|---|
| 62 | + : ''; |
|---|
| 63 | + } |
|---|
| 64 | + this.getResource = function(res) { |
|---|
| 65 | + if (res === undefined) |
|---|
| 66 | + return _current ? resources[_current.resource] |
|---|
| 67 | + : null; |
|---|
| 68 | + return resources[res]; |
|---|
| 69 | + } |
|---|
| 70 | + this.getPk = function(catalogMetadata) { |
|---|
| 71 | + if (!catalogMetadata) |
|---|
| 72 | + catalogMetadata = _current; |
|---|
| 73 | + |
|---|
| 74 | + for (var i = 0; i < catalogMetadata.fields.length; i++) |
|---|
| 75 | + if (catalogMetadata.fields[i].pk) |
|---|
| 76 | + return catalogMetadata.fields[i].name; |
|---|
| 77 | + |
|---|
| 78 | + return null; |
|---|
| 79 | + } |
|---|
| 80 | + /** |
|---|
| 81 | + * Returns catalog metadata |
|---|
| 82 | + * |
|---|
| 83 | + * @param index: |
|---|
| 84 | + * Return current catalog if |
|---|
| 85 | + * undefined, if string It find the |
|---|
| 86 | + * catalog by resoource name if |
|---|
| 87 | + * number it find it by position |
|---|
| 88 | + */ |
|---|
| 89 | + this.getMetadata = function(index) { |
|---|
| 90 | + if (!_metadata) |
|---|
| 91 | + throw new Error( |
|---|
| 92 | + 'There is no catalog metadata info'); |
|---|
| 93 | + if (index === undefined) |
|---|
| 94 | + return _current; |
|---|
| 95 | + if (typeof index === 'string') { |
|---|
| 96 | + for (var i = _metadata.length - 1; i >= 0 |
|---|
| 97 | + && _metadata[i].resource !== index; i--) |
|---|
| 98 | + ; |
|---|
| 99 | + index = i; |
|---|
| 100 | + } |
|---|
| 101 | + |
|---|
| 102 | + return _metadata[index]; |
|---|
| 103 | + } |
|---|
| 104 | + this.setCurrent = function(index) { |
|---|
| 105 | + if (!_metadata) |
|---|
| 106 | + throw new Error( |
|---|
| 107 | + 'There is no catalog metadata info'); |
|---|
| 108 | + if (index === undefined) |
|---|
| 109 | + _current = null; |
|---|
| 110 | + else |
|---|
| 111 | + _current = _metadata[index]; |
|---|
| 112 | + } |
|---|
| 113 | + /*********************************************** |
|---|
| 114 | + * Catalog fields methods * |
|---|
| 115 | + **********************************************/ |
|---|
| 116 | + |
|---|
| 117 | + /** |
|---|
| 118 | + * Returns the first field in form that should |
|---|
| 119 | + * get the focus. We find the first field that |
|---|
| 120 | + * is not read only |
|---|
| 121 | + */ |
|---|
| 122 | + this.getFFF = this.getFirstFocusableField = function() { |
|---|
| 123 | + if (!_current) |
|---|
| 124 | + throw new Error( |
|---|
| 125 | + 'There is no current catalog selected'); |
|---|
| 126 | + |
|---|
| 127 | + for (var i = 0; i < _current.fields.length; i++) |
|---|
| 128 | + if (!_current.fields[i].readOnly) |
|---|
| 129 | + return _current.fields[i].name; |
|---|
| 130 | + |
|---|
| 131 | + return null; |
|---|
| 132 | + } |
|---|
| 133 | + |
|---|
| 134 | + /** |
|---|
| 135 | + * Find the field by name or position |
|---|
| 136 | + */ |
|---|
| 137 | + this.getField = function(key, catalog) { |
|---|
| 138 | + catalog = catalog || _current; |
|---|
| 139 | + if (!catalog) |
|---|
| 140 | + throw new Error('There is no current catalog selected'); |
|---|
| 141 | + var index = -1; |
|---|
| 142 | + if (typeof key === 'string') { |
|---|
| 143 | + for (var i = catalog.fields.length - 1; i >= 0 |
|---|
| 144 | + && catalog.fields[i].name !== key; i--); |
|---|
| 145 | + index = i; |
|---|
| 146 | + } else { |
|---|
| 147 | + index = key; // In this case key === field position |
|---|
| 148 | + } |
|---|
| 149 | + |
|---|
| 150 | + return index === -1 ? {} |
|---|
| 151 | + : catalog.fields[index]; |
|---|
| 152 | + } |
|---|
| 153 | + |
|---|
| 154 | + /*********************************************** |
|---|
| 155 | + * Catalog resource operations on server * |
|---|
| 156 | + **********************************************/ |
|---|
| 157 | + |
|---|
| 158 | + function _success(response) { |
|---|
| 159 | + console.debug('$resource action success') |
|---|
| 160 | + console.log(_current); |
|---|
| 161 | + |
|---|
| 162 | + } |
|---|
| 163 | + function _fail(response) { |
|---|
| 164 | + console.error('Error trying to get data, HTTP error code: ' |
|---|
| 165 | + + response.status) |
|---|
| 166 | + } |
|---|
| 167 | + |
|---|
| 168 | + this.save = function(data) { |
|---|
| 169 | + if (!_current) |
|---|
| 170 | + throw new Error('There is no current catalog selected'); |
|---|
| 171 | + |
|---|
| 172 | + var resource = this.getResource(); |
|---|
| 173 | + return resource.save(data, _success, _fail); |
|---|
| 174 | + } |
|---|
| 175 | + this.remove = function(data) { |
|---|
| 176 | + return this.getResource().remove({}, data, |
|---|
| 177 | + _success, _fail) |
|---|
| 178 | + } |
|---|
| 179 | + this.query = function() { |
|---|
| 180 | + return this.getResource().query({}, |
|---|
| 181 | + _success, _fail); |
|---|
| 182 | + } |
|---|
| 183 | + this.refreshRef = function(refs, res, |
|---|
| 184 | + preloadedData) { |
|---|
| 185 | + // We check if there is some field for the |
|---|
| 186 | + // resource passed as parameter |
|---|
| 187 | + var field = (function() { |
|---|
| 188 | + for (var i = _current.fields.length - 1; i >= 0; i--) { |
|---|
| 189 | + if (_current.fields[i].resource === res) |
|---|
| 190 | + return _current.fields[i]; |
|---|
| 191 | + } |
|---|
| 192 | + return null; |
|---|
| 193 | + })(); |
|---|
| 194 | + |
|---|
| 195 | + // If field for that resource is not found |
|---|
| 196 | + // there is nothing to refresh |
|---|
| 197 | + if (!field) |
|---|
| 198 | + return; |
|---|
| 199 | + var resource = this.getResource(res); |
|---|
| 200 | + var data = preloadedData || resource.query({}, _success, _fail); |
|---|
| 201 | + var that = this; |
|---|
| 202 | + data.$promise.then(function(responseData) { |
|---|
| 203 | + var pk = that.getPk(that |
|---|
| 204 | + .getMetadata(field.resource)) |
|---|
| 205 | + var comboData = [] |
|---|
| 206 | + responseData.forEach(function(row) { |
|---|
| 207 | + comboData.push({ |
|---|
| 208 | + id : row[pk], |
|---|
| 209 | + label : row.label || row.name |
|---|
| 210 | + || row.code |
|---|
| 211 | + || row.first_name + ' ' |
|---|
| 212 | + + row.last_name |
|---|
| 213 | + }); |
|---|
| 214 | + }) |
|---|
| 215 | + refs[field.name] = comboData; |
|---|
| 216 | + }) |
|---|
| 217 | + } |
|---|
| 218 | + this.loadRefs = function(callback, refsFields) { |
|---|
| 219 | + if (!refsFields || refsFields.length === 0) { |
|---|
| 220 | + if (!_current) |
|---|
| 221 | + throw new Error('There is no current catalog selected'); |
|---|
| 222 | + refsFields = []; |
|---|
| 223 | + _current.fields.forEach(function(f) { |
|---|
| 224 | + if (f.resource) |
|---|
| 225 | + refsFields.push(f) |
|---|
| 226 | + |
|---|
| 227 | + }); |
|---|
| 228 | + } |
|---|
| 229 | + |
|---|
| 230 | + var that = this; |
|---|
| 231 | + var promises = [] |
|---|
| 232 | + var refs = [] |
|---|
| 233 | + refsFields.forEach(function(f) { |
|---|
| 234 | + var resource = that |
|---|
| 235 | + .getResource(f.resource); |
|---|
| 236 | + refs[f.name] = resource.query({}, |
|---|
| 237 | + _success, _fail); |
|---|
| 238 | + promises.push(refs[f.name].$promise); |
|---|
| 239 | + }); |
|---|
| 240 | + |
|---|
| 241 | + $q.all(promises) |
|---|
| 242 | + .then(function() { |
|---|
| 243 | + refsFields.forEach(function(rf) { |
|---|
| 244 | + var cat = that.getResource(rf.resource); |
|---|
| 245 | + var pk = that.getPk(that.getMetadata(rf.resource)) |
|---|
| 246 | + //console.log('PK field for ' + rf.name + ' is ' + pk) |
|---|
| 247 | + var comboData = [] |
|---|
| 248 | + refs[rf.name].forEach(function(row) { |
|---|
| 249 | + comboData.push({ |
|---|
| 250 | + id : row[pk], |
|---|
| 251 | + label : row.label |
|---|
| 252 | + || row.name |
|---|
| 253 | + || row.code |
|---|
| 254 | + || row.first_name |
|---|
| 255 | + + ' ' |
|---|
| 256 | + + (row.last_name || '') |
|---|
| 257 | + }); |
|---|
| 258 | + }) |
|---|
| 259 | + refs[rf.name] = comboData; |
|---|
| 260 | + }); |
|---|
| 261 | + // Next lines are to load special catalogs with predefined values, just like user roles |
|---|
| 262 | + _current && _current.fields.forEach(function(f) { |
|---|
| 263 | + if (f.values) |
|---|
| 264 | + refs[f.name] = f.values; |
|---|
| 265 | + }); |
|---|
| 266 | + callback(refs); |
|---|
| 267 | + }) |
|---|
| 268 | + } |
|---|
| 269 | + |
|---|
| 270 | + } ]) |
|---|
| 271 | + |
|---|
| 272 | +})(); |
|---|
| .. | .. |
|---|
| 1 | +[ { |
|---|
| 2 | + "name" : "Applications", |
|---|
| 3 | + "resource" : "application", |
|---|
| 4 | + "list_fields" : [ "name", "description", "creationTimestamp" ], |
|---|
| 5 | + "fields" : [ { |
|---|
| 6 | + "name" : "id", |
|---|
| 7 | + "display" : "ID", |
|---|
| 8 | + "type" : "number", |
|---|
| 9 | + "pk" : true, |
|---|
| 10 | + "autogenerate" : true, |
|---|
| 11 | + "readOnly" : true |
|---|
| 12 | + }, { |
|---|
| 13 | + "name" : "name", |
|---|
| 14 | + "display" : "Name", |
|---|
| 15 | + "type" : "string", |
|---|
| 16 | + "maxlength" : 45, |
|---|
| 17 | + "mandatory" : true |
|---|
| 18 | + }, { |
|---|
| 19 | + "name" : "description", |
|---|
| 20 | + "display" : "Description", |
|---|
| 21 | + "type" : "string", |
|---|
| 22 | + "maxlength" : 500, |
|---|
| 23 | + "multiline" : 2 |
|---|
| 24 | + }, { |
|---|
| 25 | + "name" : "license_filename", |
|---|
| 26 | + "display" : "License filename", |
|---|
| 27 | + "type" : "string", |
|---|
| 28 | + "maxlength" : 100, |
|---|
| 29 | + "mandatory" : true |
|---|
| 30 | + }, { |
|---|
| 31 | + "name" : "creation_timestamp", |
|---|
| 32 | + "display" : "Creation date", |
|---|
| 33 | + "autogenerate" : true, |
|---|
| 34 | + "type" : "date", |
|---|
| 35 | + "readOnly" : true |
|---|
| 36 | + }, { |
|---|
| 37 | + "name" : "metadata", |
|---|
| 38 | + "display" : "Metadata", |
|---|
| 39 | + "type" : "metadata", |
|---|
| 40 | + "allow_creation": true |
|---|
| 41 | + } ] |
|---|
| 42 | +}, { |
|---|
| 43 | + "name" : "License types", |
|---|
| 44 | + "list_fields" : [ "code", "name", "application_name", "creationTimestamp" ], |
|---|
| 45 | + "resource" : "licensetype", |
|---|
| 46 | + "fields" : [ { |
|---|
| 47 | + "name" : "id", |
|---|
| 48 | + "display" : "ID", |
|---|
| 49 | + "type" : "number", |
|---|
| 50 | + "pk" : true, |
|---|
| 51 | + "autogenerate" : true, |
|---|
| 52 | + "readOnly" : true |
|---|
| 53 | + }, { |
|---|
| 54 | + "name" : "code", |
|---|
| 55 | + "display" : "Code", |
|---|
| 56 | + "type" : "string", |
|---|
| 57 | + "maxlength" : 10, |
|---|
| 58 | + "mandatory" : true |
|---|
| 59 | + }, { |
|---|
| 60 | + "name" : "name", |
|---|
| 61 | + "display" : "Name", |
|---|
| 62 | + "type" : "string", |
|---|
| 63 | + "maxlength" : 45, |
|---|
| 64 | + "mandatory" : true |
|---|
| 65 | + }, { |
|---|
| 66 | + "name" : "description", |
|---|
| 67 | + "display" : "Description", |
|---|
| 68 | + "type" : "string", |
|---|
| 69 | + "maxlength" : 500, |
|---|
| 70 | + "multiline" : 2 |
|---|
| 71 | + }, { |
|---|
| 72 | + "name" : "application_id", |
|---|
| 73 | + "display" : "Application", |
|---|
| 74 | + "resource" : "application", |
|---|
| 75 | + "mandatory" : true, |
|---|
| 76 | + "type" : "select", |
|---|
| 77 | + "onchange": "updateMetadata" |
|---|
| 78 | + }, { |
|---|
| 79 | + "name" : "creation_timestamp", |
|---|
| 80 | + "display" : "Creation date", |
|---|
| 81 | + "autogenerate" : true, |
|---|
| 82 | + "type" : "date", |
|---|
| 83 | + "readOnly" : true |
|---|
| 84 | + }, { |
|---|
| 85 | + "name" : "application_name", |
|---|
| 86 | + "display" : "Application", |
|---|
| 87 | + "listingOnly" : true |
|---|
| 88 | + }, { |
|---|
| 89 | + "name" : "metadata", |
|---|
| 90 | + "display" : "Metadata", |
|---|
| 91 | + "type" : "metadata", |
|---|
| 92 | + "allow_creation": false |
|---|
| 93 | + } ] |
|---|
| 94 | +}, { |
|---|
| 95 | + "name" : "Organizations", |
|---|
| 96 | + "list_fields" : [ "code", "name", "org_parent_name", "creationTimestamp" ], |
|---|
| 97 | + "resource" : "organization", |
|---|
| 98 | + "fields" : [ { |
|---|
| 99 | + "name" : "id", |
|---|
| 100 | + "display" : "ID", |
|---|
| 101 | + "type" : "number", |
|---|
| 102 | + "pk" : true, |
|---|
| 103 | + "autogenerate" : true, |
|---|
| 104 | + "readOnly" : true |
|---|
| 105 | + }, { |
|---|
| 106 | + "name" : "code", |
|---|
| 107 | + "display" : "Code", |
|---|
| 108 | + "type" : "string", |
|---|
| 109 | + "maxlength" : 10, |
|---|
| 110 | + "mandatory" : true |
|---|
| 111 | + }, { |
|---|
| 112 | + "name" : "name", |
|---|
| 113 | + "display" : "Name", |
|---|
| 114 | + "type" : "string", |
|---|
| 115 | + "maxlength" : 45, |
|---|
| 116 | + "mandatory" : true |
|---|
| 117 | + }, { |
|---|
| 118 | + "name" : "description", |
|---|
| 119 | + "display" : "Description", |
|---|
| 120 | + "type" : "string", |
|---|
| 121 | + "maxlength" : 500, |
|---|
| 122 | + "multiline" : 2 |
|---|
| 123 | + }, { |
|---|
| 124 | + "name" : "org_parent_id", |
|---|
| 125 | + "display" : "Parent organization", |
|---|
| 126 | + "resource" : "organization", |
|---|
| 127 | + "type" : "select" |
|---|
| 128 | + }, { |
|---|
| 129 | + "name" : "users_ids", |
|---|
| 130 | + "display" : "Users", |
|---|
| 131 | + "resource" : "user", |
|---|
| 132 | + "type" : "multiselect" |
|---|
| 133 | + }, { |
|---|
| 134 | + "name" : "creation_timestamp", |
|---|
| 135 | + "display" : "Creation date", |
|---|
| 136 | + "autogenerate" : true, |
|---|
| 137 | + "type" : "date", |
|---|
| 138 | + "readOnly" : true |
|---|
| 139 | + }, { |
|---|
| 140 | + "name" : "org_parent_name", |
|---|
| 141 | + "display" : "Parent org", |
|---|
| 142 | + "listingOnly" : true |
|---|
| 143 | + } ] |
|---|
| 144 | +}, { |
|---|
| 145 | + "name" : "Users", |
|---|
| 146 | + "list_fields" : [ "username", "first_name", "last_name", "lastLogin" ], |
|---|
| 147 | + "resource" : "user", |
|---|
| 148 | + "fields" : [ { |
|---|
| 149 | + "name" : "username", |
|---|
| 150 | + "display" : "Username", |
|---|
| 151 | + "type" : "string", |
|---|
| 152 | + "maxlength" : 45, |
|---|
| 153 | + "pk" : true, |
|---|
| 154 | + "readOnly" : true, |
|---|
| 155 | + "mandatory" : true |
|---|
| 156 | + }, { |
|---|
| 157 | + "name" : "email", |
|---|
| 158 | + "display" : "Email", |
|---|
| 159 | + "type" : "email", |
|---|
| 160 | + "maxlength" : 150, |
|---|
| 161 | + "mandatory" : true |
|---|
| 162 | + }, { |
|---|
| 163 | + "name" : "first_name", |
|---|
| 164 | + "display" : "First name", |
|---|
| 165 | + "type" : "string", |
|---|
| 166 | + "maxlength" : 100, |
|---|
| 167 | + "mandatory" : true |
|---|
| 168 | + }, { |
|---|
| 169 | + "name" : "password", |
|---|
| 170 | + "display" : "Password", |
|---|
| 171 | + "type" : "password", |
|---|
| 172 | + "maxlength" : 100, |
|---|
| 173 | + "mandatory" : false |
|---|
| 174 | + }, { |
|---|
| 175 | + "name" : "last_name", |
|---|
| 176 | + "display" : "Last name", |
|---|
| 177 | + "type" : "string", |
|---|
| 178 | + "maxlength" : 100 |
|---|
| 179 | + }, { |
|---|
| 180 | + "name" : "organizations_ids", |
|---|
| 181 | + "display" : "Organizations", |
|---|
| 182 | + "resource" : "organization", |
|---|
| 183 | + "type" : "multiselect" |
|---|
| 184 | + }, { |
|---|
| 185 | + "name" : "roles", |
|---|
| 186 | + "display" : "Roles", |
|---|
| 187 | + "values" : [{"id":1, "label":"Advance"}, {"id":2, "label":"Admin"}], |
|---|
| 188 | + "type" : "multiselect" |
|---|
| 189 | + }, { |
|---|
| 190 | + "name" : "lastLogin", |
|---|
| 191 | + "display" : "Last login", |
|---|
| 192 | + "autogenerate" : true, |
|---|
| 193 | + "type" : "date", |
|---|
| 194 | + "readOnly" : true |
|---|
| 195 | + }, { |
|---|
| 196 | + "name" : "creation_timestamp", |
|---|
| 197 | + "display" : "Creation date", |
|---|
| 198 | + "autogenerate" : true, |
|---|
| 199 | + "type" : "date", |
|---|
| 200 | + "readOnly" : true |
|---|
| 201 | + }] |
|---|
| 202 | + } |
|---|
| 203 | + |
|---|
| 204 | +] |
|---|
| .. | .. |
|---|
| 1 | +(function() { |
|---|
| 2 | + 'use strict'; |
|---|
| 3 | + |
|---|
| 4 | + var app = angular.module('app', [ 'ngRoute', 'ngAnimate', 'ngResource' ]); |
|---|
| 5 | + |
|---|
| 6 | + app.directive( |
|---|
| 7 | + 'catalogField', |
|---|
| 8 | + function() { |
|---|
| 9 | + return { |
|---|
| 10 | + restrict : 'A', // only activate on element |
|---|
| 11 | + // attribute |
|---|
| 12 | + require : '?ngModel', // get a hold of |
|---|
| 13 | + // NgModelController |
|---|
| 14 | + link : function(scope, element, attrs, ngModel) { |
|---|
| 15 | + if (!ngModel) |
|---|
| 16 | + return; // do nothing if no ng-model |
|---|
| 17 | + // TODO: Replace the hard-coded form ID by the |
|---|
| 18 | + // appropiate dynamic field |
|---|
| 19 | + scope.catalogForm[attrs.name] = scope.catalogForm['{{field.name}}']; |
|---|
| 20 | + scope.catalogForm[attrs.name].$name = attrs.name; |
|---|
| 21 | + } |
|---|
| 22 | + }; |
|---|
| 23 | + }); |
|---|
| 24 | + |
|---|
| 25 | + app.factory('Catalogs', function($http, $resource) { |
|---|
| 26 | + var CatalogsService = { |
|---|
| 27 | + resources : { |
|---|
| 28 | + application : $resource('/application/:appId', { |
|---|
| 29 | + appId : '@id' |
|---|
| 30 | + }, { |
|---|
| 31 | + update : { |
|---|
| 32 | + method : "PUT" |
|---|
| 33 | + }, |
|---|
| 34 | + test: { |
|---|
| 35 | + url: '/application/:appId', |
|---|
| 36 | + method : "DELETE", |
|---|
| 37 | + params : { |
|---|
| 38 | + appId : '@id' |
|---|
| 39 | + } |
|---|
| 40 | + } |
|---|
| 41 | + }), |
|---|
| 42 | + user : $resource('/user/:userId', { |
|---|
| 43 | + userId : '@id' |
|---|
| 44 | + }, { |
|---|
| 45 | + update : { |
|---|
| 46 | + method : "PUT" |
|---|
| 47 | + } |
|---|
| 48 | + }), |
|---|
| 49 | + licensetype : $resource('/licenseType/:licenseTypeId', { |
|---|
| 50 | + licenseTypeId : '@id' |
|---|
| 51 | + }, { |
|---|
| 52 | + update : { |
|---|
| 53 | + method : "PUT" |
|---|
| 54 | + } |
|---|
| 55 | + }) |
|---|
| 56 | + |
|---|
| 57 | + }, |
|---|
| 58 | + list : function(initFn) { |
|---|
| 59 | + $http.get('/js/catalogs.json').success(function(data) { |
|---|
| 60 | + console.log(data); |
|---|
| 61 | + CatalogsService.data = data; |
|---|
| 62 | + initFn(); |
|---|
| 63 | + }) |
|---|
| 64 | + return CatalogsService; |
|---|
| 65 | + }, |
|---|
| 66 | + getName : function(index) { |
|---|
| 67 | + return CatalogsService.data ? CatalogsService.data[index].name |
|---|
| 68 | + : ''; |
|---|
| 69 | + }, |
|---|
| 70 | + getResource : function(index) { |
|---|
| 71 | + return CatalogsService.data ? CatalogsService.data[index].resource |
|---|
| 72 | + : ''; |
|---|
| 73 | + }, |
|---|
| 74 | + getMetadata : function(index) { |
|---|
| 75 | + return CatalogsService.data ? CatalogsService.data[index] : {}; |
|---|
| 76 | + }, |
|---|
| 77 | + save: function(catalog, data) { |
|---|
| 78 | + var resource = CatalogsService.resources[catalog.toLowerCase()]; |
|---|
| 79 | + function success(data) { |
|---|
| 80 | + console.log('success') |
|---|
| 81 | + console.log(data) |
|---|
| 82 | + } |
|---|
| 83 | + function fail(data, status) { |
|---|
| 84 | + console.log('error') |
|---|
| 85 | + console.error(data) |
|---|
| 86 | + console.error(status) |
|---|
| 87 | + } |
|---|
| 88 | + if (data.id && data.id !== '') |
|---|
| 89 | + return resource.update(data, success, fail) |
|---|
| 90 | + else |
|---|
| 91 | + return resource.save(data, success, fail) |
|---|
| 92 | + }, |
|---|
| 93 | + remove: function(catalog, data) { |
|---|
| 94 | + var resource = CatalogsService.resources[catalog.toLowerCase()]; |
|---|
| 95 | + function success(data) { |
|---|
| 96 | + console.log('success') |
|---|
| 97 | + console.log(data) |
|---|
| 98 | + } |
|---|
| 99 | + function fail(data, status) { |
|---|
| 100 | + console.log('error') |
|---|
| 101 | + console.error(data) |
|---|
| 102 | + console.error(status) |
|---|
| 103 | + } |
|---|
| 104 | + return resource.remove({}, data, success, fail) |
|---|
| 105 | + }, |
|---|
| 106 | + query: function(catalog, callback) { |
|---|
| 107 | + console.log('HI catalog ???? ' + catalog); |
|---|
| 108 | + var resource = CatalogsService.resources[catalog.toLowerCase()]; |
|---|
| 109 | + function success(data) { |
|---|
| 110 | + console.log('success') |
|---|
| 111 | + console.log(data) |
|---|
| 112 | + } |
|---|
| 113 | + function fail(data, status) { |
|---|
| 114 | + console.log('error') |
|---|
| 115 | + console.error(data) |
|---|
| 116 | + console.error(status) |
|---|
| 117 | + } |
|---|
| 118 | + return resource.query({}, success, fail); |
|---|
| 119 | + } |
|---|
| 120 | + } |
|---|
| 121 | + |
|---|
| 122 | + return CatalogsService; |
|---|
| 123 | + |
|---|
| 124 | + }); |
|---|
| 125 | + |
|---|
| 126 | + app.controller('CatalogsCtrl', [ |
|---|
| 127 | + '$scope', |
|---|
| 128 | + '$http', |
|---|
| 129 | + 'Catalogs', |
|---|
| 130 | + function($scope, $http, Catalogs) { |
|---|
| 131 | + $scope.formu = {}; |
|---|
| 132 | + $scope.catalogIndex = 0; |
|---|
| 133 | + $scope.catalogs = Catalogs.list(function() { |
|---|
| 134 | + $scope.catalogMetadata = Catalogs.getMetadata($scope.catalogIndex); |
|---|
| 135 | + $scope.list = Catalogs.query(Catalogs.getResource($scope.catalogIndex)); |
|---|
| 136 | + }); |
|---|
| 137 | + |
|---|
| 138 | + $scope.catalogMetadata = {}; |
|---|
| 139 | + $scope.selectCatalog = function(index, $event) { |
|---|
| 140 | + $scope.catalogIndex = index; |
|---|
| 141 | + $scope.catalogMetadata = Catalogs.getMetadata($scope.catalogIndex); |
|---|
| 142 | + $scope.list = Catalogs.query(Catalogs.getResource($scope.catalogIndex)); |
|---|
| 143 | + console.log($event); |
|---|
| 144 | + } |
|---|
| 145 | + $scope.edit = function(data) { |
|---|
| 146 | + $scope.showForm = true; |
|---|
| 147 | + $scope.isNew = false; |
|---|
| 148 | + for (var k in data) { |
|---|
| 149 | + if (k.indexOf('$') !== 0) $scope.formu[k] = data[k] |
|---|
| 150 | + } |
|---|
| 151 | + // TODO: Load in formu values for Form |
|---|
| 152 | + // $scope.formu = {}; |
|---|
| 153 | + } |
|---|
| 154 | + $scope.delete = function(data) { |
|---|
| 155 | + BootstrapDialog.confirm('The record will be deleted, are you sure?', function(result){ |
|---|
| 156 | + if(result) { |
|---|
| 157 | + var catalogName = Catalogs.getResource($scope.catalogIndex); |
|---|
| 158 | + var promise = Catalogs.remove(catalogName, data).$promise; |
|---|
| 159 | + promise.then(function(data) { |
|---|
| 160 | + $scope.list = Catalogs.query(catalogName); |
|---|
| 161 | + }); |
|---|
| 162 | + } |
|---|
| 163 | + }); |
|---|
| 164 | + $scope.showForm = false; |
|---|
| 165 | + $scope.isNew = false; |
|---|
| 166 | + // TODO: Load in formu values for Form |
|---|
| 167 | + // $scope.formu = {}; |
|---|
| 168 | + } |
|---|
| 169 | + |
|---|
| 170 | + } ]); |
|---|
| 171 | + |
|---|
| 172 | + app.controller('CatalogFormCtrl', [ '$scope', '$http', 'Catalogs', |
|---|
| 173 | + function($scope, $http, Catalogs) { |
|---|
| 174 | + $scope.showForm = false; |
|---|
| 175 | + $scope.scope = $scope; |
|---|
| 176 | + console.log('Form: currentCatalog:' + $scope.cataLogIndex); |
|---|
| 177 | + |
|---|
| 178 | + $scope.editNew = function() { |
|---|
| 179 | + $scope.showForm = true; |
|---|
| 180 | + $scope.isNew = true; |
|---|
| 181 | + // $scope.formu = {}; |
|---|
| 182 | + } |
|---|
| 183 | + $scope.cancel = function() { |
|---|
| 184 | + $scope.showForm = false; |
|---|
| 185 | + } |
|---|
| 186 | + |
|---|
| 187 | + $scope.saveCatalog = function() { |
|---|
| 188 | + if ($scope.catalogForm.$invalid) { |
|---|
| 189 | + alert(JSON.stringify($scope.catalogForm)) |
|---|
| 190 | + } else { |
|---|
| 191 | + var catalogName = Catalogs.getResource($scope.catalogIndex); |
|---|
| 192 | + var promise = Catalogs.save(catalogName, $scope.formu).$promise; |
|---|
| 193 | + promise.then(function(data) { |
|---|
| 194 | + $scope.$parent.list = Catalogs.query(catalogName); |
|---|
| 195 | + }); |
|---|
| 196 | + } |
|---|
| 197 | + } |
|---|
| 198 | + } ]); |
|---|
| 199 | + |
|---|
| 200 | + app.controller('CatalogListCtrl', [ '$scope', '$http', '$filter', 'Catalogs', |
|---|
| 201 | + function($scope, $http, $filter, Catalogs) { |
|---|
| 202 | + console.log('List: currentCatalog: ' + $scope.currentCatalog); |
|---|
| 203 | + var _indexOfField = function(name) { |
|---|
| 204 | + if (!$scope.catalogMetadata) return -1; |
|---|
| 205 | + for (var i = $scope.catalogMetadata.fields.length - 1; i >= 0 && $scope.catalogMetadata.fields[i].name !== name; i--); |
|---|
| 206 | + return i; |
|---|
| 207 | + } |
|---|
| 208 | + |
|---|
| 209 | + $scope.print = function(name, value) { |
|---|
| 210 | + var index = _indexOfField(name); |
|---|
| 211 | + if (index === -1) return value; |
|---|
| 212 | + var type = $scope.catalogMetadata.fields[index].type; |
|---|
| 213 | + |
|---|
| 214 | + return type === 'date' ? $filter('date')(value, 'yyyy-MM-dd') : value; |
|---|
| 215 | + } |
|---|
| 216 | + |
|---|
| 217 | + $scope.display = function(name) { |
|---|
| 218 | + var index = _indexOfField(name); |
|---|
| 219 | + return index === -1 ? '' : $scope.catalogMetadata.fields[index].display; |
|---|
| 220 | + } |
|---|
| 221 | + |
|---|
| 222 | + } ]); |
|---|
| 223 | + |
|---|
| 224 | +})(); |
|---|
| .. | .. |
|---|
| 1 | +(function() { |
|---|
| 2 | + 'use strict'; |
|---|
| 3 | + |
|---|
| 4 | + /* |
|---|
| 5 | + * Catalogs module |
|---|
| 6 | + */ |
|---|
| 7 | + |
|---|
| 8 | + angular.module('i18n', []) |
|---|
| 9 | + |
|---|
| 10 | + .service('$L', ['$http', function ($http) { |
|---|
| 11 | + var url_tpl = '/lang/messages_{0}.json'; |
|---|
| 12 | + var _defaultLang = 'en'; |
|---|
| 13 | + var _currentLang = 'en'; |
|---|
| 14 | + var _messages = null; |
|---|
| 15 | + |
|---|
| 16 | + /** |
|---|
| 17 | + * It works similar to MessageFormat in Java |
|---|
| 18 | + */ |
|---|
| 19 | + var format = function() { |
|---|
| 20 | + var args = arguments; |
|---|
| 21 | + |
|---|
| 22 | + return this.replace(/\{(\d+)\}/g, function() { |
|---|
| 23 | + return args[arguments[1]]; |
|---|
| 24 | + }); |
|---|
| 25 | + }; |
|---|
| 26 | + |
|---|
| 27 | + this.setLocale = function(newLoc) { |
|---|
| 28 | + _currentLang = newLoc; |
|---|
| 29 | + if (_currentLang === defaultLang) |
|---|
| 30 | + _messages = null; |
|---|
| 31 | + else { |
|---|
| 32 | + $http.get(format.apply(url_tpl, [newLoc])).success(function(data) { |
|---|
| 33 | + _messages = data; |
|---|
| 34 | + // TODO: Launch event ??? |
|---|
| 35 | + }); |
|---|
| 36 | + } |
|---|
| 37 | + } |
|---|
| 38 | + |
|---|
| 39 | + /** |
|---|
| 40 | + * It accepts direct messages and templates: |
|---|
| 41 | + * { |
|---|
| 42 | + * "hello": "hola", |
|---|
| 43 | + * "Hello {0}!!: "Hola {0}!!" |
|---|
| 44 | + * } |
|---|
| 45 | + * $L.get('hello'); // This returns "hola" |
|---|
| 46 | + * $L.get('Hello {0}!!', 'John'); // This returns: "Hola John!!" if languaje is spanish |
|---|
| 47 | + */ |
|---|
| 48 | + this.get = function(msg) { |
|---|
| 49 | + if (!_messages || !_messages[msg]) { |
|---|
| 50 | + if (arguments.length === 1) return msg; |
|---|
| 51 | + var params = Array.prototype.slice.call(arguments, 1); |
|---|
| 52 | + return format.apply(msg, params); |
|---|
| 53 | + } |
|---|
| 54 | + |
|---|
| 55 | + if (arguments.length === 1) return _messages[msg]; |
|---|
| 56 | + var params = Array.prototype.slice.call(arguments, 1); |
|---|
| 57 | + return format.apply(_messages[msg], params); |
|---|
| 58 | + } |
|---|
| 59 | + |
|---|
| 60 | + var that = this; |
|---|
| 61 | + String.prototype.$i18n = function() { |
|---|
| 62 | + var args = [this]; |
|---|
| 63 | + Array.prototype.push.apply(args, Array.prototype.slice.call(arguments, 0)); |
|---|
| 64 | + return that.get.apply(that, args) |
|---|
| 65 | + }; |
|---|
| 66 | + |
|---|
| 67 | + }]) |
|---|
| 68 | + .directive( |
|---|
| 69 | + 'i18n', |
|---|
| 70 | + function($L) { |
|---|
| 71 | + return { |
|---|
| 72 | + restrict : 'A', // only activate on element attribute |
|---|
| 73 | + require : '', |
|---|
| 74 | + link : function(scope, element, attrs) { |
|---|
| 75 | + var txt = attrs.i18n || element.text(); |
|---|
| 76 | + element.text($L.get(txt)); |
|---|
| 77 | + } |
|---|
| 78 | + }; |
|---|
| 79 | + }); |
|---|
| 80 | + |
|---|
| 81 | + |
|---|
| 82 | +})(); |
|---|
| .. | .. |
|---|
| 1 | +{ |
|---|
| 2 | +"": "", |
|---|
| 3 | +"": "" |
|---|
| 4 | +} |
|---|
| .. | .. |
|---|
| 1 | +{ |
|---|
| 2 | +"": "", |
|---|
| 3 | +"": "" |
|---|
| 4 | +} |
|---|
| .. | .. |
|---|
| 1 | +(function() { |
|---|
| 2 | + 'use strict'; |
|---|
| 3 | + |
|---|
| 4 | + |
|---|
| 5 | + |
|---|
| 6 | + var HTTP_ERRORS = { |
|---|
| 7 | + 401: "Unathorized action", |
|---|
| 8 | + 418: "Application error", |
|---|
| 9 | + 403: "Forbidden action", |
|---|
| 10 | + 500: "Server error", |
|---|
| 11 | + 404: "Element not found" |
|---|
| 12 | + } |
|---|
| 13 | + |
|---|
| 14 | + var app = angular.module('securis'); |
|---|
| 15 | + app.service('Packs', ['$L','$resource', 'toaster', function($L, $resource, toaster) { |
|---|
| 16 | + var PACK_STATUS = { |
|---|
| 17 | + CREATED: 'CR', |
|---|
| 18 | + ACTIVE: 'AC', |
|---|
| 19 | + ONHOLD: 'OH', |
|---|
| 20 | + EXPIRED: 'EX', |
|---|
| 21 | + CANCELLED: 'CA' |
|---|
| 22 | + } |
|---|
| 23 | + var PACK_STATUSES = { |
|---|
| 24 | + 'CR': $L.get('Created'), |
|---|
| 25 | + 'AC': $L.get('Active'), |
|---|
| 26 | + 'OH': $L.get('On Hold'), |
|---|
| 27 | + 'EX': $L.get('Expired'), |
|---|
| 28 | + 'CA': $L.get('Cancelled') |
|---|
| 29 | + }; |
|---|
| 30 | + /** |
|---|
| 31 | + * These transitions could be get from server, class Pack.Status, but we |
|---|
| 32 | + * copy them for simplicity, this info won't change easily |
|---|
| 33 | + */ |
|---|
| 34 | + var PACK_ACTIONS_BY_STATUS = { |
|---|
| 35 | + activate: [PACK_STATUS.CREATED, PACK_STATUS.EXPIRED, PACK_STATUS.ONHOLD], |
|---|
| 36 | + putonhold: [PACK_STATUS.ACTIVE], |
|---|
| 37 | + cancel: [PACK_STATUS.EXPIRED, PACK_STATUS.ONHOLD, PACK_STATUS.ACTIVE], |
|---|
| 38 | + 'delete': [PACK_STATUS.CREATED, PACK_STATUS.CANCELLED] |
|---|
| 39 | + } |
|---|
| 40 | + |
|---|
| 41 | + var packResource = $resource('/pack/:packId/:action', |
|---|
| 42 | + { |
|---|
| 43 | + packId : '@id', |
|---|
| 44 | + action : '@action' |
|---|
| 45 | + }, |
|---|
| 46 | + { |
|---|
| 47 | + activate: { |
|---|
| 48 | + method: "POST", |
|---|
| 49 | + params: {action: "activate"} |
|---|
| 50 | + }, |
|---|
| 51 | + putonhold: { |
|---|
| 52 | + method: "POST", |
|---|
| 53 | + params: {action: "putonhold"} |
|---|
| 54 | + }, |
|---|
| 55 | + cancel: { |
|---|
| 56 | + method: "POST", |
|---|
| 57 | + params: {action: "cancel"} |
|---|
| 58 | + } |
|---|
| 59 | + } |
|---|
| 60 | + ); |
|---|
| 61 | + this.getStatusColor = function(status) { |
|---|
| 62 | + var COLORS_BY_STATUS = { |
|---|
| 63 | + 'CR': '#808080', |
|---|
| 64 | + 'AC': '#329e5a', |
|---|
| 65 | + 'OH': '#9047c7', |
|---|
| 66 | + 'EX': '#ea7824', |
|---|
| 67 | + 'CA': '#a21717' |
|---|
| 68 | + }; |
|---|
| 69 | + |
|---|
| 70 | + return COLORS_BY_STATUS[status]; |
|---|
| 71 | + }, |
|---|
| 72 | + this.getStatusName = function(status) { |
|---|
| 73 | + return PACK_STATUSES[status]; |
|---|
| 74 | + } |
|---|
| 75 | + |
|---|
| 76 | + this.savePackData = function(pack, isNew, _onsuccess) { |
|---|
| 77 | + var _success = function() { |
|---|
| 78 | + _onsuccess(); |
|---|
| 79 | + toaster.pop('success', 'Packs', $L.get("Pack '{0}' {1} successfully", pack.code, isNew ? $L.get("created") : $L.get("updated"))); |
|---|
| 80 | + } |
|---|
| 81 | + var _error = function(error) { |
|---|
| 82 | + console.log(error); |
|---|
| 83 | + toaster.pop('error', 'Packs', $L.get("Error {0} pack '{1}'. Reason: {2}", isNew ? $L.get("creating") : $L.get("updating"), pack.code, $L.get(error.headers('X-SECURIS-ERROR-MSG')))); |
|---|
| 84 | + } |
|---|
| 85 | + packResource.save(pack, _success, _error); |
|---|
| 86 | + } |
|---|
| 87 | + |
|---|
| 88 | + this.isActionAvailable = function(action, pack) { |
|---|
| 89 | + var validStatuses = PACK_ACTIONS_BY_STATUS[action]; |
|---|
| 90 | + return pack && validStatuses && validStatuses.indexOf(pack.status) !== -1; |
|---|
| 91 | + } |
|---|
| 92 | + var _createSuccessCallback = function(actionName, message, _innerCallback) { |
|---|
| 93 | + return function() { |
|---|
| 94 | + _innerCallback && _innerCallback(); |
|---|
| 95 | + toaster.pop('success', actionName, message); |
|---|
| 96 | + } |
|---|
| 97 | + } |
|---|
| 98 | + var _createErrorCallback = function(pack, actionName, _innerCallback) { |
|---|
| 99 | + return function(error) { |
|---|
| 100 | + console.log(error); |
|---|
| 101 | + _innerCallback && _innerCallback(); |
|---|
| 102 | + toaster.pop('error', actionName, $L.get("Error on action '{0}', pack '{1}'. Reason: {2}", actionName, pack.code, $L.get(error.headers('X-SECURIS-ERROR-MSG')))); |
|---|
| 103 | + } |
|---|
| 104 | + } |
|---|
| 105 | + this.getPacksList = function(_onsuccess, _onerror) { |
|---|
| 106 | + return packResource.query(_onsuccess, _onerror); |
|---|
| 107 | + } |
|---|
| 108 | + this.activate = function(pack, _onsuccess, _onerror) { |
|---|
| 109 | + console.log('Activation on pack: ' + pack.id); |
|---|
| 110 | + var _success = _createSuccessCallback($L.get('Activation'), $L.get("Pack '{0}' {1} successfully", pack.code, $L.get("activated")), _onsuccess); |
|---|
| 111 | + var _error = _createErrorCallback(pack, $L.get('Activation'), _onerror); |
|---|
| 112 | + packResource.activate({id: pack.id}, _success, _error); |
|---|
| 113 | + } |
|---|
| 114 | + this.putonhold = function(pack, _onsuccess, _onerror) { |
|---|
| 115 | + console.log('Put on hold on pack: ' + pack.id); |
|---|
| 116 | + var _success = _createSuccessCallback($L.get('Put on hold'), $L.get("Pack '{0}' {1} successfully", pack.code, $L.get("put on hold")), _onsuccess); |
|---|
| 117 | + var _error = _createErrorCallback(pack, $L.get('Put on hold'), _onerror); |
|---|
| 118 | + packResource.putonhold({id: pack.id}, _success, _error); |
|---|
| 119 | + } |
|---|
| 120 | + this.cancel = function(pack, extra_data, _onsuccess, _onerror) { |
|---|
| 121 | + console.log('Cancellation on pack: ' + pack.id); |
|---|
| 122 | + var _success = _createSuccessCallback($L.get('Cancellation'), $L.get("Pack '{0}' {1} successfully", pack.code, $L.get("cancelled")), _onsuccess); |
|---|
| 123 | + var _error = _createErrorCallback(pack, $L.get('Cancellation'), _onerror); |
|---|
| 124 | + var params = angular.extend({id: pack.id}, extra_data); |
|---|
| 125 | + packResource.cancel(params, _success, _error); |
|---|
| 126 | + } |
|---|
| 127 | + this.delete = function(pack, _onsuccess, _onerror) { |
|---|
| 128 | + console.log('Delete on pack: ' + pack.id); |
|---|
| 129 | + var _success = _createSuccessCallback($L.get('Deletion'), $L.get("Pack '{0}' {1} successfully", pack.code, $L.get("deleted")), _onsuccess); |
|---|
| 130 | + var _error = _createErrorCallback(pack, $L.get('Deletion'), _onerror); |
|---|
| 131 | + packResource.delete({packId: pack.id}, _success, _error); |
|---|
| 132 | + } |
|---|
| 133 | + |
|---|
| 134 | + }]); |
|---|
| 135 | + |
|---|
| 136 | + app.service('Licenses', ['$L', '$resource', 'toaster', function($L, $resource, toaster) { |
|---|
| 137 | + var LIC_STATUS = { |
|---|
| 138 | + CREATED: 'CR', |
|---|
| 139 | + ACTIVE: 'AC', |
|---|
| 140 | + REQUESTED: 'RE', |
|---|
| 141 | + PREACTIVE: 'PA', |
|---|
| 142 | + EXPIRED: 'EX', |
|---|
| 143 | + CANCELLED: 'CA' |
|---|
| 144 | + } |
|---|
| 145 | + |
|---|
| 146 | + var LIC_STATUSES = { |
|---|
| 147 | + 'CR': $L.get('Created'), |
|---|
| 148 | + 'AC': $L.get('Active'), |
|---|
| 149 | + 'PA': $L.get('Pre-active'), |
|---|
| 150 | + 'RE': $L.get('Requested'), |
|---|
| 151 | + 'EX': $L.get('Expired'), |
|---|
| 152 | + 'CA': $L.get('Cancelled') |
|---|
| 153 | + }; |
|---|
| 154 | + |
|---|
| 155 | + /** |
|---|
| 156 | + * These transitions could be get from server, class License.Status, but |
|---|
| 157 | + * we copy them for simplicity, this info won't change easily |
|---|
| 158 | + */ |
|---|
| 159 | + var LIC_ACTIONS_BY_STATUS = { |
|---|
| 160 | + activate: [LIC_STATUS.CREATED, LIC_STATUS.REQUESTED, LIC_STATUS.PREACTIVE], |
|---|
| 161 | + send: [LIC_STATUS.ACTIVE, LIC_STATUS.PREACTIVE], |
|---|
| 162 | + download: [LIC_STATUS.ACTIVE, LIC_STATUS.PREACTIVE], |
|---|
| 163 | + block: [LIC_STATUS.CANCELLED], |
|---|
| 164 | + unblock: [LIC_STATUS.CANCELLED], |
|---|
| 165 | + cancel: [LIC_STATUS.REQUESTED, LIC_STATUS.EXPIRED, LIC_STATUS.PREACTIVE, LIC_STATUS.ACTIVE], |
|---|
| 166 | + 'delete': [LIC_STATUS.CREATED, LIC_STATUS.CANCELLED] |
|---|
| 167 | + } |
|---|
| 168 | + |
|---|
| 169 | + var licenseResource = $resource('/license/:licenseId/:action', { |
|---|
| 170 | + licenseId : '@id', |
|---|
| 171 | + action : '@action' |
|---|
| 172 | + }, |
|---|
| 173 | + { |
|---|
| 174 | + activate: { |
|---|
| 175 | + method: "POST", |
|---|
| 176 | + params: {action: "activate"} |
|---|
| 177 | + }, |
|---|
| 178 | + cancel: { |
|---|
| 179 | + method: "POST", |
|---|
| 180 | + params: {action: "cancel"} |
|---|
| 181 | + }, |
|---|
| 182 | + download: { |
|---|
| 183 | + method: "GET", |
|---|
| 184 | + params: {action: "download"} |
|---|
| 185 | + }, |
|---|
| 186 | + block: { |
|---|
| 187 | + method: "POST", |
|---|
| 188 | + params: {action: "block"} |
|---|
| 189 | + }, |
|---|
| 190 | + send: { |
|---|
| 191 | + method: "POST", |
|---|
| 192 | + params: {action: "send"} |
|---|
| 193 | + }, |
|---|
| 194 | + unblock: { |
|---|
| 195 | + method: "POST", |
|---|
| 196 | + params: {action: "unblock"} |
|---|
| 197 | + } |
|---|
| 198 | + }); |
|---|
| 199 | + |
|---|
| 200 | + |
|---|
| 201 | + this.isActionAvailable = function(action, lic) { |
|---|
| 202 | + var validStatuses = LIC_ACTIONS_BY_STATUS[action]; |
|---|
| 203 | + return lic && validStatuses && validStatuses.indexOf(lic.status) !== -1; |
|---|
| 204 | + } |
|---|
| 205 | + this.getStatusColor = function(status) { |
|---|
| 206 | + var COLORS_BY_STATUS = { |
|---|
| 207 | + 'CR': '#808080', |
|---|
| 208 | + 'AC': '#329e5a', |
|---|
| 209 | + 'RE': '#2981d4', |
|---|
| 210 | + 'EX': '#ea7824', |
|---|
| 211 | + 'CA': '#a21717' |
|---|
| 212 | + }; |
|---|
| 213 | + |
|---|
| 214 | + return COLORS_BY_STATUS[status]; |
|---|
| 215 | + }, |
|---|
| 216 | + this.getStatusName = function(status) { |
|---|
| 217 | + return LIC_STATUSES[status]; |
|---|
| 218 | + } |
|---|
| 219 | + |
|---|
| 220 | + this.saveLicenseData = function(license, isNew, _onsuccess) { |
|---|
| 221 | + var _success = function() { |
|---|
| 222 | + _onsuccess(); |
|---|
| 223 | + toaster.pop('success', 'Licenses', $L.get("License '{0}' {1} successfully", license.code, isNew ? $L.get("created") : $L.get("updated"))); |
|---|
| 224 | + } |
|---|
| 225 | + var _error = function(error) { |
|---|
| 226 | + console.log(error); |
|---|
| 227 | + toaster.pop('error', 'Licenses', $L.get("Error {0} license '{1}'. Reason: {2}", isNew ? $L.get("creating") : $L.get("updating"), license.code, $L.get(error.headers('X-SECURIS-ERROR-MSG')))); |
|---|
| 228 | + } |
|---|
| 229 | + licenseResource.save(license, _success, _error); |
|---|
| 230 | + } |
|---|
| 231 | + |
|---|
| 232 | + var _createSuccessCallback = function(actionName, message, _innerCallback) { |
|---|
| 233 | + return function() { |
|---|
| 234 | + _innerCallback && _innerCallback(); |
|---|
| 235 | + toaster.pop('success', actionName, message); |
|---|
| 236 | + } |
|---|
| 237 | + } |
|---|
| 238 | + var _createErrorCallback = function(license, actionName, _innerCallback) { |
|---|
| 239 | + return function(error) { |
|---|
| 240 | + console.log(error); |
|---|
| 241 | + _innerCallback && _innerCallback(); |
|---|
| 242 | + toaster.pop('error', actionName, $L.get("Error on action '{0}', license '{1}'. Reason: {2}", actionName, license.code, $L.get(error.headers('X-SECURIS-ERROR-MSG')))); |
|---|
| 243 | + } |
|---|
| 244 | + } |
|---|
| 245 | + |
|---|
| 246 | + this.getLicensesList = function(pack, _onsuccess, _onerror) { |
|---|
| 247 | + return licenseResource.query({packId: pack.id}, _onsuccess, _onerror); |
|---|
| 248 | + } |
|---|
| 249 | + this.activate = function(license, _onsuccess, _onerror) { |
|---|
| 250 | + console.log('Activation on license: ' + license.id); |
|---|
| 251 | + var _success = _createSuccessCallback($L.get('Activation'), $L.get("License '{0}' {1} successfully", license.code, $L.get("activated")), _onsuccess); |
|---|
| 252 | + var _error = _createErrorCallback(license, $L.get('Activation'), _onerror); |
|---|
| 253 | + licenseResource.activate({id: license.id}, _success, _error); |
|---|
| 254 | + } |
|---|
| 255 | + this.block = function(license, _onsuccess, _onerror) { |
|---|
| 256 | + console.log('Block on license: ' + license.id); |
|---|
| 257 | + var _success = _createSuccessCallback($L.get('Block'), $L.get("License '{0}' {1} successfully", license.code, $L.get("blocked")), _onsuccess); |
|---|
| 258 | + var _error = _createErrorCallback(license, $L.get('Block'), _onerror); |
|---|
| 259 | + licenseResource.putonhold({id: license.id}, _success, _error); |
|---|
| 260 | + } |
|---|
| 261 | + this.unblock = function(license, _onsuccess, _onerror) { |
|---|
| 262 | + console.log('Unblock on license: ' + license.id); |
|---|
| 263 | + var _success = _createSuccessCallback($L.get('Unblock'), $L.get("License '{0}' {1} successfully", license.code, $L.get("unblocked")), _onsuccess); |
|---|
| 264 | + var _error = _createErrorCallback(license, $L.get('Unblock'), _onerror); |
|---|
| 265 | + licenseResource.putonhold({id: license.id}, _success, _error); |
|---|
| 266 | + } |
|---|
| 267 | + this.cancel = function(license, extra_data, _onsuccess, _onerror) { |
|---|
| 268 | + console.log('Cancellation on license: ' + license.id); |
|---|
| 269 | + var _success = _createSuccessCallback($L.get('Cancellation'), $L.get("License '{0}' {1} successfully", license.code, $L.get("cancelled")), _onsuccess); |
|---|
| 270 | + var _error = _createErrorCallback(license, $L.get('Cancellation'), _onerror); |
|---|
| 271 | + var params = angular.extend({id: license.id}, extra_data); |
|---|
| 272 | + licenseResource.cancel(params, _success, _error); |
|---|
| 273 | + } |
|---|
| 274 | + this.delete = function(license, _onsuccess, _onerror) { |
|---|
| 275 | + console.log('Delete on license: ' + license.id); |
|---|
| 276 | + var _success = _createSuccessCallback($L.get('Deletion'), $L.get("License '{0}' {1} successfully", license.code, $L.get("deleted")), _onsuccess); |
|---|
| 277 | + var _error = _createErrorCallback(license, $L.get('Deletion'), _onerror); |
|---|
| 278 | + licenseResource.delete({licenseId: license.id}, _success, _error); |
|---|
| 279 | + } |
|---|
| 280 | + }]); |
|---|
| 281 | + |
|---|
| 282 | + app.directive('fileLoader', |
|---|
| 283 | + function($timeout, $parse) { |
|---|
| 284 | + return { |
|---|
| 285 | + restrict : 'A', // only activate on element attribute |
|---|
| 286 | + require : '', |
|---|
| 287 | + link : function(scope, element, attrs) { |
|---|
| 288 | + console.log('scope.license: ' + scope.$parent.license); |
|---|
| 289 | + var setter = $parse(attrs.fileLoader).assign; |
|---|
| 290 | + element.bind('change', function(evt) { |
|---|
| 291 | + if (!window.FileReader) { // Browser is not |
|---|
| 292 | + // compatible |
|---|
| 293 | + BootstrapDialog.alert($L.get("Open your .req file with a text editor and copy&paste the content in the form text field?")); |
|---|
| 294 | + return; |
|---|
| 295 | + } |
|---|
| 296 | + console.log('File selected'); |
|---|
| 297 | + // console.log('scope.license: ' + |
|---|
| 298 | + // scope.$parent.license); |
|---|
| 299 | + var field = $parse(attrs.fileLoader); |
|---|
| 300 | + // console.log('field: ' + field); |
|---|
| 301 | + var fileList = evt.target.files; |
|---|
| 302 | + if (fileList != null && fileList[0]) { |
|---|
| 303 | + var reader = new FileReader(); |
|---|
| 304 | + reader.onerror = function(data) { |
|---|
| 305 | + setter(scope.$parent, 'ERROR'); |
|---|
| 306 | + scope.$apply(); |
|---|
| 307 | + } |
|---|
| 308 | + reader.onload = function(data) { |
|---|
| 309 | + setter(scope.$parent, reader.result); |
|---|
| 310 | + scope.$apply(); |
|---|
| 311 | + } |
|---|
| 312 | + |
|---|
| 313 | + reader.readAsText(fileList[0]); |
|---|
| 314 | + } else { |
|---|
| 315 | + setter(scope.$parent, ''); |
|---|
| 316 | + scope.$apply(); |
|---|
| 317 | + } |
|---|
| 318 | + }); |
|---|
| 319 | + |
|---|
| 320 | + } |
|---|
| 321 | + }; |
|---|
| 322 | + }); |
|---|
| 323 | + |
|---|
| 324 | + |
|---|
| 325 | + app.controller('PackAndLicensesCtrl', [ |
|---|
| 326 | + '$scope', |
|---|
| 327 | + '$http', |
|---|
| 328 | + 'toaster', |
|---|
| 329 | + '$store', |
|---|
| 330 | + '$L', |
|---|
| 331 | + function($scope, $http, toaster, $store, $L) { |
|---|
| 332 | + $store.set('location', '/licenses'); |
|---|
| 333 | + |
|---|
| 334 | + $scope.maxLengthErrorMsg = function(displayname, fieldMaxlength) { |
|---|
| 335 | + return $L.get("{0} length is too long (max: {1}).", $L.get(displayname), fieldMaxlength); |
|---|
| 336 | + } |
|---|
| 337 | + $scope.mandatoryFieldErrorMsg = function(displayname) { |
|---|
| 338 | + return $L.get("'{0}' is required.", $L.get(displayname)); |
|---|
| 339 | + } |
|---|
| 340 | + $scope.field1ShouldBeGreaterThanField2 = function(field1, field2) { |
|---|
| 341 | + return $L.get("{0} should be greater than {1}", $L.get(field1), $L.get(field2)); |
|---|
| 342 | + } |
|---|
| 343 | + $scope.ellipsis = function(txt, len) { |
|---|
| 344 | + if (!txt || txt.length <= len) return txt; |
|---|
| 345 | + return txt.substring(0, len) + '...'; |
|---|
| 346 | + } |
|---|
| 347 | + $scope.currentPack = $store.get('currentPack'); |
|---|
| 348 | + |
|---|
| 349 | + }]); |
|---|
| 350 | + |
|---|
| 351 | + app.controller('PacksCtrl', [ |
|---|
| 352 | + '$scope', |
|---|
| 353 | + '$http', |
|---|
| 354 | + '$resource', |
|---|
| 355 | + 'toaster', |
|---|
| 356 | + 'Catalogs', |
|---|
| 357 | + 'Packs', |
|---|
| 358 | + '$store', |
|---|
| 359 | + '$L', |
|---|
| 360 | + function($scope, $http, $resource, toaster, Catalogs, Packs, $store, $L) { |
|---|
| 361 | + $scope.Packs = Packs; |
|---|
| 362 | + |
|---|
| 363 | + |
|---|
| 364 | + $scope.mandatory = { |
|---|
| 365 | + code: true, |
|---|
| 366 | + num_licenses: true, |
|---|
| 367 | + init_valid_date: true, |
|---|
| 368 | + end_valid_date: true, |
|---|
| 369 | + status: true, |
|---|
| 370 | + organization_id: true, |
|---|
| 371 | + license_type_id: true |
|---|
| 372 | + } |
|---|
| 373 | + $scope.maxlength = { |
|---|
| 374 | + code: 50, |
|---|
| 375 | + comments: 1024 |
|---|
| 376 | + } |
|---|
| 377 | + $scope.refs = {}; |
|---|
| 378 | + Catalogs.init().then(function() { |
|---|
| 379 | + var refFields = [{resource: 'organization', name: 'organization_id'},{resource: 'licensetype', name: 'license_type_id'}]; |
|---|
| 380 | + Catalogs.loadRefs(function(refs) { |
|---|
| 381 | + $scope.refs = refs; |
|---|
| 382 | + }, refFields); |
|---|
| 383 | + }); |
|---|
| 384 | + |
|---|
| 385 | + // Used to create the form with the appropriate data |
|---|
| 386 | + $scope.isNew = undefined; |
|---|
| 387 | + |
|---|
| 388 | + // Selected pack from listing |
|---|
| 389 | + // pack is the edited pack, in creation contains the data for |
|---|
| 390 | + // the new pack |
|---|
| 391 | + $scope.pack = null; |
|---|
| 392 | + |
|---|
| 393 | + $scope.packs = Packs.getPacksList(); |
|---|
| 394 | + |
|---|
| 395 | + $scope.save = function() { |
|---|
| 396 | + Packs.savePackData($scope.pack, $scope.isNew, function() { |
|---|
| 397 | + if (!$scope.isNew) { |
|---|
| 398 | + $scope.showForm = false; |
|---|
| 399 | + } else { |
|---|
| 400 | + $scope.newPack(); |
|---|
| 401 | + } |
|---|
| 402 | + $scope.packs = Packs.getPacksList(); |
|---|
| 403 | + }); |
|---|
| 404 | + } |
|---|
| 405 | + |
|---|
| 406 | + /** |
|---|
| 407 | + * Execute an action over the pack, activation, onhold, |
|---|
| 408 | + * cancellation |
|---|
| 409 | + */ |
|---|
| 410 | + $scope.execute = function(action, pack) { |
|---|
| 411 | + var _execute = function(extra_data) { |
|---|
| 412 | + if (extra_data) { |
|---|
| 413 | + Packs[action](pack || $scope.pack, extra_data, function() { |
|---|
| 414 | + if (!$scope.isNew) $scope.showForm = false; |
|---|
| 415 | + $scope.packs = Packs.getPacksList(); |
|---|
| 416 | + }); |
|---|
| 417 | + } else { |
|---|
| 418 | + Packs[action](pack || $scope.pack, function() { |
|---|
| 419 | + if (!$scope.isNew) $scope.showForm = false; |
|---|
| 420 | + $scope.packs = Packs.getPacksList(); |
|---|
| 421 | + }); |
|---|
| 422 | + } |
|---|
| 423 | + } |
|---|
| 424 | + if (action === 'delete') { |
|---|
| 425 | + BootstrapDialog.confirm($L.get("The pack '{0}' will be deleted, are you sure ?", pack.code), function(answer) { |
|---|
| 426 | + if (answer) { |
|---|
| 427 | + _execute(); |
|---|
| 428 | + } |
|---|
| 429 | + }); |
|---|
| 430 | + } else { |
|---|
| 431 | + if (action === 'cancel') { |
|---|
| 432 | + BootstrapDialog.show({ |
|---|
| 433 | + title: $L.get("Pack cancellation"), |
|---|
| 434 | + type: BootstrapDialog.TYPE_DANGER, |
|---|
| 435 | + message: function(dialog) { |
|---|
| 436 | + var $content = $('<div></div>'); |
|---|
| 437 | + var $message = $('<div></div>'); |
|---|
| 438 | + $message.append($('<label/>').text($L.get("The pack '{0}' and all its licenses will be cancelled, this action cannot be undone", pack.code))); |
|---|
| 439 | + $content.append($message); |
|---|
| 440 | + |
|---|
| 441 | + var $message = $('<div style="margin-top:10pt;"/>'); |
|---|
| 442 | + var pageToLoad = dialog.getData('pageToLoad'); |
|---|
| 443 | + $message.append($('<label style="margin-right:5pt;"/>').text($L.get("Cancellation reason:") + " ")); |
|---|
| 444 | + $message.append($('<input type="text" style="width:100%;" maxlength="512" id="_pack_cancellation_reason"/>')); |
|---|
| 445 | + $content.append($message); |
|---|
| 446 | + return $content; |
|---|
| 447 | + }, |
|---|
| 448 | + closable: true, |
|---|
| 449 | + buttons: [{ |
|---|
| 450 | + id: 'btn-cancel', |
|---|
| 451 | + label: $L.get('Close'), |
|---|
| 452 | + cssClass: 'btn-default', |
|---|
| 453 | + action: function(dialogRef) { |
|---|
| 454 | + dialogRef.close(); |
|---|
| 455 | + } |
|---|
| 456 | + }, { |
|---|
| 457 | + id: 'btn-ok', |
|---|
| 458 | + label: $L.get('Cancel pack'), |
|---|
| 459 | + cssClass: 'btn-primary', |
|---|
| 460 | + action: function(dialogRef){ |
|---|
| 461 | + var reason = $('#_pack_cancellation_reason').val(); |
|---|
| 462 | + console.log('Ready to cancel pack, by reason: ' + reason); |
|---|
| 463 | + if (!reason) { |
|---|
| 464 | + $('#_pack_cancellation_reason').focus(); |
|---|
| 465 | + } else { |
|---|
| 466 | + _execute({reason: reason}); |
|---|
| 467 | + dialogRef.close(); |
|---|
| 468 | + } |
|---|
| 469 | + } |
|---|
| 470 | + }] |
|---|
| 471 | + }); |
|---|
| 472 | + } else { |
|---|
| 473 | + _execute(); |
|---|
| 474 | + } |
|---|
| 475 | + } |
|---|
| 476 | + } |
|---|
| 477 | + |
|---|
| 478 | + |
|---|
| 479 | + $scope.newPack = function() { |
|---|
| 480 | + $scope.isNew = true; |
|---|
| 481 | + $scope.showForm = true; |
|---|
| 482 | + $scope.pack = { |
|---|
| 483 | + license_preactivation: true, |
|---|
| 484 | + status: 'CR', |
|---|
| 485 | + num_licenses: 1, |
|---|
| 486 | + init_valid_date: new Date(), |
|---|
| 487 | + default_valid_period: 30, |
|---|
| 488 | + license_type_id: null, |
|---|
| 489 | + organization_id: null // !$scope.refs.organization_id |
|---|
| 490 | + // || |
|---|
| 491 | + // !$scope.refs.organization_id.length |
|---|
| 492 | + // ? null : |
|---|
| 493 | + // $scope.refs.organization_id[0].id |
|---|
| 494 | + } |
|---|
| 495 | + setTimeout(function() { |
|---|
| 496 | + $('#code').focus(); |
|---|
| 497 | + }, 0); |
|---|
| 498 | + } |
|---|
| 499 | + |
|---|
| 500 | + $scope.editPack = function(selectedPack) { |
|---|
| 501 | + $scope.isNew = false; |
|---|
| 502 | + $scope.showForm = true; |
|---|
| 503 | + if (!(selectedPack.init_valid_date instanceof Date)) { |
|---|
| 504 | + selectedPack.init_valid_date = new Date(selectedPack.init_valid_date); |
|---|
| 505 | + } |
|---|
| 506 | + if (!(selectedPack.end_valid_date instanceof Date)) { |
|---|
| 507 | + selectedPack.end_valid_date = new Date(selectedPack.end_valid_date); |
|---|
| 508 | + } |
|---|
| 509 | + |
|---|
| 510 | + $scope.pack = selectedPack; |
|---|
| 511 | + |
|---|
| 512 | + // $scope.pack.organization_name = |
|---|
| 513 | + // $scope.getLabelFromId('organization_id', |
|---|
| 514 | + // $scope.pack.organization_id); |
|---|
| 515 | + $scope.pack.license_type_name = $scope.getLabelFromId('license_type_id', $scope.pack.license_type_id); |
|---|
| 516 | + $scope.pack.status_name = Packs.getStatusName($scope.pack.status); |
|---|
| 517 | + |
|---|
| 518 | + setTimeout(function() { |
|---|
| 519 | + $('#code').focus(); |
|---|
| 520 | + }, 0); |
|---|
| 521 | + } |
|---|
| 522 | + |
|---|
| 523 | + $scope.deletePack = function(selectedPack) { |
|---|
| 524 | + $scope.showForm = false; |
|---|
| 525 | + BootstrapDialog.confirm($L.get("The pack '{0}' will be deleted, are you sure?", selectedPack.code), function(result){ |
|---|
| 526 | + if(result) { |
|---|
| 527 | + var promise = packResource.remove({}, {id: selectedPack.id}).$promise; |
|---|
| 528 | + promise.then(function(data) { |
|---|
| 529 | + $scope.selectPack(null); |
|---|
| 530 | + $scope.packs = packResource.query(); |
|---|
| 531 | + toaster.pop('success', Catalogs.getName(), $L.get("Pack '{0}' deleted successfully", selectedPack.code)); |
|---|
| 532 | + },function(error) { |
|---|
| 533 | + console.log(error); |
|---|
| 534 | + toaster.pop('error', Catalogs.getName(), $L.get("Error deleting pack, reason: {0}. Details: {1}", $L.get(HTTP_ERRORS[error.status]), error.headers('X-SECURIS-ERROR-MSG')), 10000); |
|---|
| 535 | + }); |
|---|
| 536 | + } |
|---|
| 537 | + }); |
|---|
| 538 | + $scope.isNew = false; |
|---|
| 539 | + } |
|---|
| 540 | + |
|---|
| 541 | + |
|---|
| 542 | + $scope.cancel = function() { |
|---|
| 543 | + $scope.showForm = false; |
|---|
| 544 | + } |
|---|
| 545 | + |
|---|
| 546 | + $scope.selectPack = function(pack) { |
|---|
| 547 | + $scope.$parent.currentPack = pack; |
|---|
| 548 | + $store.put('currentPack', pack); |
|---|
| 549 | + $scope.$parent.$broadcast('pack_changed', pack); |
|---|
| 550 | + } |
|---|
| 551 | + |
|---|
| 552 | + $scope.getLabelFromId = function(field, myid) { |
|---|
| 553 | + var label = null; |
|---|
| 554 | + $scope.refs[field].forEach(function (elem) { |
|---|
| 555 | + if (elem.id === myid) { |
|---|
| 556 | + label = elem.label; |
|---|
| 557 | + } |
|---|
| 558 | + }); |
|---|
| 559 | + return label; |
|---|
| 560 | + } |
|---|
| 561 | + |
|---|
| 562 | + $scope.createMetadataRow = function() { |
|---|
| 563 | + if (!$scope.formu.metadata) { |
|---|
| 564 | + $scope.formu.metadata = []; |
|---|
| 565 | + } |
|---|
| 566 | + $scope.formu.metadata.push({key: '', value: '', mandatory: true}); |
|---|
| 567 | + } |
|---|
| 568 | + $scope.removeMetadataKey = function(row_md) { |
|---|
| 569 | + $scope.formu.metadata.splice( $scope.formu.metadata.indexOf(row_md), 1 ); |
|---|
| 570 | + } |
|---|
| 571 | + $scope.updateMetadata = function() { |
|---|
| 572 | + // Called when Application ID change in current field |
|---|
| 573 | + var newLTId = $scope.pack['license_type_id']; |
|---|
| 574 | + if (newLTId) { |
|---|
| 575 | + // Only if there is a "valid" value selected we should |
|---|
| 576 | + // update the metadata |
|---|
| 577 | + Catalogs.getResource('licensetype').get({licenseTypeId: newLTId}).$promise.then(function(lt) { |
|---|
| 578 | + $scope.pack.metadata = []; |
|---|
| 579 | + lt.metadata.forEach(function(md) { |
|---|
| 580 | + $scope.pack.metadata.push({ |
|---|
| 581 | + key: md.key, |
|---|
| 582 | + value: md.value, |
|---|
| 583 | + readonly: !!md.value, |
|---|
| 584 | + mandatory: md.mandatory |
|---|
| 585 | + }); |
|---|
| 586 | + }); |
|---|
| 587 | + }); |
|---|
| 588 | + } |
|---|
| 589 | + } |
|---|
| 590 | + } ]); |
|---|
| 591 | + |
|---|
| 592 | + app.controller('LicensesCtrl', [ |
|---|
| 593 | + '$scope', |
|---|
| 594 | + '$http', |
|---|
| 595 | + '$resource', |
|---|
| 596 | + 'toaster', |
|---|
| 597 | + 'Licenses', |
|---|
| 598 | + '$store', |
|---|
| 599 | + '$L', |
|---|
| 600 | + function($scope, $http, $resource, toaster, Licenses, $store, $L) { |
|---|
| 601 | + $scope.Licenses = Licenses; |
|---|
| 602 | + $scope.$on('pack_changed', function(evt, message) { |
|---|
| 603 | + $scope.licenses = Licenses.getLicensesList($scope.currentPack); |
|---|
| 604 | + $scope.creationAvailable = $scope.currentPack.status == 'AC'; |
|---|
| 605 | + if ($scope.showForm) { |
|---|
| 606 | + if ($scope.isNew) { |
|---|
| 607 | + $scope.license.pack_id = $scope.currentPack.id |
|---|
| 608 | + } else { |
|---|
| 609 | + $scope.showForm = false; |
|---|
| 610 | + } |
|---|
| 611 | + } |
|---|
| 612 | + }) |
|---|
| 613 | + |
|---|
| 614 | + $scope.mandatory = { |
|---|
| 615 | + code: true, |
|---|
| 616 | + email: true |
|---|
| 617 | + } |
|---|
| 618 | + $scope.maxlength = { |
|---|
| 619 | + code: 50, |
|---|
| 620 | + request_data: 500, |
|---|
| 621 | + comments: 1024 |
|---|
| 622 | + } |
|---|
| 623 | + $scope.refs = {}; |
|---|
| 624 | + |
|---|
| 625 | + // Used to create the form with the |
|---|
| 626 | + // appropriate data |
|---|
| 627 | + $scope.isNew = undefined; |
|---|
| 628 | + |
|---|
| 629 | + // Selected license from listing |
|---|
| 630 | + // license is the edited license, in |
|---|
| 631 | + // creation contains the data for |
|---|
| 632 | + // the new license |
|---|
| 633 | + $scope.license = null; |
|---|
| 634 | + if ($scope.currentPack) { |
|---|
| 635 | + $scope.licenses = Licenses.getLicensesList($scope.currentPack); |
|---|
| 636 | + } |
|---|
| 637 | + |
|---|
| 638 | + $scope.save = function() { |
|---|
| 639 | + Licenses.saveLicenseData($scope.license, $scope.isNew, function() { |
|---|
| 640 | + if (!$scope.isNew) { |
|---|
| 641 | + $scope.showForm = false; |
|---|
| 642 | + } else { |
|---|
| 643 | + $scope.newLicense(); |
|---|
| 644 | + } |
|---|
| 645 | + $scope.licenses = Licenses.getLicensesList($scope.currentPack); |
|---|
| 646 | + }); |
|---|
| 647 | + } |
|---|
| 648 | + |
|---|
| 649 | + $scope.newLicense = function() { |
|---|
| 650 | + if (!$scope.currentPack) { |
|---|
| 651 | + BootstrapDialog.show({ |
|---|
| 652 | + title: $L.get('New license'), |
|---|
| 653 | + type: BootstrapDialog.TYPE_WARNING, |
|---|
| 654 | + message: $L.get('Please, select a pack before to create a new license'), |
|---|
| 655 | + buttons: [{ |
|---|
| 656 | + label: 'OK', |
|---|
| 657 | + action: function(dialog) { |
|---|
| 658 | + dialog.close(); |
|---|
| 659 | + } |
|---|
| 660 | + }] |
|---|
| 661 | + }); |
|---|
| 662 | + return; |
|---|
| 663 | + } |
|---|
| 664 | + if (!$scope.creationAvailable) { |
|---|
| 665 | + BootstrapDialog.show({ |
|---|
| 666 | + title: $L.get('Pack not active'), |
|---|
| 667 | + type: BootstrapDialog.TYPE_WARNING, |
|---|
| 668 | + message: $L.get('Current pack is not active, so licenses cannot be created'), |
|---|
| 669 | + buttons: [{ |
|---|
| 670 | + label: 'OK', |
|---|
| 671 | + action: function(dialog) { |
|---|
| 672 | + dialog.close(); |
|---|
| 673 | + } |
|---|
| 674 | + }] |
|---|
| 675 | + }); |
|---|
| 676 | + return; |
|---|
| 677 | + } |
|---|
| 678 | + |
|---|
| 679 | + $scope.isNew = true; |
|---|
| 680 | + $scope.showForm = true; |
|---|
| 681 | + $scope.license = { |
|---|
| 682 | + pack_id: $scope.currentPack.id |
|---|
| 683 | + } |
|---|
| 684 | + setTimeout(function() { |
|---|
| 685 | + $('#licenseForm * #code').focus(); |
|---|
| 686 | + }, 0); |
|---|
| 687 | + } |
|---|
| 688 | + |
|---|
| 689 | + $scope.editLicense = function(selectedlicense) { |
|---|
| 690 | + $scope.isNew = false; |
|---|
| 691 | + $scope.showForm = true; |
|---|
| 692 | + $scope.license = selectedlicense; |
|---|
| 693 | + $scope.license.status_name = Licenses.getStatusName($scope.license.status); |
|---|
| 694 | + |
|---|
| 695 | + setTimeout(function() { |
|---|
| 696 | + $('#licenseForm * #code').focus(); |
|---|
| 697 | + }, 0); |
|---|
| 698 | + } |
|---|
| 699 | + |
|---|
| 700 | + $scope.deletelicense = function(selectedlicense) { |
|---|
| 701 | + $scope.showForm = false; |
|---|
| 702 | + BootstrapDialog.confirm($L.get("The license '{0}' will be deleted, are you sure?", selectedlicense.code), function(result){ |
|---|
| 703 | + if(result) { |
|---|
| 704 | + var promise = licenseResource.remove({}, {id: selectedlicense.id}).$promise; |
|---|
| 705 | + promise.then(function(data) { |
|---|
| 706 | + $scope.selectlicense(null); |
|---|
| 707 | + $scope.licenses = Licenses.getLicensesList($scope.currentPack); |
|---|
| 708 | + toaster.pop('success', Catalogs.getName(), $L.get("License '{0}' deleted successfully", selectedlicense.code)); |
|---|
| 709 | + },function(error) { |
|---|
| 710 | + console.log(error); |
|---|
| 711 | + toaster.pop('error', Catalogs.getName(), $L.get("Error deleting license, reason: {0}. Details: {1}", $L.get(HTTP_ERRORS[error.status]), error.headers('X-SECURIS-ERROR-MSG')), 10000); |
|---|
| 712 | + }); |
|---|
| 713 | + } |
|---|
| 714 | + }); |
|---|
| 715 | + $scope.isNew = false; |
|---|
| 716 | + } |
|---|
| 717 | + |
|---|
| 718 | + $scope.execute = function(action, license) { |
|---|
| 719 | + if (!license) { |
|---|
| 720 | + license = $scope.license; |
|---|
| 721 | + } |
|---|
| 722 | + var _execute = function(extra_data) { |
|---|
| 723 | + if (extra_data) { |
|---|
| 724 | + Licenses[action](license, extra_data, function() { |
|---|
| 725 | + if (!$scope.isNew) $scope.showForm = false; |
|---|
| 726 | + $scope.licenses = Licenses.getLicensesList($scope.currentPack); |
|---|
| 727 | + }); |
|---|
| 728 | + } else { |
|---|
| 729 | + Licenses[action](license, function() { |
|---|
| 730 | + if (!$scope.isNew) $scope.showForm = false; |
|---|
| 731 | + $scope.licenses = Licenses.getLicensesList($scope.currentPack); |
|---|
| 732 | + }); |
|---|
| 733 | + } |
|---|
| 734 | + } |
|---|
| 735 | + if (action === 'delete') { |
|---|
| 736 | + BootstrapDialog.confirm($L.get("The license '{0}' will be deleted, are you sure?", license.code), function(result){ |
|---|
| 737 | + if(result) { |
|---|
| 738 | + _execute(); |
|---|
| 739 | + } |
|---|
| 740 | + }); |
|---|
| 741 | + } else { |
|---|
| 742 | + if (action === 'cancel') { |
|---|
| 743 | + BootstrapDialog.show({ |
|---|
| 744 | + title: $L.get("License cancellation"), |
|---|
| 745 | + type: BootstrapDialog.TYPE_DANGER, |
|---|
| 746 | + message: function(dialog) { |
|---|
| 747 | + var $content = $('<div></div>'); |
|---|
| 748 | + var $message = $('<div></div>'); |
|---|
| 749 | + var pageToLoad = dialog.getData('pageToLoad'); |
|---|
| 750 | + $message.append($('<label/>').text($L.get("This action cannot be undone.", $scope.pack.code))); |
|---|
| 751 | + $content.append($message); |
|---|
| 752 | + |
|---|
| 753 | + var $message = $('<div style="margin-top:10pt;"/>'); |
|---|
| 754 | + $message.append($('<label style="margin-right:5pt;"/>').text($L.get("Cancellation reason:") + " ")); |
|---|
| 755 | + $message.append($('<input type="text" style="width:100%;" maxlength="512" id="_lic_cancellation_reason"/>')); |
|---|
| 756 | + $content.append($message); |
|---|
| 757 | + return $content; |
|---|
| 758 | + }, |
|---|
| 759 | + closable: true, |
|---|
| 760 | + buttons: [{ |
|---|
| 761 | + id: 'btn-cancel', |
|---|
| 762 | + label: $L.get('Close'), |
|---|
| 763 | + cssClass: 'btn-default', |
|---|
| 764 | + action: function(dialogRef) { |
|---|
| 765 | + dialogRef.close(); |
|---|
| 766 | + } |
|---|
| 767 | + }, { |
|---|
| 768 | + id: 'btn-ok', |
|---|
| 769 | + label: $L.get('Cancel license'), |
|---|
| 770 | + cssClass: 'btn-primary', |
|---|
| 771 | + action: function(dialogRef){ |
|---|
| 772 | + var reason = $('#_lic_cancellation_reason').val(); |
|---|
| 773 | + console.log('Ready to cancel license, by reason: ' + reason); |
|---|
| 774 | + if (!reason) { |
|---|
| 775 | + $('#_lic_cancellation_reason').focus(); |
|---|
| 776 | + } else { |
|---|
| 777 | + _execute({reason: reason}); |
|---|
| 778 | + dialogRef.close(); |
|---|
| 779 | + } |
|---|
| 780 | + } |
|---|
| 781 | + }] |
|---|
| 782 | + }); |
|---|
| 783 | + } else { |
|---|
| 784 | + _execute(); |
|---|
| 785 | + } |
|---|
| 786 | + } |
|---|
| 787 | + } |
|---|
| 788 | + |
|---|
| 789 | + |
|---|
| 790 | + $scope.cancel = function() { |
|---|
| 791 | + $scope.showForm = false; |
|---|
| 792 | + } |
|---|
| 793 | + |
|---|
| 794 | + $scope.showStatus = function(lic) { |
|---|
| 795 | + |
|---|
| 796 | + } |
|---|
| 797 | + $scope.showStatusLong = function(license) { |
|---|
| 798 | + |
|---|
| 799 | + } |
|---|
| 800 | + |
|---|
| 801 | + } ]); |
|---|
| 802 | + |
|---|
| 803 | +})(); |
|---|
| .. | .. |
|---|
| 1 | +(function() { |
|---|
| 2 | + 'use strict'; |
|---|
| 3 | + |
|---|
| 4 | + var app = angular.module('securis'); |
|---|
| 5 | + |
|---|
| 6 | + app.controller('LoginCtrl', ['$scope', '$http', '$location', 'toaster', '$L', '$store', |
|---|
| 7 | + function($scope, $http, $location, toaster, $L, $store) { |
|---|
| 8 | + |
|---|
| 9 | + |
|---|
| 10 | + $('#username').focus(); |
|---|
| 11 | + |
|---|
| 12 | + $scope.submit = function() { |
|---|
| 13 | + console.log('Sending user: ' + $scope.username + ' pass: ' + $scope.password); |
|---|
| 14 | + $http({ method: 'POST', |
|---|
| 15 | + url: '/user/login', |
|---|
| 16 | + headers: { |
|---|
| 17 | + "Content-Type": "application/x-www-form-urlencoded" |
|---|
| 18 | + }, |
|---|
| 19 | + data: $.param({ |
|---|
| 20 | + username: $scope.username, |
|---|
| 21 | + password: $scope.password |
|---|
| 22 | + }) |
|---|
| 23 | + }). |
|---|
| 24 | + success(function(data, status, headers, config) { |
|---|
| 25 | + toaster.pop('success', $L.get('Login successful'), $L.get('User {0} has logged in application', $scope.username), 1500); |
|---|
| 26 | + var location = $store.get('location') || '/licenses'; |
|---|
| 27 | + |
|---|
| 28 | + $location.path(location); |
|---|
| 29 | + $store.put('username', $scope.username); |
|---|
| 30 | + $store.put('token', data.token); |
|---|
| 31 | + $http.defaults.headers.common['X-SECURIS-TOKEN'] = data.token; |
|---|
| 32 | + }). |
|---|
| 33 | + error(function(data, status, headers, config) { |
|---|
| 34 | + if (status === 403 /* forbidden */ || status === 401 /* unauthorized */) { |
|---|
| 35 | + toaster.pop('error', $L.get('Login error'), $L.get('Invalid credentials'), 2000); |
|---|
| 36 | + } else if (status === 418 /* Teapot */) { |
|---|
| 37 | + toaster.pop('error', $L.get('Login error'), $L.get(headers['X-SECURIS-ERROR-MSG']), 2000); |
|---|
| 38 | + } else { |
|---|
| 39 | + console.error(data + " status: "+ status); |
|---|
| 40 | + toaster.pop('error', $L.get('Unexpected Login error'), $L.get('Unexpected error HTTP ({0}) accessing to server. Contact with the administrator.', status), 5000); |
|---|
| 41 | + } |
|---|
| 42 | + $('#username').focus(); |
|---|
| 43 | + }); |
|---|
| 44 | + return false; |
|---|
| 45 | + } |
|---|
| 46 | + }]); |
|---|
| 47 | + |
|---|
| 48 | +})(); |
|---|
| .. | .. |
|---|
| 1 | +(function() { |
|---|
| 2 | + 'use strict'; |
|---|
| 3 | + |
|---|
| 4 | + var m = angular.module('securis', [ 'ngRoute', 'ngResource', 'toaster', 'localytics.directives', 'catalogs', 'i18n' ]); |
|---|
| 5 | + |
|---|
| 6 | + m.service('$store', function() { |
|---|
| 7 | + this.get = function(key, defaultValue) { |
|---|
| 8 | + return store.get(key) || defaultValue; |
|---|
| 9 | + } |
|---|
| 10 | + this.set = this.put = function(key, value) { |
|---|
| 11 | + store.set(key, value); |
|---|
| 12 | + } |
|---|
| 13 | + this.remove = this.delete = function(key) { |
|---|
| 14 | + return store.remove(key); |
|---|
| 15 | + } |
|---|
| 16 | + this.clear = this.clearAll = function() { |
|---|
| 17 | + store.clear(); |
|---|
| 18 | + } |
|---|
| 19 | + this.getAll = function() { |
|---|
| 20 | + return store.getAll(); |
|---|
| 21 | + } |
|---|
| 22 | + }); |
|---|
| 23 | + |
|---|
| 24 | + m.factory('securisHttpInterceptor', function($q, $location, $store, toaster) { |
|---|
| 25 | + var isUnauthorizedAccess = function(rejection) { |
|---|
| 26 | + return rejection.status === 401 /* Unauthorized */; |
|---|
| 27 | + } |
|---|
| 28 | + return { |
|---|
| 29 | + 'request': function(config) { |
|---|
| 30 | + var token = $store.get('token'); |
|---|
| 31 | + if (token) { |
|---|
| 32 | + var la = $store.get('last_access'); |
|---|
| 33 | + var now = new Date().getTime(); |
|---|
| 34 | + if (la !== null) { |
|---|
| 35 | + if (now > (la + 1800000)) { // Session timeout is 1/2 |
|---|
| 36 | + // hour |
|---|
| 37 | + $store.clear(); |
|---|
| 38 | + $location.path('/login'); |
|---|
| 39 | + toaster.pop('warning', 'Session has expired', null, 4000); |
|---|
| 40 | + } else { |
|---|
| 41 | + console.debug('Last access recent'); |
|---|
| 42 | + } |
|---|
| 43 | + } |
|---|
| 44 | + $store.set('last_access', now); |
|---|
| 45 | + } |
|---|
| 46 | + return config || $q.when(config); |
|---|
| 47 | + }, |
|---|
| 48 | + 'responseError': function(rejection) { |
|---|
| 49 | + // do something on error |
|---|
| 50 | + if (isUnauthorizedAccess(rejection)) { |
|---|
| 51 | + if ($location.path() !== '/login') { |
|---|
| 52 | + $store.clear(); |
|---|
| 53 | + $location.path('/login'); |
|---|
| 54 | + console.error('There was an unathorized access to url {0}, method: {1}'.$i18n(rejection.config.url, rejection.config.method)); |
|---|
| 55 | + } else { |
|---|
| 56 | + // console.log('Error on login ...') |
|---|
| 57 | + } |
|---|
| 58 | + } |
|---|
| 59 | + return $q.reject(rejection); |
|---|
| 60 | + } |
|---|
| 61 | + }; |
|---|
| 62 | + }); |
|---|
| 63 | + |
|---|
| 64 | + m.config(function($routeProvider, $locationProvider, $httpProvider) { |
|---|
| 65 | + console.debug('Configuring routes...'); |
|---|
| 66 | + $routeProvider.when('/login', { |
|---|
| 67 | + templateUrl: 'login.html', |
|---|
| 68 | + controller: 'LoginCtrl' |
|---|
| 69 | + }); |
|---|
| 70 | + $routeProvider.when('/licenses', { |
|---|
| 71 | + templateUrl: 'licenses.html', |
|---|
| 72 | + controller: 'PackAndLicensesCtrl' |
|---|
| 73 | + }); |
|---|
| 74 | + $routeProvider.when('/admin', { |
|---|
| 75 | + templateUrl: 'admin.html', |
|---|
| 76 | + controller: 'AdminCtrl' |
|---|
| 77 | + }); |
|---|
| 78 | + |
|---|
| 79 | + // configure html5 to get links working on jsfiddle |
|---|
| 80 | + $locationProvider.html5Mode(true); |
|---|
| 81 | + $httpProvider.interceptors.push('securisHttpInterceptor'); |
|---|
| 82 | + }); |
|---|
| 83 | + |
|---|
| 84 | + m.controller('MainCtrl', ['$scope', '$http', '$location', '$L', '$store', |
|---|
| 85 | + function($scope, $http, $location, $L, $store) { |
|---|
| 86 | + |
|---|
| 87 | + $scope.currentRoute = null; |
|---|
| 88 | + console.log('Current location: ' + $location); |
|---|
| 89 | + console.log($location); |
|---|
| 90 | + $location.path('/login'); |
|---|
| 91 | + if ($store.get('token') != null) { |
|---|
| 92 | + |
|---|
| 93 | + $http.get('/check', { |
|---|
| 94 | + headers: { |
|---|
| 95 | + 'X-SECURIS-TOKEN': $store.get('token') |
|---|
| 96 | + } |
|---|
| 97 | + }).success(function(data) { |
|---|
| 98 | + if (data.valid) { |
|---|
| 99 | + $http.defaults.headers.common['X-SECURIS-TOKEN'] = $store.get('token'); |
|---|
| 100 | + var location = $store.get('location') || '/licenses'; |
|---|
| 101 | + |
|---|
| 102 | + $location.path(location); |
|---|
| 103 | + $store.set('user', data.user); |
|---|
| 104 | + } |
|---|
| 105 | + }); |
|---|
| 106 | + } |
|---|
| 107 | + |
|---|
| 108 | + $scope.logout = function() { |
|---|
| 109 | + $store.remove('user'); |
|---|
| 110 | + $store.remove('token'); |
|---|
| 111 | + $location.path('/login'); |
|---|
| 112 | + } |
|---|
| 113 | + |
|---|
| 114 | + }]); |
|---|
| 115 | + |
|---|
| 116 | +})(); |
|---|
| .. | .. |
|---|
| 1 | +/* ================================================ |
|---|
| 2 | + * Make use of Twitter Bootstrap's modal more monkey-friendly. |
|---|
| 3 | + * |
|---|
| 4 | + * For Bootstrap 3. |
|---|
| 5 | + * |
|---|
| 6 | + * javanoob@hotmail.com |
|---|
| 7 | + * |
|---|
| 8 | + * Licensed under The MIT License. |
|---|
| 9 | + * ================================================ */ |
|---|
| 10 | +var BootstrapDialog = null; |
|---|
| 11 | +!function($) { |
|---|
| 12 | + "use strict"; |
|---|
| 13 | + |
|---|
| 14 | + BootstrapDialog = function(options) { |
|---|
| 15 | + this.defaultOptions = { |
|---|
| 16 | + id: BootstrapDialog.newGuid(), |
|---|
| 17 | + type: BootstrapDialog.TYPE_PRIMARY, |
|---|
| 18 | + size: BootstrapDialog.SIZE_NORMAL, |
|---|
| 19 | + cssClass: '', |
|---|
| 20 | + title: null, |
|---|
| 21 | + message: null, |
|---|
| 22 | + buttons: [], |
|---|
| 23 | + closable: true, |
|---|
| 24 | + spinicon: BootstrapDialog.ICON_SPINNER, |
|---|
| 25 | + data: {}, |
|---|
| 26 | + onshow: null, |
|---|
| 27 | + onhide: null, |
|---|
| 28 | + autodestroy: true |
|---|
| 29 | + }; |
|---|
| 30 | + this.indexedButtons = {}; |
|---|
| 31 | + this.realized = false; |
|---|
| 32 | + this.opened = false; |
|---|
| 33 | + this.initOptions(options); |
|---|
| 34 | + this.holdThisInstance(); |
|---|
| 35 | + }; |
|---|
| 36 | + |
|---|
| 37 | + /** |
|---|
| 38 | + * Some constants. |
|---|
| 39 | + */ |
|---|
| 40 | + BootstrapDialog.NAMESPACE = 'bootstrap-dialog'; |
|---|
| 41 | + |
|---|
| 42 | + BootstrapDialog.TYPE_DEFAULT = 'type-default'; |
|---|
| 43 | + BootstrapDialog.TYPE_INFO = 'type-info'; |
|---|
| 44 | + BootstrapDialog.TYPE_PRIMARY = 'type-primary'; |
|---|
| 45 | + BootstrapDialog.TYPE_SUCCESS = 'type-success'; |
|---|
| 46 | + BootstrapDialog.TYPE_WARNING = 'type-warning'; |
|---|
| 47 | + BootstrapDialog.TYPE_DANGER = 'type-danger'; |
|---|
| 48 | + |
|---|
| 49 | + BootstrapDialog.DEFAULT_TEXTS = {}; |
|---|
| 50 | + BootstrapDialog.DEFAULT_TEXTS[BootstrapDialog.TYPE_DEFAULT] = 'Information'; |
|---|
| 51 | + BootstrapDialog.DEFAULT_TEXTS[BootstrapDialog.TYPE_INFO] = 'Information'; |
|---|
| 52 | + BootstrapDialog.DEFAULT_TEXTS[BootstrapDialog.TYPE_PRIMARY] = 'Information'; |
|---|
| 53 | + BootstrapDialog.DEFAULT_TEXTS[BootstrapDialog.TYPE_SUCCESS] = 'Success'; |
|---|
| 54 | + BootstrapDialog.DEFAULT_TEXTS[BootstrapDialog.TYPE_WARNING] = 'Warning'; |
|---|
| 55 | + BootstrapDialog.DEFAULT_TEXTS[BootstrapDialog.TYPE_DANGER] = 'Danger'; |
|---|
| 56 | + |
|---|
| 57 | + BootstrapDialog.SIZE_NORMAL = 'size-normal'; |
|---|
| 58 | + BootstrapDialog.SIZE_LARGE = 'size-large'; |
|---|
| 59 | + |
|---|
| 60 | + BootstrapDialog.BUTTON_SIZES = {}; |
|---|
| 61 | + BootstrapDialog.BUTTON_SIZES[BootstrapDialog.SIZE_NORMAL] = ''; |
|---|
| 62 | + BootstrapDialog.BUTTON_SIZES[BootstrapDialog.SIZE_LARGE] = 'btn-lg'; |
|---|
| 63 | + |
|---|
| 64 | + BootstrapDialog.ICON_SPINNER = 'glyphicon glyphicon-asterisk'; |
|---|
| 65 | + |
|---|
| 66 | + /** |
|---|
| 67 | + * Open / Close all created dialogs all at once. |
|---|
| 68 | + */ |
|---|
| 69 | + BootstrapDialog.dialogs = {}; |
|---|
| 70 | + BootstrapDialog.openAll = function() { |
|---|
| 71 | + $.each(BootstrapDialog.dialogs, function(id, dialogInstance) { |
|---|
| 72 | + dialogInstance.open(); |
|---|
| 73 | + }); |
|---|
| 74 | + }; |
|---|
| 75 | + BootstrapDialog.closeAll = function() { |
|---|
| 76 | + $.each(BootstrapDialog.dialogs, function(id, dialogInstance) { |
|---|
| 77 | + dialogInstance.close(); |
|---|
| 78 | + }); |
|---|
| 79 | + }; |
|---|
| 80 | + |
|---|
| 81 | + BootstrapDialog.prototype = { |
|---|
| 82 | + constructor: BootstrapDialog, |
|---|
| 83 | + initOptions: function(options) { |
|---|
| 84 | + this.options = $.extend(true, this.defaultOptions, options); |
|---|
| 85 | + |
|---|
| 86 | + return this; |
|---|
| 87 | + }, |
|---|
| 88 | + holdThisInstance: function() { |
|---|
| 89 | + BootstrapDialog.dialogs[this.getId()] = this; |
|---|
| 90 | + |
|---|
| 91 | + return this; |
|---|
| 92 | + }, |
|---|
| 93 | + initModalStuff: function() { |
|---|
| 94 | + this.setModal(this.createModal()) |
|---|
| 95 | + .setModalDialog(this.createModalDialog()) |
|---|
| 96 | + .setModalContent(this.createModalContent()) |
|---|
| 97 | + .setModalHeader(this.createModalHeader()) |
|---|
| 98 | + .setModalBody(this.createModalBody()) |
|---|
| 99 | + .setModalFooter(this.createModalFooter()); |
|---|
| 100 | + |
|---|
| 101 | + this.getModal().append(this.getModalDialog()); |
|---|
| 102 | + this.getModalDialog().append(this.getModalContent()); |
|---|
| 103 | + this.getModalContent() |
|---|
| 104 | + .append(this.getModalHeader()) |
|---|
| 105 | + .append(this.getModalBody()) |
|---|
| 106 | + .append(this.getModalFooter()); |
|---|
| 107 | + |
|---|
| 108 | + return this; |
|---|
| 109 | + }, |
|---|
| 110 | + createModal: function() { |
|---|
| 111 | + return $('<div class="modal fade" tabindex="-1" id="' + this.getId() + '"></div>'); |
|---|
| 112 | + }, |
|---|
| 113 | + getModal: function() { |
|---|
| 114 | + return this.$modal; |
|---|
| 115 | + }, |
|---|
| 116 | + setModal: function($modal) { |
|---|
| 117 | + this.$modal = $modal; |
|---|
| 118 | + |
|---|
| 119 | + return this; |
|---|
| 120 | + }, |
|---|
| 121 | + createModalDialog: function() { |
|---|
| 122 | + return $('<div class="modal-dialog"></div>'); |
|---|
| 123 | + }, |
|---|
| 124 | + getModalDialog: function() { |
|---|
| 125 | + return this.$modalDialog; |
|---|
| 126 | + }, |
|---|
| 127 | + setModalDialog: function($modalDialog) { |
|---|
| 128 | + this.$modalDialog = $modalDialog; |
|---|
| 129 | + |
|---|
| 130 | + return this; |
|---|
| 131 | + }, |
|---|
| 132 | + createModalContent: function() { |
|---|
| 133 | + return $('<div class="modal-content"></div>'); |
|---|
| 134 | + }, |
|---|
| 135 | + getModalContent: function() { |
|---|
| 136 | + return this.$modalContent; |
|---|
| 137 | + }, |
|---|
| 138 | + setModalContent: function($modalContent) { |
|---|
| 139 | + this.$modalContent = $modalContent; |
|---|
| 140 | + |
|---|
| 141 | + return this; |
|---|
| 142 | + }, |
|---|
| 143 | + createModalHeader: function() { |
|---|
| 144 | + return $('<div class="modal-header"></div>'); |
|---|
| 145 | + }, |
|---|
| 146 | + getModalHeader: function() { |
|---|
| 147 | + return this.$modalHeader; |
|---|
| 148 | + }, |
|---|
| 149 | + setModalHeader: function($modalHeader) { |
|---|
| 150 | + this.$modalHeader = $modalHeader; |
|---|
| 151 | + |
|---|
| 152 | + return this; |
|---|
| 153 | + }, |
|---|
| 154 | + createModalBody: function() { |
|---|
| 155 | + return $('<div class="modal-body"></div>'); |
|---|
| 156 | + }, |
|---|
| 157 | + getModalBody: function() { |
|---|
| 158 | + return this.$modalBody; |
|---|
| 159 | + }, |
|---|
| 160 | + setModalBody: function($modalBody) { |
|---|
| 161 | + this.$modalBody = $modalBody; |
|---|
| 162 | + |
|---|
| 163 | + return this; |
|---|
| 164 | + }, |
|---|
| 165 | + createModalFooter: function() { |
|---|
| 166 | + return $('<div class="modal-footer"></div>'); |
|---|
| 167 | + }, |
|---|
| 168 | + getModalFooter: function() { |
|---|
| 169 | + return this.$modaFooter; |
|---|
| 170 | + }, |
|---|
| 171 | + setModalFooter: function($modaFooter) { |
|---|
| 172 | + this.$modaFooter = $modaFooter; |
|---|
| 173 | + |
|---|
| 174 | + return this; |
|---|
| 175 | + }, |
|---|
| 176 | + createDynamicContent: function(rawContent) { |
|---|
| 177 | + var content = null; |
|---|
| 178 | + if (typeof rawContent === 'function') { |
|---|
| 179 | + content = rawContent.call(rawContent, this); |
|---|
| 180 | + } else { |
|---|
| 181 | + content = rawContent; |
|---|
| 182 | + } |
|---|
| 183 | + if (typeof content === 'string') { |
|---|
| 184 | + content = this.formatStringContent(content); |
|---|
| 185 | + } |
|---|
| 186 | + |
|---|
| 187 | + return content; |
|---|
| 188 | + }, |
|---|
| 189 | + formatStringContent: function(content) { |
|---|
| 190 | + return content.replace(/\r\n/g, '<br />').replace(/[\r\n]/g, '<br />'); |
|---|
| 191 | + }, |
|---|
| 192 | + setData: function(key, value) { |
|---|
| 193 | + this.options.data[key] = value; |
|---|
| 194 | + |
|---|
| 195 | + return this; |
|---|
| 196 | + }, |
|---|
| 197 | + getData: function(key) { |
|---|
| 198 | + return this.options.data[key]; |
|---|
| 199 | + }, |
|---|
| 200 | + setId: function(id) { |
|---|
| 201 | + this.options.id = id; |
|---|
| 202 | + |
|---|
| 203 | + return this; |
|---|
| 204 | + }, |
|---|
| 205 | + getId: function() { |
|---|
| 206 | + return this.options.id; |
|---|
| 207 | + }, |
|---|
| 208 | + getType: function() { |
|---|
| 209 | + return this.options.type; |
|---|
| 210 | + }, |
|---|
| 211 | + setType: function(type) { |
|---|
| 212 | + this.options.type = type; |
|---|
| 213 | + |
|---|
| 214 | + return this; |
|---|
| 215 | + }, |
|---|
| 216 | + getSize: function() { |
|---|
| 217 | + return this.options.size; |
|---|
| 218 | + }, |
|---|
| 219 | + setSize: function(size) { |
|---|
| 220 | + this.options.size = size; |
|---|
| 221 | + |
|---|
| 222 | + return this; |
|---|
| 223 | + }, |
|---|
| 224 | + getCssClass: function() { |
|---|
| 225 | + return this.options.cssClass; |
|---|
| 226 | + }, |
|---|
| 227 | + setCssClass: function(cssClass){ |
|---|
| 228 | + this.options.cssClass = cssClass; |
|---|
| 229 | + |
|---|
| 230 | + return this; |
|---|
| 231 | + }, |
|---|
| 232 | + getTitle: function() { |
|---|
| 233 | + return this.options.title; |
|---|
| 234 | + }, |
|---|
| 235 | + setTitle: function(title) { |
|---|
| 236 | + this.options.title = title; |
|---|
| 237 | + |
|---|
| 238 | + return this; |
|---|
| 239 | + }, |
|---|
| 240 | + getMessage: function() { |
|---|
| 241 | + return this.options.message; |
|---|
| 242 | + }, |
|---|
| 243 | + setMessage: function(message) { |
|---|
| 244 | + this.options.message = message; |
|---|
| 245 | + |
|---|
| 246 | + return this; |
|---|
| 247 | + }, |
|---|
| 248 | + isClosable: function() { |
|---|
| 249 | + return this.options.closable; |
|---|
| 250 | + }, |
|---|
| 251 | + setClosable: function(closable) { |
|---|
| 252 | + this.options.closable = closable; |
|---|
| 253 | + this.updateClosable(); |
|---|
| 254 | + |
|---|
| 255 | + return this; |
|---|
| 256 | + }, |
|---|
| 257 | + getSpinicon: function() { |
|---|
| 258 | + return this.options.spinicon; |
|---|
| 259 | + }, |
|---|
| 260 | + setSpinicon: function(spinicon) { |
|---|
| 261 | + this.options.spinicon = spinicon; |
|---|
| 262 | + |
|---|
| 263 | + return this; |
|---|
| 264 | + }, |
|---|
| 265 | + addButton: function(button) { |
|---|
| 266 | + this.options.buttons.push(button); |
|---|
| 267 | + |
|---|
| 268 | + return this; |
|---|
| 269 | + }, |
|---|
| 270 | + addButtons: function(buttons) { |
|---|
| 271 | + var that = this; |
|---|
| 272 | + |
|---|
| 273 | + $.each(buttons, function(index, button) { |
|---|
| 274 | + that.addButton(button); |
|---|
| 275 | + }); |
|---|
| 276 | + |
|---|
| 277 | + return this; |
|---|
| 278 | + }, |
|---|
| 279 | + getButtons: function() { |
|---|
| 280 | + return this.options.buttons; |
|---|
| 281 | + }, |
|---|
| 282 | + setButtons: function(buttons) { |
|---|
| 283 | + this.options.buttons = buttons; |
|---|
| 284 | + |
|---|
| 285 | + return this; |
|---|
| 286 | + }, |
|---|
| 287 | + /** |
|---|
| 288 | + * If there is id provided for a button option, it will be in dialog.indexedButtons list. |
|---|
| 289 | + * |
|---|
| 290 | + * In that case you can use dialog.getButton(id) to find the button. |
|---|
| 291 | + * |
|---|
| 292 | + * @param {type} id |
|---|
| 293 | + * @returns {undefined} |
|---|
| 294 | + */ |
|---|
| 295 | + getButton: function(id) { |
|---|
| 296 | + if (typeof this.indexedButtons[id] !== 'undefined') { |
|---|
| 297 | + return this.indexedButtons[id]; |
|---|
| 298 | + } |
|---|
| 299 | + |
|---|
| 300 | + return null; |
|---|
| 301 | + }, |
|---|
| 302 | + getButtonSize: function() { |
|---|
| 303 | + if (typeof BootstrapDialog.BUTTON_SIZES[this.getSize()] !== 'undefined') { |
|---|
| 304 | + return BootstrapDialog.BUTTON_SIZES[this.getSize()]; |
|---|
| 305 | + } |
|---|
| 306 | + |
|---|
| 307 | + return ''; |
|---|
| 308 | + }, |
|---|
| 309 | + isAutodestroy: function() { |
|---|
| 310 | + return this.options.autodestroy; |
|---|
| 311 | + }, |
|---|
| 312 | + setAutodestroy: function(autodestroy) { |
|---|
| 313 | + this.options.autodestroy = autodestroy; |
|---|
| 314 | + }, |
|---|
| 315 | + getDefaultText: function() { |
|---|
| 316 | + return BootstrapDialog.DEFAULT_TEXTS[this.getType()]; |
|---|
| 317 | + }, |
|---|
| 318 | + getNamespace: function(name) { |
|---|
| 319 | + return BootstrapDialog.NAMESPACE + '-' + name; |
|---|
| 320 | + }, |
|---|
| 321 | + createHeaderContent: function() { |
|---|
| 322 | + var $container = $('<div></div>'); |
|---|
| 323 | + $container.addClass(this.getNamespace('header')); |
|---|
| 324 | + |
|---|
| 325 | + // title |
|---|
| 326 | + $container.append(this.createTitleContent()); |
|---|
| 327 | + |
|---|
| 328 | + // Close button |
|---|
| 329 | + $container.append(this.createCloseButton()); |
|---|
| 330 | + |
|---|
| 331 | + return $container; |
|---|
| 332 | + }, |
|---|
| 333 | + createTitleContent: function() { |
|---|
| 334 | + var $title = $('<div></div>'); |
|---|
| 335 | + $title.addClass(this.getNamespace('title')); |
|---|
| 336 | + $title.append(this.getTitle() !== null ? this.createDynamicContent(this.getTitle()) : this.getDefaultText()); |
|---|
| 337 | + |
|---|
| 338 | + return $title; |
|---|
| 339 | + }, |
|---|
| 340 | + createCloseButton: function() { |
|---|
| 341 | + var $container = $('<div></div>'); |
|---|
| 342 | + $container.addClass(this.getNamespace('close-button')); |
|---|
| 343 | + var $icon = $('<button class="close">×</button>'); |
|---|
| 344 | + $container.append($icon); |
|---|
| 345 | + $container.on('click', {dialog: this}, function(event) { |
|---|
| 346 | + event.data.dialog.close(); |
|---|
| 347 | + }); |
|---|
| 348 | + |
|---|
| 349 | + return $container; |
|---|
| 350 | + }, |
|---|
| 351 | + createBodyContent: function() { |
|---|
| 352 | + var $container = $('<div></div>'); |
|---|
| 353 | + $container.addClass(this.getNamespace('body')); |
|---|
| 354 | + |
|---|
| 355 | + // Message |
|---|
| 356 | + $container.append(this.createMessageContent()); |
|---|
| 357 | + |
|---|
| 358 | + return $container; |
|---|
| 359 | + }, |
|---|
| 360 | + createMessageContent: function() { |
|---|
| 361 | + var $message = $('<div></div>'); |
|---|
| 362 | + $message.addClass(this.getNamespace('message')); |
|---|
| 363 | + $message.append(this.createDynamicContent(this.getMessage())); |
|---|
| 364 | + |
|---|
| 365 | + return $message; |
|---|
| 366 | + }, |
|---|
| 367 | + createFooterContent: function() { |
|---|
| 368 | + var $container = $('<div></div>'); |
|---|
| 369 | + $container.addClass(this.getNamespace('footer')); |
|---|
| 370 | + |
|---|
| 371 | + // Buttons |
|---|
| 372 | + $container.append(this.createFooterButtons()); |
|---|
| 373 | + |
|---|
| 374 | + return $container; |
|---|
| 375 | + }, |
|---|
| 376 | + createFooterButtons: function() { |
|---|
| 377 | + var that = this; |
|---|
| 378 | + var $container = $('<div></div>'); |
|---|
| 379 | + $container.addClass(this.getNamespace('footer-buttons')); |
|---|
| 380 | + this.indexedButtons = {}; |
|---|
| 381 | + $.each(this.options.buttons, function(index, button) { |
|---|
| 382 | + var $button = that.createButton(button); |
|---|
| 383 | + if (typeof button.id !== 'undefined') { |
|---|
| 384 | + that.indexedButtons[button.id] = $button; |
|---|
| 385 | + } |
|---|
| 386 | + $container.append($button); |
|---|
| 387 | + }); |
|---|
| 388 | + |
|---|
| 389 | + return $container; |
|---|
| 390 | + }, |
|---|
| 391 | + createButton: function(button) { |
|---|
| 392 | + var $button = $('<button class="btn"></button>'); |
|---|
| 393 | + $button.addClass(this.getButtonSize()); |
|---|
| 394 | + |
|---|
| 395 | + // Icon |
|---|
| 396 | + if (typeof button.icon !== undefined && $.trim(button.icon) !== '') { |
|---|
| 397 | + $button.append(this.createButtonIcon(button.icon)); |
|---|
| 398 | + } |
|---|
| 399 | + |
|---|
| 400 | + // Label |
|---|
| 401 | + if (typeof button.label !== undefined) { |
|---|
| 402 | + $button.append(button.label); |
|---|
| 403 | + } |
|---|
| 404 | + |
|---|
| 405 | + // Css class |
|---|
| 406 | + if (typeof button.cssClass !== undefined && $.trim(button.cssClass) !== '') { |
|---|
| 407 | + $button.addClass(button.cssClass); |
|---|
| 408 | + } else { |
|---|
| 409 | + $button.addClass('btn-default'); |
|---|
| 410 | + } |
|---|
| 411 | + |
|---|
| 412 | + // Button on click |
|---|
| 413 | + $button.on('click', {dialog: this, button: button}, function(event) { |
|---|
| 414 | + var dialog = event.data.dialog; |
|---|
| 415 | + var button = event.data.button; |
|---|
| 416 | + if (typeof button.action === 'function') { |
|---|
| 417 | + button.action.call(this, dialog); |
|---|
| 418 | + } |
|---|
| 419 | + |
|---|
| 420 | + if (button.autospin) { |
|---|
| 421 | + var $button = $(this); |
|---|
| 422 | + $button.find('.' + dialog.getNamespace('button-icon')).remove(); |
|---|
| 423 | + $button.prepend(dialog.createButtonIcon(dialog.getSpinicon()).addClass('icon-spin')); |
|---|
| 424 | + } |
|---|
| 425 | + }); |
|---|
| 426 | + |
|---|
| 427 | + return $button; |
|---|
| 428 | + }, |
|---|
| 429 | + createButtonIcon: function(icon) { |
|---|
| 430 | + var $icon = $('<span></span>'); |
|---|
| 431 | + $icon.addClass(this.getNamespace('button-icon')).addClass(icon); |
|---|
| 432 | + |
|---|
| 433 | + return $icon; |
|---|
| 434 | + }, |
|---|
| 435 | + /** |
|---|
| 436 | + * Invoke this only after the dialog is realized. |
|---|
| 437 | + * |
|---|
| 438 | + * @param {type} enable |
|---|
| 439 | + * @returns {undefined} |
|---|
| 440 | + */ |
|---|
| 441 | + enableButtons: function(enable) { |
|---|
| 442 | + var $buttons = this.getModalFooter().find('.btn'); |
|---|
| 443 | + $buttons.prop("disabled", !enable).toggleClass('disabled', !enable); |
|---|
| 444 | + |
|---|
| 445 | + return this; |
|---|
| 446 | + }, |
|---|
| 447 | + /** |
|---|
| 448 | + * Invoke this only after the dialog is realized. |
|---|
| 449 | + * |
|---|
| 450 | + * @param {type} enable |
|---|
| 451 | + * @returns {undefined} |
|---|
| 452 | + */ |
|---|
| 453 | + updateClosable: function() { |
|---|
| 454 | + if (this.isRealized()) { |
|---|
| 455 | + // Backdrop, I did't find a way to change bs3 backdrop option after the dialog is popped up, so here's a new wheel. |
|---|
| 456 | + var $theBigMask = this.getModal(); |
|---|
| 457 | + $theBigMask.off('click').on('click', {dialog: this}, function(event) { |
|---|
| 458 | + event.target === this && event.data.dialog.isClosable() && event.data.dialog.close(); |
|---|
| 459 | + }); |
|---|
| 460 | + |
|---|
| 461 | + // Close button |
|---|
| 462 | + this.getModalHeader().find('.' + this.getNamespace('close-button')).toggle(this.isClosable()); |
|---|
| 463 | + |
|---|
| 464 | + // ESC key support |
|---|
| 465 | + $theBigMask.off('keyup').on('keyup', {dialog: this}, function(event) { |
|---|
| 466 | + event.which === 27 && event.data.dialog.isClosable() && event.data.dialog.close(); |
|---|
| 467 | + }); |
|---|
| 468 | + } |
|---|
| 469 | + |
|---|
| 470 | + return this; |
|---|
| 471 | + }, |
|---|
| 472 | + /** |
|---|
| 473 | + * Set handler for modal event 'show'. |
|---|
| 474 | + * This is a setter! |
|---|
| 475 | + * |
|---|
| 476 | + * @param {type} onopen |
|---|
| 477 | + * @returns {_L9.BootstrapDialog.prototype} |
|---|
| 478 | + */ |
|---|
| 479 | + onShow: function(onshow) { |
|---|
| 480 | + this.options.onshow = onshow; |
|---|
| 481 | + |
|---|
| 482 | + return this; |
|---|
| 483 | + }, |
|---|
| 484 | + /** |
|---|
| 485 | + * Set handler for modal event 'hide'. |
|---|
| 486 | + * This is a setter! |
|---|
| 487 | + * |
|---|
| 488 | + * @param {type} onclose |
|---|
| 489 | + * @returns {_L9.BootstrapDialog.prototype} |
|---|
| 490 | + */ |
|---|
| 491 | + onHide: function(onhide) { |
|---|
| 492 | + this.options.onhide = onhide; |
|---|
| 493 | + |
|---|
| 494 | + return this; |
|---|
| 495 | + }, |
|---|
| 496 | + isRealized: function() { |
|---|
| 497 | + return this.realized; |
|---|
| 498 | + }, |
|---|
| 499 | + setRealized: function(realized) { |
|---|
| 500 | + this.realized = realized; |
|---|
| 501 | + |
|---|
| 502 | + return this; |
|---|
| 503 | + }, |
|---|
| 504 | + isOpened: function() { |
|---|
| 505 | + return this.opened; |
|---|
| 506 | + }, |
|---|
| 507 | + setOpened: function(opened) { |
|---|
| 508 | + this.opened = opened; |
|---|
| 509 | + |
|---|
| 510 | + return this; |
|---|
| 511 | + }, |
|---|
| 512 | + handleModalEvents: function() { |
|---|
| 513 | + this.getModal().on('show.bs.modal', {dialog: this}, function(event) { |
|---|
| 514 | + var dialog = event.data.dialog; |
|---|
| 515 | + typeof dialog.options.onshow === 'function' && dialog.options.onshow(dialog); |
|---|
| 516 | + dialog.showPageScrollBar(true); |
|---|
| 517 | + }); |
|---|
| 518 | + this.getModal().on('hide.bs.modal', {dialog: this}, function(event) { |
|---|
| 519 | + var dialog = event.data.dialog; |
|---|
| 520 | + typeof dialog.options.onhide === 'function' && dialog.options.onhide(dialog); |
|---|
| 521 | + }); |
|---|
| 522 | + this.getModal().on('hidden.bs.modal', {dialog: this}, function(event) { |
|---|
| 523 | + var dialog = event.data.dialog; |
|---|
| 524 | + dialog.isAutodestroy() && $(this).remove(); |
|---|
| 525 | + dialog.showPageScrollBar(false); |
|---|
| 526 | + }); |
|---|
| 527 | + |
|---|
| 528 | + return this; |
|---|
| 529 | + }, |
|---|
| 530 | + showPageScrollBar: function(show) { |
|---|
| 531 | + $(document.body).toggleClass('modal-open', show); |
|---|
| 532 | + }, |
|---|
| 533 | + realize: function() { |
|---|
| 534 | + this.initModalStuff(); |
|---|
| 535 | + this.getModal().addClass(BootstrapDialog.NAMESPACE) |
|---|
| 536 | + .addClass(this.getType()) |
|---|
| 537 | + .addClass(this.getSize()) |
|---|
| 538 | + .addClass(this.getCssClass()); |
|---|
| 539 | + this.getModalHeader().append(this.createHeaderContent()); |
|---|
| 540 | + this.getModalBody().append(this.createBodyContent()); |
|---|
| 541 | + this.getModalFooter().append(this.createFooterContent()); |
|---|
| 542 | + this.getModal().modal({ |
|---|
| 543 | + backdrop: 'static', |
|---|
| 544 | + keyboard: false, |
|---|
| 545 | + show: false |
|---|
| 546 | + }); |
|---|
| 547 | + this.handleModalEvents(); |
|---|
| 548 | + this.setRealized(true); |
|---|
| 549 | + |
|---|
| 550 | + return this; |
|---|
| 551 | + }, |
|---|
| 552 | + open: function() { |
|---|
| 553 | + !this.isRealized() && this.realize(); |
|---|
| 554 | + this.updateClosable(); |
|---|
| 555 | + this.getModal().modal('show'); |
|---|
| 556 | + this.setOpened(true); |
|---|
| 557 | + |
|---|
| 558 | + return this; |
|---|
| 559 | + }, |
|---|
| 560 | + close: function() { |
|---|
| 561 | + this.getModal().modal('hide'); |
|---|
| 562 | + if (this.isAutodestroy()) { |
|---|
| 563 | + delete BootstrapDialog.dialogs[this.getId()]; |
|---|
| 564 | + } |
|---|
| 565 | + this.setOpened(false); |
|---|
| 566 | + |
|---|
| 567 | + return this; |
|---|
| 568 | + } |
|---|
| 569 | + }; |
|---|
| 570 | + |
|---|
| 571 | + /** |
|---|
| 572 | + * RFC4122 version 4 compliant unique id creator. |
|---|
| 573 | + * |
|---|
| 574 | + * Added by https://github.com/tufanbarisyildirim/ |
|---|
| 575 | + * |
|---|
| 576 | + * @returns {String} |
|---|
| 577 | + */ |
|---|
| 578 | + BootstrapDialog.newGuid = function() { |
|---|
| 579 | + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { |
|---|
| 580 | + var r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8); |
|---|
| 581 | + return v.toString(16); |
|---|
| 582 | + }); |
|---|
| 583 | + }; |
|---|
| 584 | + |
|---|
| 585 | + /* ================================================ |
|---|
| 586 | + * For lazy people |
|---|
| 587 | + * ================================================ */ |
|---|
| 588 | + |
|---|
| 589 | + /** |
|---|
| 590 | + * Shortcut function: show |
|---|
| 591 | + * |
|---|
| 592 | + * @param {type} options |
|---|
| 593 | + * @returns {undefined} |
|---|
| 594 | + */ |
|---|
| 595 | + BootstrapDialog.show = function(options) { |
|---|
| 596 | + new BootstrapDialog(options).open(); |
|---|
| 597 | + }; |
|---|
| 598 | + |
|---|
| 599 | + /** |
|---|
| 600 | + * Alert window |
|---|
| 601 | + * |
|---|
| 602 | + * @param {type} message |
|---|
| 603 | + * @param {type} callback |
|---|
| 604 | + * @returns {undefined} |
|---|
| 605 | + */ |
|---|
| 606 | + BootstrapDialog.alert = function(message, callback) { |
|---|
| 607 | + new BootstrapDialog({ |
|---|
| 608 | + message: message, |
|---|
| 609 | + data: { |
|---|
| 610 | + 'callback': callback |
|---|
| 611 | + }, |
|---|
| 612 | + closable: false, |
|---|
| 613 | + buttons: [{ |
|---|
| 614 | + label: 'OK', |
|---|
| 615 | + action: function(dialog) { |
|---|
| 616 | + typeof dialog.getData('callback') === 'function' && dialog.getData('callback')(true); |
|---|
| 617 | + dialog.close(); |
|---|
| 618 | + } |
|---|
| 619 | + }] |
|---|
| 620 | + }).open(); |
|---|
| 621 | + }; |
|---|
| 622 | + |
|---|
| 623 | + /** |
|---|
| 624 | + * Confirm window |
|---|
| 625 | + * |
|---|
| 626 | + * @param {type} message |
|---|
| 627 | + * @param {type} callback |
|---|
| 628 | + * @returns {undefined} |
|---|
| 629 | + */ |
|---|
| 630 | + BootstrapDialog.confirm = function(message, callback) { |
|---|
| 631 | + new BootstrapDialog({ |
|---|
| 632 | + title: 'Confirmation', |
|---|
| 633 | + message: message, |
|---|
| 634 | + closable: false, |
|---|
| 635 | + data: { |
|---|
| 636 | + 'callback': callback |
|---|
| 637 | + }, |
|---|
| 638 | + buttons: [{ |
|---|
| 639 | + label: 'Cancel', |
|---|
| 640 | + action: function(dialog) { |
|---|
| 641 | + typeof dialog.getData('callback') === 'function' && dialog.getData('callback')(false); |
|---|
| 642 | + dialog.close(); |
|---|
| 643 | + } |
|---|
| 644 | + }, { |
|---|
| 645 | + label: 'OK', |
|---|
| 646 | + cssClass: 'btn-primary', |
|---|
| 647 | + action: function(dialog) { |
|---|
| 648 | + typeof dialog.getData('callback') === 'function' && dialog.getData('callback')(true); |
|---|
| 649 | + dialog.close(); |
|---|
| 650 | + } |
|---|
| 651 | + }] |
|---|
| 652 | + }).open(); |
|---|
| 653 | + }; |
|---|
| 654 | +}(window.jQuery); |
|---|
| .. | .. |
|---|
| 1 | +/*! |
|---|
| 2 | + * Bootstrap v3.2.0 (http://getbootstrap.com) |
|---|
| 3 | + * Copyright 2011-2014 Twitter, Inc. |
|---|
| 4 | + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
|---|
| 5 | + */ |
|---|
| 6 | + |
|---|
| 7 | +if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') } |
|---|
| 8 | + |
|---|
| 9 | +/* ======================================================================== |
|---|
| 10 | + * Bootstrap: transition.js v3.2.0 |
|---|
| 11 | + * http://getbootstrap.com/javascript/#transitions |
|---|
| 12 | + * ======================================================================== |
|---|
| 13 | + * Copyright 2011-2014 Twitter, Inc. |
|---|
| 14 | + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
|---|
| 15 | + * ======================================================================== */ |
|---|
| 16 | + |
|---|
| 17 | + |
|---|
| 18 | ++function ($) { |
|---|
| 19 | + 'use strict'; |
|---|
| 20 | + |
|---|
| 21 | + // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) |
|---|
| 22 | + // ============================================================ |
|---|
| 23 | + |
|---|
| 24 | + function transitionEnd() { |
|---|
| 25 | + var el = document.createElement('bootstrap') |
|---|
| 26 | + |
|---|
| 27 | + var transEndEventNames = { |
|---|
| 28 | + WebkitTransition : 'webkitTransitionEnd', |
|---|
| 29 | + MozTransition : 'transitionend', |
|---|
| 30 | + OTransition : 'oTransitionEnd otransitionend', |
|---|
| 31 | + transition : 'transitionend' |
|---|
| 32 | + } |
|---|
| 33 | + |
|---|
| 34 | + for (var name in transEndEventNames) { |
|---|
| 35 | + if (el.style[name] !== undefined) { |
|---|
| 36 | + return { end: transEndEventNames[name] } |
|---|
| 37 | + } |
|---|
| 38 | + } |
|---|
| 39 | + |
|---|
| 40 | + return false // explicit for ie8 ( ._.) |
|---|
| 41 | + } |
|---|
| 42 | + |
|---|
| 43 | + // http://blog.alexmaccaw.com/css-transitions |
|---|
| 44 | + $.fn.emulateTransitionEnd = function (duration) { |
|---|
| 45 | + var called = false |
|---|
| 46 | + var $el = this |
|---|
| 47 | + $(this).one('bsTransitionEnd', function () { called = true }) |
|---|
| 48 | + var callback = function () { if (!called) $($el).trigger($.support.transition.end) } |
|---|
| 49 | + setTimeout(callback, duration) |
|---|
| 50 | + return this |
|---|
| 51 | + } |
|---|
| 52 | + |
|---|
| 53 | + $(function () { |
|---|
| 54 | + $.support.transition = transitionEnd() |
|---|
| 55 | + |
|---|
| 56 | + if (!$.support.transition) return |
|---|
| 57 | + |
|---|
| 58 | + $.event.special.bsTransitionEnd = { |
|---|
| 59 | + bindType: $.support.transition.end, |
|---|
| 60 | + delegateType: $.support.transition.end, |
|---|
| 61 | + handle: function (e) { |
|---|
| 62 | + if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) |
|---|
| 63 | + } |
|---|
| 64 | + } |
|---|
| 65 | + }) |
|---|
| 66 | + |
|---|
| 67 | +}(jQuery); |
|---|
| 68 | + |
|---|
| 69 | +/* ======================================================================== |
|---|
| 70 | + * Bootstrap: alert.js v3.2.0 |
|---|
| 71 | + * http://getbootstrap.com/javascript/#alerts |
|---|
| 72 | + * ======================================================================== |
|---|
| 73 | + * Copyright 2011-2014 Twitter, Inc. |
|---|
| 74 | + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
|---|
| 75 | + * ======================================================================== */ |
|---|
| 76 | + |
|---|
| 77 | + |
|---|
| 78 | ++function ($) { |
|---|
| 79 | + 'use strict'; |
|---|
| 80 | + |
|---|
| 81 | + // ALERT CLASS DEFINITION |
|---|
| 82 | + // ====================== |
|---|
| 83 | + |
|---|
| 84 | + var dismiss = '[data-dismiss="alert"]' |
|---|
| 85 | + var Alert = function (el) { |
|---|
| 86 | + $(el).on('click', dismiss, this.close) |
|---|
| 87 | + } |
|---|
| 88 | + |
|---|
| 89 | + Alert.VERSION = '3.2.0' |
|---|
| 90 | + |
|---|
| 91 | + Alert.prototype.close = function (e) { |
|---|
| 92 | + var $this = $(this) |
|---|
| 93 | + var selector = $this.attr('data-target') |
|---|
| 94 | + |
|---|
| 95 | + if (!selector) { |
|---|
| 96 | + selector = $this.attr('href') |
|---|
| 97 | + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 |
|---|
| 98 | + } |
|---|
| 99 | + |
|---|
| 100 | + var $parent = $(selector) |
|---|
| 101 | + |
|---|
| 102 | + if (e) e.preventDefault() |
|---|
| 103 | + |
|---|
| 104 | + if (!$parent.length) { |
|---|
| 105 | + $parent = $this.hasClass('alert') ? $this : $this.parent() |
|---|
| 106 | + } |
|---|
| 107 | + |
|---|
| 108 | + $parent.trigger(e = $.Event('close.bs.alert')) |
|---|
| 109 | + |
|---|
| 110 | + if (e.isDefaultPrevented()) return |
|---|
| 111 | + |
|---|
| 112 | + $parent.removeClass('in') |
|---|
| 113 | + |
|---|
| 114 | + function removeElement() { |
|---|
| 115 | + // detach from parent, fire event then clean up data |
|---|
| 116 | + $parent.detach().trigger('closed.bs.alert').remove() |
|---|
| 117 | + } |
|---|
| 118 | + |
|---|
| 119 | + $.support.transition && $parent.hasClass('fade') ? |
|---|
| 120 | + $parent |
|---|
| 121 | + .one('bsTransitionEnd', removeElement) |
|---|
| 122 | + .emulateTransitionEnd(150) : |
|---|
| 123 | + removeElement() |
|---|
| 124 | + } |
|---|
| 125 | + |
|---|
| 126 | + |
|---|
| 127 | + // ALERT PLUGIN DEFINITION |
|---|
| 128 | + // ======================= |
|---|
| 129 | + |
|---|
| 130 | + function Plugin(option) { |
|---|
| 131 | + return this.each(function () { |
|---|
| 132 | + var $this = $(this) |
|---|
| 133 | + var data = $this.data('bs.alert') |
|---|
| 134 | + |
|---|
| 135 | + if (!data) $this.data('bs.alert', (data = new Alert(this))) |
|---|
| 136 | + if (typeof option == 'string') data[option].call($this) |
|---|
| 137 | + }) |
|---|
| 138 | + } |
|---|
| 139 | + |
|---|
| 140 | + var old = $.fn.alert |
|---|
| 141 | + |
|---|
| 142 | + $.fn.alert = Plugin |
|---|
| 143 | + $.fn.alert.Constructor = Alert |
|---|
| 144 | + |
|---|
| 145 | + |
|---|
| 146 | + // ALERT NO CONFLICT |
|---|
| 147 | + // ================= |
|---|
| 148 | + |
|---|
| 149 | + $.fn.alert.noConflict = function () { |
|---|
| 150 | + $.fn.alert = old |
|---|
| 151 | + return this |
|---|
| 152 | + } |
|---|
| 153 | + |
|---|
| 154 | + |
|---|
| 155 | + // ALERT DATA-API |
|---|
| 156 | + // ============== |
|---|
| 157 | + |
|---|
| 158 | + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) |
|---|
| 159 | + |
|---|
| 160 | +}(jQuery); |
|---|
| 161 | + |
|---|
| 162 | +/* ======================================================================== |
|---|
| 163 | + * Bootstrap: button.js v3.2.0 |
|---|
| 164 | + * http://getbootstrap.com/javascript/#buttons |
|---|
| 165 | + * ======================================================================== |
|---|
| 166 | + * Copyright 2011-2014 Twitter, Inc. |
|---|
| 167 | + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
|---|
| 168 | + * ======================================================================== */ |
|---|
| 169 | + |
|---|
| 170 | + |
|---|
| 171 | ++function ($) { |
|---|
| 172 | + 'use strict'; |
|---|
| 173 | + |
|---|
| 174 | + // BUTTON PUBLIC CLASS DEFINITION |
|---|
| 175 | + // ============================== |
|---|
| 176 | + |
|---|
| 177 | + var Button = function (element, options) { |
|---|
| 178 | + this.$element = $(element) |
|---|
| 179 | + this.options = $.extend({}, Button.DEFAULTS, options) |
|---|
| 180 | + this.isLoading = false |
|---|
| 181 | + } |
|---|
| 182 | + |
|---|
| 183 | + Button.VERSION = '3.2.0' |
|---|
| 184 | + |
|---|
| 185 | + Button.DEFAULTS = { |
|---|
| 186 | + loadingText: 'loading...' |
|---|
| 187 | + } |
|---|
| 188 | + |
|---|
| 189 | + Button.prototype.setState = function (state) { |
|---|
| 190 | + var d = 'disabled' |
|---|
| 191 | + var $el = this.$element |
|---|
| 192 | + var val = $el.is('input') ? 'val' : 'html' |
|---|
| 193 | + var data = $el.data() |
|---|
| 194 | + |
|---|
| 195 | + state = state + 'Text' |
|---|
| 196 | + |
|---|
| 197 | + if (data.resetText == null) $el.data('resetText', $el[val]()) |
|---|
| 198 | + |
|---|
| 199 | + $el[val](data[state] == null ? this.options[state] : data[state]) |
|---|
| 200 | + |
|---|
| 201 | + // push to event loop to allow forms to submit |
|---|
| 202 | + setTimeout($.proxy(function () { |
|---|
| 203 | + if (state == 'loadingText') { |
|---|
| 204 | + this.isLoading = true |
|---|
| 205 | + $el.addClass(d).attr(d, d) |
|---|
| 206 | + } else if (this.isLoading) { |
|---|
| 207 | + this.isLoading = false |
|---|
| 208 | + $el.removeClass(d).removeAttr(d) |
|---|
| 209 | + } |
|---|
| 210 | + }, this), 0) |
|---|
| 211 | + } |
|---|
| 212 | + |
|---|
| 213 | + Button.prototype.toggle = function () { |
|---|
| 214 | + var changed = true |
|---|
| 215 | + var $parent = this.$element.closest('[data-toggle="buttons"]') |
|---|
| 216 | + |
|---|
| 217 | + if ($parent.length) { |
|---|
| 218 | + var $input = this.$element.find('input') |
|---|
| 219 | + if ($input.prop('type') == 'radio') { |
|---|
| 220 | + if ($input.prop('checked') && this.$element.hasClass('active')) changed = false |
|---|
| 221 | + else $parent.find('.active').removeClass('active') |
|---|
| 222 | + } |
|---|
| 223 | + if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') |
|---|
| 224 | + } |
|---|
| 225 | + |
|---|
| 226 | + if (changed) this.$element.toggleClass('active') |
|---|
| 227 | + } |
|---|
| 228 | + |
|---|
| 229 | + |
|---|
| 230 | + // BUTTON PLUGIN DEFINITION |
|---|
| 231 | + // ======================== |
|---|
| 232 | + |
|---|
| 233 | + function Plugin(option) { |
|---|
| 234 | + return this.each(function () { |
|---|
| 235 | + var $this = $(this) |
|---|
| 236 | + var data = $this.data('bs.button') |
|---|
| 237 | + var options = typeof option == 'object' && option |
|---|
| 238 | + |
|---|
| 239 | + if (!data) $this.data('bs.button', (data = new Button(this, options))) |
|---|
| 240 | + |
|---|
| 241 | + if (option == 'toggle') data.toggle() |
|---|
| 242 | + else if (option) data.setState(option) |
|---|
| 243 | + }) |
|---|
| 244 | + } |
|---|
| 245 | + |
|---|
| 246 | + var old = $.fn.button |
|---|
| 247 | + |
|---|
| 248 | + $.fn.button = Plugin |
|---|
| 249 | + $.fn.button.Constructor = Button |
|---|
| 250 | + |
|---|
| 251 | + |
|---|
| 252 | + // BUTTON NO CONFLICT |
|---|
| 253 | + // ================== |
|---|
| 254 | + |
|---|
| 255 | + $.fn.button.noConflict = function () { |
|---|
| 256 | + $.fn.button = old |
|---|
| 257 | + return this |
|---|
| 258 | + } |
|---|
| 259 | + |
|---|
| 260 | + |
|---|
| 261 | + // BUTTON DATA-API |
|---|
| 262 | + // =============== |
|---|
| 263 | + |
|---|
| 264 | + $(document).on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { |
|---|
| 265 | + var $btn = $(e.target) |
|---|
| 266 | + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') |
|---|
| 267 | + Plugin.call($btn, 'toggle') |
|---|
| 268 | + e.preventDefault() |
|---|
| 269 | + }) |
|---|
| 270 | + |
|---|
| 271 | +}(jQuery); |
|---|
| 272 | + |
|---|
| 273 | +/* ======================================================================== |
|---|
| 274 | + * Bootstrap: carousel.js v3.2.0 |
|---|
| 275 | + * http://getbootstrap.com/javascript/#carousel |
|---|
| 276 | + * ======================================================================== |
|---|
| 277 | + * Copyright 2011-2014 Twitter, Inc. |
|---|
| 278 | + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
|---|
| 279 | + * ======================================================================== */ |
|---|
| 280 | + |
|---|
| 281 | + |
|---|
| 282 | ++function ($) { |
|---|
| 283 | + 'use strict'; |
|---|
| 284 | + |
|---|
| 285 | + // CAROUSEL CLASS DEFINITION |
|---|
| 286 | + // ========================= |
|---|
| 287 | + |
|---|
| 288 | + var Carousel = function (element, options) { |
|---|
| 289 | + this.$element = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this)) |
|---|
| 290 | + this.$indicators = this.$element.find('.carousel-indicators') |
|---|
| 291 | + this.options = options |
|---|
| 292 | + this.paused = |
|---|
| 293 | + this.sliding = |
|---|
| 294 | + this.interval = |
|---|
| 295 | + this.$active = |
|---|
| 296 | + this.$items = null |
|---|
| 297 | + |
|---|
| 298 | + this.options.pause == 'hover' && this.$element |
|---|
| 299 | + .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) |
|---|
| 300 | + .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) |
|---|
| 301 | + } |
|---|
| 302 | + |
|---|
| 303 | + Carousel.VERSION = '3.2.0' |
|---|
| 304 | + |
|---|
| 305 | + Carousel.DEFAULTS = { |
|---|
| 306 | + interval: 5000, |
|---|
| 307 | + pause: 'hover', |
|---|
| 308 | + wrap: true |
|---|
| 309 | + } |
|---|
| 310 | + |
|---|
| 311 | + Carousel.prototype.keydown = function (e) { |
|---|
| 312 | + switch (e.which) { |
|---|
| 313 | + case 37: this.prev(); break |
|---|
| 314 | + case 39: this.next(); break |
|---|
| 315 | + default: return |
|---|
| 316 | + } |
|---|
| 317 | + |
|---|
| 318 | + e.preventDefault() |
|---|
| 319 | + } |
|---|
| 320 | + |
|---|
| 321 | + Carousel.prototype.cycle = function (e) { |
|---|
| 322 | + e || (this.paused = false) |
|---|
| 323 | + |
|---|
| 324 | + this.interval && clearInterval(this.interval) |
|---|
| 325 | + |
|---|
| 326 | + this.options.interval |
|---|
| 327 | + && !this.paused |
|---|
| 328 | + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) |
|---|
| 329 | + |
|---|
| 330 | + return this |
|---|
| 331 | + } |
|---|
| 332 | + |
|---|
| 333 | + Carousel.prototype.getItemIndex = function (item) { |
|---|
| 334 | + this.$items = item.parent().children('.item') |
|---|
| 335 | + return this.$items.index(item || this.$active) |
|---|
| 336 | + } |
|---|
| 337 | + |
|---|
| 338 | + Carousel.prototype.to = function (pos) { |
|---|
| 339 | + var that = this |
|---|
| 340 | + var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) |
|---|
| 341 | + |
|---|
| 342 | + if (pos > (this.$items.length - 1) || pos < 0) return |
|---|
| 343 | + |
|---|
| 344 | + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" |
|---|
| 345 | + if (activeIndex == pos) return this.pause().cycle() |
|---|
| 346 | + |
|---|
| 347 | + return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) |
|---|
| 348 | + } |
|---|
| 349 | + |
|---|
| 350 | + Carousel.prototype.pause = function (e) { |
|---|
| 351 | + e || (this.paused = true) |
|---|
| 352 | + |
|---|
| 353 | + if (this.$element.find('.next, .prev').length && $.support.transition) { |
|---|
| 354 | + this.$element.trigger($.support.transition.end) |
|---|
| 355 | + this.cycle(true) |
|---|
| 356 | + } |
|---|
| 357 | + |
|---|
| 358 | + this.interval = clearInterval(this.interval) |
|---|
| 359 | + |
|---|
| 360 | + return this |
|---|
| 361 | + } |
|---|
| 362 | + |
|---|
| 363 | + Carousel.prototype.next = function () { |
|---|
| 364 | + if (this.sliding) return |
|---|
| 365 | + return this.slide('next') |
|---|
| 366 | + } |
|---|
| 367 | + |
|---|
| 368 | + Carousel.prototype.prev = function () { |
|---|
| 369 | + if (this.sliding) return |
|---|
| 370 | + return this.slide('prev') |
|---|
| 371 | + } |
|---|
| 372 | + |
|---|
| 373 | + Carousel.prototype.slide = function (type, next) { |
|---|
| 374 | + var $active = this.$element.find('.item.active') |
|---|
| 375 | + var $next = next || $active[type]() |
|---|
| 376 | + var isCycling = this.interval |
|---|
| 377 | + var direction = type == 'next' ? 'left' : 'right' |
|---|
| 378 | + var fallback = type == 'next' ? 'first' : 'last' |
|---|
| 379 | + var that = this |
|---|
| 380 | + |
|---|
| 381 | + if (!$next.length) { |
|---|
| 382 | + if (!this.options.wrap) return |
|---|
| 383 | + $next = this.$element.find('.item')[fallback]() |
|---|
| 384 | + } |
|---|
| 385 | + |
|---|
| 386 | + if ($next.hasClass('active')) return (this.sliding = false) |
|---|
| 387 | + |
|---|
| 388 | + var relatedTarget = $next[0] |
|---|
| 389 | + var slideEvent = $.Event('slide.bs.carousel', { |
|---|
| 390 | + relatedTarget: relatedTarget, |
|---|
| 391 | + direction: direction |
|---|
| 392 | + }) |
|---|
| 393 | + this.$element.trigger(slideEvent) |
|---|
| 394 | + if (slideEvent.isDefaultPrevented()) return |
|---|
| 395 | + |
|---|
| 396 | + this.sliding = true |
|---|
| 397 | + |
|---|
| 398 | + isCycling && this.pause() |
|---|
| 399 | + |
|---|
| 400 | + if (this.$indicators.length) { |
|---|
| 401 | + this.$indicators.find('.active').removeClass('active') |
|---|
| 402 | + var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) |
|---|
| 403 | + $nextIndicator && $nextIndicator.addClass('active') |
|---|
| 404 | + } |
|---|
| 405 | + |
|---|
| 406 | + var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" |
|---|
| 407 | + if ($.support.transition && this.$element.hasClass('slide')) { |
|---|
| 408 | + $next.addClass(type) |
|---|
| 409 | + $next[0].offsetWidth // force reflow |
|---|
| 410 | + $active.addClass(direction) |
|---|
| 411 | + $next.addClass(direction) |
|---|
| 412 | + $active |
|---|
| 413 | + .one('bsTransitionEnd', function () { |
|---|
| 414 | + $next.removeClass([type, direction].join(' ')).addClass('active') |
|---|
| 415 | + $active.removeClass(['active', direction].join(' ')) |
|---|
| 416 | + that.sliding = false |
|---|
| 417 | + setTimeout(function () { |
|---|
| 418 | + that.$element.trigger(slidEvent) |
|---|
| 419 | + }, 0) |
|---|
| 420 | + }) |
|---|
| 421 | + .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000) |
|---|
| 422 | + } else { |
|---|
| 423 | + $active.removeClass('active') |
|---|
| 424 | + $next.addClass('active') |
|---|
| 425 | + this.sliding = false |
|---|
| 426 | + this.$element.trigger(slidEvent) |
|---|
| 427 | + } |
|---|
| 428 | + |
|---|
| 429 | + isCycling && this.cycle() |
|---|
| 430 | + |
|---|
| 431 | + return this |
|---|
| 432 | + } |
|---|
| 433 | + |
|---|
| 434 | + |
|---|
| 435 | + // CAROUSEL PLUGIN DEFINITION |
|---|
| 436 | + // ========================== |
|---|
| 437 | + |
|---|
| 438 | + function Plugin(option) { |
|---|
| 439 | + return this.each(function () { |
|---|
| 440 | + var $this = $(this) |
|---|
| 441 | + var data = $this.data('bs.carousel') |
|---|
| 442 | + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) |
|---|
| 443 | + var action = typeof option == 'string' ? option : options.slide |
|---|
| 444 | + |
|---|
| 445 | + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) |
|---|
| 446 | + if (typeof option == 'number') data.to(option) |
|---|
| 447 | + else if (action) data[action]() |
|---|
| 448 | + else if (options.interval) data.pause().cycle() |
|---|
| 449 | + }) |
|---|
| 450 | + } |
|---|
| 451 | + |
|---|
| 452 | + var old = $.fn.carousel |
|---|
| 453 | + |
|---|
| 454 | + $.fn.carousel = Plugin |
|---|
| 455 | + $.fn.carousel.Constructor = Carousel |
|---|
| 456 | + |
|---|
| 457 | + |
|---|
| 458 | + // CAROUSEL NO CONFLICT |
|---|
| 459 | + // ==================== |
|---|
| 460 | + |
|---|
| 461 | + $.fn.carousel.noConflict = function () { |
|---|
| 462 | + $.fn.carousel = old |
|---|
| 463 | + return this |
|---|
| 464 | + } |
|---|
| 465 | + |
|---|
| 466 | + |
|---|
| 467 | + // CAROUSEL DATA-API |
|---|
| 468 | + // ================= |
|---|
| 469 | + |
|---|
| 470 | + $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { |
|---|
| 471 | + var href |
|---|
| 472 | + var $this = $(this) |
|---|
| 473 | + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 |
|---|
| 474 | + if (!$target.hasClass('carousel')) return |
|---|
| 475 | + var options = $.extend({}, $target.data(), $this.data()) |
|---|
| 476 | + var slideIndex = $this.attr('data-slide-to') |
|---|
| 477 | + if (slideIndex) options.interval = false |
|---|
| 478 | + |
|---|
| 479 | + Plugin.call($target, options) |
|---|
| 480 | + |
|---|
| 481 | + if (slideIndex) { |
|---|
| 482 | + $target.data('bs.carousel').to(slideIndex) |
|---|
| 483 | + } |
|---|
| 484 | + |
|---|
| 485 | + e.preventDefault() |
|---|
| 486 | + }) |
|---|
| 487 | + |
|---|
| 488 | + $(window).on('load', function () { |
|---|
| 489 | + $('[data-ride="carousel"]').each(function () { |
|---|
| 490 | + var $carousel = $(this) |
|---|
| 491 | + Plugin.call($carousel, $carousel.data()) |
|---|
| 492 | + }) |
|---|
| 493 | + }) |
|---|
| 494 | + |
|---|
| 495 | +}(jQuery); |
|---|
| 496 | + |
|---|
| 497 | +/* ======================================================================== |
|---|
| 498 | + * Bootstrap: collapse.js v3.2.0 |
|---|
| 499 | + * http://getbootstrap.com/javascript/#collapse |
|---|
| 500 | + * ======================================================================== |
|---|
| 501 | + * Copyright 2011-2014 Twitter, Inc. |
|---|
| 502 | + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
|---|
| 503 | + * ======================================================================== */ |
|---|
| 504 | + |
|---|
| 505 | + |
|---|
| 506 | ++function ($) { |
|---|
| 507 | + 'use strict'; |
|---|
| 508 | + |
|---|
| 509 | + // COLLAPSE PUBLIC CLASS DEFINITION |
|---|
| 510 | + // ================================ |
|---|
| 511 | + |
|---|
| 512 | + var Collapse = function (element, options) { |
|---|
| 513 | + this.$element = $(element) |
|---|
| 514 | + this.options = $.extend({}, Collapse.DEFAULTS, options) |
|---|
| 515 | + this.transitioning = null |
|---|
| 516 | + |
|---|
| 517 | + if (this.options.parent) this.$parent = $(this.options.parent) |
|---|
| 518 | + if (this.options.toggle) this.toggle() |
|---|
| 519 | + } |
|---|
| 520 | + |
|---|
| 521 | + Collapse.VERSION = '3.2.0' |
|---|
| 522 | + |
|---|
| 523 | + Collapse.DEFAULTS = { |
|---|
| 524 | + toggle: true |
|---|
| 525 | + } |
|---|
| 526 | + |
|---|
| 527 | + Collapse.prototype.dimension = function () { |
|---|
| 528 | + var hasWidth = this.$element.hasClass('width') |
|---|
| 529 | + return hasWidth ? 'width' : 'height' |
|---|
| 530 | + } |
|---|
| 531 | + |
|---|
| 532 | + Collapse.prototype.show = function () { |
|---|
| 533 | + if (this.transitioning || this.$element.hasClass('in')) return |
|---|
| 534 | + |
|---|
| 535 | + var startEvent = $.Event('show.bs.collapse') |
|---|
| 536 | + this.$element.trigger(startEvent) |
|---|
| 537 | + if (startEvent.isDefaultPrevented()) return |
|---|
| 538 | + |
|---|
| 539 | + var actives = this.$parent && this.$parent.find('> .panel > .in') |
|---|
| 540 | + |
|---|
| 541 | + if (actives && actives.length) { |
|---|
| 542 | + var hasData = actives.data('bs.collapse') |
|---|
| 543 | + if (hasData && hasData.transitioning) return |
|---|
| 544 | + Plugin.call(actives, 'hide') |
|---|
| 545 | + hasData || actives.data('bs.collapse', null) |
|---|
| 546 | + } |
|---|
| 547 | + |
|---|
| 548 | + var dimension = this.dimension() |
|---|
| 549 | + |
|---|
| 550 | + this.$element |
|---|
| 551 | + .removeClass('collapse') |
|---|
| 552 | + .addClass('collapsing')[dimension](0) |
|---|
| 553 | + |
|---|
| 554 | + this.transitioning = 1 |
|---|
| 555 | + |
|---|
| 556 | + var complete = function () { |
|---|
| 557 | + this.$element |
|---|
| 558 | + .removeClass('collapsing') |
|---|
| 559 | + .addClass('collapse in')[dimension]('') |
|---|
| 560 | + this.transitioning = 0 |
|---|
| 561 | + this.$element |
|---|
| 562 | + .trigger('shown.bs.collapse') |
|---|
| 563 | + } |
|---|
| 564 | + |
|---|
| 565 | + if (!$.support.transition) return complete.call(this) |
|---|
| 566 | + |
|---|
| 567 | + var scrollSize = $.camelCase(['scroll', dimension].join('-')) |
|---|
| 568 | + |
|---|
| 569 | + this.$element |
|---|
| 570 | + .one('bsTransitionEnd', $.proxy(complete, this)) |
|---|
| 571 | + .emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize]) |
|---|
| 572 | + } |
|---|
| 573 | + |
|---|
| 574 | + Collapse.prototype.hide = function () { |
|---|
| 575 | + if (this.transitioning || !this.$element.hasClass('in')) return |
|---|
| 576 | + |
|---|
| 577 | + var startEvent = $.Event('hide.bs.collapse') |
|---|
| 578 | + this.$element.trigger(startEvent) |
|---|
| 579 | + if (startEvent.isDefaultPrevented()) return |
|---|
| 580 | + |
|---|
| 581 | + var dimension = this.dimension() |
|---|
| 582 | + |
|---|
| 583 | + this.$element[dimension](this.$element[dimension]())[0].offsetHeight |
|---|
| 584 | + |
|---|
| 585 | + this.$element |
|---|
| 586 | + .addClass('collapsing') |
|---|
| 587 | + .removeClass('collapse') |
|---|
| 588 | + .removeClass('in') |
|---|
| 589 | + |
|---|
| 590 | + this.transitioning = 1 |
|---|
| 591 | + |
|---|
| 592 | + var complete = function () { |
|---|
| 593 | + this.transitioning = 0 |
|---|
| 594 | + this.$element |
|---|
| 595 | + .trigger('hidden.bs.collapse') |
|---|
| 596 | + .removeClass('collapsing') |
|---|
| 597 | + .addClass('collapse') |
|---|
| 598 | + } |
|---|
| 599 | + |
|---|
| 600 | + if (!$.support.transition) return complete.call(this) |
|---|
| 601 | + |
|---|
| 602 | + this.$element |
|---|
| 603 | + [dimension](0) |
|---|
| 604 | + .one('bsTransitionEnd', $.proxy(complete, this)) |
|---|
| 605 | + .emulateTransitionEnd(350) |
|---|
| 606 | + } |
|---|
| 607 | + |
|---|
| 608 | + Collapse.prototype.toggle = function () { |
|---|
| 609 | + this[this.$element.hasClass('in') ? 'hide' : 'show']() |
|---|
| 610 | + } |
|---|
| 611 | + |
|---|
| 612 | + |
|---|
| 613 | + // COLLAPSE PLUGIN DEFINITION |
|---|
| 614 | + // ========================== |
|---|
| 615 | + |
|---|
| 616 | + function Plugin(option) { |
|---|
| 617 | + return this.each(function () { |
|---|
| 618 | + var $this = $(this) |
|---|
| 619 | + var data = $this.data('bs.collapse') |
|---|
| 620 | + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) |
|---|
| 621 | + |
|---|
| 622 | + if (!data && options.toggle && option == 'show') option = !option |
|---|
| 623 | + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) |
|---|
| 624 | + if (typeof option == 'string') data[option]() |
|---|
| 625 | + }) |
|---|
| 626 | + } |
|---|
| 627 | + |
|---|
| 628 | + var old = $.fn.collapse |
|---|
| 629 | + |
|---|
| 630 | + $.fn.collapse = Plugin |
|---|
| 631 | + $.fn.collapse.Constructor = Collapse |
|---|
| 632 | + |
|---|
| 633 | + |
|---|
| 634 | + // COLLAPSE NO CONFLICT |
|---|
| 635 | + // ==================== |
|---|
| 636 | + |
|---|
| 637 | + $.fn.collapse.noConflict = function () { |
|---|
| 638 | + $.fn.collapse = old |
|---|
| 639 | + return this |
|---|
| 640 | + } |
|---|
| 641 | + |
|---|
| 642 | + |
|---|
| 643 | + // COLLAPSE DATA-API |
|---|
| 644 | + // ================= |
|---|
| 645 | + |
|---|
| 646 | + $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { |
|---|
| 647 | + var href |
|---|
| 648 | + var $this = $(this) |
|---|
| 649 | + var target = $this.attr('data-target') |
|---|
| 650 | + || e.preventDefault() |
|---|
| 651 | + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 |
|---|
| 652 | + var $target = $(target) |
|---|
| 653 | + var data = $target.data('bs.collapse') |
|---|
| 654 | + var option = data ? 'toggle' : $this.data() |
|---|
| 655 | + var parent = $this.attr('data-parent') |
|---|
| 656 | + var $parent = parent && $(parent) |
|---|
| 657 | + |
|---|
| 658 | + if (!data || !data.transitioning) { |
|---|
| 659 | + if ($parent) $parent.find('[data-toggle="collapse"][data-parent="' + parent + '"]').not($this).addClass('collapsed') |
|---|
| 660 | + $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') |
|---|
| 661 | + } |
|---|
| 662 | + |
|---|
| 663 | + Plugin.call($target, option) |
|---|
| 664 | + }) |
|---|
| 665 | + |
|---|
| 666 | +}(jQuery); |
|---|
| 667 | + |
|---|
| 668 | +/* ======================================================================== |
|---|
| 669 | + * Bootstrap: dropdown.js v3.2.0 |
|---|
| 670 | + * http://getbootstrap.com/javascript/#dropdowns |
|---|
| 671 | + * ======================================================================== |
|---|
| 672 | + * Copyright 2011-2014 Twitter, Inc. |
|---|
| 673 | + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
|---|
| 674 | + * ======================================================================== */ |
|---|
| 675 | + |
|---|
| 676 | + |
|---|
| 677 | ++function ($) { |
|---|
| 678 | + 'use strict'; |
|---|
| 679 | + |
|---|
| 680 | + // DROPDOWN CLASS DEFINITION |
|---|
| 681 | + // ========================= |
|---|
| 682 | + |
|---|
| 683 | + var backdrop = '.dropdown-backdrop' |
|---|
| 684 | + var toggle = '[data-toggle="dropdown"]' |
|---|
| 685 | + var Dropdown = function (element) { |
|---|
| 686 | + $(element).on('click.bs.dropdown', this.toggle) |
|---|
| 687 | + } |
|---|
| 688 | + |
|---|
| 689 | + Dropdown.VERSION = '3.2.0' |
|---|
| 690 | + |
|---|
| 691 | + Dropdown.prototype.toggle = function (e) { |
|---|
| 692 | + var $this = $(this) |
|---|
| 693 | + |
|---|
| 694 | + if ($this.is('.disabled, :disabled')) return |
|---|
| 695 | + |
|---|
| 696 | + var $parent = getParent($this) |
|---|
| 697 | + var isActive = $parent.hasClass('open') |
|---|
| 698 | + |
|---|
| 699 | + clearMenus() |
|---|
| 700 | + |
|---|
| 701 | + if (!isActive) { |
|---|
| 702 | + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { |
|---|
| 703 | + // if mobile we use a backdrop because click events don't delegate |
|---|
| 704 | + $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus) |
|---|
| 705 | + } |
|---|
| 706 | + |
|---|
| 707 | + var relatedTarget = { relatedTarget: this } |
|---|
| 708 | + $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) |
|---|
| 709 | + |
|---|
| 710 | + if (e.isDefaultPrevented()) return |
|---|
| 711 | + |
|---|
| 712 | + $this.trigger('focus') |
|---|
| 713 | + |
|---|
| 714 | + $parent |
|---|
| 715 | + .toggleClass('open') |
|---|
| 716 | + .trigger('shown.bs.dropdown', relatedTarget) |
|---|
| 717 | + } |
|---|
| 718 | + |
|---|
| 719 | + return false |
|---|
| 720 | + } |
|---|
| 721 | + |
|---|
| 722 | + Dropdown.prototype.keydown = function (e) { |
|---|
| 723 | + if (!/(38|40|27)/.test(e.keyCode)) return |
|---|
| 724 | + |
|---|
| 725 | + var $this = $(this) |
|---|
| 726 | + |
|---|
| 727 | + e.preventDefault() |
|---|
| 728 | + e.stopPropagation() |
|---|
| 729 | + |
|---|
| 730 | + if ($this.is('.disabled, :disabled')) return |
|---|
| 731 | + |
|---|
| 732 | + var $parent = getParent($this) |
|---|
| 733 | + var isActive = $parent.hasClass('open') |
|---|
| 734 | + |
|---|
| 735 | + if (!isActive || (isActive && e.keyCode == 27)) { |
|---|
| 736 | + if (e.which == 27) $parent.find(toggle).trigger('focus') |
|---|
| 737 | + return $this.trigger('click') |
|---|
| 738 | + } |
|---|
| 739 | + |
|---|
| 740 | + var desc = ' li:not(.divider):visible a' |
|---|
| 741 | + var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc) |
|---|
| 742 | + |
|---|
| 743 | + if (!$items.length) return |
|---|
| 744 | + |
|---|
| 745 | + var index = $items.index($items.filter(':focus')) |
|---|
| 746 | + |
|---|
| 747 | + if (e.keyCode == 38 && index > 0) index-- // up |
|---|
| 748 | + if (e.keyCode == 40 && index < $items.length - 1) index++ // down |
|---|
| 749 | + if (!~index) index = 0 |
|---|
| 750 | + |
|---|
| 751 | + $items.eq(index).trigger('focus') |
|---|
| 752 | + } |
|---|
| 753 | + |
|---|
| 754 | + function clearMenus(e) { |
|---|
| 755 | + if (e && e.which === 3) return |
|---|
| 756 | + $(backdrop).remove() |
|---|
| 757 | + $(toggle).each(function () { |
|---|
| 758 | + var $parent = getParent($(this)) |
|---|
| 759 | + var relatedTarget = { relatedTarget: this } |
|---|
| 760 | + if (!$parent.hasClass('open')) return |
|---|
| 761 | + $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) |
|---|
| 762 | + if (e.isDefaultPrevented()) return |
|---|
| 763 | + $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget) |
|---|
| 764 | + }) |
|---|
| 765 | + } |
|---|
| 766 | + |
|---|
| 767 | + function getParent($this) { |
|---|
| 768 | + var selector = $this.attr('data-target') |
|---|
| 769 | + |
|---|
| 770 | + if (!selector) { |
|---|
| 771 | + selector = $this.attr('href') |
|---|
| 772 | + selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 |
|---|
| 773 | + } |
|---|
| 774 | + |
|---|
| 775 | + var $parent = selector && $(selector) |
|---|
| 776 | + |
|---|
| 777 | + return $parent && $parent.length ? $parent : $this.parent() |
|---|
| 778 | + } |
|---|
| 779 | + |
|---|
| 780 | + |
|---|
| 781 | + // DROPDOWN PLUGIN DEFINITION |
|---|
| 782 | + // ========================== |
|---|
| 783 | + |
|---|
| 784 | + function Plugin(option) { |
|---|
| 785 | + return this.each(function () { |
|---|
| 786 | + var $this = $(this) |
|---|
| 787 | + var data = $this.data('bs.dropdown') |
|---|
| 788 | + |
|---|
| 789 | + if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) |
|---|
| 790 | + if (typeof option == 'string') data[option].call($this) |
|---|
| 791 | + }) |
|---|
| 792 | + } |
|---|
| 793 | + |
|---|
| 794 | + var old = $.fn.dropdown |
|---|
| 795 | + |
|---|
| 796 | + $.fn.dropdown = Plugin |
|---|
| 797 | + $.fn.dropdown.Constructor = Dropdown |
|---|
| 798 | + |
|---|
| 799 | + |
|---|
| 800 | + // DROPDOWN NO CONFLICT |
|---|
| 801 | + // ==================== |
|---|
| 802 | + |
|---|
| 803 | + $.fn.dropdown.noConflict = function () { |
|---|
| 804 | + $.fn.dropdown = old |
|---|
| 805 | + return this |
|---|
| 806 | + } |
|---|
| 807 | + |
|---|
| 808 | + |
|---|
| 809 | + // APPLY TO STANDARD DROPDOWN ELEMENTS |
|---|
| 810 | + // =================================== |
|---|
| 811 | + |
|---|
| 812 | + $(document) |
|---|
| 813 | + .on('click.bs.dropdown.data-api', clearMenus) |
|---|
| 814 | + .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) |
|---|
| 815 | + .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) |
|---|
| 816 | + .on('keydown.bs.dropdown.data-api', toggle + ', [role="menu"], [role="listbox"]', Dropdown.prototype.keydown) |
|---|
| 817 | + |
|---|
| 818 | +}(jQuery); |
|---|
| 819 | + |
|---|
| 820 | +/* ======================================================================== |
|---|
| 821 | + * Bootstrap: modal.js v3.2.0 |
|---|
| 822 | + * http://getbootstrap.com/javascript/#modals |
|---|
| 823 | + * ======================================================================== |
|---|
| 824 | + * Copyright 2011-2014 Twitter, Inc. |
|---|
| 825 | + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
|---|
| 826 | + * ======================================================================== */ |
|---|
| 827 | + |
|---|
| 828 | + |
|---|
| 829 | ++function ($) { |
|---|
| 830 | + 'use strict'; |
|---|
| 831 | + |
|---|
| 832 | + // MODAL CLASS DEFINITION |
|---|
| 833 | + // ====================== |
|---|
| 834 | + |
|---|
| 835 | + var Modal = function (element, options) { |
|---|
| 836 | + this.options = options |
|---|
| 837 | + this.$body = $(document.body) |
|---|
| 838 | + this.$element = $(element) |
|---|
| 839 | + this.$backdrop = |
|---|
| 840 | + this.isShown = null |
|---|
| 841 | + this.scrollbarWidth = 0 |
|---|
| 842 | + |
|---|
| 843 | + if (this.options.remote) { |
|---|
| 844 | + this.$element |
|---|
| 845 | + .find('.modal-content') |
|---|
| 846 | + .load(this.options.remote, $.proxy(function () { |
|---|
| 847 | + this.$element.trigger('loaded.bs.modal') |
|---|
| 848 | + }, this)) |
|---|
| 849 | + } |
|---|
| 850 | + } |
|---|
| 851 | + |
|---|
| 852 | + Modal.VERSION = '3.2.0' |
|---|
| 853 | + |
|---|
| 854 | + Modal.DEFAULTS = { |
|---|
| 855 | + backdrop: true, |
|---|
| 856 | + keyboard: true, |
|---|
| 857 | + show: true |
|---|
| 858 | + } |
|---|
| 859 | + |
|---|
| 860 | + Modal.prototype.toggle = function (_relatedTarget) { |
|---|
| 861 | + return this.isShown ? this.hide() : this.show(_relatedTarget) |
|---|
| 862 | + } |
|---|
| 863 | + |
|---|
| 864 | + Modal.prototype.show = function (_relatedTarget) { |
|---|
| 865 | + var that = this |
|---|
| 866 | + var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) |
|---|
| 867 | + |
|---|
| 868 | + this.$element.trigger(e) |
|---|
| 869 | + |
|---|
| 870 | + if (this.isShown || e.isDefaultPrevented()) return |
|---|
| 871 | + |
|---|
| 872 | + this.isShown = true |
|---|
| 873 | + |
|---|
| 874 | + this.checkScrollbar() |
|---|
| 875 | + this.$body.addClass('modal-open') |
|---|
| 876 | + |
|---|
| 877 | + this.setScrollbar() |
|---|
| 878 | + this.escape() |
|---|
| 879 | + |
|---|
| 880 | + this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) |
|---|
| 881 | + |
|---|
| 882 | + this.backdrop(function () { |
|---|
| 883 | + var transition = $.support.transition && that.$element.hasClass('fade') |
|---|
| 884 | + |
|---|
| 885 | + if (!that.$element.parent().length) { |
|---|
| 886 | + that.$element.appendTo(that.$body) // don't move modals dom position |
|---|
| 887 | + } |
|---|
| 888 | + |
|---|
| 889 | + that.$element |
|---|
| 890 | + .show() |
|---|
| 891 | + .scrollTop(0) |
|---|
| 892 | + |
|---|
| 893 | + if (transition) { |
|---|
| 894 | + that.$element[0].offsetWidth // force reflow |
|---|
| 895 | + } |
|---|
| 896 | + |
|---|
| 897 | + that.$element |
|---|
| 898 | + .addClass('in') |
|---|
| 899 | + .attr('aria-hidden', false) |
|---|
| 900 | + |
|---|
| 901 | + that.enforceFocus() |
|---|
| 902 | + |
|---|
| 903 | + var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) |
|---|
| 904 | + |
|---|
| 905 | + transition ? |
|---|
| 906 | + that.$element.find('.modal-dialog') // wait for modal to slide in |
|---|
| 907 | + .one('bsTransitionEnd', function () { |
|---|
| 908 | + that.$element.trigger('focus').trigger(e) |
|---|
| 909 | + }) |
|---|
| 910 | + .emulateTransitionEnd(300) : |
|---|
| 911 | + that.$element.trigger('focus').trigger(e) |
|---|
| 912 | + }) |
|---|
| 913 | + } |
|---|
| 914 | + |
|---|
| 915 | + Modal.prototype.hide = function (e) { |
|---|
| 916 | + if (e) e.preventDefault() |
|---|
| 917 | + |
|---|
| 918 | + e = $.Event('hide.bs.modal') |
|---|
| 919 | + |
|---|
| 920 | + this.$element.trigger(e) |
|---|
| 921 | + |
|---|
| 922 | + if (!this.isShown || e.isDefaultPrevented()) return |
|---|
| 923 | + |
|---|
| 924 | + this.isShown = false |
|---|
| 925 | + |
|---|
| 926 | + this.$body.removeClass('modal-open') |
|---|
| 927 | + |
|---|
| 928 | + this.resetScrollbar() |
|---|
| 929 | + this.escape() |
|---|
| 930 | + |
|---|
| 931 | + $(document).off('focusin.bs.modal') |
|---|
| 932 | + |
|---|
| 933 | + this.$element |
|---|
| 934 | + .removeClass('in') |
|---|
| 935 | + .attr('aria-hidden', true) |
|---|
| 936 | + .off('click.dismiss.bs.modal') |
|---|
| 937 | + |
|---|
| 938 | + $.support.transition && this.$element.hasClass('fade') ? |
|---|
| 939 | + this.$element |
|---|
| 940 | + .one('bsTransitionEnd', $.proxy(this.hideModal, this)) |
|---|
| 941 | + .emulateTransitionEnd(300) : |
|---|
| 942 | + this.hideModal() |
|---|
| 943 | + } |
|---|
| 944 | + |
|---|
| 945 | + Modal.prototype.enforceFocus = function () { |
|---|
| 946 | + $(document) |
|---|
| 947 | + .off('focusin.bs.modal') // guard against infinite focus loop |
|---|
| 948 | + .on('focusin.bs.modal', $.proxy(function (e) { |
|---|
| 949 | + if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { |
|---|
| 950 | + this.$element.trigger('focus') |
|---|
| 951 | + } |
|---|
| 952 | + }, this)) |
|---|
| 953 | + } |
|---|
| 954 | + |
|---|
| 955 | + Modal.prototype.escape = function () { |
|---|
| 956 | + if (this.isShown && this.options.keyboard) { |
|---|
| 957 | + this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) { |
|---|
| 958 | + e.which == 27 && this.hide() |
|---|
| 959 | + }, this)) |
|---|
| 960 | + } else if (!this.isShown) { |
|---|
| 961 | + this.$element.off('keyup.dismiss.bs.modal') |
|---|
| 962 | + } |
|---|
| 963 | + } |
|---|
| 964 | + |
|---|
| 965 | + Modal.prototype.hideModal = function () { |
|---|
| 966 | + var that = this |
|---|
| 967 | + this.$element.hide() |
|---|
| 968 | + this.backdrop(function () { |
|---|
| 969 | + that.$element.trigger('hidden.bs.modal') |
|---|
| 970 | + }) |
|---|
| 971 | + } |
|---|
| 972 | + |
|---|
| 973 | + Modal.prototype.removeBackdrop = function () { |
|---|
| 974 | + this.$backdrop && this.$backdrop.remove() |
|---|
| 975 | + this.$backdrop = null |
|---|
| 976 | + } |
|---|
| 977 | + |
|---|
| 978 | + Modal.prototype.backdrop = function (callback) { |
|---|
| 979 | + var that = this |
|---|
| 980 | + var animate = this.$element.hasClass('fade') ? 'fade' : '' |
|---|
| 981 | + |
|---|
| 982 | + if (this.isShown && this.options.backdrop) { |
|---|
| 983 | + var doAnimate = $.support.transition && animate |
|---|
| 984 | + |
|---|
| 985 | + this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') |
|---|
| 986 | + .appendTo(this.$body) |
|---|
| 987 | + |
|---|
| 988 | + this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { |
|---|
| 989 | + if (e.target !== e.currentTarget) return |
|---|
| 990 | + this.options.backdrop == 'static' |
|---|
| 991 | + ? this.$element[0].focus.call(this.$element[0]) |
|---|
| 992 | + : this.hide.call(this) |
|---|
| 993 | + }, this)) |
|---|
| 994 | + |
|---|
| 995 | + if (doAnimate) this.$backdrop[0].offsetWidth // force reflow |
|---|
| 996 | + |
|---|
| 997 | + this.$backdrop.addClass('in') |
|---|
| 998 | + |
|---|
| 999 | + if (!callback) return |
|---|
| 1000 | + |
|---|
| 1001 | + doAnimate ? |
|---|
| 1002 | + this.$backdrop |
|---|
| 1003 | + .one('bsTransitionEnd', callback) |
|---|
| 1004 | + .emulateTransitionEnd(150) : |
|---|
| 1005 | + callback() |
|---|
| 1006 | + |
|---|
| 1007 | + } else if (!this.isShown && this.$backdrop) { |
|---|
| 1008 | + this.$backdrop.removeClass('in') |
|---|
| 1009 | + |
|---|
| 1010 | + var callbackRemove = function () { |
|---|
| 1011 | + that.removeBackdrop() |
|---|
| 1012 | + callback && callback() |
|---|
| 1013 | + } |
|---|
| 1014 | + $.support.transition && this.$element.hasClass('fade') ? |
|---|
| 1015 | + this.$backdrop |
|---|
| 1016 | + .one('bsTransitionEnd', callbackRemove) |
|---|
| 1017 | + .emulateTransitionEnd(150) : |
|---|
| 1018 | + callbackRemove() |
|---|
| 1019 | + |
|---|
| 1020 | + } else if (callback) { |
|---|
| 1021 | + callback() |
|---|
| 1022 | + } |
|---|
| 1023 | + } |
|---|
| 1024 | + |
|---|
| 1025 | + Modal.prototype.checkScrollbar = function () { |
|---|
| 1026 | + if (document.body.clientWidth >= window.innerWidth) return |
|---|
| 1027 | + this.scrollbarWidth = this.scrollbarWidth || this.measureScrollbar() |
|---|
| 1028 | + } |
|---|
| 1029 | + |
|---|
| 1030 | + Modal.prototype.setScrollbar = function () { |
|---|
| 1031 | + var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) |
|---|
| 1032 | + if (this.scrollbarWidth) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) |
|---|
| 1033 | + } |
|---|
| 1034 | + |
|---|
| 1035 | + Modal.prototype.resetScrollbar = function () { |
|---|
| 1036 | + this.$body.css('padding-right', '') |
|---|
| 1037 | + } |
|---|
| 1038 | + |
|---|
| 1039 | + Modal.prototype.measureScrollbar = function () { // thx walsh |
|---|
| 1040 | + var scrollDiv = document.createElement('div') |
|---|
| 1041 | + scrollDiv.className = 'modal-scrollbar-measure' |
|---|
| 1042 | + this.$body.append(scrollDiv) |
|---|
| 1043 | + var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth |
|---|
| 1044 | + this.$body[0].removeChild(scrollDiv) |
|---|
| 1045 | + return scrollbarWidth |
|---|
| 1046 | + } |
|---|
| 1047 | + |
|---|
| 1048 | + |
|---|
| 1049 | + // MODAL PLUGIN DEFINITION |
|---|
| 1050 | + // ======================= |
|---|
| 1051 | + |
|---|
| 1052 | + function Plugin(option, _relatedTarget) { |
|---|
| 1053 | + return this.each(function () { |
|---|
| 1054 | + var $this = $(this) |
|---|
| 1055 | + var data = $this.data('bs.modal') |
|---|
| 1056 | + var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) |
|---|
| 1057 | + |
|---|
| 1058 | + if (!data) $this.data('bs.modal', (data = new Modal(this, options))) |
|---|
| 1059 | + if (typeof option == 'string') data[option](_relatedTarget) |
|---|
| 1060 | + else if (options.show) data.show(_relatedTarget) |
|---|
| 1061 | + }) |
|---|
| 1062 | + } |
|---|
| 1063 | + |
|---|
| 1064 | + var old = $.fn.modal |
|---|
| 1065 | + |
|---|
| 1066 | + $.fn.modal = Plugin |
|---|
| 1067 | + $.fn.modal.Constructor = Modal |
|---|
| 1068 | + |
|---|
| 1069 | + |
|---|
| 1070 | + // MODAL NO CONFLICT |
|---|
| 1071 | + // ================= |
|---|
| 1072 | + |
|---|
| 1073 | + $.fn.modal.noConflict = function () { |
|---|
| 1074 | + $.fn.modal = old |
|---|
| 1075 | + return this |
|---|
| 1076 | + } |
|---|
| 1077 | + |
|---|
| 1078 | + |
|---|
| 1079 | + // MODAL DATA-API |
|---|
| 1080 | + // ============== |
|---|
| 1081 | + |
|---|
| 1082 | + $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { |
|---|
| 1083 | + var $this = $(this) |
|---|
| 1084 | + var href = $this.attr('href') |
|---|
| 1085 | + var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 |
|---|
| 1086 | + var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) |
|---|
| 1087 | + |
|---|
| 1088 | + if ($this.is('a')) e.preventDefault() |
|---|
| 1089 | + |
|---|
| 1090 | + $target.one('show.bs.modal', function (showEvent) { |
|---|
| 1091 | + if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown |
|---|
| 1092 | + $target.one('hidden.bs.modal', function () { |
|---|
| 1093 | + $this.is(':visible') && $this.trigger('focus') |
|---|
| 1094 | + }) |
|---|
| 1095 | + }) |
|---|
| 1096 | + Plugin.call($target, option, this) |
|---|
| 1097 | + }) |
|---|
| 1098 | + |
|---|
| 1099 | +}(jQuery); |
|---|
| 1100 | + |
|---|
| 1101 | +/* ======================================================================== |
|---|
| 1102 | + * Bootstrap: tooltip.js v3.2.0 |
|---|
| 1103 | + * http://getbootstrap.com/javascript/#tooltip |
|---|
| 1104 | + * Inspired by the original jQuery.tipsy by Jason Frame |
|---|
| 1105 | + * ======================================================================== |
|---|
| 1106 | + * Copyright 2011-2014 Twitter, Inc. |
|---|
| 1107 | + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
|---|
| 1108 | + * ======================================================================== */ |
|---|
| 1109 | + |
|---|
| 1110 | + |
|---|
| 1111 | ++function ($) { |
|---|
| 1112 | + 'use strict'; |
|---|
| 1113 | + |
|---|
| 1114 | + // TOOLTIP PUBLIC CLASS DEFINITION |
|---|
| 1115 | + // =============================== |
|---|
| 1116 | + |
|---|
| 1117 | + var Tooltip = function (element, options) { |
|---|
| 1118 | + this.type = |
|---|
| 1119 | + this.options = |
|---|
| 1120 | + this.enabled = |
|---|
| 1121 | + this.timeout = |
|---|
| 1122 | + this.hoverState = |
|---|
| 1123 | + this.$element = null |
|---|
| 1124 | + |
|---|
| 1125 | + this.init('tooltip', element, options) |
|---|
| 1126 | + } |
|---|
| 1127 | + |
|---|
| 1128 | + Tooltip.VERSION = '3.2.0' |
|---|
| 1129 | + |
|---|
| 1130 | + Tooltip.DEFAULTS = { |
|---|
| 1131 | + animation: true, |
|---|
| 1132 | + placement: 'top', |
|---|
| 1133 | + selector: false, |
|---|
| 1134 | + template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>', |
|---|
| 1135 | + trigger: 'hover focus', |
|---|
| 1136 | + title: '', |
|---|
| 1137 | + delay: 0, |
|---|
| 1138 | + html: false, |
|---|
| 1139 | + container: false, |
|---|
| 1140 | + viewport: { |
|---|
| 1141 | + selector: 'body', |
|---|
| 1142 | + padding: 0 |
|---|
| 1143 | + } |
|---|
| 1144 | + } |
|---|
| 1145 | + |
|---|
| 1146 | + Tooltip.prototype.init = function (type, element, options) { |
|---|
| 1147 | + this.enabled = true |
|---|
| 1148 | + this.type = type |
|---|
| 1149 | + this.$element = $(element) |
|---|
| 1150 | + this.options = this.getOptions(options) |
|---|
| 1151 | + this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport) |
|---|
| 1152 | + |
|---|
| 1153 | + var triggers = this.options.trigger.split(' ') |
|---|
| 1154 | + |
|---|
| 1155 | + for (var i = triggers.length; i--;) { |
|---|
| 1156 | + var trigger = triggers[i] |
|---|
| 1157 | + |
|---|
| 1158 | + if (trigger == 'click') { |
|---|
| 1159 | + this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) |
|---|
| 1160 | + } else if (trigger != 'manual') { |
|---|
| 1161 | + var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' |
|---|
| 1162 | + var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' |
|---|
| 1163 | + |
|---|
| 1164 | + this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) |
|---|
| 1165 | + this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) |
|---|
| 1166 | + } |
|---|
| 1167 | + } |
|---|
| 1168 | + |
|---|
| 1169 | + this.options.selector ? |
|---|
| 1170 | + (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : |
|---|
| 1171 | + this.fixTitle() |
|---|
| 1172 | + } |
|---|
| 1173 | + |
|---|
| 1174 | + Tooltip.prototype.getDefaults = function () { |
|---|
| 1175 | + return Tooltip.DEFAULTS |
|---|
| 1176 | + } |
|---|
| 1177 | + |
|---|
| 1178 | + Tooltip.prototype.getOptions = function (options) { |
|---|
| 1179 | + options = $.extend({}, this.getDefaults(), this.$element.data(), options) |
|---|
| 1180 | + |
|---|
| 1181 | + if (options.delay && typeof options.delay == 'number') { |
|---|
| 1182 | + options.delay = { |
|---|
| 1183 | + show: options.delay, |
|---|
| 1184 | + hide: options.delay |
|---|
| 1185 | + } |
|---|
| 1186 | + } |
|---|
| 1187 | + |
|---|
| 1188 | + return options |
|---|
| 1189 | + } |
|---|
| 1190 | + |
|---|
| 1191 | + Tooltip.prototype.getDelegateOptions = function () { |
|---|
| 1192 | + var options = {} |
|---|
| 1193 | + var defaults = this.getDefaults() |
|---|
| 1194 | + |
|---|
| 1195 | + this._options && $.each(this._options, function (key, value) { |
|---|
| 1196 | + if (defaults[key] != value) options[key] = value |
|---|
| 1197 | + }) |
|---|
| 1198 | + |
|---|
| 1199 | + return options |
|---|
| 1200 | + } |
|---|
| 1201 | + |
|---|
| 1202 | + Tooltip.prototype.enter = function (obj) { |
|---|
| 1203 | + var self = obj instanceof this.constructor ? |
|---|
| 1204 | + obj : $(obj.currentTarget).data('bs.' + this.type) |
|---|
| 1205 | + |
|---|
| 1206 | + if (!self) { |
|---|
| 1207 | + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) |
|---|
| 1208 | + $(obj.currentTarget).data('bs.' + this.type, self) |
|---|
| 1209 | + } |
|---|
| 1210 | + |
|---|
| 1211 | + clearTimeout(self.timeout) |
|---|
| 1212 | + |
|---|
| 1213 | + self.hoverState = 'in' |
|---|
| 1214 | + |
|---|
| 1215 | + if (!self.options.delay || !self.options.delay.show) return self.show() |
|---|
| 1216 | + |
|---|
| 1217 | + self.timeout = setTimeout(function () { |
|---|
| 1218 | + if (self.hoverState == 'in') self.show() |
|---|
| 1219 | + }, self.options.delay.show) |
|---|
| 1220 | + } |
|---|
| 1221 | + |
|---|
| 1222 | + Tooltip.prototype.leave = function (obj) { |
|---|
| 1223 | + var self = obj instanceof this.constructor ? |
|---|
| 1224 | + obj : $(obj.currentTarget).data('bs.' + this.type) |
|---|
| 1225 | + |
|---|
| 1226 | + if (!self) { |
|---|
| 1227 | + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) |
|---|
| 1228 | + $(obj.currentTarget).data('bs.' + this.type, self) |
|---|
| 1229 | + } |
|---|
| 1230 | + |
|---|
| 1231 | + clearTimeout(self.timeout) |
|---|
| 1232 | + |
|---|
| 1233 | + self.hoverState = 'out' |
|---|
| 1234 | + |
|---|
| 1235 | + if (!self.options.delay || !self.options.delay.hide) return self.hide() |
|---|
| 1236 | + |
|---|
| 1237 | + self.timeout = setTimeout(function () { |
|---|
| 1238 | + if (self.hoverState == 'out') self.hide() |
|---|
| 1239 | + }, self.options.delay.hide) |
|---|
| 1240 | + } |
|---|
| 1241 | + |
|---|
| 1242 | + Tooltip.prototype.show = function () { |
|---|
| 1243 | + var e = $.Event('show.bs.' + this.type) |
|---|
| 1244 | + |
|---|
| 1245 | + if (this.hasContent() && this.enabled) { |
|---|
| 1246 | + this.$element.trigger(e) |
|---|
| 1247 | + |
|---|
| 1248 | + var inDom = $.contains(document.documentElement, this.$element[0]) |
|---|
| 1249 | + if (e.isDefaultPrevented() || !inDom) return |
|---|
| 1250 | + var that = this |
|---|
| 1251 | + |
|---|
| 1252 | + var $tip = this.tip() |
|---|
| 1253 | + |
|---|
| 1254 | + var tipId = this.getUID(this.type) |
|---|
| 1255 | + |
|---|
| 1256 | + this.setContent() |
|---|
| 1257 | + $tip.attr('id', tipId) |
|---|
| 1258 | + this.$element.attr('aria-describedby', tipId) |
|---|
| 1259 | + |
|---|
| 1260 | + if (this.options.animation) $tip.addClass('fade') |
|---|
| 1261 | + |
|---|
| 1262 | + var placement = typeof this.options.placement == 'function' ? |
|---|
| 1263 | + this.options.placement.call(this, $tip[0], this.$element[0]) : |
|---|
| 1264 | + this.options.placement |
|---|
| 1265 | + |
|---|
| 1266 | + var autoToken = /\s?auto?\s?/i |
|---|
| 1267 | + var autoPlace = autoToken.test(placement) |
|---|
| 1268 | + if (autoPlace) placement = placement.replace(autoToken, '') || 'top' |
|---|
| 1269 | + |
|---|
| 1270 | + $tip |
|---|
| 1271 | + .detach() |
|---|
| 1272 | + .css({ top: 0, left: 0, display: 'block' }) |
|---|
| 1273 | + .addClass(placement) |
|---|
| 1274 | + .data('bs.' + this.type, this) |
|---|
| 1275 | + |
|---|
| 1276 | + this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) |
|---|
| 1277 | + |
|---|
| 1278 | + var pos = this.getPosition() |
|---|
| 1279 | + var actualWidth = $tip[0].offsetWidth |
|---|
| 1280 | + var actualHeight = $tip[0].offsetHeight |
|---|
| 1281 | + |
|---|
| 1282 | + if (autoPlace) { |
|---|
| 1283 | + var orgPlacement = placement |
|---|
| 1284 | + var $parent = this.$element.parent() |
|---|
| 1285 | + var parentDim = this.getPosition($parent) |
|---|
| 1286 | + |
|---|
| 1287 | + placement = placement == 'bottom' && pos.top + pos.height + actualHeight - parentDim.scroll > parentDim.height ? 'top' : |
|---|
| 1288 | + placement == 'top' && pos.top - parentDim.scroll - actualHeight < 0 ? 'bottom' : |
|---|
| 1289 | + placement == 'right' && pos.right + actualWidth > parentDim.width ? 'left' : |
|---|
| 1290 | + placement == 'left' && pos.left - actualWidth < parentDim.left ? 'right' : |
|---|
| 1291 | + placement |
|---|
| 1292 | + |
|---|
| 1293 | + $tip |
|---|
| 1294 | + .removeClass(orgPlacement) |
|---|
| 1295 | + .addClass(placement) |
|---|
| 1296 | + } |
|---|
| 1297 | + |
|---|
| 1298 | + var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) |
|---|
| 1299 | + |
|---|
| 1300 | + this.applyPlacement(calculatedOffset, placement) |
|---|
| 1301 | + |
|---|
| 1302 | + var complete = function () { |
|---|
| 1303 | + that.$element.trigger('shown.bs.' + that.type) |
|---|
| 1304 | + that.hoverState = null |
|---|
| 1305 | + } |
|---|
| 1306 | + |
|---|
| 1307 | + $.support.transition && this.$tip.hasClass('fade') ? |
|---|
| 1308 | + $tip |
|---|
| 1309 | + .one('bsTransitionEnd', complete) |
|---|
| 1310 | + .emulateTransitionEnd(150) : |
|---|
| 1311 | + complete() |
|---|
| 1312 | + } |
|---|
| 1313 | + } |
|---|
| 1314 | + |
|---|
| 1315 | + Tooltip.prototype.applyPlacement = function (offset, placement) { |
|---|
| 1316 | + var $tip = this.tip() |
|---|
| 1317 | + var width = $tip[0].offsetWidth |
|---|
| 1318 | + var height = $tip[0].offsetHeight |
|---|
| 1319 | + |
|---|
| 1320 | + // manually read margins because getBoundingClientRect includes difference |
|---|
| 1321 | + var marginTop = parseInt($tip.css('margin-top'), 10) |
|---|
| 1322 | + var marginLeft = parseInt($tip.css('margin-left'), 10) |
|---|
| 1323 | + |
|---|
| 1324 | + // we must check for NaN for ie 8/9 |
|---|
| 1325 | + if (isNaN(marginTop)) marginTop = 0 |
|---|
| 1326 | + if (isNaN(marginLeft)) marginLeft = 0 |
|---|
| 1327 | + |
|---|
| 1328 | + offset.top = offset.top + marginTop |
|---|
| 1329 | + offset.left = offset.left + marginLeft |
|---|
| 1330 | + |
|---|
| 1331 | + // $.fn.offset doesn't round pixel values |
|---|
| 1332 | + // so we use setOffset directly with our own function B-0 |
|---|
| 1333 | + $.offset.setOffset($tip[0], $.extend({ |
|---|
| 1334 | + using: function (props) { |
|---|
| 1335 | + $tip.css({ |
|---|
| 1336 | + top: Math.round(props.top), |
|---|
| 1337 | + left: Math.round(props.left) |
|---|
| 1338 | + }) |
|---|
| 1339 | + } |
|---|
| 1340 | + }, offset), 0) |
|---|
| 1341 | + |
|---|
| 1342 | + $tip.addClass('in') |
|---|
| 1343 | + |
|---|
| 1344 | + // check to see if placing tip in new offset caused the tip to resize itself |
|---|
| 1345 | + var actualWidth = $tip[0].offsetWidth |
|---|
| 1346 | + var actualHeight = $tip[0].offsetHeight |
|---|
| 1347 | + |
|---|
| 1348 | + if (placement == 'top' && actualHeight != height) { |
|---|
| 1349 | + offset.top = offset.top + height - actualHeight |
|---|
| 1350 | + } |
|---|
| 1351 | + |
|---|
| 1352 | + var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) |
|---|
| 1353 | + |
|---|
| 1354 | + if (delta.left) offset.left += delta.left |
|---|
| 1355 | + else offset.top += delta.top |
|---|
| 1356 | + |
|---|
| 1357 | + var arrowDelta = delta.left ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight |
|---|
| 1358 | + var arrowPosition = delta.left ? 'left' : 'top' |
|---|
| 1359 | + var arrowOffsetPosition = delta.left ? 'offsetWidth' : 'offsetHeight' |
|---|
| 1360 | + |
|---|
| 1361 | + $tip.offset(offset) |
|---|
| 1362 | + this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], arrowPosition) |
|---|
| 1363 | + } |
|---|
| 1364 | + |
|---|
| 1365 | + Tooltip.prototype.replaceArrow = function (delta, dimension, position) { |
|---|
| 1366 | + this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '') |
|---|
| 1367 | + } |
|---|
| 1368 | + |
|---|
| 1369 | + Tooltip.prototype.setContent = function () { |
|---|
| 1370 | + var $tip = this.tip() |
|---|
| 1371 | + var title = this.getTitle() |
|---|
| 1372 | + |
|---|
| 1373 | + $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) |
|---|
| 1374 | + $tip.removeClass('fade in top bottom left right') |
|---|
| 1375 | + } |
|---|
| 1376 | + |
|---|
| 1377 | + Tooltip.prototype.hide = function () { |
|---|
| 1378 | + var that = this |
|---|
| 1379 | + var $tip = this.tip() |
|---|
| 1380 | + var e = $.Event('hide.bs.' + this.type) |
|---|
| 1381 | + |
|---|
| 1382 | + this.$element.removeAttr('aria-describedby') |
|---|
| 1383 | + |
|---|
| 1384 | + function complete() { |
|---|
| 1385 | + if (that.hoverState != 'in') $tip.detach() |
|---|
| 1386 | + that.$element.trigger('hidden.bs.' + that.type) |
|---|
| 1387 | + } |
|---|
| 1388 | + |
|---|
| 1389 | + this.$element.trigger(e) |
|---|
| 1390 | + |
|---|
| 1391 | + if (e.isDefaultPrevented()) return |
|---|
| 1392 | + |
|---|
| 1393 | + $tip.removeClass('in') |
|---|
| 1394 | + |
|---|
| 1395 | + $.support.transition && this.$tip.hasClass('fade') ? |
|---|
| 1396 | + $tip |
|---|
| 1397 | + .one('bsTransitionEnd', complete) |
|---|
| 1398 | + .emulateTransitionEnd(150) : |
|---|
| 1399 | + complete() |
|---|
| 1400 | + |
|---|
| 1401 | + this.hoverState = null |
|---|
| 1402 | + |
|---|
| 1403 | + return this |
|---|
| 1404 | + } |
|---|
| 1405 | + |
|---|
| 1406 | + Tooltip.prototype.fixTitle = function () { |
|---|
| 1407 | + var $e = this.$element |
|---|
| 1408 | + if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') { |
|---|
| 1409 | + $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') |
|---|
| 1410 | + } |
|---|
| 1411 | + } |
|---|
| 1412 | + |
|---|
| 1413 | + Tooltip.prototype.hasContent = function () { |
|---|
| 1414 | + return this.getTitle() |
|---|
| 1415 | + } |
|---|
| 1416 | + |
|---|
| 1417 | + Tooltip.prototype.getPosition = function ($element) { |
|---|
| 1418 | + $element = $element || this.$element |
|---|
| 1419 | + var el = $element[0] |
|---|
| 1420 | + var isBody = el.tagName == 'BODY' |
|---|
| 1421 | + return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : null, { |
|---|
| 1422 | + scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop(), |
|---|
| 1423 | + width: isBody ? $(window).width() : $element.outerWidth(), |
|---|
| 1424 | + height: isBody ? $(window).height() : $element.outerHeight() |
|---|
| 1425 | + }, isBody ? { top: 0, left: 0 } : $element.offset()) |
|---|
| 1426 | + } |
|---|
| 1427 | + |
|---|
| 1428 | + Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { |
|---|
| 1429 | + return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : |
|---|
| 1430 | + placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : |
|---|
| 1431 | + placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : |
|---|
| 1432 | + /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } |
|---|
| 1433 | + |
|---|
| 1434 | + } |
|---|
| 1435 | + |
|---|
| 1436 | + Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { |
|---|
| 1437 | + var delta = { top: 0, left: 0 } |
|---|
| 1438 | + if (!this.$viewport) return delta |
|---|
| 1439 | + |
|---|
| 1440 | + var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 |
|---|
| 1441 | + var viewportDimensions = this.getPosition(this.$viewport) |
|---|
| 1442 | + |
|---|
| 1443 | + if (/right|left/.test(placement)) { |
|---|
| 1444 | + var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll |
|---|
| 1445 | + var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight |
|---|
| 1446 | + if (topEdgeOffset < viewportDimensions.top) { // top overflow |
|---|
| 1447 | + delta.top = viewportDimensions.top - topEdgeOffset |
|---|
| 1448 | + } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow |
|---|
| 1449 | + delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset |
|---|
| 1450 | + } |
|---|
| 1451 | + } else { |
|---|
| 1452 | + var leftEdgeOffset = pos.left - viewportPadding |
|---|
| 1453 | + var rightEdgeOffset = pos.left + viewportPadding + actualWidth |
|---|
| 1454 | + if (leftEdgeOffset < viewportDimensions.left) { // left overflow |
|---|
| 1455 | + delta.left = viewportDimensions.left - leftEdgeOffset |
|---|
| 1456 | + } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow |
|---|
| 1457 | + delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset |
|---|
| 1458 | + } |
|---|
| 1459 | + } |
|---|
| 1460 | + |
|---|
| 1461 | + return delta |
|---|
| 1462 | + } |
|---|
| 1463 | + |
|---|
| 1464 | + Tooltip.prototype.getTitle = function () { |
|---|
| 1465 | + var title |
|---|
| 1466 | + var $e = this.$element |
|---|
| 1467 | + var o = this.options |
|---|
| 1468 | + |
|---|
| 1469 | + title = $e.attr('data-original-title') |
|---|
| 1470 | + || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) |
|---|
| 1471 | + |
|---|
| 1472 | + return title |
|---|
| 1473 | + } |
|---|
| 1474 | + |
|---|
| 1475 | + Tooltip.prototype.getUID = function (prefix) { |
|---|
| 1476 | + do prefix += ~~(Math.random() * 1000000) |
|---|
| 1477 | + while (document.getElementById(prefix)) |
|---|
| 1478 | + return prefix |
|---|
| 1479 | + } |
|---|
| 1480 | + |
|---|
| 1481 | + Tooltip.prototype.tip = function () { |
|---|
| 1482 | + return (this.$tip = this.$tip || $(this.options.template)) |
|---|
| 1483 | + } |
|---|
| 1484 | + |
|---|
| 1485 | + Tooltip.prototype.arrow = function () { |
|---|
| 1486 | + return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) |
|---|
| 1487 | + } |
|---|
| 1488 | + |
|---|
| 1489 | + Tooltip.prototype.validate = function () { |
|---|
| 1490 | + if (!this.$element[0].parentNode) { |
|---|
| 1491 | + this.hide() |
|---|
| 1492 | + this.$element = null |
|---|
| 1493 | + this.options = null |
|---|
| 1494 | + } |
|---|
| 1495 | + } |
|---|
| 1496 | + |
|---|
| 1497 | + Tooltip.prototype.enable = function () { |
|---|
| 1498 | + this.enabled = true |
|---|
| 1499 | + } |
|---|
| 1500 | + |
|---|
| 1501 | + Tooltip.prototype.disable = function () { |
|---|
| 1502 | + this.enabled = false |
|---|
| 1503 | + } |
|---|
| 1504 | + |
|---|
| 1505 | + Tooltip.prototype.toggleEnabled = function () { |
|---|
| 1506 | + this.enabled = !this.enabled |
|---|
| 1507 | + } |
|---|
| 1508 | + |
|---|
| 1509 | + Tooltip.prototype.toggle = function (e) { |
|---|
| 1510 | + var self = this |
|---|
| 1511 | + if (e) { |
|---|
| 1512 | + self = $(e.currentTarget).data('bs.' + this.type) |
|---|
| 1513 | + if (!self) { |
|---|
| 1514 | + self = new this.constructor(e.currentTarget, this.getDelegateOptions()) |
|---|
| 1515 | + $(e.currentTarget).data('bs.' + this.type, self) |
|---|
| 1516 | + } |
|---|
| 1517 | + } |
|---|
| 1518 | + |
|---|
| 1519 | + self.tip().hasClass('in') ? self.leave(self) : self.enter(self) |
|---|
| 1520 | + } |
|---|
| 1521 | + |
|---|
| 1522 | + Tooltip.prototype.destroy = function () { |
|---|
| 1523 | + clearTimeout(this.timeout) |
|---|
| 1524 | + this.hide().$element.off('.' + this.type).removeData('bs.' + this.type) |
|---|
| 1525 | + } |
|---|
| 1526 | + |
|---|
| 1527 | + |
|---|
| 1528 | + // TOOLTIP PLUGIN DEFINITION |
|---|
| 1529 | + // ========================= |
|---|
| 1530 | + |
|---|
| 1531 | + function Plugin(option) { |
|---|
| 1532 | + return this.each(function () { |
|---|
| 1533 | + var $this = $(this) |
|---|
| 1534 | + var data = $this.data('bs.tooltip') |
|---|
| 1535 | + var options = typeof option == 'object' && option |
|---|
| 1536 | + |
|---|
| 1537 | + if (!data && option == 'destroy') return |
|---|
| 1538 | + if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) |
|---|
| 1539 | + if (typeof option == 'string') data[option]() |
|---|
| 1540 | + }) |
|---|
| 1541 | + } |
|---|
| 1542 | + |
|---|
| 1543 | + var old = $.fn.tooltip |
|---|
| 1544 | + |
|---|
| 1545 | + $.fn.tooltip = Plugin |
|---|
| 1546 | + $.fn.tooltip.Constructor = Tooltip |
|---|
| 1547 | + |
|---|
| 1548 | + |
|---|
| 1549 | + // TOOLTIP NO CONFLICT |
|---|
| 1550 | + // =================== |
|---|
| 1551 | + |
|---|
| 1552 | + $.fn.tooltip.noConflict = function () { |
|---|
| 1553 | + $.fn.tooltip = old |
|---|
| 1554 | + return this |
|---|
| 1555 | + } |
|---|
| 1556 | + |
|---|
| 1557 | +}(jQuery); |
|---|
| 1558 | + |
|---|
| 1559 | +/* ======================================================================== |
|---|
| 1560 | + * Bootstrap: popover.js v3.2.0 |
|---|
| 1561 | + * http://getbootstrap.com/javascript/#popovers |
|---|
| 1562 | + * ======================================================================== |
|---|
| 1563 | + * Copyright 2011-2014 Twitter, Inc. |
|---|
| 1564 | + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
|---|
| 1565 | + * ======================================================================== */ |
|---|
| 1566 | + |
|---|
| 1567 | + |
|---|
| 1568 | ++function ($) { |
|---|
| 1569 | + 'use strict'; |
|---|
| 1570 | + |
|---|
| 1571 | + // POPOVER PUBLIC CLASS DEFINITION |
|---|
| 1572 | + // =============================== |
|---|
| 1573 | + |
|---|
| 1574 | + var Popover = function (element, options) { |
|---|
| 1575 | + this.init('popover', element, options) |
|---|
| 1576 | + } |
|---|
| 1577 | + |
|---|
| 1578 | + if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') |
|---|
| 1579 | + |
|---|
| 1580 | + Popover.VERSION = '3.2.0' |
|---|
| 1581 | + |
|---|
| 1582 | + Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { |
|---|
| 1583 | + placement: 'right', |
|---|
| 1584 | + trigger: 'click', |
|---|
| 1585 | + content: '', |
|---|
| 1586 | + template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>' |
|---|
| 1587 | + }) |
|---|
| 1588 | + |
|---|
| 1589 | + |
|---|
| 1590 | + // NOTE: POPOVER EXTENDS tooltip.js |
|---|
| 1591 | + // ================================ |
|---|
| 1592 | + |
|---|
| 1593 | + Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) |
|---|
| 1594 | + |
|---|
| 1595 | + Popover.prototype.constructor = Popover |
|---|
| 1596 | + |
|---|
| 1597 | + Popover.prototype.getDefaults = function () { |
|---|
| 1598 | + return Popover.DEFAULTS |
|---|
| 1599 | + } |
|---|
| 1600 | + |
|---|
| 1601 | + Popover.prototype.setContent = function () { |
|---|
| 1602 | + var $tip = this.tip() |
|---|
| 1603 | + var title = this.getTitle() |
|---|
| 1604 | + var content = this.getContent() |
|---|
| 1605 | + |
|---|
| 1606 | + $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) |
|---|
| 1607 | + $tip.find('.popover-content').empty()[ // we use append for html objects to maintain js events |
|---|
| 1608 | + this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' |
|---|
| 1609 | + ](content) |
|---|
| 1610 | + |
|---|
| 1611 | + $tip.removeClass('fade top bottom left right in') |
|---|
| 1612 | + |
|---|
| 1613 | + // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do |
|---|
| 1614 | + // this manually by checking the contents. |
|---|
| 1615 | + if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() |
|---|
| 1616 | + } |
|---|
| 1617 | + |
|---|
| 1618 | + Popover.prototype.hasContent = function () { |
|---|
| 1619 | + return this.getTitle() || this.getContent() |
|---|
| 1620 | + } |
|---|
| 1621 | + |
|---|
| 1622 | + Popover.prototype.getContent = function () { |
|---|
| 1623 | + var $e = this.$element |
|---|
| 1624 | + var o = this.options |
|---|
| 1625 | + |
|---|
| 1626 | + return $e.attr('data-content') |
|---|
| 1627 | + || (typeof o.content == 'function' ? |
|---|
| 1628 | + o.content.call($e[0]) : |
|---|
| 1629 | + o.content) |
|---|
| 1630 | + } |
|---|
| 1631 | + |
|---|
| 1632 | + Popover.prototype.arrow = function () { |
|---|
| 1633 | + return (this.$arrow = this.$arrow || this.tip().find('.arrow')) |
|---|
| 1634 | + } |
|---|
| 1635 | + |
|---|
| 1636 | + Popover.prototype.tip = function () { |
|---|
| 1637 | + if (!this.$tip) this.$tip = $(this.options.template) |
|---|
| 1638 | + return this.$tip |
|---|
| 1639 | + } |
|---|
| 1640 | + |
|---|
| 1641 | + |
|---|
| 1642 | + // POPOVER PLUGIN DEFINITION |
|---|
| 1643 | + // ========================= |
|---|
| 1644 | + |
|---|
| 1645 | + function Plugin(option) { |
|---|
| 1646 | + return this.each(function () { |
|---|
| 1647 | + var $this = $(this) |
|---|
| 1648 | + var data = $this.data('bs.popover') |
|---|
| 1649 | + var options = typeof option == 'object' && option |
|---|
| 1650 | + |
|---|
| 1651 | + if (!data && option == 'destroy') return |
|---|
| 1652 | + if (!data) $this.data('bs.popover', (data = new Popover(this, options))) |
|---|
| 1653 | + if (typeof option == 'string') data[option]() |
|---|
| 1654 | + }) |
|---|
| 1655 | + } |
|---|
| 1656 | + |
|---|
| 1657 | + var old = $.fn.popover |
|---|
| 1658 | + |
|---|
| 1659 | + $.fn.popover = Plugin |
|---|
| 1660 | + $.fn.popover.Constructor = Popover |
|---|
| 1661 | + |
|---|
| 1662 | + |
|---|
| 1663 | + // POPOVER NO CONFLICT |
|---|
| 1664 | + // =================== |
|---|
| 1665 | + |
|---|
| 1666 | + $.fn.popover.noConflict = function () { |
|---|
| 1667 | + $.fn.popover = old |
|---|
| 1668 | + return this |
|---|
| 1669 | + } |
|---|
| 1670 | + |
|---|
| 1671 | +}(jQuery); |
|---|
| 1672 | + |
|---|
| 1673 | +/* ======================================================================== |
|---|
| 1674 | + * Bootstrap: scrollspy.js v3.2.0 |
|---|
| 1675 | + * http://getbootstrap.com/javascript/#scrollspy |
|---|
| 1676 | + * ======================================================================== |
|---|
| 1677 | + * Copyright 2011-2014 Twitter, Inc. |
|---|
| 1678 | + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
|---|
| 1679 | + * ======================================================================== */ |
|---|
| 1680 | + |
|---|
| 1681 | + |
|---|
| 1682 | ++function ($) { |
|---|
| 1683 | + 'use strict'; |
|---|
| 1684 | + |
|---|
| 1685 | + // SCROLLSPY CLASS DEFINITION |
|---|
| 1686 | + // ========================== |
|---|
| 1687 | + |
|---|
| 1688 | + function ScrollSpy(element, options) { |
|---|
| 1689 | + var process = $.proxy(this.process, this) |
|---|
| 1690 | + |
|---|
| 1691 | + this.$body = $('body') |
|---|
| 1692 | + this.$scrollElement = $(element).is('body') ? $(window) : $(element) |
|---|
| 1693 | + this.options = $.extend({}, ScrollSpy.DEFAULTS, options) |
|---|
| 1694 | + this.selector = (this.options.target || '') + ' .nav li > a' |
|---|
| 1695 | + this.offsets = [] |
|---|
| 1696 | + this.targets = [] |
|---|
| 1697 | + this.activeTarget = null |
|---|
| 1698 | + this.scrollHeight = 0 |
|---|
| 1699 | + |
|---|
| 1700 | + this.$scrollElement.on('scroll.bs.scrollspy', process) |
|---|
| 1701 | + this.refresh() |
|---|
| 1702 | + this.process() |
|---|
| 1703 | + } |
|---|
| 1704 | + |
|---|
| 1705 | + ScrollSpy.VERSION = '3.2.0' |
|---|
| 1706 | + |
|---|
| 1707 | + ScrollSpy.DEFAULTS = { |
|---|
| 1708 | + offset: 10 |
|---|
| 1709 | + } |
|---|
| 1710 | + |
|---|
| 1711 | + ScrollSpy.prototype.getScrollHeight = function () { |
|---|
| 1712 | + return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) |
|---|
| 1713 | + } |
|---|
| 1714 | + |
|---|
| 1715 | + ScrollSpy.prototype.refresh = function () { |
|---|
| 1716 | + var offsetMethod = 'offset' |
|---|
| 1717 | + var offsetBase = 0 |
|---|
| 1718 | + |
|---|
| 1719 | + if (!$.isWindow(this.$scrollElement[0])) { |
|---|
| 1720 | + offsetMethod = 'position' |
|---|
| 1721 | + offsetBase = this.$scrollElement.scrollTop() |
|---|
| 1722 | + } |
|---|
| 1723 | + |
|---|
| 1724 | + this.offsets = [] |
|---|
| 1725 | + this.targets = [] |
|---|
| 1726 | + this.scrollHeight = this.getScrollHeight() |
|---|
| 1727 | + |
|---|
| 1728 | + var self = this |
|---|
| 1729 | + |
|---|
| 1730 | + this.$body |
|---|
| 1731 | + .find(this.selector) |
|---|
| 1732 | + .map(function () { |
|---|
| 1733 | + var $el = $(this) |
|---|
| 1734 | + var href = $el.data('target') || $el.attr('href') |
|---|
| 1735 | + var $href = /^#./.test(href) && $(href) |
|---|
| 1736 | + |
|---|
| 1737 | + return ($href |
|---|
| 1738 | + && $href.length |
|---|
| 1739 | + && $href.is(':visible') |
|---|
| 1740 | + && [[$href[offsetMethod]().top + offsetBase, href]]) || null |
|---|
| 1741 | + }) |
|---|
| 1742 | + .sort(function (a, b) { return a[0] - b[0] }) |
|---|
| 1743 | + .each(function () { |
|---|
| 1744 | + self.offsets.push(this[0]) |
|---|
| 1745 | + self.targets.push(this[1]) |
|---|
| 1746 | + }) |
|---|
| 1747 | + } |
|---|
| 1748 | + |
|---|
| 1749 | + ScrollSpy.prototype.process = function () { |
|---|
| 1750 | + var scrollTop = this.$scrollElement.scrollTop() + this.options.offset |
|---|
| 1751 | + var scrollHeight = this.getScrollHeight() |
|---|
| 1752 | + var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() |
|---|
| 1753 | + var offsets = this.offsets |
|---|
| 1754 | + var targets = this.targets |
|---|
| 1755 | + var activeTarget = this.activeTarget |
|---|
| 1756 | + var i |
|---|
| 1757 | + |
|---|
| 1758 | + if (this.scrollHeight != scrollHeight) { |
|---|
| 1759 | + this.refresh() |
|---|
| 1760 | + } |
|---|
| 1761 | + |
|---|
| 1762 | + if (scrollTop >= maxScroll) { |
|---|
| 1763 | + return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) |
|---|
| 1764 | + } |
|---|
| 1765 | + |
|---|
| 1766 | + if (activeTarget && scrollTop <= offsets[0]) { |
|---|
| 1767 | + return activeTarget != (i = targets[0]) && this.activate(i) |
|---|
| 1768 | + } |
|---|
| 1769 | + |
|---|
| 1770 | + for (i = offsets.length; i--;) { |
|---|
| 1771 | + activeTarget != targets[i] |
|---|
| 1772 | + && scrollTop >= offsets[i] |
|---|
| 1773 | + && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) |
|---|
| 1774 | + && this.activate(targets[i]) |
|---|
| 1775 | + } |
|---|
| 1776 | + } |
|---|
| 1777 | + |
|---|
| 1778 | + ScrollSpy.prototype.activate = function (target) { |
|---|
| 1779 | + this.activeTarget = target |
|---|
| 1780 | + |
|---|
| 1781 | + $(this.selector) |
|---|
| 1782 | + .parentsUntil(this.options.target, '.active') |
|---|
| 1783 | + .removeClass('active') |
|---|
| 1784 | + |
|---|
| 1785 | + var selector = this.selector + |
|---|
| 1786 | + '[data-target="' + target + '"],' + |
|---|
| 1787 | + this.selector + '[href="' + target + '"]' |
|---|
| 1788 | + |
|---|
| 1789 | + var active = $(selector) |
|---|
| 1790 | + .parents('li') |
|---|
| 1791 | + .addClass('active') |
|---|
| 1792 | + |
|---|
| 1793 | + if (active.parent('.dropdown-menu').length) { |
|---|
| 1794 | + active = active |
|---|
| 1795 | + .closest('li.dropdown') |
|---|
| 1796 | + .addClass('active') |
|---|
| 1797 | + } |
|---|
| 1798 | + |
|---|
| 1799 | + active.trigger('activate.bs.scrollspy') |
|---|
| 1800 | + } |
|---|
| 1801 | + |
|---|
| 1802 | + |
|---|
| 1803 | + // SCROLLSPY PLUGIN DEFINITION |
|---|
| 1804 | + // =========================== |
|---|
| 1805 | + |
|---|
| 1806 | + function Plugin(option) { |
|---|
| 1807 | + return this.each(function () { |
|---|
| 1808 | + var $this = $(this) |
|---|
| 1809 | + var data = $this.data('bs.scrollspy') |
|---|
| 1810 | + var options = typeof option == 'object' && option |
|---|
| 1811 | + |
|---|
| 1812 | + if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) |
|---|
| 1813 | + if (typeof option == 'string') data[option]() |
|---|
| 1814 | + }) |
|---|
| 1815 | + } |
|---|
| 1816 | + |
|---|
| 1817 | + var old = $.fn.scrollspy |
|---|
| 1818 | + |
|---|
| 1819 | + $.fn.scrollspy = Plugin |
|---|
| 1820 | + $.fn.scrollspy.Constructor = ScrollSpy |
|---|
| 1821 | + |
|---|
| 1822 | + |
|---|
| 1823 | + // SCROLLSPY NO CONFLICT |
|---|
| 1824 | + // ===================== |
|---|
| 1825 | + |
|---|
| 1826 | + $.fn.scrollspy.noConflict = function () { |
|---|
| 1827 | + $.fn.scrollspy = old |
|---|
| 1828 | + return this |
|---|
| 1829 | + } |
|---|
| 1830 | + |
|---|
| 1831 | + |
|---|
| 1832 | + // SCROLLSPY DATA-API |
|---|
| 1833 | + // ================== |
|---|
| 1834 | + |
|---|
| 1835 | + $(window).on('load.bs.scrollspy.data-api', function () { |
|---|
| 1836 | + $('[data-spy="scroll"]').each(function () { |
|---|
| 1837 | + var $spy = $(this) |
|---|
| 1838 | + Plugin.call($spy, $spy.data()) |
|---|
| 1839 | + }) |
|---|
| 1840 | + }) |
|---|
| 1841 | + |
|---|
| 1842 | +}(jQuery); |
|---|
| 1843 | + |
|---|
| 1844 | +/* ======================================================================== |
|---|
| 1845 | + * Bootstrap: tab.js v3.2.0 |
|---|
| 1846 | + * http://getbootstrap.com/javascript/#tabs |
|---|
| 1847 | + * ======================================================================== |
|---|
| 1848 | + * Copyright 2011-2014 Twitter, Inc. |
|---|
| 1849 | + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
|---|
| 1850 | + * ======================================================================== */ |
|---|
| 1851 | + |
|---|
| 1852 | + |
|---|
| 1853 | ++function ($) { |
|---|
| 1854 | + 'use strict'; |
|---|
| 1855 | + |
|---|
| 1856 | + // TAB CLASS DEFINITION |
|---|
| 1857 | + // ==================== |
|---|
| 1858 | + |
|---|
| 1859 | + var Tab = function (element) { |
|---|
| 1860 | + this.element = $(element) |
|---|
| 1861 | + } |
|---|
| 1862 | + |
|---|
| 1863 | + Tab.VERSION = '3.2.0' |
|---|
| 1864 | + |
|---|
| 1865 | + Tab.prototype.show = function () { |
|---|
| 1866 | + var $this = this.element |
|---|
| 1867 | + var $ul = $this.closest('ul:not(.dropdown-menu)') |
|---|
| 1868 | + var selector = $this.data('target') |
|---|
| 1869 | + |
|---|
| 1870 | + if (!selector) { |
|---|
| 1871 | + selector = $this.attr('href') |
|---|
| 1872 | + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 |
|---|
| 1873 | + } |
|---|
| 1874 | + |
|---|
| 1875 | + if ($this.parent('li').hasClass('active')) return |
|---|
| 1876 | + |
|---|
| 1877 | + var previous = $ul.find('.active:last a')[0] |
|---|
| 1878 | + var e = $.Event('show.bs.tab', { |
|---|
| 1879 | + relatedTarget: previous |
|---|
| 1880 | + }) |
|---|
| 1881 | + |
|---|
| 1882 | + $this.trigger(e) |
|---|
| 1883 | + |
|---|
| 1884 | + if (e.isDefaultPrevented()) return |
|---|
| 1885 | + |
|---|
| 1886 | + var $target = $(selector) |
|---|
| 1887 | + |
|---|
| 1888 | + this.activate($this.closest('li'), $ul) |
|---|
| 1889 | + this.activate($target, $target.parent(), function () { |
|---|
| 1890 | + $this.trigger({ |
|---|
| 1891 | + type: 'shown.bs.tab', |
|---|
| 1892 | + relatedTarget: previous |
|---|
| 1893 | + }) |
|---|
| 1894 | + }) |
|---|
| 1895 | + } |
|---|
| 1896 | + |
|---|
| 1897 | + Tab.prototype.activate = function (element, container, callback) { |
|---|
| 1898 | + var $active = container.find('> .active') |
|---|
| 1899 | + var transition = callback |
|---|
| 1900 | + && $.support.transition |
|---|
| 1901 | + && $active.hasClass('fade') |
|---|
| 1902 | + |
|---|
| 1903 | + function next() { |
|---|
| 1904 | + $active |
|---|
| 1905 | + .removeClass('active') |
|---|
| 1906 | + .find('> .dropdown-menu > .active') |
|---|
| 1907 | + .removeClass('active') |
|---|
| 1908 | + |
|---|
| 1909 | + element.addClass('active') |
|---|
| 1910 | + |
|---|
| 1911 | + if (transition) { |
|---|
| 1912 | + element[0].offsetWidth // reflow for transition |
|---|
| 1913 | + element.addClass('in') |
|---|
| 1914 | + } else { |
|---|
| 1915 | + element.removeClass('fade') |
|---|
| 1916 | + } |
|---|
| 1917 | + |
|---|
| 1918 | + if (element.parent('.dropdown-menu')) { |
|---|
| 1919 | + element.closest('li.dropdown').addClass('active') |
|---|
| 1920 | + } |
|---|
| 1921 | + |
|---|
| 1922 | + callback && callback() |
|---|
| 1923 | + } |
|---|
| 1924 | + |
|---|
| 1925 | + transition ? |
|---|
| 1926 | + $active |
|---|
| 1927 | + .one('bsTransitionEnd', next) |
|---|
| 1928 | + .emulateTransitionEnd(150) : |
|---|
| 1929 | + next() |
|---|
| 1930 | + |
|---|
| 1931 | + $active.removeClass('in') |
|---|
| 1932 | + } |
|---|
| 1933 | + |
|---|
| 1934 | + |
|---|
| 1935 | + // TAB PLUGIN DEFINITION |
|---|
| 1936 | + // ===================== |
|---|
| 1937 | + |
|---|
| 1938 | + function Plugin(option) { |
|---|
| 1939 | + return this.each(function () { |
|---|
| 1940 | + var $this = $(this) |
|---|
| 1941 | + var data = $this.data('bs.tab') |
|---|
| 1942 | + |
|---|
| 1943 | + if (!data) $this.data('bs.tab', (data = new Tab(this))) |
|---|
| 1944 | + if (typeof option == 'string') data[option]() |
|---|
| 1945 | + }) |
|---|
| 1946 | + } |
|---|
| 1947 | + |
|---|
| 1948 | + var old = $.fn.tab |
|---|
| 1949 | + |
|---|
| 1950 | + $.fn.tab = Plugin |
|---|
| 1951 | + $.fn.tab.Constructor = Tab |
|---|
| 1952 | + |
|---|
| 1953 | + |
|---|
| 1954 | + // TAB NO CONFLICT |
|---|
| 1955 | + // =============== |
|---|
| 1956 | + |
|---|
| 1957 | + $.fn.tab.noConflict = function () { |
|---|
| 1958 | + $.fn.tab = old |
|---|
| 1959 | + return this |
|---|
| 1960 | + } |
|---|
| 1961 | + |
|---|
| 1962 | + |
|---|
| 1963 | + // TAB DATA-API |
|---|
| 1964 | + // ============ |
|---|
| 1965 | + |
|---|
| 1966 | + $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { |
|---|
| 1967 | + e.preventDefault() |
|---|
| 1968 | + Plugin.call($(this), 'show') |
|---|
| 1969 | + }) |
|---|
| 1970 | + |
|---|
| 1971 | +}(jQuery); |
|---|
| 1972 | + |
|---|
| 1973 | +/* ======================================================================== |
|---|
| 1974 | + * Bootstrap: affix.js v3.2.0 |
|---|
| 1975 | + * http://getbootstrap.com/javascript/#affix |
|---|
| 1976 | + * ======================================================================== |
|---|
| 1977 | + * Copyright 2011-2014 Twitter, Inc. |
|---|
| 1978 | + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
|---|
| 1979 | + * ======================================================================== */ |
|---|
| 1980 | + |
|---|
| 1981 | + |
|---|
| 1982 | ++function ($) { |
|---|
| 1983 | + 'use strict'; |
|---|
| 1984 | + |
|---|
| 1985 | + // AFFIX CLASS DEFINITION |
|---|
| 1986 | + // ====================== |
|---|
| 1987 | + |
|---|
| 1988 | + var Affix = function (element, options) { |
|---|
| 1989 | + this.options = $.extend({}, Affix.DEFAULTS, options) |
|---|
| 1990 | + |
|---|
| 1991 | + this.$target = $(this.options.target) |
|---|
| 1992 | + .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) |
|---|
| 1993 | + .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) |
|---|
| 1994 | + |
|---|
| 1995 | + this.$element = $(element) |
|---|
| 1996 | + this.affixed = |
|---|
| 1997 | + this.unpin = |
|---|
| 1998 | + this.pinnedOffset = null |
|---|
| 1999 | + |
|---|
| 2000 | + this.checkPosition() |
|---|
| 2001 | + } |
|---|
| 2002 | + |
|---|
| 2003 | + Affix.VERSION = '3.2.0' |
|---|
| 2004 | + |
|---|
| 2005 | + Affix.RESET = 'affix affix-top affix-bottom' |
|---|
| 2006 | + |
|---|
| 2007 | + Affix.DEFAULTS = { |
|---|
| 2008 | + offset: 0, |
|---|
| 2009 | + target: window |
|---|
| 2010 | + } |
|---|
| 2011 | + |
|---|
| 2012 | + Affix.prototype.getPinnedOffset = function () { |
|---|
| 2013 | + if (this.pinnedOffset) return this.pinnedOffset |
|---|
| 2014 | + this.$element.removeClass(Affix.RESET).addClass('affix') |
|---|
| 2015 | + var scrollTop = this.$target.scrollTop() |
|---|
| 2016 | + var position = this.$element.offset() |
|---|
| 2017 | + return (this.pinnedOffset = position.top - scrollTop) |
|---|
| 2018 | + } |
|---|
| 2019 | + |
|---|
| 2020 | + Affix.prototype.checkPositionWithEventLoop = function () { |
|---|
| 2021 | + setTimeout($.proxy(this.checkPosition, this), 1) |
|---|
| 2022 | + } |
|---|
| 2023 | + |
|---|
| 2024 | + Affix.prototype.checkPosition = function () { |
|---|
| 2025 | + if (!this.$element.is(':visible')) return |
|---|
| 2026 | + |
|---|
| 2027 | + var scrollHeight = $(document).height() |
|---|
| 2028 | + var scrollTop = this.$target.scrollTop() |
|---|
| 2029 | + var position = this.$element.offset() |
|---|
| 2030 | + var offset = this.options.offset |
|---|
| 2031 | + var offsetTop = offset.top |
|---|
| 2032 | + var offsetBottom = offset.bottom |
|---|
| 2033 | + |
|---|
| 2034 | + if (typeof offset != 'object') offsetBottom = offsetTop = offset |
|---|
| 2035 | + if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) |
|---|
| 2036 | + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) |
|---|
| 2037 | + |
|---|
| 2038 | + var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false : |
|---|
| 2039 | + offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' : |
|---|
| 2040 | + offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false |
|---|
| 2041 | + |
|---|
| 2042 | + if (this.affixed === affix) return |
|---|
| 2043 | + if (this.unpin != null) this.$element.css('top', '') |
|---|
| 2044 | + |
|---|
| 2045 | + var affixType = 'affix' + (affix ? '-' + affix : '') |
|---|
| 2046 | + var e = $.Event(affixType + '.bs.affix') |
|---|
| 2047 | + |
|---|
| 2048 | + this.$element.trigger(e) |
|---|
| 2049 | + |
|---|
| 2050 | + if (e.isDefaultPrevented()) return |
|---|
| 2051 | + |
|---|
| 2052 | + this.affixed = affix |
|---|
| 2053 | + this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null |
|---|
| 2054 | + |
|---|
| 2055 | + this.$element |
|---|
| 2056 | + .removeClass(Affix.RESET) |
|---|
| 2057 | + .addClass(affixType) |
|---|
| 2058 | + .trigger($.Event(affixType.replace('affix', 'affixed'))) |
|---|
| 2059 | + |
|---|
| 2060 | + if (affix == 'bottom') { |
|---|
| 2061 | + this.$element.offset({ |
|---|
| 2062 | + top: scrollHeight - this.$element.height() - offsetBottom |
|---|
| 2063 | + }) |
|---|
| 2064 | + } |
|---|
| 2065 | + } |
|---|
| 2066 | + |
|---|
| 2067 | + |
|---|
| 2068 | + // AFFIX PLUGIN DEFINITION |
|---|
| 2069 | + // ======================= |
|---|
| 2070 | + |
|---|
| 2071 | + function Plugin(option) { |
|---|
| 2072 | + return this.each(function () { |
|---|
| 2073 | + var $this = $(this) |
|---|
| 2074 | + var data = $this.data('bs.affix') |
|---|
| 2075 | + var options = typeof option == 'object' && option |
|---|
| 2076 | + |
|---|
| 2077 | + if (!data) $this.data('bs.affix', (data = new Affix(this, options))) |
|---|
| 2078 | + if (typeof option == 'string') data[option]() |
|---|
| 2079 | + }) |
|---|
| 2080 | + } |
|---|
| 2081 | + |
|---|
| 2082 | + var old = $.fn.affix |
|---|
| 2083 | + |
|---|
| 2084 | + $.fn.affix = Plugin |
|---|
| 2085 | + $.fn.affix.Constructor = Affix |
|---|
| 2086 | + |
|---|
| 2087 | + |
|---|
| 2088 | + // AFFIX NO CONFLICT |
|---|
| 2089 | + // ================= |
|---|
| 2090 | + |
|---|
| 2091 | + $.fn.affix.noConflict = function () { |
|---|
| 2092 | + $.fn.affix = old |
|---|
| 2093 | + return this |
|---|
| 2094 | + } |
|---|
| 2095 | + |
|---|
| 2096 | + |
|---|
| 2097 | + // AFFIX DATA-API |
|---|
| 2098 | + // ============== |
|---|
| 2099 | + |
|---|
| 2100 | + $(window).on('load', function () { |
|---|
| 2101 | + $('[data-spy="affix"]').each(function () { |
|---|
| 2102 | + var $spy = $(this) |
|---|
| 2103 | + var data = $spy.data() |
|---|
| 2104 | + |
|---|
| 2105 | + data.offset = data.offset || {} |
|---|
| 2106 | + |
|---|
| 2107 | + if (data.offsetBottom) data.offset.bottom = data.offsetBottom |
|---|
| 2108 | + if (data.offsetTop) data.offset.top = data.offsetTop |
|---|
| 2109 | + |
|---|
| 2110 | + Plugin.call($spy, data) |
|---|
| 2111 | + }) |
|---|
| 2112 | + }) |
|---|
| 2113 | + |
|---|
| 2114 | +}(jQuery); |
|---|
| .. | .. |
|---|
| 1 | +/*! |
|---|
| 2 | + * Bootstrap v3.2.0 (http://getbootstrap.com) |
|---|
| 3 | + * Copyright 2011-2014 Twitter, Inc. |
|---|
| 4 | + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
|---|
| 5 | + */ |
|---|
| 6 | +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.2.0",d.prototype.close=function(b){function c(){f.detach().trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",c).emulateTransitionEnd(150):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.2.0",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),d[e](null==f[b]?this.options[b]:f[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b).on("keydown.bs.carousel",a.proxy(this.keydown,this)),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.2.0",c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},c.prototype.keydown=function(a){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.to=function(b){var c=this,d=this.getItemIndex(this.$active=this.$element.find(".item.active"));return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=e[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:g});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,f&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(e)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:g});return a.support.transition&&this.$element.hasClass("slide")?(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one("bsTransitionEnd",function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger(m)),f&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(b=!b),e||d.data("bs.collapse",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};c.VERSION="3.2.0",c.DEFAULTS={toggle:!0},c.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},c.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var c=a.Event("show.bs.collapse");if(this.$element.trigger(c),!c.isDefaultPrevented()){var d=this.$parent&&this.$parent.find("> .panel > .in");if(d&&d.length){var e=d.data("bs.collapse");if(e&&e.transitioning)return;b.call(d,"hide"),e||d.data("bs.collapse",null)}var f=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[f](0),this.transitioning=1;var g=function(){this.$element.removeClass("collapsing").addClass("collapse in")[f](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return g.call(this);var h=a.camelCase(["scroll",f].join("-"));this.$element.one("bsTransitionEnd",a.proxy(g,this)).emulateTransitionEnd(350)[f](this.$element[0][h])}}},c.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(d,this)).emulateTransitionEnd(350):d.call(this)}}},c.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var d=a.fn.collapse;a.fn.collapse=b,a.fn.collapse.Constructor=c,a.fn.collapse.noConflict=function(){return a.fn.collapse=d,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(c){var d,e=a(this),f=e.attr("data-target")||c.preventDefault()||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),g=a(f),h=g.data("bs.collapse"),i=h?"toggle":e.data(),j=e.attr("data-parent"),k=j&&a(j);h&&h.transitioning||(k&&k.find('[data-toggle="collapse"][data-parent="'+j+'"]').not(e).addClass("collapsed"),e[g.hasClass("in")?"addClass":"removeClass"]("collapsed")),b.call(g,i)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.2.0",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.divider):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(i.filter(":focus"));38==b.keyCode&&j>0&&j--,40==b.keyCode&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f+', [role="menu"], [role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.2.0",c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.$body.addClass("modal-open"),this.setScrollbar(),this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(c.$body),c.$element.show().scrollTop(0),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one("bsTransitionEnd",function(){c.$element.trigger("focus").trigger(e)}).emulateTransitionEnd(300):c.$element.trigger("focus").trigger(e)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.$body.removeClass("modal-open"),this.resetScrollbar(),this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;if(this.$backdrop=a('<div class="modal-backdrop '+d+'" />').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),e&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;e?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(150):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var f=function(){c.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",f).emulateTransitionEnd(150):f()}else b&&b()},c.prototype.checkScrollbar=function(){document.body.clientWidth>=window.innerWidth||(this.scrollbarWidth=this.scrollbarWidth||this.measureScrollbar())},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.scrollbarWidth&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.2.0",c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show()},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var c=a.contains(document.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!c)return;var d=this,e=this.tip(),f=this.getUID(this.type);this.setContent(),e.attr("id",f),this.$element.attr("aria-describedby",f),this.options.animation&&e.addClass("fade");var g="function"==typeof this.options.placement?this.options.placement.call(this,e[0],this.$element[0]):this.options.placement,h=/\s?auto?\s?/i,i=h.test(g);i&&(g=g.replace(h,"")||"top"),e.detach().css({top:0,left:0,display:"block"}).addClass(g).data("bs."+this.type,this),this.options.container?e.appendTo(this.options.container):e.insertAfter(this.$element);var j=this.getPosition(),k=e[0].offsetWidth,l=e[0].offsetHeight;if(i){var m=g,n=this.$element.parent(),o=this.getPosition(n);g="bottom"==g&&j.top+j.height+l-o.scroll>o.height?"top":"top"==g&&j.top-o.scroll-l<0?"bottom":"right"==g&&j.right+k>o.width?"left":"left"==g&&j.left-k<o.left?"right":g,e.removeClass(m).addClass(g)}var p=this.getCalculatedOffset(g,j,k,l);this.applyPlacement(p,g);var q=function(){d.$element.trigger("shown.bs."+d.type),d.hoverState=null};a.support.transition&&this.$tip.hasClass("fade")?e.one("bsTransitionEnd",q).emulateTransitionEnd(150):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=k.left?2*k.left-e+i:2*k.top-f+j,m=k.left?"left":"top",n=k.left?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(l,d[0][n],m)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach(),c.$element.trigger("hidden.bs."+c.type)}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.removeAttr("aria-describedby"),this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one("bsTransitionEnd",b).emulateTransitionEnd(150):b(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName;return a.extend({},"function"==typeof c.getBoundingClientRect?c.getBoundingClientRect():null,{scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop(),width:d?a(window).width():b.outerWidth(),height:d?a(window).height():b.outerHeight()},d?{top:0,left:0}:b.offset())},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.2.0",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").empty()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},c.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){var e=a.proxy(this.process,this);this.$body=a("body"),this.$scrollElement=a(a(c).is("body")?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.2.0",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b="offset",c=0;a.isWindow(this.$scrollElement[0])||(b="position",c=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var d=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+c,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){d.offsets.push(this[0]),d.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<=e[0])return g!=(a=f[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parentsUntil(this.options.target,".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.2.0",c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.closest("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},c.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one("bsTransitionEnd",e).emulateTransitionEnd(150):e(),f.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(c){c.preventDefault(),b.call(a(this),"show")})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.2.0",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=a(document).height(),d=this.$target.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top(this.$element)),"function"==typeof h&&(h=f.bottom(this.$element));var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=b-h?"bottom":null!=g&&g>=d?"top":!1;if(this.affixed!==i){null!=this.unpin&&this.$element.css("top","");var j="affix"+(i?"-"+i:""),k=a.Event(j+".bs.affix");this.$element.trigger(k),k.isDefaultPrevented()||(this.affixed=i,this.unpin="bottom"==i?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(j).trigger(a.Event(j.replace("affix","affixed"))),"bottom"==i&&this.$element.offset({top:b-this.$element.height()-h}))}}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},d.offsetBottom&&(d.offset.bottom=d.offsetBottom),d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); |
|---|
| .. | .. |
|---|
| 1 | +// Chosen, a Select Box Enhancer for jQuery and Prototype |
|---|
| 2 | +// by Patrick Filler for Harvest, http://getharvest.com |
|---|
| 3 | +// |
|---|
| 4 | +// Version 1.0.0 |
|---|
| 5 | +// Full source at https://github.com/harvesthq/chosen |
|---|
| 6 | +// Copyright (c) 2011 Harvest http://getharvest.com |
|---|
| 7 | + |
|---|
| 8 | +// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md |
|---|
| 9 | +// This file is generated by `grunt build`, do not edit it by hand. |
|---|
| 10 | +(function() { |
|---|
| 11 | + var $, AbstractChosen, Chosen, SelectParser, _ref, |
|---|
| 12 | + __hasProp = {}.hasOwnProperty, |
|---|
| 13 | + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; |
|---|
| 14 | + |
|---|
| 15 | + SelectParser = (function() { |
|---|
| 16 | + function SelectParser() { |
|---|
| 17 | + this.options_index = 0; |
|---|
| 18 | + this.parsed = []; |
|---|
| 19 | + } |
|---|
| 20 | + |
|---|
| 21 | + SelectParser.prototype.add_node = function(child) { |
|---|
| 22 | + if (child.nodeName.toUpperCase() === "OPTGROUP") { |
|---|
| 23 | + return this.add_group(child); |
|---|
| 24 | + } else { |
|---|
| 25 | + return this.add_option(child); |
|---|
| 26 | + } |
|---|
| 27 | + }; |
|---|
| 28 | + |
|---|
| 29 | + SelectParser.prototype.add_group = function(group) { |
|---|
| 30 | + var group_position, option, _i, _len, _ref, _results; |
|---|
| 31 | + |
|---|
| 32 | + group_position = this.parsed.length; |
|---|
| 33 | + this.parsed.push({ |
|---|
| 34 | + array_index: group_position, |
|---|
| 35 | + group: true, |
|---|
| 36 | + label: this.escapeExpression(group.label), |
|---|
| 37 | + children: 0, |
|---|
| 38 | + disabled: group.disabled |
|---|
| 39 | + }); |
|---|
| 40 | + _ref = group.childNodes; |
|---|
| 41 | + _results = []; |
|---|
| 42 | + for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
|---|
| 43 | + option = _ref[_i]; |
|---|
| 44 | + _results.push(this.add_option(option, group_position, group.disabled)); |
|---|
| 45 | + } |
|---|
| 46 | + return _results; |
|---|
| 47 | + }; |
|---|
| 48 | + |
|---|
| 49 | + SelectParser.prototype.add_option = function(option, group_position, group_disabled) { |
|---|
| 50 | + if (option.nodeName.toUpperCase() === "OPTION") { |
|---|
| 51 | + if (option.text !== "") { |
|---|
| 52 | + if (group_position != null) { |
|---|
| 53 | + this.parsed[group_position].children += 1; |
|---|
| 54 | + } |
|---|
| 55 | + this.parsed.push({ |
|---|
| 56 | + array_index: this.parsed.length, |
|---|
| 57 | + options_index: this.options_index, |
|---|
| 58 | + value: option.value, |
|---|
| 59 | + text: option.text, |
|---|
| 60 | + html: option.innerHTML, |
|---|
| 61 | + selected: option.selected, |
|---|
| 62 | + disabled: group_disabled === true ? group_disabled : option.disabled, |
|---|
| 63 | + group_array_index: group_position, |
|---|
| 64 | + classes: option.className, |
|---|
| 65 | + style: option.style.cssText |
|---|
| 66 | + }); |
|---|
| 67 | + } else { |
|---|
| 68 | + this.parsed.push({ |
|---|
| 69 | + array_index: this.parsed.length, |
|---|
| 70 | + options_index: this.options_index, |
|---|
| 71 | + empty: true |
|---|
| 72 | + }); |
|---|
| 73 | + } |
|---|
| 74 | + return this.options_index += 1; |
|---|
| 75 | + } |
|---|
| 76 | + }; |
|---|
| 77 | + |
|---|
| 78 | + SelectParser.prototype.escapeExpression = function(text) { |
|---|
| 79 | + var map, unsafe_chars; |
|---|
| 80 | + |
|---|
| 81 | + if ((text == null) || text === false) { |
|---|
| 82 | + return ""; |
|---|
| 83 | + } |
|---|
| 84 | + if (!/[\&\<\>\"\'\`]/.test(text)) { |
|---|
| 85 | + return text; |
|---|
| 86 | + } |
|---|
| 87 | + map = { |
|---|
| 88 | + "<": "<", |
|---|
| 89 | + ">": ">", |
|---|
| 90 | + '"': """, |
|---|
| 91 | + "'": "'", |
|---|
| 92 | + "`": "`" |
|---|
| 93 | + }; |
|---|
| 94 | + unsafe_chars = /&(?!\w+;)|[\<\>\"\'\`]/g; |
|---|
| 95 | + return text.replace(unsafe_chars, function(chr) { |
|---|
| 96 | + return map[chr] || "&"; |
|---|
| 97 | + }); |
|---|
| 98 | + }; |
|---|
| 99 | + |
|---|
| 100 | + return SelectParser; |
|---|
| 101 | + |
|---|
| 102 | + })(); |
|---|
| 103 | + |
|---|
| 104 | + SelectParser.select_to_array = function(select) { |
|---|
| 105 | + var child, parser, _i, _len, _ref; |
|---|
| 106 | + |
|---|
| 107 | + parser = new SelectParser(); |
|---|
| 108 | + _ref = select.childNodes; |
|---|
| 109 | + for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
|---|
| 110 | + child = _ref[_i]; |
|---|
| 111 | + parser.add_node(child); |
|---|
| 112 | + } |
|---|
| 113 | + return parser.parsed; |
|---|
| 114 | + }; |
|---|
| 115 | + |
|---|
| 116 | + AbstractChosen = (function() { |
|---|
| 117 | + function AbstractChosen(form_field, options) { |
|---|
| 118 | + this.form_field = form_field; |
|---|
| 119 | + this.options = options != null ? options : {}; |
|---|
| 120 | + if (!AbstractChosen.browser_is_supported()) { |
|---|
| 121 | + return; |
|---|
| 122 | + } |
|---|
| 123 | + this.is_multiple = this.form_field.multiple; |
|---|
| 124 | + this.set_default_text(); |
|---|
| 125 | + this.set_default_values(); |
|---|
| 126 | + this.setup(); |
|---|
| 127 | + this.set_up_html(); |
|---|
| 128 | + this.register_observers(); |
|---|
| 129 | + } |
|---|
| 130 | + |
|---|
| 131 | + AbstractChosen.prototype.set_default_values = function() { |
|---|
| 132 | + var _this = this; |
|---|
| 133 | + |
|---|
| 134 | + this.click_test_action = function(evt) { |
|---|
| 135 | + return _this.test_active_click(evt); |
|---|
| 136 | + }; |
|---|
| 137 | + this.activate_action = function(evt) { |
|---|
| 138 | + return _this.activate_field(evt); |
|---|
| 139 | + }; |
|---|
| 140 | + this.active_field = false; |
|---|
| 141 | + this.mouse_on_container = false; |
|---|
| 142 | + this.results_showing = false; |
|---|
| 143 | + this.result_highlighted = null; |
|---|
| 144 | + this.result_single_selected = null; |
|---|
| 145 | + this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false; |
|---|
| 146 | + this.disable_search_threshold = this.options.disable_search_threshold || 0; |
|---|
| 147 | + this.disable_search = this.options.disable_search || false; |
|---|
| 148 | + this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true; |
|---|
| 149 | + this.group_search = this.options.group_search != null ? this.options.group_search : true; |
|---|
| 150 | + this.search_contains = this.options.search_contains || false; |
|---|
| 151 | + this.single_backstroke_delete = this.options.single_backstroke_delete != null ? this.options.single_backstroke_delete : true; |
|---|
| 152 | + this.max_selected_options = this.options.max_selected_options || Infinity; |
|---|
| 153 | + this.inherit_select_classes = this.options.inherit_select_classes || false; |
|---|
| 154 | + this.display_selected_options = this.options.display_selected_options != null ? this.options.display_selected_options : true; |
|---|
| 155 | + return this.display_disabled_options = this.options.display_disabled_options != null ? this.options.display_disabled_options : true; |
|---|
| 156 | + }; |
|---|
| 157 | + |
|---|
| 158 | + AbstractChosen.prototype.set_default_text = function() { |
|---|
| 159 | + if (this.form_field.getAttribute("data-placeholder")) { |
|---|
| 160 | + this.default_text = this.form_field.getAttribute("data-placeholder"); |
|---|
| 161 | + } else if (this.is_multiple) { |
|---|
| 162 | + this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text; |
|---|
| 163 | + } else { |
|---|
| 164 | + this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text; |
|---|
| 165 | + } |
|---|
| 166 | + return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text; |
|---|
| 167 | + }; |
|---|
| 168 | + |
|---|
| 169 | + AbstractChosen.prototype.mouse_enter = function() { |
|---|
| 170 | + return this.mouse_on_container = true; |
|---|
| 171 | + }; |
|---|
| 172 | + |
|---|
| 173 | + AbstractChosen.prototype.mouse_leave = function() { |
|---|
| 174 | + return this.mouse_on_container = false; |
|---|
| 175 | + }; |
|---|
| 176 | + |
|---|
| 177 | + AbstractChosen.prototype.input_focus = function(evt) { |
|---|
| 178 | + var _this = this; |
|---|
| 179 | + |
|---|
| 180 | + if (this.is_multiple) { |
|---|
| 181 | + if (!this.active_field) { |
|---|
| 182 | + return setTimeout((function() { |
|---|
| 183 | + return _this.container_mousedown(); |
|---|
| 184 | + }), 50); |
|---|
| 185 | + } |
|---|
| 186 | + } else { |
|---|
| 187 | + if (!this.active_field) { |
|---|
| 188 | + return this.activate_field(); |
|---|
| 189 | + } |
|---|
| 190 | + } |
|---|
| 191 | + }; |
|---|
| 192 | + |
|---|
| 193 | + AbstractChosen.prototype.input_blur = function(evt) { |
|---|
| 194 | + var _this = this; |
|---|
| 195 | + |
|---|
| 196 | + if (!this.mouse_on_container) { |
|---|
| 197 | + this.active_field = false; |
|---|
| 198 | + return setTimeout((function() { |
|---|
| 199 | + return _this.blur_test(); |
|---|
| 200 | + }), 100); |
|---|
| 201 | + } |
|---|
| 202 | + }; |
|---|
| 203 | + |
|---|
| 204 | + AbstractChosen.prototype.results_option_build = function(options) { |
|---|
| 205 | + var content, data, _i, _len, _ref; |
|---|
| 206 | + |
|---|
| 207 | + content = ''; |
|---|
| 208 | + _ref = this.results_data; |
|---|
| 209 | + for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
|---|
| 210 | + data = _ref[_i]; |
|---|
| 211 | + if (data.group) { |
|---|
| 212 | + content += this.result_add_group(data); |
|---|
| 213 | + } else { |
|---|
| 214 | + content += this.result_add_option(data); |
|---|
| 215 | + } |
|---|
| 216 | + if (options != null ? options.first : void 0) { |
|---|
| 217 | + if (data.selected && this.is_multiple) { |
|---|
| 218 | + this.choice_build(data); |
|---|
| 219 | + } else if (data.selected && !this.is_multiple) { |
|---|
| 220 | + this.single_set_selected_text(data.text); |
|---|
| 221 | + } |
|---|
| 222 | + } |
|---|
| 223 | + } |
|---|
| 224 | + return content; |
|---|
| 225 | + }; |
|---|
| 226 | + |
|---|
| 227 | + AbstractChosen.prototype.result_add_option = function(option) { |
|---|
| 228 | + var classes, style; |
|---|
| 229 | + |
|---|
| 230 | + if (!option.search_match) { |
|---|
| 231 | + return ''; |
|---|
| 232 | + } |
|---|
| 233 | + if (!this.include_option_in_results(option)) { |
|---|
| 234 | + return ''; |
|---|
| 235 | + } |
|---|
| 236 | + classes = []; |
|---|
| 237 | + if (!option.disabled && !(option.selected && this.is_multiple)) { |
|---|
| 238 | + classes.push("active-result"); |
|---|
| 239 | + } |
|---|
| 240 | + if (option.disabled && !(option.selected && this.is_multiple)) { |
|---|
| 241 | + classes.push("disabled-result"); |
|---|
| 242 | + } |
|---|
| 243 | + if (option.selected) { |
|---|
| 244 | + classes.push("result-selected"); |
|---|
| 245 | + } |
|---|
| 246 | + if (option.group_array_index != null) { |
|---|
| 247 | + classes.push("group-option"); |
|---|
| 248 | + } |
|---|
| 249 | + if (option.classes !== "") { |
|---|
| 250 | + classes.push(option.classes); |
|---|
| 251 | + } |
|---|
| 252 | + style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : ""; |
|---|
| 253 | + return "<li class=\"" + (classes.join(' ')) + "\"" + style + " data-option-array-index=\"" + option.array_index + "\">" + option.search_text + "</li>"; |
|---|
| 254 | + }; |
|---|
| 255 | + |
|---|
| 256 | + AbstractChosen.prototype.result_add_group = function(group) { |
|---|
| 257 | + if (!(group.search_match || group.group_match)) { |
|---|
| 258 | + return ''; |
|---|
| 259 | + } |
|---|
| 260 | + if (!(group.active_options > 0)) { |
|---|
| 261 | + return ''; |
|---|
| 262 | + } |
|---|
| 263 | + return "<li class=\"group-result\">" + group.search_text + "</li>"; |
|---|
| 264 | + }; |
|---|
| 265 | + |
|---|
| 266 | + AbstractChosen.prototype.results_update_field = function() { |
|---|
| 267 | + this.set_default_text(); |
|---|
| 268 | + if (!this.is_multiple) { |
|---|
| 269 | + this.results_reset_cleanup(); |
|---|
| 270 | + } |
|---|
| 271 | + this.result_clear_highlight(); |
|---|
| 272 | + this.result_single_selected = null; |
|---|
| 273 | + this.results_build(); |
|---|
| 274 | + if (this.results_showing) { |
|---|
| 275 | + return this.winnow_results(); |
|---|
| 276 | + } |
|---|
| 277 | + }; |
|---|
| 278 | + |
|---|
| 279 | + AbstractChosen.prototype.results_toggle = function() { |
|---|
| 280 | + if (this.results_showing) { |
|---|
| 281 | + return this.results_hide(); |
|---|
| 282 | + } else { |
|---|
| 283 | + return this.results_show(); |
|---|
| 284 | + } |
|---|
| 285 | + }; |
|---|
| 286 | + |
|---|
| 287 | + AbstractChosen.prototype.results_search = function(evt) { |
|---|
| 288 | + if (this.results_showing) { |
|---|
| 289 | + return this.winnow_results(); |
|---|
| 290 | + } else { |
|---|
| 291 | + return this.results_show(); |
|---|
| 292 | + } |
|---|
| 293 | + }; |
|---|
| 294 | + |
|---|
| 295 | + AbstractChosen.prototype.winnow_results = function() { |
|---|
| 296 | + var escapedSearchText, option, regex, regexAnchor, results, results_group, searchText, startpos, text, zregex, _i, _len, _ref; |
|---|
| 297 | + |
|---|
| 298 | + this.no_results_clear(); |
|---|
| 299 | + results = 0; |
|---|
| 300 | + searchText = this.get_search_text(); |
|---|
| 301 | + escapedSearchText = searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); |
|---|
| 302 | + regexAnchor = this.search_contains ? "" : "^"; |
|---|
| 303 | + regex = new RegExp(regexAnchor + escapedSearchText, 'i'); |
|---|
| 304 | + zregex = new RegExp(escapedSearchText, 'i'); |
|---|
| 305 | + _ref = this.results_data; |
|---|
| 306 | + for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
|---|
| 307 | + option = _ref[_i]; |
|---|
| 308 | + option.search_match = false; |
|---|
| 309 | + results_group = null; |
|---|
| 310 | + if (this.include_option_in_results(option)) { |
|---|
| 311 | + if (option.group) { |
|---|
| 312 | + option.group_match = false; |
|---|
| 313 | + option.active_options = 0; |
|---|
| 314 | + } |
|---|
| 315 | + if ((option.group_array_index != null) && this.results_data[option.group_array_index]) { |
|---|
| 316 | + results_group = this.results_data[option.group_array_index]; |
|---|
| 317 | + if (results_group.active_options === 0 && results_group.search_match) { |
|---|
| 318 | + results += 1; |
|---|
| 319 | + } |
|---|
| 320 | + results_group.active_options += 1; |
|---|
| 321 | + } |
|---|
| 322 | + if (!(option.group && !this.group_search)) { |
|---|
| 323 | + option.search_text = option.group ? option.label : option.html; |
|---|
| 324 | + option.search_match = this.search_string_match(option.search_text, regex); |
|---|
| 325 | + if (option.search_match && !option.group) { |
|---|
| 326 | + results += 1; |
|---|
| 327 | + } |
|---|
| 328 | + if (option.search_match) { |
|---|
| 329 | + if (searchText.length) { |
|---|
| 330 | + startpos = option.search_text.search(zregex); |
|---|
| 331 | + text = option.search_text.substr(0, startpos + searchText.length) + '</em>' + option.search_text.substr(startpos + searchText.length); |
|---|
| 332 | + option.search_text = text.substr(0, startpos) + '<em>' + text.substr(startpos); |
|---|
| 333 | + } |
|---|
| 334 | + if (results_group != null) { |
|---|
| 335 | + results_group.group_match = true; |
|---|
| 336 | + } |
|---|
| 337 | + } else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) { |
|---|
| 338 | + option.search_match = true; |
|---|
| 339 | + } |
|---|
| 340 | + } |
|---|
| 341 | + } |
|---|
| 342 | + } |
|---|
| 343 | + this.result_clear_highlight(); |
|---|
| 344 | + if (results < 1 && searchText.length) { |
|---|
| 345 | + this.update_results_content(""); |
|---|
| 346 | + return this.no_results(searchText); |
|---|
| 347 | + } else { |
|---|
| 348 | + this.update_results_content(this.results_option_build()); |
|---|
| 349 | + return this.winnow_results_set_highlight(); |
|---|
| 350 | + } |
|---|
| 351 | + }; |
|---|
| 352 | + |
|---|
| 353 | + AbstractChosen.prototype.search_string_match = function(search_string, regex) { |
|---|
| 354 | + var part, parts, _i, _len; |
|---|
| 355 | + |
|---|
| 356 | + if (regex.test(search_string)) { |
|---|
| 357 | + return true; |
|---|
| 358 | + } else if (this.enable_split_word_search && (search_string.indexOf(" ") >= 0 || search_string.indexOf("[") === 0)) { |
|---|
| 359 | + parts = search_string.replace(/\[|\]/g, "").split(" "); |
|---|
| 360 | + if (parts.length) { |
|---|
| 361 | + for (_i = 0, _len = parts.length; _i < _len; _i++) { |
|---|
| 362 | + part = parts[_i]; |
|---|
| 363 | + if (regex.test(part)) { |
|---|
| 364 | + return true; |
|---|
| 365 | + } |
|---|
| 366 | + } |
|---|
| 367 | + } |
|---|
| 368 | + } |
|---|
| 369 | + }; |
|---|
| 370 | + |
|---|
| 371 | + AbstractChosen.prototype.choices_count = function() { |
|---|
| 372 | + var option, _i, _len, _ref; |
|---|
| 373 | + |
|---|
| 374 | + if (this.selected_option_count != null) { |
|---|
| 375 | + return this.selected_option_count; |
|---|
| 376 | + } |
|---|
| 377 | + this.selected_option_count = 0; |
|---|
| 378 | + _ref = this.form_field.options; |
|---|
| 379 | + for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
|---|
| 380 | + option = _ref[_i]; |
|---|
| 381 | + if (option.selected) { |
|---|
| 382 | + this.selected_option_count += 1; |
|---|
| 383 | + } |
|---|
| 384 | + } |
|---|
| 385 | + return this.selected_option_count; |
|---|
| 386 | + }; |
|---|
| 387 | + |
|---|
| 388 | + AbstractChosen.prototype.choices_click = function(evt) { |
|---|
| 389 | + evt.preventDefault(); |
|---|
| 390 | + if (!(this.results_showing || this.is_disabled)) { |
|---|
| 391 | + return this.results_show(); |
|---|
| 392 | + } |
|---|
| 393 | + }; |
|---|
| 394 | + |
|---|
| 395 | + AbstractChosen.prototype.keyup_checker = function(evt) { |
|---|
| 396 | + var stroke, _ref; |
|---|
| 397 | + |
|---|
| 398 | + stroke = (_ref = evt.which) != null ? _ref : evt.keyCode; |
|---|
| 399 | + this.search_field_scale(); |
|---|
| 400 | + switch (stroke) { |
|---|
| 401 | + case 8: |
|---|
| 402 | + if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) { |
|---|
| 403 | + return this.keydown_backstroke(); |
|---|
| 404 | + } else if (!this.pending_backstroke) { |
|---|
| 405 | + this.result_clear_highlight(); |
|---|
| 406 | + return this.results_search(); |
|---|
| 407 | + } |
|---|
| 408 | + break; |
|---|
| 409 | + case 13: |
|---|
| 410 | + evt.preventDefault(); |
|---|
| 411 | + if (this.results_showing) { |
|---|
| 412 | + return this.result_select(evt); |
|---|
| 413 | + } |
|---|
| 414 | + break; |
|---|
| 415 | + case 27: |
|---|
| 416 | + if (this.results_showing) { |
|---|
| 417 | + this.results_hide(); |
|---|
| 418 | + } |
|---|
| 419 | + return true; |
|---|
| 420 | + case 9: |
|---|
| 421 | + case 38: |
|---|
| 422 | + case 40: |
|---|
| 423 | + case 16: |
|---|
| 424 | + case 91: |
|---|
| 425 | + case 17: |
|---|
| 426 | + break; |
|---|
| 427 | + default: |
|---|
| 428 | + return this.results_search(); |
|---|
| 429 | + } |
|---|
| 430 | + }; |
|---|
| 431 | + |
|---|
| 432 | + AbstractChosen.prototype.container_width = function() { |
|---|
| 433 | + if (this.options.width != null) { |
|---|
| 434 | + return this.options.width; |
|---|
| 435 | + } else { |
|---|
| 436 | + return "" + this.form_field.offsetWidth + "px"; |
|---|
| 437 | + } |
|---|
| 438 | + }; |
|---|
| 439 | + |
|---|
| 440 | + AbstractChosen.prototype.include_option_in_results = function(option) { |
|---|
| 441 | + if (this.is_multiple && (!this.display_selected_options && option.selected)) { |
|---|
| 442 | + return false; |
|---|
| 443 | + } |
|---|
| 444 | + if (!this.display_disabled_options && option.disabled) { |
|---|
| 445 | + return false; |
|---|
| 446 | + } |
|---|
| 447 | + if (option.empty) { |
|---|
| 448 | + return false; |
|---|
| 449 | + } |
|---|
| 450 | + return true; |
|---|
| 451 | + }; |
|---|
| 452 | + |
|---|
| 453 | + AbstractChosen.browser_is_supported = function() { |
|---|
| 454 | + if (window.navigator.appName === "Microsoft Internet Explorer") { |
|---|
| 455 | + return document.documentMode >= 8; |
|---|
| 456 | + } |
|---|
| 457 | + if (/iP(od|hone)/i.test(window.navigator.userAgent)) { |
|---|
| 458 | + return false; |
|---|
| 459 | + } |
|---|
| 460 | + if (/Android/i.test(window.navigator.userAgent)) { |
|---|
| 461 | + if (/Mobile/i.test(window.navigator.userAgent)) { |
|---|
| 462 | + return false; |
|---|
| 463 | + } |
|---|
| 464 | + } |
|---|
| 465 | + return true; |
|---|
| 466 | + }; |
|---|
| 467 | + |
|---|
| 468 | + AbstractChosen.default_multiple_text = "Select Some Options"; |
|---|
| 469 | + |
|---|
| 470 | + AbstractChosen.default_single_text = "Select an Option"; |
|---|
| 471 | + |
|---|
| 472 | + AbstractChosen.default_no_result_text = "No results match"; |
|---|
| 473 | + |
|---|
| 474 | + return AbstractChosen; |
|---|
| 475 | + |
|---|
| 476 | + })(); |
|---|
| 477 | + |
|---|
| 478 | + $ = jQuery; |
|---|
| 479 | + |
|---|
| 480 | + $.fn.extend({ |
|---|
| 481 | + chosen: function(options) { |
|---|
| 482 | + if (!AbstractChosen.browser_is_supported()) { |
|---|
| 483 | + return this; |
|---|
| 484 | + } |
|---|
| 485 | + return this.each(function(input_field) { |
|---|
| 486 | + var $this, chosen; |
|---|
| 487 | + |
|---|
| 488 | + $this = $(this); |
|---|
| 489 | + chosen = $this.data('chosen'); |
|---|
| 490 | + if (options === 'destroy' && chosen) { |
|---|
| 491 | + chosen.destroy(); |
|---|
| 492 | + } else if (!chosen) { |
|---|
| 493 | + $this.data('chosen', new Chosen(this, options)); |
|---|
| 494 | + } |
|---|
| 495 | + }); |
|---|
| 496 | + } |
|---|
| 497 | + }); |
|---|
| 498 | + |
|---|
| 499 | + Chosen = (function(_super) { |
|---|
| 500 | + __extends(Chosen, _super); |
|---|
| 501 | + |
|---|
| 502 | + function Chosen() { |
|---|
| 503 | + _ref = Chosen.__super__.constructor.apply(this, arguments); |
|---|
| 504 | + return _ref; |
|---|
| 505 | + } |
|---|
| 506 | + |
|---|
| 507 | + Chosen.prototype.setup = function() { |
|---|
| 508 | + this.form_field_jq = $(this.form_field); |
|---|
| 509 | + this.current_selectedIndex = this.form_field.selectedIndex; |
|---|
| 510 | + return this.is_rtl = this.form_field_jq.hasClass("chosen-rtl"); |
|---|
| 511 | + }; |
|---|
| 512 | + |
|---|
| 513 | + Chosen.prototype.set_up_html = function() { |
|---|
| 514 | + var container_classes, container_props; |
|---|
| 515 | + |
|---|
| 516 | + container_classes = ["chosen-container"]; |
|---|
| 517 | + container_classes.push("chosen-container-" + (this.is_multiple ? "multi" : "single")); |
|---|
| 518 | + if (this.inherit_select_classes && this.form_field.className) { |
|---|
| 519 | + container_classes.push(this.form_field.className); |
|---|
| 520 | + } |
|---|
| 521 | + if (this.is_rtl) { |
|---|
| 522 | + container_classes.push("chosen-rtl"); |
|---|
| 523 | + } |
|---|
| 524 | + container_props = { |
|---|
| 525 | + 'class': container_classes.join(' '), |
|---|
| 526 | + 'style': "width: " + (this.container_width()) + ";", |
|---|
| 527 | + 'title': this.form_field.title |
|---|
| 528 | + }; |
|---|
| 529 | + if (this.form_field.id.length) { |
|---|
| 530 | + container_props.id = this.form_field.id.replace(/[^\w]/g, '_') + "_chosen"; |
|---|
| 531 | + } |
|---|
| 532 | + this.container = $("<div />", container_props); |
|---|
| 533 | + if (this.is_multiple) { |
|---|
| 534 | + this.container.html('<ul class="chosen-choices"><li class="search-field"><input type="text" value="' + this.default_text + '" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chosen-drop"><ul class="chosen-results"></ul></div>'); |
|---|
| 535 | + } else { |
|---|
| 536 | + this.container.html('<a class="chosen-single chosen-default" tabindex="-1"><span>' + this.default_text + '</span><div><b></b></div></a><div class="chosen-drop"><div class="chosen-search"><input type="text" autocomplete="off" /></div><ul class="chosen-results"></ul></div>'); |
|---|
| 537 | + } |
|---|
| 538 | + this.form_field_jq.hide().after(this.container); |
|---|
| 539 | + this.dropdown = this.container.find('div.chosen-drop').first(); |
|---|
| 540 | + this.search_field = this.container.find('input').first(); |
|---|
| 541 | + this.search_results = this.container.find('ul.chosen-results').first(); |
|---|
| 542 | + this.search_field_scale(); |
|---|
| 543 | + this.search_no_results = this.container.find('li.no-results').first(); |
|---|
| 544 | + if (this.is_multiple) { |
|---|
| 545 | + this.search_choices = this.container.find('ul.chosen-choices').first(); |
|---|
| 546 | + this.search_container = this.container.find('li.search-field').first(); |
|---|
| 547 | + } else { |
|---|
| 548 | + this.search_container = this.container.find('div.chosen-search').first(); |
|---|
| 549 | + this.selected_item = this.container.find('.chosen-single').first(); |
|---|
| 550 | + } |
|---|
| 551 | + this.results_build(); |
|---|
| 552 | + this.set_tab_index(); |
|---|
| 553 | + this.set_label_behavior(); |
|---|
| 554 | + return this.form_field_jq.trigger("chosen:ready", { |
|---|
| 555 | + chosen: this |
|---|
| 556 | + }); |
|---|
| 557 | + }; |
|---|
| 558 | + |
|---|
| 559 | + Chosen.prototype.register_observers = function() { |
|---|
| 560 | + var _this = this; |
|---|
| 561 | + |
|---|
| 562 | + this.container.bind('mousedown.chosen', function(evt) { |
|---|
| 563 | + _this.container_mousedown(evt); |
|---|
| 564 | + }); |
|---|
| 565 | + this.container.bind('mouseup.chosen', function(evt) { |
|---|
| 566 | + _this.container_mouseup(evt); |
|---|
| 567 | + }); |
|---|
| 568 | + this.container.bind('mouseenter.chosen', function(evt) { |
|---|
| 569 | + _this.mouse_enter(evt); |
|---|
| 570 | + }); |
|---|
| 571 | + this.container.bind('mouseleave.chosen', function(evt) { |
|---|
| 572 | + _this.mouse_leave(evt); |
|---|
| 573 | + }); |
|---|
| 574 | + this.search_results.bind('mouseup.chosen', function(evt) { |
|---|
| 575 | + _this.search_results_mouseup(evt); |
|---|
| 576 | + }); |
|---|
| 577 | + this.search_results.bind('mouseover.chosen', function(evt) { |
|---|
| 578 | + _this.search_results_mouseover(evt); |
|---|
| 579 | + }); |
|---|
| 580 | + this.search_results.bind('mouseout.chosen', function(evt) { |
|---|
| 581 | + _this.search_results_mouseout(evt); |
|---|
| 582 | + }); |
|---|
| 583 | + this.search_results.bind('mousewheel.chosen DOMMouseScroll.chosen', function(evt) { |
|---|
| 584 | + _this.search_results_mousewheel(evt); |
|---|
| 585 | + }); |
|---|
| 586 | + this.form_field_jq.bind("chosen:updated.chosen", function(evt) { |
|---|
| 587 | + _this.results_update_field(evt); |
|---|
| 588 | + }); |
|---|
| 589 | + this.form_field_jq.bind("chosen:activate.chosen", function(evt) { |
|---|
| 590 | + _this.activate_field(evt); |
|---|
| 591 | + }); |
|---|
| 592 | + this.form_field_jq.bind("chosen:open.chosen", function(evt) { |
|---|
| 593 | + _this.container_mousedown(evt); |
|---|
| 594 | + }); |
|---|
| 595 | + this.search_field.bind('blur.chosen', function(evt) { |
|---|
| 596 | + _this.input_blur(evt); |
|---|
| 597 | + }); |
|---|
| 598 | + this.search_field.bind('keyup.chosen', function(evt) { |
|---|
| 599 | + _this.keyup_checker(evt); |
|---|
| 600 | + }); |
|---|
| 601 | + this.search_field.bind('keydown.chosen', function(evt) { |
|---|
| 602 | + _this.keydown_checker(evt); |
|---|
| 603 | + }); |
|---|
| 604 | + this.search_field.bind('focus.chosen', function(evt) { |
|---|
| 605 | + _this.input_focus(evt); |
|---|
| 606 | + }); |
|---|
| 607 | + if (this.is_multiple) { |
|---|
| 608 | + return this.search_choices.bind('click.chosen', function(evt) { |
|---|
| 609 | + _this.choices_click(evt); |
|---|
| 610 | + }); |
|---|
| 611 | + } else { |
|---|
| 612 | + return this.container.bind('click.chosen', function(evt) { |
|---|
| 613 | + evt.preventDefault(); |
|---|
| 614 | + }); |
|---|
| 615 | + } |
|---|
| 616 | + }; |
|---|
| 617 | + |
|---|
| 618 | + Chosen.prototype.destroy = function() { |
|---|
| 619 | + $(document).unbind("click.chosen", this.click_test_action); |
|---|
| 620 | + if (this.search_field[0].tabIndex) { |
|---|
| 621 | + this.form_field_jq[0].tabIndex = this.search_field[0].tabIndex; |
|---|
| 622 | + } |
|---|
| 623 | + this.container.remove(); |
|---|
| 624 | + this.form_field_jq.removeData('chosen'); |
|---|
| 625 | + return this.form_field_jq.show(); |
|---|
| 626 | + }; |
|---|
| 627 | + |
|---|
| 628 | + Chosen.prototype.search_field_disabled = function() { |
|---|
| 629 | + this.is_disabled = this.form_field_jq[0].disabled; |
|---|
| 630 | + if (this.is_disabled) { |
|---|
| 631 | + this.container.addClass('chosen-disabled'); |
|---|
| 632 | + this.search_field[0].disabled = true; |
|---|
| 633 | + if (!this.is_multiple) { |
|---|
| 634 | + this.selected_item.unbind("focus.chosen", this.activate_action); |
|---|
| 635 | + } |
|---|
| 636 | + return this.close_field(); |
|---|
| 637 | + } else { |
|---|
| 638 | + this.container.removeClass('chosen-disabled'); |
|---|
| 639 | + this.search_field[0].disabled = false; |
|---|
| 640 | + if (!this.is_multiple) { |
|---|
| 641 | + return this.selected_item.bind("focus.chosen", this.activate_action); |
|---|
| 642 | + } |
|---|
| 643 | + } |
|---|
| 644 | + }; |
|---|
| 645 | + |
|---|
| 646 | + Chosen.prototype.container_mousedown = function(evt) { |
|---|
| 647 | + if (!this.is_disabled) { |
|---|
| 648 | + if (evt && evt.type === "mousedown" && !this.results_showing) { |
|---|
| 649 | + evt.preventDefault(); |
|---|
| 650 | + } |
|---|
| 651 | + if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) { |
|---|
| 652 | + if (!this.active_field) { |
|---|
| 653 | + if (this.is_multiple) { |
|---|
| 654 | + this.search_field.val(""); |
|---|
| 655 | + } |
|---|
| 656 | + $(document).bind('click.chosen', this.click_test_action); |
|---|
| 657 | + this.results_show(); |
|---|
| 658 | + } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chosen-single").length)) { |
|---|
| 659 | + evt.preventDefault(); |
|---|
| 660 | + this.results_toggle(); |
|---|
| 661 | + } |
|---|
| 662 | + return this.activate_field(); |
|---|
| 663 | + } |
|---|
| 664 | + } |
|---|
| 665 | + }; |
|---|
| 666 | + |
|---|
| 667 | + Chosen.prototype.container_mouseup = function(evt) { |
|---|
| 668 | + if (evt.target.nodeName === "ABBR" && !this.is_disabled) { |
|---|
| 669 | + return this.results_reset(evt); |
|---|
| 670 | + } |
|---|
| 671 | + }; |
|---|
| 672 | + |
|---|
| 673 | + Chosen.prototype.search_results_mousewheel = function(evt) { |
|---|
| 674 | + var delta, _ref1, _ref2; |
|---|
| 675 | + |
|---|
| 676 | + delta = -((_ref1 = evt.originalEvent) != null ? _ref1.wheelDelta : void 0) || ((_ref2 = evt.originialEvent) != null ? _ref2.detail : void 0); |
|---|
| 677 | + if (delta != null) { |
|---|
| 678 | + evt.preventDefault(); |
|---|
| 679 | + if (evt.type === 'DOMMouseScroll') { |
|---|
| 680 | + delta = delta * 40; |
|---|
| 681 | + } |
|---|
| 682 | + return this.search_results.scrollTop(delta + this.search_results.scrollTop()); |
|---|
| 683 | + } |
|---|
| 684 | + }; |
|---|
| 685 | + |
|---|
| 686 | + Chosen.prototype.blur_test = function(evt) { |
|---|
| 687 | + if (!this.active_field && this.container.hasClass("chosen-container-active")) { |
|---|
| 688 | + return this.close_field(); |
|---|
| 689 | + } |
|---|
| 690 | + }; |
|---|
| 691 | + |
|---|
| 692 | + Chosen.prototype.close_field = function() { |
|---|
| 693 | + $(document).unbind("click.chosen", this.click_test_action); |
|---|
| 694 | + this.active_field = false; |
|---|
| 695 | + this.results_hide(); |
|---|
| 696 | + this.container.removeClass("chosen-container-active"); |
|---|
| 697 | + this.clear_backstroke(); |
|---|
| 698 | + this.show_search_field_default(); |
|---|
| 699 | + return this.search_field_scale(); |
|---|
| 700 | + }; |
|---|
| 701 | + |
|---|
| 702 | + Chosen.prototype.activate_field = function() { |
|---|
| 703 | + this.container.addClass("chosen-container-active"); |
|---|
| 704 | + this.active_field = true; |
|---|
| 705 | + this.search_field.val(this.search_field.val()); |
|---|
| 706 | + return this.search_field.focus(); |
|---|
| 707 | + }; |
|---|
| 708 | + |
|---|
| 709 | + Chosen.prototype.test_active_click = function(evt) { |
|---|
| 710 | + if (this.container.is($(evt.target).closest('.chosen-container'))) { |
|---|
| 711 | + return this.active_field = true; |
|---|
| 712 | + } else { |
|---|
| 713 | + return this.close_field(); |
|---|
| 714 | + } |
|---|
| 715 | + }; |
|---|
| 716 | + |
|---|
| 717 | + Chosen.prototype.results_build = function() { |
|---|
| 718 | + this.parsing = true; |
|---|
| 719 | + this.selected_option_count = null; |
|---|
| 720 | + this.results_data = SelectParser.select_to_array(this.form_field); |
|---|
| 721 | + if (this.is_multiple) { |
|---|
| 722 | + this.search_choices.find("li.search-choice").remove(); |
|---|
| 723 | + } else if (!this.is_multiple) { |
|---|
| 724 | + this.single_set_selected_text(); |
|---|
| 725 | + if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) { |
|---|
| 726 | + this.search_field[0].readOnly = true; |
|---|
| 727 | + this.container.addClass("chosen-container-single-nosearch"); |
|---|
| 728 | + } else { |
|---|
| 729 | + this.search_field[0].readOnly = false; |
|---|
| 730 | + this.container.removeClass("chosen-container-single-nosearch"); |
|---|
| 731 | + } |
|---|
| 732 | + } |
|---|
| 733 | + this.update_results_content(this.results_option_build({ |
|---|
| 734 | + first: true |
|---|
| 735 | + })); |
|---|
| 736 | + this.search_field_disabled(); |
|---|
| 737 | + this.show_search_field_default(); |
|---|
| 738 | + this.search_field_scale(); |
|---|
| 739 | + return this.parsing = false; |
|---|
| 740 | + }; |
|---|
| 741 | + |
|---|
| 742 | + Chosen.prototype.result_do_highlight = function(el) { |
|---|
| 743 | + var high_bottom, high_top, maxHeight, visible_bottom, visible_top; |
|---|
| 744 | + |
|---|
| 745 | + if (el.length) { |
|---|
| 746 | + this.result_clear_highlight(); |
|---|
| 747 | + this.result_highlight = el; |
|---|
| 748 | + this.result_highlight.addClass("highlighted"); |
|---|
| 749 | + maxHeight = parseInt(this.search_results.css("maxHeight"), 10); |
|---|
| 750 | + visible_top = this.search_results.scrollTop(); |
|---|
| 751 | + visible_bottom = maxHeight + visible_top; |
|---|
| 752 | + high_top = this.result_highlight.position().top + this.search_results.scrollTop(); |
|---|
| 753 | + high_bottom = high_top + this.result_highlight.outerHeight(); |
|---|
| 754 | + if (high_bottom >= visible_bottom) { |
|---|
| 755 | + return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0); |
|---|
| 756 | + } else if (high_top < visible_top) { |
|---|
| 757 | + return this.search_results.scrollTop(high_top); |
|---|
| 758 | + } |
|---|
| 759 | + } |
|---|
| 760 | + }; |
|---|
| 761 | + |
|---|
| 762 | + Chosen.prototype.result_clear_highlight = function() { |
|---|
| 763 | + if (this.result_highlight) { |
|---|
| 764 | + this.result_highlight.removeClass("highlighted"); |
|---|
| 765 | + } |
|---|
| 766 | + return this.result_highlight = null; |
|---|
| 767 | + }; |
|---|
| 768 | + |
|---|
| 769 | + Chosen.prototype.results_show = function() { |
|---|
| 770 | + if (this.is_multiple && this.max_selected_options <= this.choices_count()) { |
|---|
| 771 | + this.form_field_jq.trigger("chosen:maxselected", { |
|---|
| 772 | + chosen: this |
|---|
| 773 | + }); |
|---|
| 774 | + return false; |
|---|
| 775 | + } |
|---|
| 776 | + this.container.addClass("chosen-with-drop"); |
|---|
| 777 | + this.form_field_jq.trigger("chosen:showing_dropdown", { |
|---|
| 778 | + chosen: this |
|---|
| 779 | + }); |
|---|
| 780 | + this.results_showing = true; |
|---|
| 781 | + this.search_field.focus(); |
|---|
| 782 | + this.search_field.val(this.search_field.val()); |
|---|
| 783 | + return this.winnow_results(); |
|---|
| 784 | + }; |
|---|
| 785 | + |
|---|
| 786 | + Chosen.prototype.update_results_content = function(content) { |
|---|
| 787 | + return this.search_results.html(content); |
|---|
| 788 | + }; |
|---|
| 789 | + |
|---|
| 790 | + Chosen.prototype.results_hide = function() { |
|---|
| 791 | + if (this.results_showing) { |
|---|
| 792 | + this.result_clear_highlight(); |
|---|
| 793 | + this.container.removeClass("chosen-with-drop"); |
|---|
| 794 | + this.form_field_jq.trigger("chosen:hiding_dropdown", { |
|---|
| 795 | + chosen: this |
|---|
| 796 | + }); |
|---|
| 797 | + } |
|---|
| 798 | + return this.results_showing = false; |
|---|
| 799 | + }; |
|---|
| 800 | + |
|---|
| 801 | + Chosen.prototype.set_tab_index = function(el) { |
|---|
| 802 | + var ti; |
|---|
| 803 | + |
|---|
| 804 | + if (this.form_field.tabIndex) { |
|---|
| 805 | + ti = this.form_field.tabIndex; |
|---|
| 806 | + this.form_field.tabIndex = -1; |
|---|
| 807 | + return this.search_field[0].tabIndex = ti; |
|---|
| 808 | + } |
|---|
| 809 | + }; |
|---|
| 810 | + |
|---|
| 811 | + Chosen.prototype.set_label_behavior = function() { |
|---|
| 812 | + var _this = this; |
|---|
| 813 | + |
|---|
| 814 | + this.form_field_label = this.form_field_jq.parents("label"); |
|---|
| 815 | + if (!this.form_field_label.length && this.form_field.id.length) { |
|---|
| 816 | + this.form_field_label = $("label[for='" + this.form_field.id + "']"); |
|---|
| 817 | + } |
|---|
| 818 | + if (this.form_field_label.length > 0) { |
|---|
| 819 | + return this.form_field_label.bind('click.chosen', function(evt) { |
|---|
| 820 | + if (_this.is_multiple) { |
|---|
| 821 | + return _this.container_mousedown(evt); |
|---|
| 822 | + } else { |
|---|
| 823 | + return _this.activate_field(); |
|---|
| 824 | + } |
|---|
| 825 | + }); |
|---|
| 826 | + } |
|---|
| 827 | + }; |
|---|
| 828 | + |
|---|
| 829 | + Chosen.prototype.show_search_field_default = function() { |
|---|
| 830 | + if (this.is_multiple && this.choices_count() < 1 && !this.active_field) { |
|---|
| 831 | + this.search_field.val(this.default_text); |
|---|
| 832 | + return this.search_field.addClass("default"); |
|---|
| 833 | + } else { |
|---|
| 834 | + this.search_field.val(""); |
|---|
| 835 | + return this.search_field.removeClass("default"); |
|---|
| 836 | + } |
|---|
| 837 | + }; |
|---|
| 838 | + |
|---|
| 839 | + Chosen.prototype.search_results_mouseup = function(evt) { |
|---|
| 840 | + var target; |
|---|
| 841 | + |
|---|
| 842 | + target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first(); |
|---|
| 843 | + if (target.length) { |
|---|
| 844 | + this.result_highlight = target; |
|---|
| 845 | + this.result_select(evt); |
|---|
| 846 | + return this.search_field.focus(); |
|---|
| 847 | + } |
|---|
| 848 | + }; |
|---|
| 849 | + |
|---|
| 850 | + Chosen.prototype.search_results_mouseover = function(evt) { |
|---|
| 851 | + var target; |
|---|
| 852 | + |
|---|
| 853 | + target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first(); |
|---|
| 854 | + if (target) { |
|---|
| 855 | + return this.result_do_highlight(target); |
|---|
| 856 | + } |
|---|
| 857 | + }; |
|---|
| 858 | + |
|---|
| 859 | + Chosen.prototype.search_results_mouseout = function(evt) { |
|---|
| 860 | + if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) { |
|---|
| 861 | + return this.result_clear_highlight(); |
|---|
| 862 | + } |
|---|
| 863 | + }; |
|---|
| 864 | + |
|---|
| 865 | + Chosen.prototype.choice_build = function(item) { |
|---|
| 866 | + var choice, close_link, |
|---|
| 867 | + _this = this; |
|---|
| 868 | + |
|---|
| 869 | + choice = $('<li />', { |
|---|
| 870 | + "class": "search-choice" |
|---|
| 871 | + }).html("<span>" + item.html + "</span>"); |
|---|
| 872 | + if (item.disabled) { |
|---|
| 873 | + choice.addClass('search-choice-disabled'); |
|---|
| 874 | + } else { |
|---|
| 875 | + close_link = $('<a />', { |
|---|
| 876 | + "class": 'search-choice-close', |
|---|
| 877 | + 'data-option-array-index': item.array_index |
|---|
| 878 | + }); |
|---|
| 879 | + close_link.bind('click.chosen', function(evt) { |
|---|
| 880 | + return _this.choice_destroy_link_click(evt); |
|---|
| 881 | + }); |
|---|
| 882 | + choice.append(close_link); |
|---|
| 883 | + } |
|---|
| 884 | + return this.search_container.before(choice); |
|---|
| 885 | + }; |
|---|
| 886 | + |
|---|
| 887 | + Chosen.prototype.choice_destroy_link_click = function(evt) { |
|---|
| 888 | + evt.preventDefault(); |
|---|
| 889 | + evt.stopPropagation(); |
|---|
| 890 | + if (!this.is_disabled) { |
|---|
| 891 | + return this.choice_destroy($(evt.target)); |
|---|
| 892 | + } |
|---|
| 893 | + }; |
|---|
| 894 | + |
|---|
| 895 | + Chosen.prototype.choice_destroy = function(link) { |
|---|
| 896 | + if (this.result_deselect(link[0].getAttribute("data-option-array-index"))) { |
|---|
| 897 | + this.show_search_field_default(); |
|---|
| 898 | + if (this.is_multiple && this.choices_count() > 0 && this.search_field.val().length < 1) { |
|---|
| 899 | + this.results_hide(); |
|---|
| 900 | + } |
|---|
| 901 | + link.parents('li').first().remove(); |
|---|
| 902 | + return this.search_field_scale(); |
|---|
| 903 | + } |
|---|
| 904 | + }; |
|---|
| 905 | + |
|---|
| 906 | + Chosen.prototype.results_reset = function() { |
|---|
| 907 | + this.form_field.options[0].selected = true; |
|---|
| 908 | + this.selected_option_count = null; |
|---|
| 909 | + this.single_set_selected_text(); |
|---|
| 910 | + this.show_search_field_default(); |
|---|
| 911 | + this.results_reset_cleanup(); |
|---|
| 912 | + this.form_field_jq.trigger("change"); |
|---|
| 913 | + if (this.active_field) { |
|---|
| 914 | + return this.results_hide(); |
|---|
| 915 | + } |
|---|
| 916 | + }; |
|---|
| 917 | + |
|---|
| 918 | + Chosen.prototype.results_reset_cleanup = function() { |
|---|
| 919 | + this.current_selectedIndex = this.form_field.selectedIndex; |
|---|
| 920 | + return this.selected_item.find("abbr").remove(); |
|---|
| 921 | + }; |
|---|
| 922 | + |
|---|
| 923 | + Chosen.prototype.result_select = function(evt) { |
|---|
| 924 | + var high, item, selected_index; |
|---|
| 925 | + |
|---|
| 926 | + if (this.result_highlight) { |
|---|
| 927 | + high = this.result_highlight; |
|---|
| 928 | + this.result_clear_highlight(); |
|---|
| 929 | + if (this.is_multiple && this.max_selected_options <= this.choices_count()) { |
|---|
| 930 | + this.form_field_jq.trigger("chosen:maxselected", { |
|---|
| 931 | + chosen: this |
|---|
| 932 | + }); |
|---|
| 933 | + return false; |
|---|
| 934 | + } |
|---|
| 935 | + if (this.is_multiple) { |
|---|
| 936 | + high.removeClass("active-result"); |
|---|
| 937 | + } else { |
|---|
| 938 | + if (this.result_single_selected) { |
|---|
| 939 | + this.result_single_selected.removeClass("result-selected"); |
|---|
| 940 | + selected_index = this.result_single_selected[0].getAttribute('data-option-array-index'); |
|---|
| 941 | + this.results_data[selected_index].selected = false; |
|---|
| 942 | + } |
|---|
| 943 | + this.result_single_selected = high; |
|---|
| 944 | + } |
|---|
| 945 | + high.addClass("result-selected"); |
|---|
| 946 | + item = this.results_data[high[0].getAttribute("data-option-array-index")]; |
|---|
| 947 | + item.selected = true; |
|---|
| 948 | + this.form_field.options[item.options_index].selected = true; |
|---|
| 949 | + this.selected_option_count = null; |
|---|
| 950 | + if (this.is_multiple) { |
|---|
| 951 | + this.choice_build(item); |
|---|
| 952 | + } else { |
|---|
| 953 | + this.single_set_selected_text(item.text); |
|---|
| 954 | + } |
|---|
| 955 | + if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) { |
|---|
| 956 | + this.results_hide(); |
|---|
| 957 | + } |
|---|
| 958 | + this.search_field.val(""); |
|---|
| 959 | + if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) { |
|---|
| 960 | + this.form_field_jq.trigger("change", { |
|---|
| 961 | + 'selected': this.form_field.options[item.options_index].value |
|---|
| 962 | + }); |
|---|
| 963 | + } |
|---|
| 964 | + this.current_selectedIndex = this.form_field.selectedIndex; |
|---|
| 965 | + return this.search_field_scale(); |
|---|
| 966 | + } |
|---|
| 967 | + }; |
|---|
| 968 | + |
|---|
| 969 | + Chosen.prototype.single_set_selected_text = function(text) { |
|---|
| 970 | + if (text == null) { |
|---|
| 971 | + text = this.default_text; |
|---|
| 972 | + } |
|---|
| 973 | + if (text === this.default_text) { |
|---|
| 974 | + this.selected_item.addClass("chosen-default"); |
|---|
| 975 | + } else { |
|---|
| 976 | + this.single_deselect_control_build(); |
|---|
| 977 | + this.selected_item.removeClass("chosen-default"); |
|---|
| 978 | + } |
|---|
| 979 | + return this.selected_item.find("span").text(text); |
|---|
| 980 | + }; |
|---|
| 981 | + |
|---|
| 982 | + Chosen.prototype.result_deselect = function(pos) { |
|---|
| 983 | + var result_data; |
|---|
| 984 | + |
|---|
| 985 | + result_data = this.results_data[pos]; |
|---|
| 986 | + if (!this.form_field.options[result_data.options_index].disabled) { |
|---|
| 987 | + result_data.selected = false; |
|---|
| 988 | + this.form_field.options[result_data.options_index].selected = false; |
|---|
| 989 | + this.selected_option_count = null; |
|---|
| 990 | + this.result_clear_highlight(); |
|---|
| 991 | + if (this.results_showing) { |
|---|
| 992 | + this.winnow_results(); |
|---|
| 993 | + } |
|---|
| 994 | + this.form_field_jq.trigger("change", { |
|---|
| 995 | + deselected: this.form_field.options[result_data.options_index].value |
|---|
| 996 | + }); |
|---|
| 997 | + this.search_field_scale(); |
|---|
| 998 | + return true; |
|---|
| 999 | + } else { |
|---|
| 1000 | + return false; |
|---|
| 1001 | + } |
|---|
| 1002 | + }; |
|---|
| 1003 | + |
|---|
| 1004 | + Chosen.prototype.single_deselect_control_build = function() { |
|---|
| 1005 | + if (!this.allow_single_deselect) { |
|---|
| 1006 | + return; |
|---|
| 1007 | + } |
|---|
| 1008 | + if (!this.selected_item.find("abbr").length) { |
|---|
| 1009 | + this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>"); |
|---|
| 1010 | + } |
|---|
| 1011 | + return this.selected_item.addClass("chosen-single-with-deselect"); |
|---|
| 1012 | + }; |
|---|
| 1013 | + |
|---|
| 1014 | + Chosen.prototype.get_search_text = function() { |
|---|
| 1015 | + if (this.search_field.val() === this.default_text) { |
|---|
| 1016 | + return ""; |
|---|
| 1017 | + } else { |
|---|
| 1018 | + return $('<div/>').text($.trim(this.search_field.val())).html(); |
|---|
| 1019 | + } |
|---|
| 1020 | + }; |
|---|
| 1021 | + |
|---|
| 1022 | + Chosen.prototype.winnow_results_set_highlight = function() { |
|---|
| 1023 | + var do_high, selected_results; |
|---|
| 1024 | + |
|---|
| 1025 | + selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : []; |
|---|
| 1026 | + do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first(); |
|---|
| 1027 | + if (do_high != null) { |
|---|
| 1028 | + return this.result_do_highlight(do_high); |
|---|
| 1029 | + } |
|---|
| 1030 | + }; |
|---|
| 1031 | + |
|---|
| 1032 | + Chosen.prototype.no_results = function(terms) { |
|---|
| 1033 | + var no_results_html; |
|---|
| 1034 | + |
|---|
| 1035 | + no_results_html = $('<li class="no-results">' + this.results_none_found + ' "<span></span>"</li>'); |
|---|
| 1036 | + no_results_html.find("span").first().html(terms); |
|---|
| 1037 | + return this.search_results.append(no_results_html); |
|---|
| 1038 | + }; |
|---|
| 1039 | + |
|---|
| 1040 | + Chosen.prototype.no_results_clear = function() { |
|---|
| 1041 | + return this.search_results.find(".no-results").remove(); |
|---|
| 1042 | + }; |
|---|
| 1043 | + |
|---|
| 1044 | + Chosen.prototype.keydown_arrow = function() { |
|---|
| 1045 | + var next_sib; |
|---|
| 1046 | + |
|---|
| 1047 | + if (this.results_showing && this.result_highlight) { |
|---|
| 1048 | + next_sib = this.result_highlight.nextAll("li.active-result").first(); |
|---|
| 1049 | + if (next_sib) { |
|---|
| 1050 | + return this.result_do_highlight(next_sib); |
|---|
| 1051 | + } |
|---|
| 1052 | + } else { |
|---|
| 1053 | + return this.results_show(); |
|---|
| 1054 | + } |
|---|
| 1055 | + }; |
|---|
| 1056 | + |
|---|
| 1057 | + Chosen.prototype.keyup_arrow = function() { |
|---|
| 1058 | + var prev_sibs; |
|---|
| 1059 | + |
|---|
| 1060 | + if (!this.results_showing && !this.is_multiple) { |
|---|
| 1061 | + return this.results_show(); |
|---|
| 1062 | + } else if (this.result_highlight) { |
|---|
| 1063 | + prev_sibs = this.result_highlight.prevAll("li.active-result"); |
|---|
| 1064 | + if (prev_sibs.length) { |
|---|
| 1065 | + return this.result_do_highlight(prev_sibs.first()); |
|---|
| 1066 | + } else { |
|---|
| 1067 | + if (this.choices_count() > 0) { |
|---|
| 1068 | + this.results_hide(); |
|---|
| 1069 | + } |
|---|
| 1070 | + return this.result_clear_highlight(); |
|---|
| 1071 | + } |
|---|
| 1072 | + } |
|---|
| 1073 | + }; |
|---|
| 1074 | + |
|---|
| 1075 | + Chosen.prototype.keydown_backstroke = function() { |
|---|
| 1076 | + var next_available_destroy; |
|---|
| 1077 | + |
|---|
| 1078 | + if (this.pending_backstroke) { |
|---|
| 1079 | + this.choice_destroy(this.pending_backstroke.find("a").first()); |
|---|
| 1080 | + return this.clear_backstroke(); |
|---|
| 1081 | + } else { |
|---|
| 1082 | + next_available_destroy = this.search_container.siblings("li.search-choice").last(); |
|---|
| 1083 | + if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) { |
|---|
| 1084 | + this.pending_backstroke = next_available_destroy; |
|---|
| 1085 | + if (this.single_backstroke_delete) { |
|---|
| 1086 | + return this.keydown_backstroke(); |
|---|
| 1087 | + } else { |
|---|
| 1088 | + return this.pending_backstroke.addClass("search-choice-focus"); |
|---|
| 1089 | + } |
|---|
| 1090 | + } |
|---|
| 1091 | + } |
|---|
| 1092 | + }; |
|---|
| 1093 | + |
|---|
| 1094 | + Chosen.prototype.clear_backstroke = function() { |
|---|
| 1095 | + if (this.pending_backstroke) { |
|---|
| 1096 | + this.pending_backstroke.removeClass("search-choice-focus"); |
|---|
| 1097 | + } |
|---|
| 1098 | + return this.pending_backstroke = null; |
|---|
| 1099 | + }; |
|---|
| 1100 | + |
|---|
| 1101 | + Chosen.prototype.keydown_checker = function(evt) { |
|---|
| 1102 | + var stroke, _ref1; |
|---|
| 1103 | + |
|---|
| 1104 | + stroke = (_ref1 = evt.which) != null ? _ref1 : evt.keyCode; |
|---|
| 1105 | + this.search_field_scale(); |
|---|
| 1106 | + if (stroke !== 8 && this.pending_backstroke) { |
|---|
| 1107 | + this.clear_backstroke(); |
|---|
| 1108 | + } |
|---|
| 1109 | + switch (stroke) { |
|---|
| 1110 | + case 8: |
|---|
| 1111 | + this.backstroke_length = this.search_field.val().length; |
|---|
| 1112 | + break; |
|---|
| 1113 | + case 9: |
|---|
| 1114 | + if (this.results_showing && !this.is_multiple) { |
|---|
| 1115 | + this.result_select(evt); |
|---|
| 1116 | + } |
|---|
| 1117 | + this.mouse_on_container = false; |
|---|
| 1118 | + break; |
|---|
| 1119 | + case 13: |
|---|
| 1120 | + evt.preventDefault(); |
|---|
| 1121 | + break; |
|---|
| 1122 | + case 38: |
|---|
| 1123 | + evt.preventDefault(); |
|---|
| 1124 | + this.keyup_arrow(); |
|---|
| 1125 | + break; |
|---|
| 1126 | + case 40: |
|---|
| 1127 | + evt.preventDefault(); |
|---|
| 1128 | + this.keydown_arrow(); |
|---|
| 1129 | + break; |
|---|
| 1130 | + } |
|---|
| 1131 | + }; |
|---|
| 1132 | + |
|---|
| 1133 | + Chosen.prototype.search_field_scale = function() { |
|---|
| 1134 | + var div, f_width, h, style, style_block, styles, w, _i, _len; |
|---|
| 1135 | + |
|---|
| 1136 | + if (this.is_multiple) { |
|---|
| 1137 | + h = 0; |
|---|
| 1138 | + w = 0; |
|---|
| 1139 | + style_block = "position:absolute; left: -1000px; top: -1000px; display:none;"; |
|---|
| 1140 | + styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing']; |
|---|
| 1141 | + for (_i = 0, _len = styles.length; _i < _len; _i++) { |
|---|
| 1142 | + style = styles[_i]; |
|---|
| 1143 | + style_block += style + ":" + this.search_field.css(style) + ";"; |
|---|
| 1144 | + } |
|---|
| 1145 | + div = $('<div />', { |
|---|
| 1146 | + 'style': style_block |
|---|
| 1147 | + }); |
|---|
| 1148 | + div.text(this.search_field.val()); |
|---|
| 1149 | + $('body').append(div); |
|---|
| 1150 | + w = div.width() + 25; |
|---|
| 1151 | + div.remove(); |
|---|
| 1152 | + f_width = this.container.outerWidth(); |
|---|
| 1153 | + if (w > f_width - 10) { |
|---|
| 1154 | + w = f_width - 10; |
|---|
| 1155 | + } |
|---|
| 1156 | + return this.search_field.css({ |
|---|
| 1157 | + 'width': w + 'px' |
|---|
| 1158 | + }); |
|---|
| 1159 | + } |
|---|
| 1160 | + }; |
|---|
| 1161 | + |
|---|
| 1162 | + return Chosen; |
|---|
| 1163 | + |
|---|
| 1164 | + })(AbstractChosen); |
|---|
| 1165 | + |
|---|
| 1166 | +}).call(this); |
|---|
| .. | .. |
|---|
| 1 | +/*! jQuery v1.11.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ |
|---|
| 2 | +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m="1.11.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(l.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:k&&!k.call("\ufeff\xa0")?function(a){return null==a?"":k.call(a)}:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||n.guid++,e):void 0},now:function(){return+new Date},support:l}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="<select t=''><option selected=''></option></select>",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=jb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=kb(b);function nb(){}nb.prototype=d.filters=d.pseudos,d.setFilters=new nb;function ob(a,b){var c,e,f,g,h,i,j,k=x[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=Q.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?db.error(a):x(a,i).slice(0)}function pb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=a.document,A=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,B=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:A.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:z,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=z.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return y.find(a);this.length=1,this[0]=d}return this.context=z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};B.prototype=n.fn,y=n(z);var C=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!n(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function E(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return E(a,"nextSibling")},prev:function(a){return E(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(D[a]||(e=n.unique(e)),C.test(a)&&(e=e.reverse())),this.pushStack(e)}});var F=/\S+/g,G={};function H(a){var b=G[a]={};return n.each(a.match(F)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?G[a]||H(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&n.each(arguments,function(a,c){var d;while((d=n.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){if(a===!0?!--n.readyWait:!n.isReady){if(!z.body)return setTimeout(n.ready);n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(z,[n]),n.fn.trigger&&n(z).trigger("ready").off("ready"))}}});function J(){z.addEventListener?(z.removeEventListener("DOMContentLoaded",K,!1),a.removeEventListener("load",K,!1)):(z.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(z.addEventListener||"load"===event.type||"complete"===z.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===z.readyState)setTimeout(n.ready);else if(z.addEventListener)z.addEventListener("DOMContentLoaded",K,!1),a.addEventListener("load",K,!1);else{z.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&z.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!n.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}J(),n.ready()}}()}return I.promise(b)};var L="undefined",M;for(M in n(l))break;l.ownLast="0"!==M,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c=z.getElementsByTagName("body")[0];c&&(a=z.createElement("div"),a.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",b=z.createElement("div"),c.appendChild(a).appendChild(b),typeof b.style.zoom!==L&&(b.style.cssText="border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1",(l.inlineBlockNeedsLayout=3===b.offsetWidth)&&(c.style.zoom=1)),c.removeChild(a),a=b=null)}),function(){var a=z.createElement("div");if(null==l.deleteExpando){l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}}a=null}(),n.acceptData=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(n.acceptData(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f |
|---|
| 3 | +}}function S(a,b,c){if(n.acceptData(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d]));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=["Top","Right","Bottom","Left"],V=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},W=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},X=/^(?:checkbox|radio)$/i;!function(){var a=z.createDocumentFragment(),b=z.createElement("div"),c=z.createElement("input");if(b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a>",l.leadingWhitespace=3===b.firstChild.nodeType,l.tbody=!b.getElementsByTagName("tbody").length,l.htmlSerialize=!!b.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==z.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,a.appendChild(c),l.appendChecked=c.checked,b.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,a.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){l.noCloneEvent=!1}),b.cloneNode(!0).click()),null==l.deleteExpando){l.deleteExpando=!0;try{delete b.test}catch(d){l.deleteExpando=!1}}a=b=c=null}(),function(){var b,c,d=z.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),l[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var Y=/^(?:input|select|textarea)$/i,Z=/^key/,$=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,ab=/^([^.]*)(?:\.(.+)|)$/;function bb(){return!0}function cb(){return!1}function db(){try{return z.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof n===L||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(F)||[""],h=b.length;while(h--)f=ab.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(F)||[""],j=b.length;while(j--)if(h=ab.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,m,o=[d||z],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||z,3!==d.nodeType&&8!==d.nodeType&&!_.test(p+n.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[n.expando]?b:new n.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),k=n.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!n.isWindow(d)){for(i=k.delegateType||p,_.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||z)&&o.push(l.defaultView||l.parentWindow||a)}m=0;while((h=o[m++])&&!b.isPropagationStopped())b.type=m>1?i:k.bindType||p,f=(n._data(h,"events")||{})[b.type]&&n._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&n.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&n.acceptData(d)&&g&&d[p]&&!n.isWindow(d)){l=d[g],l&&(d[g]=null),n.event.triggered=p;try{d[p]()}catch(r){}n.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((n.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?n(c,this).index(i)>=0:n.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=$.test(e)?this.mouseHooks:Z.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||z),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},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(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||z,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==db()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===db()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return n.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=z.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===L&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&(a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault())?bb:cb):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:cb,isPropagationStopped:cb,isImmediatePropagationStopped:cb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=bb,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=bb,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submitBubbles||(n.event.special.submit={setup:function(){return n.nodeName(this,"form")?!1:void n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?b.form:void 0;c&&!n._data(c,"submitBubbles")&&(n.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),n._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return n.nodeName(this,"form")?!1:void n.event.remove(this,"._submit")}}),l.changeBubbles||(n.event.special.change={setup:function(){return Y.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),n.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),n.event.simulate("change",this,a,!0)})),!1):void n.event.add(this,"beforeactivate._change",function(a){var b=a.target;Y.test(b.nodeName)&&!n._data(b,"changeBubbles")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a,!0)}),n._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return n.event.remove(this,"._change"),!Y.test(this.nodeName)}}),l.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=cb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return n().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=cb),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});function eb(a){var b=fb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var fb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gb=/ jQuery\d+="(?:null|\d+)"/g,hb=new RegExp("<(?:"+fb+")[\\s/>]","i"),ib=/^\s+/,jb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,kb=/<([\w:]+)/,lb=/<tbody/i,mb=/<|&#?\w+;/,nb=/<(?:script|style|link)/i,ob=/checked\s*(?:[^=]|=\s*.checked.)/i,pb=/^$|\/(?:java|ecma)script/i,qb=/^true\/(.*)/,rb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,sb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},tb=eb(z),ub=tb.appendChild(z.createElement("div"));sb.optgroup=sb.option,sb.tbody=sb.tfoot=sb.colgroup=sb.caption=sb.thead,sb.th=sb.td;function vb(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==L?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==L?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,vb(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function wb(a){X.test(a.type)&&(a.defaultChecked=a.checked)}function xb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function yb(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function zb(a){var b=qb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ab(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}function Bb(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Cb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(yb(b).text=a.text,zb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&X.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}n.extend({clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!hb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ub.innerHTML=a.outerHTML,ub.removeChild(f=ub.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=vb(f),h=vb(a),g=0;null!=(e=h[g]);++g)d[g]&&Cb(e,d[g]);if(b)if(c)for(h=h||vb(a),d=d||vb(f),g=0;null!=(e=h[g]);g++)Bb(e,d[g]);else Bb(a,f);return d=vb(f,"script"),d.length>0&&Ab(d,!i&&vb(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k,m=a.length,o=eb(b),p=[],q=0;m>q;q++)if(f=a[q],f||0===f)if("object"===n.type(f))n.merge(p,f.nodeType?[f]:f);else if(mb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(kb.exec(f)||["",""])[1].toLowerCase(),k=sb[i]||sb._default,h.innerHTML=k[1]+f.replace(jb,"<$1></$2>")+k[2],e=k[0];while(e--)h=h.lastChild;if(!l.leadingWhitespace&&ib.test(f)&&p.push(b.createTextNode(ib.exec(f)[0])),!l.tbody){f="table"!==i||lb.test(f)?"<table>"!==k[1]||lb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)n.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}n.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),l.appendChecked||n.grep(vb(p,"input"),wb),q=0;while(f=p[q++])if((!d||-1===n.inArray(f,d))&&(g=n.contains(f.ownerDocument,f),h=vb(o.appendChild(f),"script"),g&&Ab(h),c)){e=0;while(f=h[e++])pb.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.deleteExpando,m=n.event.special;null!=(d=a[h]);h++)if((b||n.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k?delete d[i]:typeof d.removeAttribute!==L?d.removeAttribute(i):d[i]=null,c.push(f))}}}),n.fn.extend({text:function(a){return W(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||z).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(vb(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&Ab(vb(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(vb(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return W(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(gb,""):void 0;if(!("string"!=typeof a||nb.test(a)||!l.htmlSerialize&&hb.test(a)||!l.leadingWhitespace&&ib.test(a)||sb[(kb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(jb,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(vb(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(vb(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,o=k-1,p=a[0],q=n.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&ob.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(i=n.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=n.map(vb(i,"script"),yb),f=g.length;k>j;j++)d=i,j!==o&&(d=n.clone(d,!0,!0),f&&n.merge(g,vb(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,n.map(g,zb),j=0;f>j;j++)d=g[j],pb.test(d.type||"")&&!n._data(d,"globalEval")&&n.contains(h,d)&&(d.src?n._evalUrl&&n._evalUrl(d.src):n.globalEval((d.text||d.textContent||d.innerHTML||"").replace(rb,"")));i=c=null}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],g=n(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Db,Eb={};function Fb(b,c){var d=n(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:n.css(d[0],"display");return d.detach(),e}function Gb(a){var b=z,c=Eb[a];return c||(c=Fb(a,b),"none"!==c&&c||(Db=(Db||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Db[0].contentWindow||Db[0].contentDocument).document,b.write(),b.close(),c=Fb(a,b),Db.detach()),Eb[a]=c),c}!function(){var a,b,c=z.createElement("div"),d="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;padding:0;margin:0;border:0";c.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],a.style.cssText="float:left;opacity:.5",l.opacity=/^0.5/.test(a.style.opacity),l.cssFloat=!!a.style.cssFloat,c.style.backgroundClip="content-box",c.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===c.style.backgroundClip,a=c=null,l.shrinkWrapBlocks=function(){var a,c,e,f;if(null==b){if(a=z.getElementsByTagName("body")[0],!a)return;f="border:0;width:0;height:0;position:absolute;top:0;left:-9999px",c=z.createElement("div"),e=z.createElement("div"),a.appendChild(c).appendChild(e),b=!1,typeof e.style.zoom!==L&&(e.style.cssText=d+";width:1px;padding:1px;zoom:1",e.innerHTML="<div></div>",e.firstChild.style.width="5px",b=3!==e.offsetWidth),a.removeChild(c),a=c=e=null}return b}}();var Hb=/^margin/,Ib=new RegExp("^("+T+")(?!px)[a-z%]+$","i"),Jb,Kb,Lb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Jb=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Kb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Jb(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),Ib.test(g)&&Hb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):z.documentElement.currentStyle&&(Jb=function(a){return a.currentStyle},Kb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Jb(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ib.test(g)&&!Lb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Mb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h=z.createElement("div"),i="border:0;width:0;height:0;position:absolute;top:0;left:-9999px",j="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;padding:0;margin:0;border:0";h.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",b=h.getElementsByTagName("a")[0],b.style.cssText="float:left;opacity:.5",l.opacity=/^0.5/.test(b.style.opacity),l.cssFloat=!!b.style.cssFloat,h.style.backgroundClip="content-box",h.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===h.style.backgroundClip,b=h=null,n.extend(l,{reliableHiddenOffsets:function(){if(null!=c)return c;var a,b,d,e=z.createElement("div"),f=z.getElementsByTagName("body")[0];if(f)return e.setAttribute("className","t"),e.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=z.createElement("div"),a.style.cssText=i,f.appendChild(a).appendChild(e),e.innerHTML="<table><tr><td></td><td>t</td></tr></table>",b=e.getElementsByTagName("td"),b[0].style.cssText="padding:0;margin:0;border:0;display:none",d=0===b[0].offsetHeight,b[0].style.display="",b[1].style.display="none",c=d&&0===b[0].offsetHeight,f.removeChild(a),e=f=null,c},boxSizing:function(){return null==d&&k(),d},boxSizingReliable:function(){return null==e&&k(),e},pixelPosition:function(){return null==f&&k(),f},reliableMarginRight:function(){var b,c,d,e;if(null==g&&a.getComputedStyle){if(b=z.getElementsByTagName("body")[0],!b)return;c=z.createElement("div"),d=z.createElement("div"),c.style.cssText=i,b.appendChild(c).appendChild(d),e=d.appendChild(z.createElement("div")),e.style.cssText=d.style.cssText=j,e.style.marginRight=e.style.width="0",d.style.width="1px",g=!parseFloat((a.getComputedStyle(e,null)||{}).marginRight),b.removeChild(c)}return g}});function k(){var b,c,h=z.getElementsByTagName("body")[0];h&&(b=z.createElement("div"),c=z.createElement("div"),b.style.cssText=i,h.appendChild(b).appendChild(c),c.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:absolute;display:block;padding:1px;border:1px;width:4px;margin-top:1%;top:1%",n.swap(h,null!=h.style.zoom?{zoom:1}:{},function(){d=4===c.offsetWidth}),e=!0,f=!1,g=!0,a.getComputedStyle&&(f="1%"!==(a.getComputedStyle(c,null)||{}).top,e="4px"===(a.getComputedStyle(c,null)||{width:"4px"}).width),h.removeChild(b),c=h=null)}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Nb=/alpha\([^)]*\)/i,Ob=/opacity\s*=\s*([^)]*)/,Pb=/^(none|table(?!-c[ea]).+)/,Qb=new RegExp("^("+T+")(.*)$","i"),Rb=new RegExp("^([+-])=("+T+")","i"),Sb={position:"absolute",visibility:"hidden",display:"block"},Tb={letterSpacing:0,fontWeight:400},Ub=["Webkit","O","Moz","ms"];function Vb(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ub.length;while(e--)if(b=Ub[e]+c,b in a)return b;return d}function Wb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&V(d)&&(f[g]=n._data(d,"olddisplay",Gb(d.nodeName)))):f[g]||(e=V(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Xb(a,b,c){var d=Qb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Yb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+U[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+U[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+U[f]+"Width",!0,e))):(g+=n.css(a,"padding"+U[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+U[f]+"Width",!0,e)));return g}function Zb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Jb(a),g=l.boxSizing()&&"border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Kb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ib.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Yb(a,b,c||(g?"border":"content"),d,f)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Kb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=Vb(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Rb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]="",i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Vb(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Kb(a,b,d)),"normal"===f&&b in Tb&&(f=Tb[b]),""===c||c?(e=parseFloat(f),c===!0||n.isNumeric(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?0===a.offsetWidth&&Pb.test(n.css(a,"display"))?n.swap(a,Sb,function(){return Zb(a,b,d)}):Zb(a,b,d):void 0},set:function(a,c,d){var e=d&&Jb(a);return Xb(a,c,d?Yb(a,b,d,l.boxSizing()&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Ob.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Nb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Nb.test(f)?f.replace(Nb,e):f+" "+e)}}),n.cssHooks.marginRight=Mb(l.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},Kb,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+U[d]+b]=f[d]||f[d-2]||f[0];return e}},Hb.test(a)||(n.cssHooks[a+b].set=Xb)}),n.fn.extend({css:function(a,b){return W(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Jb(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b) |
|---|
| 4 | +},a,b,arguments.length>1)},show:function(){return Wb(this,!0)},hide:function(){return Wb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){V(this)?n(this).show():n(this).hide()})}});function $b(a,b,c,d,e){return new $b.prototype.init(a,b,c,d,e)}n.Tween=$b,$b.prototype={constructor:$b,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=$b.propHooks[this.prop];return a&&a.get?a.get(this):$b.propHooks._default.get(this)},run:function(a){var b,c=$b.propHooks[this.prop];return this.pos=b=this.options.duration?n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):$b.propHooks._default.set(this),this}},$b.prototype.init.prototype=$b.prototype,$b.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},$b.propHooks.scrollTop=$b.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=$b.prototype.init,n.fx.step={};var _b,ac,bc=/^(?:toggle|show|hide)$/,cc=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),dc=/queueHooks$/,ec=[jc],fc={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=cc.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&cc.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function gc(){return setTimeout(function(){_b=void 0}),_b=n.now()}function hc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=U[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function ic(a,b,c){for(var d,e=(fc[b]||[]).concat(fc["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function jc(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&V(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k=Gb(a.nodeName),"none"===j&&(j=k),"inline"===j&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==k?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],bc.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}if(!n.isEmptyObject(o)){r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=ic(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function kc(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function lc(a,b,c){var d,e,f=0,g=ec.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=_b||gc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:_b||gc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(kc(k,j.opts.specialEasing);g>f;f++)if(d=ec[f].call(j,a,k,j.opts))return d;return n.map(k,ic,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(lc,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],fc[c]=fc[c]||[],fc[c].unshift(b)},prefilter:function(a,b){b?ec.unshift(a):ec.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(V).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=lc(this,n.extend({},a),f);(e||n._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&dc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(hc(b,!0),a,d,e)}}),n.each({slideDown:hc("show"),slideUp:hc("hide"),slideToggle:hc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(_b=n.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),_b=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){ac||(ac=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(ac),ac=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e=z.createElement("div");e.setAttribute("className","t"),e.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=e.getElementsByTagName("a")[0],c=z.createElement("select"),d=c.appendChild(z.createElement("option")),b=e.getElementsByTagName("input")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==e.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=d.selected,l.enctype=!!z.createElement("form").enctype,c.disabled=!0,l.optDisabled=!d.disabled,b=z.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value,a=b=c=d=e=null}();var mc=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(mc,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.text(a)}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(l.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var nc,oc,pc=n.expr.attrHandle,qc=/^(?:checked|selected)$/i,rc=l.getSetAttribute,sc=l.input;n.fn.extend({attr:function(a,b){return W(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===L?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?oc:nc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(F);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?sc&&rc||!qc.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(rc?c:d)},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),oc={set:function(a,b,c){return b===!1?n.removeAttr(a,c):sc&&rc||!qc.test(c)?a.setAttribute(!rc&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=pc[b]||n.find.attr;pc[b]=sc&&rc||!qc.test(b)?function(a,b,d){var e,f;return d||(f=pc[b],pc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,pc[b]=f),e}:function(a,b,c){return c?void 0:a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),sc&&rc||(n.attrHooks.value={set:function(a,b,c){return n.nodeName(a,"input")?void(a.defaultValue=b):nc&&nc.set(a,b,c)}}),rc||(nc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},pc.id=pc.name=pc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:nc.set},n.attrHooks.contenteditable={set:function(a,b,c){nc.set(a,""===b?!1:b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var tc=/^(?:input|select|textarea|button|object)$/i,uc=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return W(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):tc.test(a.nodeName)||uc.test(a.nodeName)&&a.href?0:-1}}}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var vc=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(F)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(vc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(F)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(vc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(F)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===L||"boolean"===c)&&(this.className&&n._data(this,"__className__",this.className),this.className=this.className||a===!1?"":n._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(vc," ").indexOf(b)>=0)return!0;return!1}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var wc=n.now(),xc=/\?/,yc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(yc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var zc,Ac,Bc=/#.*$/,Cc=/([?&])_=[^&]*/,Dc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Ec=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Fc=/^(?:GET|HEAD)$/,Gc=/^\/\//,Hc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ic={},Jc={},Kc="*/".concat("*");try{Ac=location.href}catch(Lc){Ac=z.createElement("a"),Ac.href="",Ac=Ac.href}zc=Hc.exec(Ac.toLowerCase())||[];function Mc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(F)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nc(a,b,c,d){var e={},f=a===Jc;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Oc(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Pc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Qc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ac,type:"GET",isLocal:Ec.test(zc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Oc(Oc(a,n.ajaxSettings),b):Oc(n.ajaxSettings,a)},ajaxPrefilter:Mc(Ic),ajaxTransport:Mc(Jc),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Dc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||Ac)+"").replace(Bc,"").replace(Gc,zc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(F)||[""],null==k.crossDomain&&(c=Hc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===zc[1]&&c[2]===zc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(zc[3]||("http:"===zc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),Nc(Ic,k,b,v),2===t)return v;h=k.global,h&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Fc.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(xc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Cc.test(e)?e.replace(Cc,"$1_="+wc++):e+(xc.test(e)?"&":"?")+"_="+wc++)),k.ifModified&&(n.lastModified[e]&&v.setRequestHeader("If-Modified-Since",n.lastModified[e]),n.etag[e]&&v.setRequestHeader("If-None-Match",n.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Kc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Nc(Jc,k,b,v)){v.readyState=1,h&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Pc(k,v,c)),u=Qc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(n.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!l.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||n.css(a,"display"))},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var Rc=/%20/g,Sc=/\[\]$/,Tc=/\r?\n/g,Uc=/^(?:submit|button|image|reset|file)$/i,Vc=/^(?:input|select|textarea|keygen)/i;function Wc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||Sc.test(a)?d(a,e):Wc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Wc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Wc(c,a[c],b,e);return d.join("&").replace(Rc,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&Vc.test(this.nodeName)&&!Uc.test(a)&&(this.checked||!X.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(Tc,"\r\n")}}):{name:b.name,value:c.replace(Tc,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&$c()||_c()}:$c;var Xc=0,Yc={},Zc=n.ajaxSettings.xhr();a.ActiveXObject&&n(a).on("unload",function(){for(var a in Yc)Yc[a](void 0,!0)}),l.cors=!!Zc&&"withCredentials"in Zc,Zc=l.ajax=!!Zc,Zc&&n.ajaxTransport(function(a){if(!a.crossDomain||l.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Xc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Yc[g],b=void 0,f.onreadystatechange=n.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Yc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function $c(){try{return new a.XMLHttpRequest}catch(b){}}function _c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=z.head||n("head")[0]||z.documentElement;return{send:function(d,e){b=z.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var ad=[],bd=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=ad.pop()||n.expando+"_"+wc++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(bd.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&bd.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(bd,"$1"+e):b.jsonp!==!1&&(b.url+=(xc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,ad.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||z;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var cd=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&cd)return cd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=a.slice(h,a.length),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&n.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var dd=a.document.documentElement;function ed(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?(typeof e.getBoundingClientRect!==L&&(d=e.getBoundingClientRect()),c=ed(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||dd;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||dd})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return W(this,function(a,d,e){var f=ed(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Mb(l.pixelPosition,function(a,c){return c?(c=Kb(a,b),Ib.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return W(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var fd=a.jQuery,gd=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=gd),b&&a.jQuery===n&&(a.jQuery=fd),n},typeof b===L&&(a.jQuery=a.$=n),n}); |
|---|
| .. | .. |
|---|
| 1 | +{"version":3,"file":"jquery-1.11.0.min.js","sources":["jquery-1.11.0.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","deletedIds","slice","concat","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","trim","support","version","jQuery","selector","context","fn","init","rtrim","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","prototype","jquery","constructor","length","toArray","call","get","num","pushStack","elems","ret","merge","prevObject","each","callback","args","map","elem","i","apply","arguments","first","eq","last","len","j","end","sort","splice","extend","src","copyIsArray","copy","name","options","clone","target","deep","isFunction","isPlainObject","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","obj","type","Array","isWindow","isNumeric","parseFloat","isEmptyObject","key","nodeType","e","ownLast","globalEval","data","execScript","camelCase","string","nodeName","toLowerCase","value","isArraylike","text","makeArray","arr","results","Object","inArray","max","second","grep","invert","callbackInverse","matches","callbackExpect","arg","guid","proxy","tmp","now","Date","split","Sizzle","Expr","getText","isXML","compile","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","sortOrder","a","b","strundefined","MAX_NEGATIVE","pop","push_native","booleans","whitespace","characterEncoding","identifier","attributes","pseudos","RegExp","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","rquickExpr","rsibling","rescape","runescape","funescape","_","escaped","escapedWhitespace","high","String","fromCharCode","childNodes","els","seed","match","m","groups","old","nid","newContext","newSelector","ownerDocument","exec","getElementById","parentNode","id","getElementsByTagName","getElementsByClassName","qsa","test","tokenize","getAttribute","setAttribute","toSelector","testContext","join","querySelectorAll","qsaError","removeAttribute","select","keys","cache","cacheLength","shift","markFunction","assert","div","createElement","removeChild","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","documentElement","node","hasCompare","doc","parent","defaultView","top","addEventListener","attachEvent","className","appendChild","createComment","innerHTML","firstChild","getById","getElementsByName","find","filter","attrId","getAttributeNode","tag","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","val","specified","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","nodeValue","selectors","createPseudo","relative",">","dir"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","simple","forward","ofType","xml","outerCache","nodeIndex","start","useCache","lastChild","pseudo","setFilters","idx","matched","not","matcher","unmatched","has","innerText","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","disabled","checked","selected","selectedIndex","empty","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","base","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","group","contexts","token","div1","defaultValue","unique","isXMLDoc","rneedsContext","rsingleTag","risSimple","winnow","qualifier","self","is","rootjQuery","charAt","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","next","prev","until","sibling","n","r","targets","closest","l","pos","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","siblings","contentDocument","contentWindow","reverse","rnotwhite","optionsCache","createOptions","object","flag","Callbacks","firing","memory","fired","firingLength","firingIndex","firingStart","list","stack","once","fire","stopOnFalse","disable","remove","lock","locked","fireWith","Deferred","func","tuples","state","promise","always","deferred","fail","then","fns","newDefer","tuple","returned","resolve","reject","progress","notify","pipe","stateString","when","subordinate","resolveValues","remaining","updateFunc","values","progressValues","notifyWith","resolveWith","progressContexts","resolveContexts","readyList","readyWait","holdReady","hold","wait","body","setTimeout","trigger","off","detach","removeEventListener","completed","detachEvent","event","readyState","frameElement","doScroll","doScrollCheck","inlineBlockNeedsLayout","container","style","cssText","zoom","offsetWidth","deleteExpando","acceptData","noData","rbrace","rmultiDash","dataAttr","parseJSON","isEmptyDataObject","internalData","pvt","thisCache","internalKey","isNode","toJSON","internalRemoveData","cleanData","applet ","embed ","object ","hasData","removeData","_data","_removeData","queue","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","cssExpand","isHidden","el","css","access","chainable","emptyGet","raw","bulk","rcheckableType","fragment","createDocumentFragment","leadingWhitespace","tbody","htmlSerialize","html5Clone","cloneNode","outerHTML","appendChecked","noCloneChecked","checkClone","noCloneEvent","click","eventName","change","focusin","rformElems","rkeyEvent","rmouseEvent","rfocusMorph","rtypenamespace","returnTrue","returnFalse","safeActiveElement","err","types","events","t","handleObjIn","special","eventHandle","handleObj","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","namespace","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","onlyHandlers","ontype","bubbleType","eventPath","Event","isTrigger","namespace_re","noBubble","parentWindow","isPropagationStopped","preventDefault","isDefaultPrevented","_default","fix","handlerQueue","delegateTarget","preDispatch","currentTarget","isImmediatePropagationStopped","stopPropagation","postDispatch","sel","prop","originalEvent","fixHook","fixHooks","mouseHooks","keyHooks","props","srcElement","metaKey","original","which","charCode","keyCode","eventDoc","fromElement","pageX","clientX","scrollLeft","clientLeft","pageY","clientY","scrollTop","clientTop","relatedTarget","toElement","load","blur","beforeunload","returnValue","simulate","bubble","isSimulated","defaultPrevented","getPreventDefault","timeStamp","cancelBubble","stopImmediatePropagation","mouseenter","mouseleave","orig","related","submitBubbles","form","_submit_bubble","changeBubbles","propertyName","_just_changed","focusinBubbles","attaches","on","one","origFn","triggerHandler","createSafeFragment","nodeNames","safeFrag","rinlinejQuery","rnoshimcache","rleadingWhitespace","rxhtmlTag","rtagName","rtbody","rhtml","rnoInnerhtml","rchecked","rscriptType","rscriptTypeMasked","rcleanScript","wrapMap","option","legend","area","param","thead","tr","col","td","safeFragment","fragmentDiv","optgroup","tfoot","colgroup","caption","th","getAll","found","fixDefaultChecked","defaultChecked","manipulationTarget","content","disableScript","restoreScript","setGlobalEval","refElements","cloneCopyEvent","dest","oldData","curData","fixCloneNodeIssues","defaultSelected","dataAndEvents","deepDataAndEvents","destElements","srcElements","inPage","buildFragment","scripts","selection","wrap","safe","nodes","createTextNode","append","domManip","prepend","insertBefore","before","after","keepData","html","replaceWith","replaceChild","hasScripts","set","iNoClone","_evalUrl","appendTo","prependTo","insertAfter","replaceAll","insert","iframe","elemdisplay","actualDisplay","display","getDefaultComputedStyle","defaultDisplay","write","close","shrinkWrapBlocksVal","divReset","opacity","cssFloat","backgroundClip","clearCloneStyle","shrinkWrapBlocks","containerStyles","width","rmargin","rnumnonpx","getStyles","curCSS","rposition","getComputedStyle","computed","minWidth","maxWidth","getPropertyValue","currentStyle","left","rs","rsLeft","runtimeStyle","pixelLeft","addGetHookIf","conditionFn","hookFn","condition","reliableHiddenOffsetsVal","boxSizingVal","boxSizingReliableVal","pixelPositionVal","reliableMarginRightVal","reliableHiddenOffsets","tds","isSupported","offsetHeight","boxSizing","computeStyleTests","boxSizingReliable","pixelPosition","reliableMarginRight","marginDiv","marginRight","swap","ralpha","ropacity","rdisplayswap","rnumsplit","rrelNum","cssShow","position","visibility","cssNormalTransform","letterSpacing","fontWeight","cssPrefixes","vendorPropName","capName","origName","showHide","show","hidden","setPositiveNumber","subtract","augmentWidthOrHeight","extra","isBorderBox","styles","getWidthOrHeight","valueIsBorderBox","cssHooks","cssNumber","columnCount","fillOpacity","lineHeight","order","orphans","widows","zIndex","cssProps","float","$1","margin","padding","border","prefix","suffix","expand","expanded","parts","hide","toggle","Tween","easing","unit","propHooks","run","percent","eased","duration","step","tween","fx","linear","p","swing","cos","PI","fxNow","timerId","rfxtypes","rfxnum","rrun","animationPrefilters","defaultPrefilter","tweeners","*","createTween","scale","maxIterations","createFxNow","genFx","includeWidth","height","animation","collection","opts","oldfire","dDisplay","anim","dataShow","unqueued","overflow","overflowX","overflowY","propFilter","specialEasing","Animation","properties","stopped","tick","currentTime","startTime","tweens","originalProperties","originalOptions","gotoEnd","rejectWith","timer","complete","tweener","prefilter","speed","opt","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","interval","setInterval","clearInterval","slow","fast","delay","time","timeout","clearTimeout","getSetAttribute","hrefNormalized","checkOn","optSelected","enctype","optDisabled","radioValue","rreturn","valHooks","optionSet","scrollHeight","nodeHook","boolHook","ruseDefault","getSetInput","removeAttr","nType","attrHooks","propName","attrNames","propFix","getter","setAttributeNode","createAttribute","coords","contenteditable","rfocusable","rclickable","removeProp","for","class","notxml","tabindex","parseInt","rclass","addClass","classes","clazz","finalValue","proceed","removeClass","toggleClass","stateVal","classNames","hasClass","hover","fnOver","fnOut","bind","unbind","delegate","undelegate","nonce","rquery","rvalidtokens","JSON","parse","requireNonComma","depth","str","comma","open","Function","parseXML","DOMParser","parseFromString","ActiveXObject","async","loadXML","ajaxLocParts","ajaxLocation","rhash","rts","rheaders","rlocalProtocol","rnoContent","rprotocol","rurl","prefilters","transports","allTypes","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","ajaxHandleResponses","s","responses","firstDataType","ct","finalDataType","mimeType","getResponseHeader","converters","ajaxConvert","response","isSuccess","conv2","current","conv","responseFields","dataFilter","active","lastModified","etag","url","isLocal","processData","contentType","accepts","json","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","cacheURL","responseHeadersString","timeoutTimer","fireGlobals","transport","responseHeaders","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getAllResponseHeaders","setRequestHeader","lname","overrideMimeType","code","status","abort","statusText","finalText","success","method","crossDomain","traditional","hasContent","ifModified","headers","beforeSend","send","nativeStatusText","modified","getJSON","getScript","throws","wrapAll","wrapInner","unwrap","visible","r20","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","v","encodeURIComponent","serialize","serializeArray","xhr","createStandardXHR","createActiveXHR","xhrId","xhrCallbacks","xhrSupported","cors","username","xhrFields","isAbort","onreadystatechange","responseText","XMLHttpRequest","script","text script","head","scriptCharset","charset","onload","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","keepScripts","parsed","_load","params","animated","getWindow","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","calculatePosition","curElem","using","win","box","getBoundingClientRect","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","funcName","size","andSelf","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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"} |
|---|
| .. | .. |
|---|
| 1 | +/* Modernizr 2.6.2 (Custom Build) | MIT & BSD |
|---|
| 2 | + * Build: http://modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-inlinesvg-smil-svg-svgclippaths-touch-webgl-shiv-mq-cssclasses-addtest-prefixed-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load |
|---|
| 3 | + */ |
|---|
| 4 | +;window.Modernizr=function(a,b,c){function D(a){j.cssText=a}function E(a,b){return D(n.join(a+";")+(b||""))}function F(a,b){return typeof a===b}function G(a,b){return!!~(""+a).indexOf(b)}function H(a,b){for(var d in a){var e=a[d];if(!G(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function I(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:F(f,"function")?f.bind(d||b):f}return!1}function J(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+p.join(d+" ")+d).split(" ");return F(b,"string")||F(b,"undefined")?H(e,b):(e=(a+" "+q.join(d+" ")+d).split(" "),I(e,b,c))}function K(){e.input=function(c){for(var d=0,e=c.length;d<e;d++)u[c[d]]=c[d]in k;return u.list&&(u.list=!!b.createElement("datalist")&&!!a.HTMLDataListElement),u}("autocomplete autofocus list placeholder max min multiple pattern required step".split(" ")),e.inputtypes=function(a){for(var d=0,e,f,h,i=a.length;d<i;d++)k.setAttribute("type",f=a[d]),e=k.type!=="text",e&&(k.value=l,k.style.cssText="position:absolute;visibility:hidden;",/^range$/.test(f)&&k.style.WebkitAppearance!==c?(g.appendChild(k),h=b.defaultView,e=h.getComputedStyle&&h.getComputedStyle(k,null).WebkitAppearance!=="textfield"&&k.offsetHeight!==0,g.removeChild(k)):/^(search|tel)$/.test(f)||(/^(url|email)$/.test(f)?e=k.checkValidity&&k.checkValidity()===!1:e=k.value!=l)),t[a[d]]=!!e;return t}("search tel url email datetime date month week time datetime-local number range color".split(" "))}var d="2.6.2",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k=b.createElement("input"),l=":)",m={}.toString,n=" -webkit- -moz- -o- -ms- ".split(" "),o="Webkit Moz O ms",p=o.split(" "),q=o.toLowerCase().split(" "),r={svg:"http://www.w3.org/2000/svg"},s={},t={},u={},v=[],w=v.slice,x,y=function(a,c,d,e){var f,i,j,k,l=b.createElement("div"),m=b.body,n=m||b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:h+(d+1),l.appendChild(j);return f=["­",'<style id="s',h,'">',a,"</style>"].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},z=function(b){var c=a.matchMedia||a.msMatchMedia;if(c)return c(b).matches;var d;return y("@media "+b+" { #"+h+" { position: absolute; } }",function(b){d=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle)["position"]=="absolute"}),d},A=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;return f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=F(e[d],"function"),F(e[d],"undefined")||(e[d]=c),e.removeAttribute(d))),e=null,f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),B={}.hasOwnProperty,C;!F(B,"undefined")&&!F(B.call,"undefined")?C=function(a,b){return B.call(a,b)}:C=function(a,b){return b in a&&F(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=w.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(w.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(w.call(arguments)))};return e}),s.flexbox=function(){return J("flexWrap")},s.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},s.canvastext=function(){return!!e.canvas&&!!F(b.createElement("canvas").getContext("2d").fillText,"function")},s.webgl=function(){return!!a.WebGLRenderingContext},s.touch=function(){var c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:y(["@media (",n.join("touch-enabled),("),h,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=a.offsetTop===9}),c},s.geolocation=function(){return"geolocation"in navigator},s.postmessage=function(){return!!a.postMessage},s.websqldatabase=function(){return!!a.openDatabase},s.indexedDB=function(){return!!J("indexedDB",a)},s.hashchange=function(){return A("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},s.history=function(){return!!a.history&&!!history.pushState},s.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a},s.websockets=function(){return"WebSocket"in a||"MozWebSocket"in a},s.rgba=function(){return D("background-color:rgba(150,255,150,.5)"),G(j.backgroundColor,"rgba")},s.hsla=function(){return D("background-color:hsla(120,40%,100%,.5)"),G(j.backgroundColor,"rgba")||G(j.backgroundColor,"hsla")},s.multiplebgs=function(){return D("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(j.background)},s.backgroundsize=function(){return J("backgroundSize")},s.borderimage=function(){return J("borderImage")},s.borderradius=function(){return J("borderRadius")},s.boxshadow=function(){return J("boxShadow")},s.textshadow=function(){return b.createElement("div").style.textShadow===""},s.opacity=function(){return E("opacity:.55"),/^0.55$/.test(j.opacity)},s.cssanimations=function(){return J("animationName")},s.csscolumns=function(){return J("columnCount")},s.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";return D((a+"-webkit- ".split(" ").join(b+a)+n.join(c+a)).slice(0,-a.length)),G(j.backgroundImage,"gradient")},s.cssreflections=function(){return J("boxReflect")},s.csstransforms=function(){return!!J("transform")},s.csstransforms3d=function(){var a=!!J("perspective");return a&&"webkitPerspective"in g.style&&y("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a},s.csstransitions=function(){return J("transition")},s.fontface=function(){var a;return y('@font-face {font-family:"font";src:url("https://")}',function(c,d){var e=b.getElementById("smodernizr"),f=e.sheet||e.styleSheet,g=f?f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"":"";a=/src/i.test(g)&&g.indexOf(d.split(" ")[0])===0}),a},s.generatedcontent=function(){var a;return y(["#",h,"{font:0/0 a}#",h,':after{content:"',l,'";visibility:hidden;font:3px/1 a}'].join(""),function(b){a=b.offsetHeight>=3}),a},s.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),c.h264=a.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,"")}catch(d){}return c},s.audio=function(){var a=b.createElement("audio"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),c.mp3=a.canPlayType("audio/mpeg;").replace(/^no$/,""),c.wav=a.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),c.m4a=(a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")).replace(/^no$/,"")}catch(d){}return c},s.localstorage=function(){try{return localStorage.setItem(h,h),localStorage.removeItem(h),!0}catch(a){return!1}},s.sessionstorage=function(){try{return sessionStorage.setItem(h,h),sessionStorage.removeItem(h),!0}catch(a){return!1}},s.webworkers=function(){return!!a.Worker},s.applicationcache=function(){return!!a.applicationCache},s.svg=function(){return!!b.createElementNS&&!!b.createElementNS(r.svg,"svg").createSVGRect},s.inlinesvg=function(){var a=b.createElement("div");return a.innerHTML="<svg/>",(a.firstChild&&a.firstChild.namespaceURI)==r.svg},s.smil=function(){return!!b.createElementNS&&/SVGAnimate/.test(m.call(b.createElementNS(r.svg,"animate")))},s.svgclippaths=function(){return!!b.createElementNS&&/SVGClipPath/.test(m.call(b.createElementNS(r.svg,"clipPath")))};for(var L in s)C(s,L)&&(x=L.toLowerCase(),e[x]=s[L](),v.push((e[x]?"":"no-")+x));return e.input||K(),e.addTest=function(a,b){if(typeof a=="object")for(var d in a)C(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},D(""),i=k=null,function(a,b){function k(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function l(){var a=r.elements;return typeof a=="string"?a.split(" "):a}function m(a){var b=i[a[g]];return b||(b={},h++,a[g]=h,i[h]=b),b}function n(a,c,f){c||(c=b);if(j)return c.createElement(a);f||(f=m(c));var g;return f.cache[a]?g=f.cache[a].cloneNode():e.test(a)?g=(f.cache[a]=f.createElem(a)).cloneNode():g=f.createElem(a),g.canHaveChildren&&!d.test(a)?f.frag.appendChild(g):g}function o(a,c){a||(a=b);if(j)return a.createDocumentFragment();c=c||m(a);var d=c.frag.cloneNode(),e=0,f=l(),g=f.length;for(;e<g;e++)d.createElement(f[e]);return d}function p(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return r.shivMethods?n(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+l().join().replace(/\w+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(r,b.frag)}function q(a){a||(a=b);var c=m(a);return r.shivCSS&&!f&&!c.hasCSS&&(c.hasCSS=!!k(a,"article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}mark{background:#FF0;color:#000}")),j||p(a,c),a}var c=a.html5||{},d=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,e=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,f,g="_html5shiv",h=0,i={},j;(function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",f="hidden"in a,j=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){f=!0,j=!0}})();var r={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,supportsUnknownElements:j,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:q,createElement:n,createDocumentFragment:o};a.html5=r,q(b)}(this,b),e._version=d,e._prefixes=n,e._domPrefixes=q,e._cssomPrefixes=p,e.mq=z,e.hasEvent=A,e.testProp=function(a){return H([a])},e.testAllProps=J,e.testStyles=y,e.prefixed=function(a,b,c){return b?J(a,b,c):J(a,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+v.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f<d;f++)g=a[f].split("="),(e=z[g.shift()])&&(c=e(c,g));for(f=0;f<b;f++)c=x[f](c);return c}function g(a,e,f,g,h){var i=b(a),j=i.autoCallback;i.url.split(".").pop().split("?").shift(),i.bypass||(e&&(e=d(e)?e:e[a]||e[g]||e[a.split("/").pop().split("?")[0]]),i.instead?i.instead(a,e,f,g,h):(y[i.url]?i.noexec=!0:y[i.url]=1,f.load(i.url,i.forceCSS||!i.forceJS&&"css"==i.url.split(".").pop().split("?").shift()?"c":c,i.noexec,i.attrs,i.timeout),(d(e)||d(j))&&f.load(function(){k(),e&&e(i.origUrl,h,g),j&&j(i.origUrl,h,g),y[i.url]=2})))}function h(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}),g(a,j,b,0,h);else if(Object(a)===a)for(n in m=function(){var b=0,c;for(c in a)a.hasOwnProperty(c)&&b++;return b}(),a)a.hasOwnProperty(n)&&(!c&&!--m&&(d(j)?j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}:j[n]=function(a){return function(){var b=[].slice.call(arguments);a&&a.apply(this,b),l()}}(k[n])),g(a[n],j,b,n,h))}else!c&&l()}var h=!!a.test,i=a.load||a.both,j=a.callback||f,k=j,l=a.complete||f,m,n;c(h?a.yep:a.nope,!!i),i&&c(i)}var i,j,l=this.yepnope.loader;if(e(a))g(a,0,l,0);else if(w(a))for(i=0;i<a.length;i++)j=a[i],e(j)?g(j,0,l,0):w(j)?B(j):Object(j)===j&&h(j,l);else Object(a)===a&&h(a,l)},B.addPrefix=function(a,b){z[a]=b},B.addFilter=function(a){x.push(a)},B.errorTimeout=1e4,null==b.readyState&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",A=function(){b.removeEventListener("DOMContentLoaded",A,0),b.readyState="complete"},0)),a.yepnope=k(),a.yepnope.executeStack=h,a.yepnope.injectJs=function(a,c,d,e,i,j){var k=b.createElement("script"),l,o,e=e||B.errorTimeout;k.src=a;for(o in d)k.setAttribute(o,d[o]);c=j?h:c||f,k.onreadystatechange=k.onload=function(){!l&&g(k.readyState)&&(l=1,c(),k.onload=k.onreadystatechange=null)},m(function(){l||(l=1,c(1))},e),i?k.onload():n.parentNode.insertBefore(k,n)},a.yepnope.injectCss=function(a,c,d,e,g,i){var e=b.createElement("link"),j,c=i?h:c||f;e.href=a,e.rel="stylesheet",e.type="text/css";for(j in d)e.setAttribute(j,d[j]);g||(n.parentNode.insertBefore(e,n),m(c,0))}}(this,document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))}; |
|---|
| .. | .. |
|---|
| 1 | +;(function(win){ |
|---|
| 2 | + var store = {}, |
|---|
| 3 | + doc = win.document, |
|---|
| 4 | + localStorageName = 'localStorage', |
|---|
| 5 | + scriptTag = 'script', |
|---|
| 6 | + storage |
|---|
| 7 | + |
|---|
| 8 | + store.disabled = false |
|---|
| 9 | + store.set = function(key, value) {} |
|---|
| 10 | + store.get = function(key) {} |
|---|
| 11 | + store.remove = function(key) {} |
|---|
| 12 | + store.clear = function() {} |
|---|
| 13 | + store.transact = function(key, defaultVal, transactionFn) { |
|---|
| 14 | + var val = store.get(key) |
|---|
| 15 | + if (transactionFn == null) { |
|---|
| 16 | + transactionFn = defaultVal |
|---|
| 17 | + defaultVal = null |
|---|
| 18 | + } |
|---|
| 19 | + if (typeof val == 'undefined') { val = defaultVal || {} } |
|---|
| 20 | + transactionFn(val) |
|---|
| 21 | + store.set(key, val) |
|---|
| 22 | + } |
|---|
| 23 | + store.getAll = function() {} |
|---|
| 24 | + store.forEach = function() {} |
|---|
| 25 | + |
|---|
| 26 | + store.serialize = function(value) { |
|---|
| 27 | + return JSON.stringify(value) |
|---|
| 28 | + } |
|---|
| 29 | + store.deserialize = function(value) { |
|---|
| 30 | + if (typeof value != 'string') { return undefined } |
|---|
| 31 | + try { return JSON.parse(value) } |
|---|
| 32 | + catch(e) { return value || undefined } |
|---|
| 33 | + } |
|---|
| 34 | + |
|---|
| 35 | + // Functions to encapsulate questionable FireFox 3.6.13 behavior |
|---|
| 36 | + // when about.config::dom.storage.enabled === false |
|---|
| 37 | + // See https://github.com/marcuswestin/store.js/issues#issue/13 |
|---|
| 38 | + function isLocalStorageNameSupported() { |
|---|
| 39 | + try { return (localStorageName in win && win[localStorageName]) } |
|---|
| 40 | + catch(err) { return false } |
|---|
| 41 | + } |
|---|
| 42 | + |
|---|
| 43 | + if (isLocalStorageNameSupported()) { |
|---|
| 44 | + storage = win[localStorageName] |
|---|
| 45 | + store.set = function(key, val) { |
|---|
| 46 | + if (val === undefined) { return store.remove(key) } |
|---|
| 47 | + storage.setItem(key, store.serialize(val)) |
|---|
| 48 | + return val |
|---|
| 49 | + } |
|---|
| 50 | + store.get = function(key) { return store.deserialize(storage.getItem(key)) } |
|---|
| 51 | + store.remove = function(key) { storage.removeItem(key) } |
|---|
| 52 | + store.clear = function() { storage.clear() } |
|---|
| 53 | + store.getAll = function() { |
|---|
| 54 | + var ret = {} |
|---|
| 55 | + store.forEach(function(key, val) { |
|---|
| 56 | + ret[key] = val |
|---|
| 57 | + }) |
|---|
| 58 | + return ret |
|---|
| 59 | + } |
|---|
| 60 | + store.forEach = function(callback) { |
|---|
| 61 | + for (var i=0; i<storage.length; i++) { |
|---|
| 62 | + var key = storage.key(i) |
|---|
| 63 | + callback(key, store.get(key)) |
|---|
| 64 | + } |
|---|
| 65 | + } |
|---|
| 66 | + } else if (doc.documentElement.addBehavior) { |
|---|
| 67 | + var storageOwner, |
|---|
| 68 | + storageContainer |
|---|
| 69 | + // Since #userData storage applies only to specific paths, we need to |
|---|
| 70 | + // somehow link our data to a specific path. We choose /favicon.ico |
|---|
| 71 | + // as a pretty safe option, since all browsers already make a request to |
|---|
| 72 | + // this URL anyway and being a 404 will not hurt us here. We wrap an |
|---|
| 73 | + // iframe pointing to the favicon in an ActiveXObject(htmlfile) object |
|---|
| 74 | + // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx) |
|---|
| 75 | + // since the iframe access rules appear to allow direct access and |
|---|
| 76 | + // manipulation of the document element, even for a 404 page. This |
|---|
| 77 | + // document can be used instead of the current document (which would |
|---|
| 78 | + // have been limited to the current path) to perform #userData storage. |
|---|
| 79 | + try { |
|---|
| 80 | + storageContainer = new ActiveXObject('htmlfile') |
|---|
| 81 | + storageContainer.open() |
|---|
| 82 | + storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>') |
|---|
| 83 | + storageContainer.close() |
|---|
| 84 | + storageOwner = storageContainer.w.frames[0].document |
|---|
| 85 | + storage = storageOwner.createElement('div') |
|---|
| 86 | + } catch(e) { |
|---|
| 87 | + // somehow ActiveXObject instantiation failed (perhaps some special |
|---|
| 88 | + // security settings or otherwse), fall back to per-path storage |
|---|
| 89 | + storage = doc.createElement('div') |
|---|
| 90 | + storageOwner = doc.body |
|---|
| 91 | + } |
|---|
| 92 | + function withIEStorage(storeFunction) { |
|---|
| 93 | + return function() { |
|---|
| 94 | + var args = Array.prototype.slice.call(arguments, 0) |
|---|
| 95 | + args.unshift(storage) |
|---|
| 96 | + // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx |
|---|
| 97 | + // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx |
|---|
| 98 | + storageOwner.appendChild(storage) |
|---|
| 99 | + storage.addBehavior('#default#userData') |
|---|
| 100 | + storage.load(localStorageName) |
|---|
| 101 | + var result = storeFunction.apply(store, args) |
|---|
| 102 | + storageOwner.removeChild(storage) |
|---|
| 103 | + return result |
|---|
| 104 | + } |
|---|
| 105 | + } |
|---|
| 106 | + |
|---|
| 107 | + // In IE7, keys may not contain special chars. See all of https://github.com/marcuswestin/store.js/issues/40 |
|---|
| 108 | + var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g") |
|---|
| 109 | + function ieKeyFix(key) { |
|---|
| 110 | + return key.replace(forbiddenCharsRegex, '___') |
|---|
| 111 | + } |
|---|
| 112 | + store.set = withIEStorage(function(storage, key, val) { |
|---|
| 113 | + key = ieKeyFix(key) |
|---|
| 114 | + if (val === undefined) { return store.remove(key) } |
|---|
| 115 | + storage.setAttribute(key, store.serialize(val)) |
|---|
| 116 | + storage.save(localStorageName) |
|---|
| 117 | + return val |
|---|
| 118 | + }) |
|---|
| 119 | + store.get = withIEStorage(function(storage, key) { |
|---|
| 120 | + key = ieKeyFix(key) |
|---|
| 121 | + return store.deserialize(storage.getAttribute(key)) |
|---|
| 122 | + }) |
|---|
| 123 | + store.remove = withIEStorage(function(storage, key) { |
|---|
| 124 | + key = ieKeyFix(key) |
|---|
| 125 | + storage.removeAttribute(key) |
|---|
| 126 | + storage.save(localStorageName) |
|---|
| 127 | + }) |
|---|
| 128 | + store.clear = withIEStorage(function(storage) { |
|---|
| 129 | + var attributes = storage.XMLDocument.documentElement.attributes |
|---|
| 130 | + storage.load(localStorageName) |
|---|
| 131 | + for (var i=0, attr; attr=attributes[i]; i++) { |
|---|
| 132 | + storage.removeAttribute(attr.name) |
|---|
| 133 | + } |
|---|
| 134 | + storage.save(localStorageName) |
|---|
| 135 | + }) |
|---|
| 136 | + store.getAll = function(storage) { |
|---|
| 137 | + var ret = {} |
|---|
| 138 | + store.forEach(function(key, val) { |
|---|
| 139 | + ret[key] = val |
|---|
| 140 | + }) |
|---|
| 141 | + return ret |
|---|
| 142 | + } |
|---|
| 143 | + store.forEach = withIEStorage(function(storage, callback) { |
|---|
| 144 | + var attributes = storage.XMLDocument.documentElement.attributes |
|---|
| 145 | + for (var i=0, attr; attr=attributes[i]; ++i) { |
|---|
| 146 | + callback(attr.name, store.deserialize(storage.getAttribute(attr.name))) |
|---|
| 147 | + } |
|---|
| 148 | + }) |
|---|
| 149 | + } |
|---|
| 150 | + |
|---|
| 151 | + try { |
|---|
| 152 | + var testKey = '__storejs__' |
|---|
| 153 | + store.set(testKey, testKey) |
|---|
| 154 | + if (store.get(testKey) != testKey) { store.disabled = true } |
|---|
| 155 | + store.remove(testKey) |
|---|
| 156 | + } catch(e) { |
|---|
| 157 | + store.disabled = true |
|---|
| 158 | + } |
|---|
| 159 | + store.enabled = !store.disabled |
|---|
| 160 | + |
|---|
| 161 | + if (typeof module != 'undefined' && module.exports) { module.exports = store } |
|---|
| 162 | + else if (typeof define === 'function' && define.amd) { define(store) } |
|---|
| 163 | + else { win.store = store } |
|---|
| 164 | + |
|---|
| 165 | +})(this.window || global); |
|---|
| .. | .. |
|---|
| 1 | +/* Copyright (c) 2010-2013 Marcus Westin */ |
|---|
| 2 | +(function(e){function o(){try{return r in e&&e[r]}catch(t){return!1}}var t={},n=e.document,r="localStorage",i="script",s;t.disabled=!1,t.set=function(e,t){},t.get=function(e){},t.remove=function(e){},t.clear=function(){},t.transact=function(e,n,r){var i=t.get(e);r==null&&(r=n,n=null),typeof i=="undefined"&&(i=n||{}),r(i),t.set(e,i)},t.getAll=function(){},t.forEach=function(){},t.serialize=function(e){return JSON.stringify(e)},t.deserialize=function(e){if(typeof e!="string")return undefined;try{return JSON.parse(e)}catch(t){return e||undefined}};if(o())s=e[r],t.set=function(e,n){return n===undefined?t.remove(e):(s.setItem(e,t.serialize(n)),n)},t.get=function(e){return t.deserialize(s.getItem(e))},t.remove=function(e){s.removeItem(e)},t.clear=function(){s.clear()},t.getAll=function(){var e={};return t.forEach(function(t,n){e[t]=n}),e},t.forEach=function(e){for(var n=0;n<s.length;n++){var r=s.key(n);e(r,t.get(r))}};else if(n.documentElement.addBehavior){var u,a;try{a=new ActiveXObject("htmlfile"),a.open(),a.write("<"+i+">document.w=window</"+i+'><iframe src="/favicon.ico"></iframe>'),a.close(),u=a.w.frames[0].document,s=u.createElement("div")}catch(f){s=n.createElement("div"),u=n.body}function l(e){return function(){var n=Array.prototype.slice.call(arguments,0);n.unshift(s),u.appendChild(s),s.addBehavior("#default#userData"),s.load(r);var i=e.apply(t,n);return u.removeChild(s),i}}var c=new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]","g");function h(e){return e.replace(c,"___")}t.set=l(function(e,n,i){return n=h(n),i===undefined?t.remove(n):(e.setAttribute(n,t.serialize(i)),e.save(r),i)}),t.get=l(function(e,n){return n=h(n),t.deserialize(e.getAttribute(n))}),t.remove=l(function(e,t){t=h(t),e.removeAttribute(t),e.save(r)}),t.clear=l(function(e){var t=e.XMLDocument.documentElement.attributes;e.load(r);for(var n=0,i;i=t[n];n++)e.removeAttribute(i.name);e.save(r)}),t.getAll=function(e){var n={};return t.forEach(function(e,t){n[e]=t}),n},t.forEach=l(function(e,n){var r=e.XMLDocument.documentElement.attributes;for(var i=0,s;s=r[i];++i)n(s.name,t.deserialize(e.getAttribute(s.name)))})}try{var p="__storejs__";t.set(p,p),t.get(p)!=p&&(t.disabled=!0),t.remove(p)}catch(f){t.disabled=!0}t.enabled=!t.disabled,typeof module!="undefined"&&module.exports?module.exports=t:typeof define=="function"&&define.amd?define(t):e.store=t})(this.window||global) |
|---|
| .. | .. |
|---|
| 1 | + |
|---|
| 2 | +<div ng-include="'header.html'"></div> |
|---|
| 3 | + |
|---|
| 4 | +<div class="container"> |
|---|
| 5 | + <div class="col-md-12"> </div> |
|---|
| 6 | + <div id="packs_section" class="col-md-6" ng-controller="PacksCtrl"> |
|---|
| 7 | + <nav class="navbar navbar-default navbar-static-top" role="navigation"> |
|---|
| 8 | + <div class="container-fluid"> |
|---|
| 9 | + <!-- Brand and toggle get grouped for better mobile display --> |
|---|
| 10 | + <div class="navbar-header"> |
|---|
| 11 | + <a class="navbar-brand" i18n>Packs</a> |
|---|
| 12 | + </div> |
|---|
| 13 | + |
|---|
| 14 | + <!-- Collect the nav links, forms, and other content for toggling --> |
|---|
| 15 | + <div class="collapse navbar-collapse"> |
|---|
| 16 | + <ul class="nav navbar-nav"> |
|---|
| 17 | + <li><a i18n ng-click="newPack()"><span |
|---|
| 18 | + class="glyphicon glyphicon-plus"></span> New</a></li> |
|---|
| 19 | + <li><a i18n ng-click="cancel()"> <span |
|---|
| 20 | + class="glyphicon glyphicon-ban-circle"></span> Cancel |
|---|
| 21 | + </a></li> |
|---|
| 22 | + </ul> |
|---|
| 23 | + <div class="navbar-form navbar-right form-group"> |
|---|
| 24 | + <span class="input-group input-group-sm"> |
|---|
| 25 | + <div class="input-group-addon" style="width: 28px;"> |
|---|
| 26 | + <span class=" glyphicon glyphicon-search"></span> |
|---|
| 27 | + </div> <input type="text" class="form-control" placeholder="Search" |
|---|
| 28 | + ng-model="$searchPacksText"> |
|---|
| 29 | + <div class="input-group-addon" style="width: 20px;"> |
|---|
| 30 | + <span class=" glyphicon glyphicon-remove" |
|---|
| 31 | + ng-click="$searchPacksText = '';"></span> |
|---|
| 32 | + </div> |
|---|
| 33 | + </span> |
|---|
| 34 | + </div> |
|---|
| 35 | + </div> |
|---|
| 36 | + </div> |
|---|
| 37 | + </nav> |
|---|
| 38 | + |
|---|
| 39 | + <div class="panel panel-default animate-show ng-hide" |
|---|
| 40 | + ng-show="showForm"> |
|---|
| 41 | + <form role="form" class="form-horizontal " name="packForm" |
|---|
| 42 | + id="packForm" ng-submit="save()"> |
|---|
| 43 | + <div class="form-group" ng-if="!isNew"> |
|---|
| 44 | + <label class="col-md-3 control-label">ID</label> |
|---|
| 45 | + <div class="col-md-8"> |
|---|
| 46 | + <p class="form-control-static" ng-bind="pack.id"></p> |
|---|
| 47 | + </div> |
|---|
| 48 | + </div> |
|---|
| 49 | + <div class="form-group"> |
|---|
| 50 | + <label class="col-md-3 control-label" for="code" i18n>Code</label> |
|---|
| 51 | + <div class="col-md-8"> |
|---|
| 52 | + <input type="string" id="code" name="code" placeholder="" |
|---|
| 53 | + class="form-control" ng-model="pack.code" |
|---|
| 54 | + ng-required="mandatory.code" ng-maxlength="{{maxlength.code}}" /> |
|---|
| 55 | + <div class="alert inline-alert alert-warning" |
|---|
| 56 | + ng-show="packForm.code.$invalid"> |
|---|
| 57 | + <span class="glyphicon glyphicon-warning-sign"></span> <span |
|---|
| 58 | + ng-show="packForm.code.$error.maxlength" |
|---|
| 59 | + ng-bind="maxlengthErrorMsg('Code', maxlength.code)"></span> <span |
|---|
| 60 | + ng-show="packForm.code.$error.required" |
|---|
| 61 | + ng-bind="mandatoryFieldErrorMsg('Code')"></span> |
|---|
| 62 | + </div> |
|---|
| 63 | + </div> |
|---|
| 64 | + </div> |
|---|
| 65 | + |
|---|
| 66 | + <div class="form-group"> |
|---|
| 67 | + <label class="col-md-3 control-label" for="code" i18n>Validity (from - to)</label> |
|---|
| 68 | + <div class="col-md-4"> |
|---|
| 69 | + <input type="date" id="init_valid_date" name="init_valid_date" placeholder="" |
|---|
| 70 | + class="form-control" ng-model="pack.init_valid_date" |
|---|
| 71 | + ng-required="mandatory.init_valid_date" /> |
|---|
| 72 | + <div class="alert inline-alert alert-warning" |
|---|
| 73 | + ng-show="packForm.initValidDate.$invalid"> |
|---|
| 74 | + <span class="glyphicon glyphicon-warning-sign"></span> |
|---|
| 75 | + <span ng-show="packForm.init_valid_date.$error.required" |
|---|
| 76 | + ng-bind="mandatoryFieldErrorMsg('Init valid date')"></span> |
|---|
| 77 | + </div> |
|---|
| 78 | + </div> |
|---|
| 79 | + <div class="col-md-4"> |
|---|
| 80 | + <input type="date" id="end_valid_date" name="end_valid_date" placeholder="" |
|---|
| 81 | + class="form-control" ng-model="pack.end_valid_date" |
|---|
| 82 | + min="{{pack.init_valid_date | date: 'yyyy-MM-dd'}}" |
|---|
| 83 | + ng-required="mandatory.end_valid_date" /> |
|---|
| 84 | + <div class="alert inline-alert alert-warning" |
|---|
| 85 | + ng-show="packForm.end_valid_date.$invalid"> |
|---|
| 86 | + <span class="glyphicon glyphicon-warning-sign"></span> |
|---|
| 87 | + <span ng-show="packForm.end_valid_date.$error.required" |
|---|
| 88 | + ng-bind="mandatoryFieldErrorMsg('End valid date')"></span> |
|---|
| 89 | + <span ng-show="packForm.end_valid_date.$error.min" |
|---|
| 90 | + ng-bind="field1ShouldBeGreaterThanField2('End date', 'Init date')"></span> |
|---|
| 91 | + </div> |
|---|
| 92 | + </div> |
|---|
| 93 | + </div> |
|---|
| 94 | + |
|---|
| 95 | + <div class="form-group"> |
|---|
| 96 | + <label class="col-md-3 control-label" for="num_licenses" i18n>Num. |
|---|
| 97 | + Licenses</label> |
|---|
| 98 | + <div class="col-md-8"> |
|---|
| 99 | + <input type="number" id="num_licenses" name="num_licenses" |
|---|
| 100 | + placeholder="" class="form-control" ng-model="pack.num_licenses" |
|---|
| 101 | + ng-required="mandatory.num_licenses" /> |
|---|
| 102 | + <div class="alert inline-alert alert-warning" |
|---|
| 103 | + ng-show="packForm.num_licenses.$invalid"> |
|---|
| 104 | + <span class="glyphicon glyphicon-warning-sign"></span> <span |
|---|
| 105 | + ng-show="packForm.num_licenses.$error.maxlength" |
|---|
| 106 | + ng-bind="maxlengthErrorMsg('Num. Licenses', maxlength.num_licenses)"></span> |
|---|
| 107 | + <span ng-show="packForm.num_licenses.$error.required" |
|---|
| 108 | + ng-bind="mandatoryFieldErrorMsg('Num. Licenses')"></span> |
|---|
| 109 | + </div> |
|---|
| 110 | + </div> |
|---|
| 111 | + </div> |
|---|
| 112 | + |
|---|
| 113 | + <div class="form-group" ng-if="!isNew"> |
|---|
| 114 | + <label class="col-md-3 control-label" for="status" i18n>Status</label> |
|---|
| 115 | + <div class="col-md-8"> |
|---|
| 116 | + <p class="form-control-static" ng-bind="pack.status_name"></p> |
|---|
| 117 | + <div class="alert inline-alert alert-warning" |
|---|
| 118 | + ng-show="packForm.status.$invalid"> |
|---|
| 119 | + <span class="glyphicon glyphicon-warning-sign"></span> <span |
|---|
| 120 | + ng-show="packForm.status.$error.required" |
|---|
| 121 | + ng-bind="mandatoryFieldErrorMsg('Status')"></span> |
|---|
| 122 | + </div> |
|---|
| 123 | + </div> |
|---|
| 124 | + </div> |
|---|
| 125 | + |
|---|
| 126 | + <div class="form-group"> |
|---|
| 127 | + <label class="col-md-3 control-label" for="license_type_id" i18n>License |
|---|
| 128 | + type</label> |
|---|
| 129 | + <div class="col-md-8"> |
|---|
| 130 | + <select ng-if="isNew" class="form-control" id="license_type_id" |
|---|
| 131 | + ng-change="updateMetadata()" |
|---|
| 132 | + ng-required="mandatory.license_type_id" |
|---|
| 133 | + ng-model="pack.license_type_id" |
|---|
| 134 | + ng-options="o.id as o.label for o in refs.license_type_id"> |
|---|
| 135 | + </select> |
|---|
| 136 | + <p ng-if="!isNew" class="form-control-static" ng-bind="pack.license_type_name"></p> |
|---|
| 137 | + <div class="alert inline-alert alert-warning" |
|---|
| 138 | + ng-show="packForm.license_type_id.$invalid"> |
|---|
| 139 | + <span class="glyphicon glyphicon-warning-sign"></span> <span |
|---|
| 140 | + ng-show="packForm.license_type_id.$error.required" |
|---|
| 141 | + ng-bind="mandatoryFieldErrorMsg('License type')"></span> |
|---|
| 142 | + </div> |
|---|
| 143 | + </div> |
|---|
| 144 | + </div> |
|---|
| 145 | + |
|---|
| 146 | + <div class="form-group"> |
|---|
| 147 | + <label class="col-md-3 control-label" for="organization_id" i18n>Organization</label> |
|---|
| 148 | + <div class="col-md-8"> |
|---|
| 149 | + <select ng-if="isNew" class="form-control" |
|---|
| 150 | + ng-model="pack.organization_id" |
|---|
| 151 | + ng-required="mandatory.organization_id" |
|---|
| 152 | + ng-options="o.id as o.label for o in refs.organization_id"> |
|---|
| 153 | + </select> |
|---|
| 154 | + <p ng-if="!isNew" class="form-control-static" ng-bind="pack.organization_name"></p> |
|---|
| 155 | + <div class="alert inline-alert alert-warning" |
|---|
| 156 | + ng-show="packForm.organization_id.$invalid"> |
|---|
| 157 | + <span class="glyphicon glyphicon-warning-sign"></span> <span |
|---|
| 158 | + ng-show="packForm.organization_id.$error.required" |
|---|
| 159 | + ng-bind="mandatoryFieldErrorMsg('Organization')"></span> |
|---|
| 160 | + </div> |
|---|
| 161 | + </div> |
|---|
| 162 | + </div> |
|---|
| 163 | + <div class="form-group"> |
|---|
| 164 | + <label class="col-md-3 control-label" for="license_preactivation" |
|---|
| 165 | + i18n>License preactivation</label> |
|---|
| 166 | + <div class="col-md-8"> |
|---|
| 167 | + <input type="checkbox" class="form-control" |
|---|
| 168 | + ng-model="pack.license_preactivation" /> |
|---|
| 169 | + </div> |
|---|
| 170 | + </div> |
|---|
| 171 | + <div class="form-group"> |
|---|
| 172 | + <label class="col-md-3 control-label" for="license_preactivation" |
|---|
| 173 | + i18n>Default valid period (days)</label> |
|---|
| 174 | + <div class="col-md-8"> |
|---|
| 175 | + <input type="number" id="default_valid_period" name="default_valid_period" |
|---|
| 176 | + min="1" class="form-control" ng-model="pack.default_valid_period" |
|---|
| 177 | + ng-required="pack.license_preactivation" /> |
|---|
| 178 | + <div class="alert inline-alert alert-warning" |
|---|
| 179 | + ng-show="packForm.default_valid_period.$invalid"> |
|---|
| 180 | + <span class="glyphicon glyphicon-warning-sign"></span> |
|---|
| 181 | + <span ng-show="packForm.default_valid_period.$error.required" |
|---|
| 182 | + ng-bind="mandatoryFieldErrorMsg('Default valid period')"></span> |
|---|
| 183 | + <span ng-show="packForm.default_valid_period.$error.min" |
|---|
| 184 | + ng-bind="field1ShouldBeGreaterThanField2('The default valid period', '0')"></span> |
|---|
| 185 | + </div> |
|---|
| 186 | + </div> |
|---|
| 187 | + </div> |
|---|
| 188 | + |
|---|
| 189 | + |
|---|
| 190 | + <div class="form-group"> |
|---|
| 191 | + <label class="col-md-3 control-label" for="comments" i18n>Comments</label> |
|---|
| 192 | + <div class="col-md-8"> |
|---|
| 193 | + <textarea type="string" id="comments" name="comments" |
|---|
| 194 | + placeholder="" class="form-control" ng-model="pack.comments" |
|---|
| 195 | + rows="2" ng-required="mandatory.comments" |
|---|
| 196 | + ng-maxlength="{{maxlength.comments}}"></textarea> |
|---|
| 197 | + <div class="alert inline-alert alert-warning" |
|---|
| 198 | + ng-show="packForm.comments.$invalid"> |
|---|
| 199 | + <span class="glyphicon glyphicon-warning-sign"></span> <span |
|---|
| 200 | + ng-show="packForm.comments.$error.maxlength" |
|---|
| 201 | + ng-bind="maxlengthErrorMsg('Comments', maxlength.comments)"></span> |
|---|
| 202 | + <span ng-show="packForm.comments.$error.required" |
|---|
| 203 | + ng-bind="mandatoryFieldErrorMsg('comments')"></span> |
|---|
| 204 | + </div> |
|---|
| 205 | + </div> |
|---|
| 206 | + </div> |
|---|
| 207 | + |
|---|
| 208 | + <div class="form-group" ng-if="!isNew"> |
|---|
| 209 | + <label i18n class="col-md-3 control-label">Created by</label> |
|---|
| 210 | + <div class="col-md-8"> |
|---|
| 211 | + <p class="form-control-static" ng-bind="pack.created_by_name"></p> |
|---|
| 212 | + </div> |
|---|
| 213 | + </div> |
|---|
| 214 | + |
|---|
| 215 | + <div class="form-group" ng-if="!isNew"> |
|---|
| 216 | + <label i18n class="col-md-3 control-label">Creation date</label> |
|---|
| 217 | + <div class="col-md-8"> |
|---|
| 218 | + <p class="form-control-static" |
|---|
| 219 | + ng-bind="pack.creation_timestamp | date:'medium'"></p> |
|---|
| 220 | + </div> |
|---|
| 221 | + </div> |
|---|
| 222 | + |
|---|
| 223 | + <div class="form-group"> |
|---|
| 224 | + <label class="col-md-3 control-label" i18n>Metadata</label> |
|---|
| 225 | + <div class="col-md-8"> |
|---|
| 226 | + <table class="table table-hover table-condensed"> |
|---|
| 227 | + <thead> |
|---|
| 228 | + <tr> |
|---|
| 229 | + <th i18n>Key</th> |
|---|
| 230 | + <th i18n>Value</th> |
|---|
| 231 | + </tr> |
|---|
| 232 | + </thead> |
|---|
| 233 | + <tbody> |
|---|
| 234 | + <tr ng-repeat="row_md in pack.metadata"> |
|---|
| 235 | + <td><input type="text" id="md_key" name="md_key" |
|---|
| 236 | + placeholder="" ng-readonly="true" |
|---|
| 237 | + class="form-control" ng-model="row_md['key']" |
|---|
| 238 | + ng-required="true" /></td> |
|---|
| 239 | + <td><input type="text" id="md_value" name="md_value" ng-readonly="row_md['readonly']" |
|---|
| 240 | + placeholder="" class="form-control" ng-model="row_md['value']" |
|---|
| 241 | + ng-required="row_md['mandatory']" ng-maxlength="150" /></td> |
|---|
| 242 | + </tr> |
|---|
| 243 | + </tbody> |
|---|
| 244 | + </table> |
|---|
| 245 | + </div> |
|---|
| 246 | + </div> |
|---|
| 247 | + |
|---|
| 248 | + <div class="form-group"> |
|---|
| 249 | + <div class="col-md-offset-3 col-md-10 " id="saveContainer"> |
|---|
| 250 | + <button id="save" type="submit" class="btn btn-primary"> |
|---|
| 251 | + <span i18n class="glyphicon glyphicon-floppy-disk"></span> Save |
|---|
| 252 | + </button> |
|---|
| 253 | + <button ng-if="!isNew" id="acc" type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> |
|---|
| 254 | + <span i18n class="glyphicon glyphicon-align-justify"></span> Actions |
|---|
| 255 | + <span class="caret"></span> |
|---|
| 256 | + </button> |
|---|
| 257 | + <ul class="dropdown-menu" role="menu"> |
|---|
| 258 | + <li><a ng-click="execute('activate')" ng-if="Packs.isActionAvailable('activate', pack)" href="#" >Activate</a></li> |
|---|
| 259 | + <li><a ng-click="execute('putonhold')" ng-if="Packs.isActionAvailable('putonhold', pack)" href="#">Put on hold</a></li> |
|---|
| 260 | + <li class="divider"></li> |
|---|
| 261 | + <li><a ng-click="execute('cancel')" ng-if="Packs.isActionAvailable('cancel', pack)" href="#">Cancel</a></li> |
|---|
| 262 | + <li><a ng-click="execute('delete')" ng-if="Packs.isActionAvailable('delete', pack)" href="#">Delete</a></li> |
|---|
| 263 | + </ul> |
|---|
| 264 | + </div> |
|---|
| 265 | + </div> |
|---|
| 266 | + </form> |
|---|
| 267 | + </div> |
|---|
| 268 | + |
|---|
| 269 | + <div class="panel panel-default"> |
|---|
| 270 | + <div class="panel-heading"> |
|---|
| 271 | + Packs <span class="badge pull-right" ng-bind="packs.length || 0"></span> |
|---|
| 272 | + </div> |
|---|
| 273 | + |
|---|
| 274 | + <table class="table table-hover table-condensed"> |
|---|
| 275 | + <thead> |
|---|
| 276 | + <tr> |
|---|
| 277 | + <th i18n>Code</th> |
|---|
| 278 | + <th i18n>Organization</th> |
|---|
| 279 | + <th i18n>Application</th> |
|---|
| 280 | + <th i18n>Licenses</th> |
|---|
| 281 | + <th></th> |
|---|
| 282 | + </tr> |
|---|
| 283 | + </thead> |
|---|
| 284 | + <tbody> |
|---|
| 285 | + <tr ng-repeat="p in packs | filter:searchText" |
|---|
| 286 | + ng-dblclick="editPack(p)" |
|---|
| 287 | + ng-class="{success: currentPack.id === p.id}" |
|---|
| 288 | + ng-click="selectPack(p)"> |
|---|
| 289 | + <td style="white-space: nowrap;" ng-bind="p.code"></td> |
|---|
| 290 | + <td ng-bind="ellipsis(p.organization_name, 20)" |
|---|
| 291 | + title="{{pack.organization_name}}"></td> |
|---|
| 292 | + <td ng-bind="p.application_name"></td> |
|---|
| 293 | + <td |
|---|
| 294 | + title="Total: {{p.num_licenses}}, available: {{p.num_available}}">{{p.num_licenses}} |
|---|
| 295 | + ({{p.num_available}})</td> |
|---|
| 296 | + <td> |
|---|
| 297 | + <div class="dropdown"> |
|---|
| 298 | + <a class="dropdown-toggle" data-toggle="dropdown"> <span |
|---|
| 299 | + class="glyphicon glyphicon-align-justify" style="color: {{Packs.getStatusColor(p.status)}}"></span> |
|---|
| 300 | + <span style="color: {{Packs.getStatusColor(p.status)}}" class="caret"></span> |
|---|
| 301 | + </a> |
|---|
| 302 | + <ul class="dropdown-menu"> |
|---|
| 303 | + <li ng-if="Packs.isActionAvailable('edit', p)"><a |
|---|
| 304 | + ng-click="editPack(p)"><span |
|---|
| 305 | + class="glyphicon glyphicon-pencil"></span> <span i18n>Edit</span></a></li> |
|---|
| 306 | + <li ng-if="Packs.isActionAvailable('activate', p)"><a |
|---|
| 307 | + ng-click="execute('activate', p)"><span |
|---|
| 308 | + class="glyphicon glyphicon-check"></span> <span i18n>Activate</span></a></li> |
|---|
| 309 | + <li ng-if="Packs.isActionAvailable('putonhold', p)"><a |
|---|
| 310 | + ng-click="execute('putonhold', p)"><span |
|---|
| 311 | + class="glyphicon glyphicon-pause"></span> <span i18n>Put on hold</span></a></li> |
|---|
| 312 | + <li ng-if="Packs.isActionAvailable('cancel', p)"><a |
|---|
| 313 | + ng-click="execute('cancel', p)"><span |
|---|
| 314 | + class="glyphicon glyphicon-ban-circle"></span> <span i18n>Cancel</span></a></li> |
|---|
| 315 | + <li ng-if="Packs.isActionAvailable('delete', p)"><a |
|---|
| 316 | + ng-click="execute('delete', p)"><span |
|---|
| 317 | + class="glyphicon glyphicon-trash"></span> <span i18n>Delete</span></a></li> |
|---|
| 318 | + </ul> |
|---|
| 319 | + </div> |
|---|
| 320 | + </td> |
|---|
| 321 | + </tr> |
|---|
| 322 | + </tbody> |
|---|
| 323 | + <tfoot> |
|---|
| 324 | + </tfoot> |
|---|
| 325 | + </table> |
|---|
| 326 | + </div> |
|---|
| 327 | + |
|---|
| 328 | + </div> |
|---|
| 329 | + <div id="licenses_section" class="col-md-6" |
|---|
| 330 | + ng-controller="LicensesCtrl"> |
|---|
| 331 | + <nav class="navbar navbar-default navbar-static-top" |
|---|
| 332 | + ng-disabled="!currentPack"> |
|---|
| 333 | + <div class="container-fluid"> |
|---|
| 334 | + <!-- Brand and toggle get grouped for better mobile display --> |
|---|
| 335 | + <div class="navbar-header success"> |
|---|
| 336 | + <a class="navbar-brand" i18n>Licenses</a> |
|---|
| 337 | + </div> |
|---|
| 338 | + |
|---|
| 339 | + <!-- Collect the nav links, forms, and other content for toggling --> |
|---|
| 340 | + <div class="collapse navbar-collapse" |
|---|
| 341 | + id="bs-example-navbar-collapse-1"> |
|---|
| 342 | + <ul class="nav navbar-nav"> |
|---|
| 343 | + <li><a i18n ng-click="newLicense()"><span |
|---|
| 344 | + class="glyphicon glyphicon-plus"></span> New</a></li> |
|---|
| 345 | + <li><a i18n ng-click="cancel()"> <span |
|---|
| 346 | + class="glyphicon glyphicon-ban-circle"></span> Cancel |
|---|
| 347 | + </a></li> |
|---|
| 348 | + </ul> |
|---|
| 349 | + <div class="navbar-form navbar-right form-group"> |
|---|
| 350 | + <span class="input-group input-group-sm"> |
|---|
| 351 | + <div class="input-group-addon" style="width: 28px;"> |
|---|
| 352 | + <span class=" glyphicon glyphicon-search"></span> |
|---|
| 353 | + </div> <input type="text" class="form-control" placeholder="Search" |
|---|
| 354 | + ng-model="$searchLicensesText"> |
|---|
| 355 | + <div class="input-group-addon" style="width: 20px;"> |
|---|
| 356 | + <span class=" glyphicon glyphicon-remove" |
|---|
| 357 | + ng-click="$searchLicensesText = '';"></span> |
|---|
| 358 | + </div> |
|---|
| 359 | + </span> |
|---|
| 360 | + </div> |
|---|
| 361 | + </div> |
|---|
| 362 | + </div> |
|---|
| 363 | + </nav> |
|---|
| 364 | + |
|---|
| 365 | + <div ng-if="!currentPack" class="well well-lg"> |
|---|
| 366 | + <h4 i18n>No pack selected</h4> |
|---|
| 367 | + <p i18n>Please, select a pack to manage its licenses</p> |
|---|
| 368 | + </div> |
|---|
| 369 | + |
|---|
| 370 | + <div ng-if="currentPack" |
|---|
| 371 | + class="panel panel-default animate-show ng-hide" ng-show="showForm"> |
|---|
| 372 | + <form role="form" class="form-horizontal " name="licenseForm" |
|---|
| 373 | + id="licenseForm" ng-submit="save()"> |
|---|
| 374 | + <div class="form-group" ng-if="!isNew"> |
|---|
| 375 | + <label class="col-md-3 control-label">ID</label> |
|---|
| 376 | + <div class="col-md-8"> |
|---|
| 377 | + <p class="form-control-static" ng-bind="license.id"></p> |
|---|
| 378 | + </div> |
|---|
| 379 | + </div> |
|---|
| 380 | + <div class="form-group"> |
|---|
| 381 | + <label class="col-md-3 control-label" for="pack_id" i18n>Pack</label> |
|---|
| 382 | + <div class="col-md-8"> |
|---|
| 383 | + <p class="form-control-static" ng-bind="currentPack.code"></p> |
|---|
| 384 | + <input type="hidden" id="pack_id" name="pack_id" |
|---|
| 385 | + ng-model="license.pack_id" /> |
|---|
| 386 | + </div> |
|---|
| 387 | + </div> |
|---|
| 388 | + <div class="form-group"> |
|---|
| 389 | + <label class="col-md-3 control-label" for="code" i18n>Code</label> |
|---|
| 390 | + <div class="col-md-8"> |
|---|
| 391 | + <input type="string" id="code" name="code" placeholder="" |
|---|
| 392 | + class="form-control" ng-model="license.code" |
|---|
| 393 | + ng-required="mandatory.code" ng-maxlength="{{maxlength.code}}" /> |
|---|
| 394 | + <div class="alert inline-alert alert-warning" |
|---|
| 395 | + ng-show="licenseForm.code.$invalid"> |
|---|
| 396 | + <span class="glyphicon glyphicon-warning-sign"></span> <span |
|---|
| 397 | + ng-show="licenseForm.code.$error.maxlength" |
|---|
| 398 | + ng-bind="maxlengthErrorMsg('Code', maxlength.code)"></span> <span |
|---|
| 399 | + ng-show="licenseForm.code.$error.required" |
|---|
| 400 | + ng-bind="mandatoryFieldErrorMsg('Code')"></span> |
|---|
| 401 | + </div> |
|---|
| 402 | + </div> |
|---|
| 403 | + </div> |
|---|
| 404 | + <div class="form-group" ng-if="!isNew"> |
|---|
| 405 | + <label class="col-md-3 control-label" i18n>Status</label> |
|---|
| 406 | + <div class="col-md-8"> |
|---|
| 407 | + <p class="form-control-static" ng-bind="showStatusLong(license)"></p> |
|---|
| 408 | + </div> |
|---|
| 409 | + </div> |
|---|
| 410 | + |
|---|
| 411 | + <div class="form-group"> |
|---|
| 412 | + <label class="col-md-3 control-label" for="full_name" i18n>User |
|---|
| 413 | + full name</label> |
|---|
| 414 | + <div class="col-md-8"> |
|---|
| 415 | + <input type="string" id="full_name" name="full_name" |
|---|
| 416 | + placeholder="" class="form-control" ng-model="license.full_name" |
|---|
| 417 | + ng-required="mandatory.full_name" /> |
|---|
| 418 | + <div class="alert inline-alert alert-warning" |
|---|
| 419 | + ng-show="licenseForm.full_name.$invalid"> |
|---|
| 420 | + <span class="glyphicon glyphicon-warning-sign"></span> <span |
|---|
| 421 | + ng-show="licenseForm.full_name.$error.maxlength" |
|---|
| 422 | + ng-bind="maxlengthErrorMsg('User full name', maxlength.full_name)"></span> |
|---|
| 423 | + <span ng-show="licenseForm.full_name.$error.required" |
|---|
| 424 | + ng-bind="mandatoryFieldErrorMsg('User full name')"></span> |
|---|
| 425 | + </div> |
|---|
| 426 | + </div> |
|---|
| 427 | + </div> |
|---|
| 428 | + |
|---|
| 429 | + <div class="form-group"> |
|---|
| 430 | + <label class="col-md-3 control-label" for="email" i18n>User |
|---|
| 431 | + email</label> |
|---|
| 432 | + <div class="col-md-8"> |
|---|
| 433 | + <input type="email" id="email" name="email" placeholder="" |
|---|
| 434 | + class="form-control" ng-model="license.email" |
|---|
| 435 | + ng-required="mandatory.email" /> |
|---|
| 436 | + <div class="alert inline-alert alert-warning" |
|---|
| 437 | + ng-show="licenseForm.email.$invalid"> |
|---|
| 438 | + <span class="glyphicon glyphicon-warning-sign"></span> <span |
|---|
| 439 | + ng-show="licenseForm.email.$error.email" |
|---|
| 440 | + ng-bind="'Please, write a valid email address'"></span> <span |
|---|
| 441 | + ng-show="licenseForm.email.$error.maxlength" |
|---|
| 442 | + ng-bind="maxlengthErrorMsg('User email', maxlength.email)"></span> |
|---|
| 443 | + <span ng-show="licenseForm.email.$error.required" |
|---|
| 444 | + ng-bind="mandatoryFieldErrorMsg('User email')"></span> |
|---|
| 445 | + </div> |
|---|
| 446 | + </div> |
|---|
| 447 | + </div> |
|---|
| 448 | + <div class="form-group" ng-if="isNew || !license.request_data"> |
|---|
| 449 | + <label class="col-md-3 control-label" for="request_data" i18n>Request |
|---|
| 450 | + data</label> |
|---|
| 451 | + <div class="col-md-7"> |
|---|
| 452 | + <textarea id="request_data" name="request_data" placeholder="" |
|---|
| 453 | + class="form-control" ng-model="license.request_data" rows="2" |
|---|
| 454 | + ng-required="mandatory.request_data" |
|---|
| 455 | + ng-maxlength="{{maxlength.request_data}}"></textarea> |
|---|
| 456 | + <div class="alert inline-alert alert-warning" |
|---|
| 457 | + ng-show="licenseForm.request_data.$invalid"> |
|---|
| 458 | + Invalid ? {{licenseForm.request_data.$invalid}} |
|---|
| 459 | + Error ? {{licenseForm.request_data.$error | json}} |
|---|
| 460 | + Error ? {{licenseForm.request_data.$error.maxlength}} |
|---|
| 461 | + <span class="glyphicon glyphicon-warning-sign"> |
|---|
| 462 | + <span |
|---|
| 463 | + ng-show="licenseForm.request_data.$error.maxlength" |
|---|
| 464 | + ng-bind="maxlengthErrorMsg('Request data', maxlength.request_data)"></span> |
|---|
| 465 | + <span ng-show="licenseForm.request_data.$error.required" |
|---|
| 466 | + ng-bind="mandatoryFieldErrorMsg('Request data')"></span> |
|---|
| 467 | + </span> |
|---|
| 468 | + </div> |
|---|
| 469 | + </div> |
|---|
| 470 | + <span class="btn btn-file btn-default btn-xs"> |
|---|
| 471 | + <span class="glyphicon glyphicon-folder-open"></span> |
|---|
| 472 | + <input file-loader="license.request_data" type="file" /> |
|---|
| 473 | + </span> |
|---|
| 474 | + </div> |
|---|
| 475 | + |
|---|
| 476 | + <div class="form-group"> |
|---|
| 477 | + <label class="col-md-3 control-label" for="comments" i18n>Comments</label> |
|---|
| 478 | + <div class="col-md-8"> |
|---|
| 479 | + <textarea type="string" id="comments" name="comments" |
|---|
| 480 | + placeholder="" class="form-control" ng-model="license.comments" |
|---|
| 481 | + rows="2" ng-required="mandatory.comments" |
|---|
| 482 | + ng-maxlength="{{maxlength.comments}}"></textarea> |
|---|
| 483 | + |
|---|
| 484 | + <div class="alert inline-alert alert-warning" |
|---|
| 485 | + ng-show="licenseForm.comments.$invalid"> |
|---|
| 486 | + <span class="glyphicon glyphicon-warning-sign"></span> <span |
|---|
| 487 | + ng-show="licenseForm.comments.$error.maxlength" |
|---|
| 488 | + ng-bind="maxlengthErrorMsg('Comments', maxlength.comments)"></span> |
|---|
| 489 | + <span ng-show="licenseForm.comments.$error.required" |
|---|
| 490 | + ng-bind="mandatoryFieldErrorMsg('comments')"></span> |
|---|
| 491 | + </div> |
|---|
| 492 | + </div> |
|---|
| 493 | + </div> |
|---|
| 494 | + |
|---|
| 495 | + <div class="form-group" ng-if="!isNew && license.request_data"> |
|---|
| 496 | + <label class="col-md-3 control-label" i18n>Request data</label> |
|---|
| 497 | + <div class="col-md-8"> |
|---|
| 498 | + <pre class="form-control-static" |
|---|
| 499 | + ng-bind="license.request_data | json"></pre> |
|---|
| 500 | + </div> |
|---|
| 501 | + </div> |
|---|
| 502 | + |
|---|
| 503 | + <div class="form-group" ng-if="!isNew && license.license_data"> |
|---|
| 504 | + <label class="col-md-3 control-label" i18n>License file</label> |
|---|
| 505 | + <div class="col-md-8"> |
|---|
| 506 | + <p class="form-control-static" ng-bind="license.license_data"></p> |
|---|
| 507 | + <button id="downloadLicense" class="btn btn-xs btn-link" |
|---|
| 508 | + ng-click="downloadLicense(license)"> |
|---|
| 509 | + <span i18n class="glyphicon glyphicon-download"></span> |
|---|
| 510 | + </button> |
|---|
| 511 | + </div> |
|---|
| 512 | + </div> |
|---|
| 513 | + |
|---|
| 514 | + <div class="form-group" ng-if="!isNew"> |
|---|
| 515 | + <label class="col-md-3 control-label" i18n>Created by</label> |
|---|
| 516 | + <div class="col-md-8"> |
|---|
| 517 | + <p class="form-control-static" ng-bind="license.created_by_name"></p> |
|---|
| 518 | + </div> |
|---|
| 519 | + </div> |
|---|
| 520 | + |
|---|
| 521 | + <div class="form-group" ng-if="!isNew && license.canceled_by_name"> |
|---|
| 522 | + <label class="col-md-3 control-label">Canceled by</label> |
|---|
| 523 | + <div class="col-md-8"> |
|---|
| 524 | + <p class="form-control-static" ng-bind="license.canceled_by_name"></p> |
|---|
| 525 | + </div> |
|---|
| 526 | + </div> |
|---|
| 527 | + |
|---|
| 528 | + <div class="form-group" ng-if="!isNew"> |
|---|
| 529 | + <label class="col-md-3 control-label" i18n>Creation date</label> |
|---|
| 530 | + <div class="col-md-8"> |
|---|
| 531 | + <p class="form-control-static" |
|---|
| 532 | + ng-bind="license.creation_timestamp | date:'medium'"></p> |
|---|
| 533 | + </div> |
|---|
| 534 | + </div> |
|---|
| 535 | + |
|---|
| 536 | + <div class="form-group" ng-if="!isNew"> |
|---|
| 537 | + <label class="col-md-3 control-label" i18n>Modification |
|---|
| 538 | + date</label> |
|---|
| 539 | + <div class="col-md-8"> |
|---|
| 540 | + <p class="form-control-static" |
|---|
| 541 | + ng-bind="license.modificationTimestamp | date:'medium'"></p> |
|---|
| 542 | + </div> |
|---|
| 543 | + </div> |
|---|
| 544 | + |
|---|
| 545 | + <div class="form-group" |
|---|
| 546 | + ng-if="!isNew && license.activationTimestamp"> |
|---|
| 547 | + <label class="col-md-3 control-label" i18n>Activation date</label> |
|---|
| 548 | + <div class="col-md-8"> |
|---|
| 549 | + <p class="form-control-static" |
|---|
| 550 | + ng-bind="license.activationTimestamp | date:'medium'"></p> |
|---|
| 551 | + </div> |
|---|
| 552 | + </div> |
|---|
| 553 | + |
|---|
| 554 | + <div class="form-group" ng-if="!isNew && license.sendTimestamp"> |
|---|
| 555 | + <label class="col-md-3 control-label" i18n>Send date</label> |
|---|
| 556 | + <div class="col-md-8"> |
|---|
| 557 | + <p class="form-control-static" |
|---|
| 558 | + ng-bind="license.sendTimestamp | date:'medium'"></p> |
|---|
| 559 | + </div> |
|---|
| 560 | + </div> |
|---|
| 561 | + |
|---|
| 562 | + <div class="form-group" |
|---|
| 563 | + ng-if="!isNew && license.cancelationTimestamp"> |
|---|
| 564 | + <label class="col-md-3 control-label" i18n>Cancelation date</label> |
|---|
| 565 | + <div class="col-md-8"> |
|---|
| 566 | + <p class="form-control-static" |
|---|
| 567 | + ng-bind="license.cancelationTimestamp | date:'medium'"></p> |
|---|
| 568 | + </div> |
|---|
| 569 | + </div> |
|---|
| 570 | + |
|---|
| 571 | + <div class="form-group" |
|---|
| 572 | + ng-if="!isNew && license.lastAccessTimestamp"> |
|---|
| 573 | + <label class="col-md-3 control-label" i18n>Last access date</label> |
|---|
| 574 | + <div class="col-md-8"> |
|---|
| 575 | + <p class="form-control-static" |
|---|
| 576 | + ng-bind="license.lastAccessTimestamp | date:'medium'"></p> |
|---|
| 577 | + </div> |
|---|
| 578 | + </div> |
|---|
| 579 | + |
|---|
| 580 | + <div class="form-group"> |
|---|
| 581 | + <div class="col-md-offset-3 col-md-9" id="saveContainer"> |
|---|
| 582 | + <button id="save" type="submit" class="btn btn-primary"> |
|---|
| 583 | + <span i18n class="glyphicon glyphicon-floppy-disk"></span> Save |
|---|
| 584 | + </button> |
|---|
| 585 | + <button ng-if="!isNew" id="acc" type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> |
|---|
| 586 | + <span i18n class="glyphicon glyphicon-align-justify"></span> Actions |
|---|
| 587 | + <span class="caret"></span> |
|---|
| 588 | + </button> |
|---|
| 589 | + <ul class="dropdown-menu" role="menu"> |
|---|
| 590 | + <li ng-if="Licenses.isActionAvailable('activate', license)"><a ng-click="execute('activate', license)" href="#">Activate</a></li> |
|---|
| 591 | + <li ng-if="Licenses.isActionAvailable('download', license)"><a ng-click="execute('download', license)" href="#">Download</a></li> |
|---|
| 592 | + <li ng-if="Licenses.isActionAvailable('send', license)"><a ng-click="execute('send', license)" href="#">Send by email</a></li> |
|---|
| 593 | + <li ng-if="Licenses.isActionAvailable('cancel', license)"><a ng-click="execute('cancel', license)" href="#">Cancel</a></li> |
|---|
| 594 | + <li ng-if="Licenses.isActionAvailable('delete', license)"><a ng-click="execute('delete', license)" href="#">Delete</a></li> |
|---|
| 595 | + </ul> |
|---|
| 596 | + |
|---|
| 597 | + </div> |
|---|
| 598 | + </div> |
|---|
| 599 | + </form> |
|---|
| 600 | + </div> |
|---|
| 601 | + |
|---|
| 602 | + <div class="panel panel-default" ng-if="currentPack"> |
|---|
| 603 | + <div class="panel-heading"> |
|---|
| 604 | + <span i18n>Licenses for pack: </span>{{currentPack.code}} <span |
|---|
| 605 | + style="color: lightgreen;" class="badge pull-right" |
|---|
| 606 | + ng-bind="currentPack.lic_available || 0"></span> <span |
|---|
| 607 | + class="badge pull-right" ng-bind="licenses.length || 0"></span> |
|---|
| 608 | + </div> |
|---|
| 609 | + |
|---|
| 610 | + |
|---|
| 611 | + <table class="table table-hover table-condensed"> |
|---|
| 612 | + <thead> |
|---|
| 613 | + <tr> |
|---|
| 614 | + <th i18n>License code</th> |
|---|
| 615 | + <th i18n>User fullname</th> |
|---|
| 616 | + <th i18n>Email</th> |
|---|
| 617 | + <th i18n>Status</th> |
|---|
| 618 | + <th></th> |
|---|
| 619 | + </tr> |
|---|
| 620 | + </thead> |
|---|
| 621 | + <tbody> |
|---|
| 622 | + <tr ng-repeat="lic in licenses | filter:searchLicenseText" |
|---|
| 623 | + ng-dblclick="editLicense(lic)"> |
|---|
| 624 | + <td style="white-space: nowrap;" ng-bind="lic.code"></td> |
|---|
| 625 | + <td ng-bind="ellipsis(lic.full_name, 20)" |
|---|
| 626 | + title="{{lic.full_name}}"></td> |
|---|
| 627 | + <td ng-bind="ellipsis(lic.email, 30)" title="{{lic.email}}"></td> |
|---|
| 628 | + <td ng-bind="showStatus(lic.status)"></td> |
|---|
| 629 | + <td> |
|---|
| 630 | + <div class="dropdown"> |
|---|
| 631 | + <a class="dropdown-toggle" data-toggle="dropdown"> <span |
|---|
| 632 | + class="glyphicon glyphicon-align-justify" style="color: {{Licenses.getStatusColor(lic.status)}}"></span> |
|---|
| 633 | + <span style="color: {{Licenses.getStatusColor(lic.status)}}" class="caret"></span> |
|---|
| 634 | + </a> |
|---|
| 635 | + <ul class="dropdown-menu"> |
|---|
| 636 | + <li ng-if="Licenses.isActionAvailable('download', lic)"><a |
|---|
| 637 | + ng-click="execute('download', lic)"><span |
|---|
| 638 | + class="glyphicon glyphicon-download"></span> <span i18n>Download</span></a></li> |
|---|
| 639 | + <li ng-if="Licenses.isActionAvailable('edit', lic)"><a |
|---|
| 640 | + ng-click="editLicense(lic)"><span |
|---|
| 641 | + class="glyphicon glyphicon-pencil"></span> <span i18n>Edit</span></a></li> |
|---|
| 642 | + <li ng-if="Licenses.isActionAvailable('activate', lic)"><a |
|---|
| 643 | + ng-click="execute('activate', lic)"><span |
|---|
| 644 | + class="glyphicon glyphicon-check"></span> <span i18n>Activate</span></a></li> |
|---|
| 645 | + <li ng-if="Licenses.isActionAvailable('send', lic)"><a |
|---|
| 646 | + ng-click="execute('send', lic)"><span |
|---|
| 647 | + class="glyphicon glyphicon-send"></span> <span i18n>Send email</span></a></li> |
|---|
| 648 | + <li ng-if="Licenses.isActionAvailable('block', lic)"><a |
|---|
| 649 | + ng-click="execute('block', lic)"><span |
|---|
| 650 | + class="glyphicon glyphicon-exclamation-sign"></span> <span i18n>Block</span></a></li> |
|---|
| 651 | + <li ng-if="Licenses.isActionAvailable('unblock', lic)"><a |
|---|
| 652 | + ng-click="execute('unblock', lic)"><span |
|---|
| 653 | + class="glyphicon glyphicon-ok-sign"></span> <span i18n>Unblock</span></a></li> |
|---|
| 654 | + <li ng-if="Licenses.isActionAvailable('cancel', lic)"><a |
|---|
| 655 | + ng-click="execute('cancel', lic)"><span |
|---|
| 656 | + class="glyphicon glyphicon-ban-circle"></span> <span i18n>Cancel</span></a></li> |
|---|
| 657 | + <li ng-if="Licenses.isActionAvailable('delete', lic)"><a |
|---|
| 658 | + ng-click="execute('delete', lic)"><span |
|---|
| 659 | + class="glyphicon glyphicon-trash"></span> <span i18n>Delete</span></a></li> |
|---|
| 660 | + </ul> |
|---|
| 661 | + </div> |
|---|
| 662 | + </td> |
|---|
| 663 | + </tr> |
|---|
| 664 | + </tbody> |
|---|
| 665 | + <tfoot> |
|---|
| 666 | + </tfoot> |
|---|
| 667 | + </table> |
|---|
| 668 | + </div> |
|---|
| 669 | + |
|---|
| 670 | + </div> |
|---|
| 671 | +</div> |
|---|
| .. | .. |
|---|
| 1 | + |
|---|
| 2 | + <div class="navbar navbar-inverse navbar-fixed-top"> |
|---|
| 3 | + <div class="container"> |
|---|
| 4 | + <div class="navbar-header"> |
|---|
| 5 | + <button type="button" class="navbar-toggle" data-toggle="collapse" |
|---|
| 6 | + data-target=".navbar-collapse"> |
|---|
| 7 | + <span class="icon-bar"></span> <span class="icon-bar"></span> <span |
|---|
| 8 | + class="icon-bar"></span> |
|---|
| 9 | + </button> |
|---|
| 10 | + <a i18n class="navbar-brand" href="#">SeCuris</a> |
|---|
| 11 | + </div> |
|---|
| 12 | + <div class="navbar-collapse collapse"> |
|---|
| 13 | + <ul class="nav navbar-nav navbar-right"> |
|---|
| 14 | + <li><a i18n href="#about">About</a></li> |
|---|
| 15 | + <li><a i18n href="#contact">Contact</a></li> |
|---|
| 16 | + </ul> |
|---|
| 17 | + </div> |
|---|
| 18 | + </div> |
|---|
| 19 | + </div> |
|---|
| 20 | + |
|---|
| 21 | + <!-- Main jumbotron for a primary marketing message or call to action --> |
|---|
| 22 | + <div class="jumbotron"> |
|---|
| 23 | + <div class="container"> |
|---|
| 24 | + <h2 i18n >SeCuris</h2> |
|---|
| 25 | + <p i18n >Server License for CurisTEC products.</p> |
|---|
| 26 | + </div> |
|---|
| 27 | + </div> |
|---|
| 28 | + |
|---|
| 29 | + <div class="container"> |
|---|
| 30 | + <div class="col-md-8 col-md-offset-2"> |
|---|
| 31 | + <form role="form" class="form-horizontal" |
|---|
| 32 | + ng-submit="submit()" name="loginForm"> |
|---|
| 33 | + <p i18n class="lead">Sign in SeCuris</p> |
|---|
| 34 | + <fieldset> |
|---|
| 35 | + <div class="form-group"> |
|---|
| 36 | + <label i18n class="col-md-3 control-label" for="username">Username</label> |
|---|
| 37 | + <div class="col-md-5"> |
|---|
| 38 | + <input type="text" id="username" name="username" placeholder="" |
|---|
| 39 | + class="form-control" ng-model="username" required> |
|---|
| 40 | + </div> |
|---|
| 41 | + </div> |
|---|
| 42 | + <div class="form-group"> |
|---|
| 43 | + <!-- Password--> |
|---|
| 44 | + <label i18n class="col-md-3 control-label" for="password">Password</label> |
|---|
| 45 | + <div class="col-md-5"> |
|---|
| 46 | + <input type="password" id="password" name="password" |
|---|
| 47 | + placeholder="" class="form-control" ng-model="password" required> |
|---|
| 48 | + </div> |
|---|
| 49 | + </div> |
|---|
| 50 | + <div class="form-group"> |
|---|
| 51 | + <div class="col-md-offset-3 col-md-10"> |
|---|
| 52 | + <button i18n type="submit" class="btn btn-primary">Sign in</button> |
|---|
| 53 | + </div> |
|---|
| 54 | + </div> |
|---|
| 55 | + </fieldset> |
|---|
| 56 | + |
|---|
| 57 | + </form> |
|---|
| 58 | + </div> |
|---|
| 59 | + </div> |
|---|
| 60 | + |
|---|
| .. | .. |
|---|
| 1 | +<!DOCTYPE html> |
|---|
| 2 | +<html class="no-js" lang="en" ng-app="securis" |
|---|
| 3 | + xmlns:ng="http://angularjs.org"> |
|---|
| 4 | +<head> |
|---|
| 5 | +<base href="/"> |
|---|
| 6 | +<meta charset="utf-8"> |
|---|
| 7 | +<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> |
|---|
| 8 | +<title>SeCuris</title> |
|---|
| 9 | +<meta name="description" content=""> |
|---|
| 10 | +<meta name="viewport" content="width=device-width"> |
|---|
| 11 | + |
|---|
| 12 | +<link rel="stylesheet" href="/css/bootstrap.min.css"> |
|---|
| 13 | +<link rel="stylesheet" href="/css/bootstrap-dialog.css"> |
|---|
| 14 | +<link rel="stylesheet" href="/css/toaster.css"> |
|---|
| 15 | +<link rel="stylesheet" href="/css/chosen.css"> |
|---|
| 16 | +<link rel="stylesheet" href="/css/chosen-spinner.css"> |
|---|
| 17 | +<link rel="stylesheet" href="/css/bootstrap-theme.min.css"> |
|---|
| 18 | +<link rel="stylesheet" href="/css/font-awesome.min.css"> |
|---|
| 19 | + |
|---|
| 20 | +<link rel="stylesheet" href="/css/securis.css"> |
|---|
| 21 | + |
|---|
| 22 | +<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|---|
| 23 | + |
|---|
| 24 | +</head> |
|---|
| 25 | +<body > |
|---|
| 26 | +<div ng-controller="MainCtrl"> |
|---|
| 27 | + <div ng-view ></div> |
|---|
| 28 | + |
|---|
| 29 | + <hr> |
|---|
| 30 | + <div> |
|---|
| 31 | + <footer> |
|---|
| 32 | + <small i18n style="margin: auto; display: block;" class="text-center">© CurisTEC 2014</small> |
|---|
| 33 | + </footer> |
|---|
| 34 | + </div> |
|---|
| 35 | + <!-- /container --> |
|---|
| 36 | + <script src="/js/vendor/modernizr-2.6.2.min.js"></script> |
|---|
| 37 | + <script |
|---|
| 38 | + src="/js/vendor/jquery.min.js"></script> |
|---|
| 39 | + <script type="text/javascript" |
|---|
| 40 | + src="/js/vendor/bootstrap.min.js"></script> |
|---|
| 41 | + <script type="text/javascript" |
|---|
| 42 | + src="/js/vendor/bootstrap-dialog.js"></script> |
|---|
| 43 | + <script type="text/javascript" |
|---|
| 44 | + src="/js/angular/angular.js"></script> |
|---|
| 45 | + <script type="text/javascript" |
|---|
| 46 | + src="/js/angular/angular-route.min.js"></script> |
|---|
| 47 | + <script type="text/javascript" |
|---|
| 48 | + src="/js/angular/angular-resource.min.js"></script> |
|---|
| 49 | + <script type="text/javascript" |
|---|
| 50 | + src="/js/angular/angular-resource.min.js"></script> |
|---|
| 51 | + <script type="text/javascript" |
|---|
| 52 | + src="/js/angular/toaster.js"></script> |
|---|
| 53 | + <script type="text/javascript" |
|---|
| 54 | + src="/js/angular/toaster.js"></script> |
|---|
| 55 | + <script type="text/javascript" |
|---|
| 56 | + src="/js/vendor/chosen.jquery.js"></script> |
|---|
| 57 | + <script type="text/javascript" |
|---|
| 58 | + src="/js/angular/chosen.js"></script> |
|---|
| 59 | + <script type="text/javascript" |
|---|
| 60 | + src="/js/vendor/store.min.js"></script> |
|---|
| 61 | + |
|---|
| 62 | + <script type="text/javascript" src="js/i18n.js"></script> |
|---|
| 63 | + <script type="text/javascript" src="js/main.js"></script> |
|---|
| 64 | + <script type="text/javascript" src="js/login.js"></script> |
|---|
| 65 | + <script type="text/javascript" src="js/catalogs.js"></script> |
|---|
| 66 | + <script type="text/javascript" src="js/licenses.js"></script> |
|---|
| 67 | + <script type="text/javascript" src="js/admin.js"></script> |
|---|
| 68 | + |
|---|
| 69 | + <toaster-container toaster-options="{'time-out': 3000}"></toaster-container> |
|---|
| 70 | +</div> |
|---|
| 71 | +</body> |
|---|
| 72 | +</html> |
|---|
| .. | .. |
|---|
| 1 | +var connect = require('connect'); |
|---|
| 2 | + |
|---|
| 3 | +connect.createServer( |
|---|
| 4 | + connect.static(__dirname) |
|---|
| 5 | +).listen(8080); |
|---|
| 6 | + |
|---|
| 7 | +console.log('Server listening in http://0.0.0.0:8080...'); |
|---|