From 5be404d6a38a538911d4415186453aea9ad1ef84 Mon Sep 17 00:00:00 2001 From: jfarcand Date: Tue, 13 Feb 2024 09:54:57 -0500 Subject: [PATCH] Support for atmosphere-3.0.x --- extensions-samples/chat-cdi/README.md | 2 - extensions-samples/chat-cdi/pom.xml | 55 - .../org/atmosphere/samples/chat/CDIChat.java | 88 - .../samples/chat/JacksonDecoder.java | 42 - .../samples/chat/JacksonEncoder.java | 42 - .../org/atmosphere/samples/chat/Message.java | 60 - .../chat-cdi/src/main/resources/logback.xml | 22 - .../src/main/webapp/WEB-INF/beans.xml | 6 - .../chat-cdi/src/main/webapp/WEB-INF/web.xml | 21 - .../chat-cdi/src/main/webapp/index.html | 29 - .../src/main/webapp/javascript/application.js | 124 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- extensions-samples/cometd/pom.xml | 78 - .../src/main/resources/log4j.properties | 14 - .../cometd/src/main/webapp/WEB-INF/web.xml | 59 - extensions-samples/guice/chat-guice/pom.xml | 56 - .../samples/guice/EventListener.java | 64 - .../samples/guice/GuiceChatConfig.java | 65 - .../samples/guice/GuiceChatModule.java | 72 - .../samples/guice/InjectedService.java | 14 - .../org/atmosphere/samples/guice/Message.java | 32 - .../samples/guice/ResourceChat.java | 63 - .../atmosphere/samples/guice/Response.java | 36 - .../src/main/webapp/WEB-INF/web.xml | 30 - .../chat-guice/src/main/webapp/index.html | 72 - .../src/main/webapp/javascript/application.js | 83 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- .../gwt/gwt20-jersey-rpc/pom.xml | 125 - .../atmosphere/samples/GwtJerseyDemo.gwt.xml | 21 - .../samples/client/GwtJerseyDemo.java | 142 - .../atmosphere/samples/client/RPCEvent.java | 25 - .../samples/client/RPCSerializer.java | 28 - .../samples/server/JerseyGwtRpc.java | 43 - .../src/main/resources/logging.properties | 34 - .../src/main/webapp/META-INF/MANIFEST.MF | 1 - .../src/main/webapp/WEB-INF/glassfish-web.xml | 11 - .../src/main/webapp/WEB-INF/sun-web.xml | 10 - .../src/main/webapp/WEB-INF/web.xml | 30 - .../src/main/webapp/index.html | 36 - extensions-samples/gwt/gwt20-json/pom.xml | 130 - .../atmosphere/samples/GwtJsonDemo.gwt.xml | 22 - .../org/atmosphere/samples/client/Event.java | 28 - .../samples/client/GwtJsonDemo.java | 140 - .../samples/client/MyBeanFactory.java | 16 - .../samples/server/JsonAtmosphereHandler.java | 104 - .../src/main/resources/logging.properties | 34 - .../src/main/webapp/META-INF/MANIFEST.MF | 1 - .../src/main/webapp/META-INF/atmosphere.xml | 8 - .../src/main/webapp/WEB-INF/sun-web.xml | 10 - .../src/main/webapp/WEB-INF/web.xml | 27 - .../gwt/gwt20-json/src/main/webapp/index.jsp | 37 - .../gwt/gwt20-managed-rpc/pom.xml | 133 - .../org/atmosphere/samples/GwtRpcDemo.gwt.xml | 18 - .../atmosphere/samples/client/GwtRpcDemo.java | 140 - .../samples/server/ManagedGWTResource.java | 102 - .../src/main/resources/logging.properties | 34 - .../src/main/webapp/META-INF/MANIFEST.MF | 1 - .../src/main/webapp/WEB-INF/sun-web.xml | 10 - .../src/main/webapp/WEB-INF/web.xml | 25 - .../src/main/webapp/index.jsp | 35 - extensions-samples/gwt/gwt20-rpc/pom.xml | 126 - .../org/atmosphere/samples/GwtRpcDemo.gwt.xml | 23 - .../atmosphere/samples/client/GwtRpcDemo.java | 158 - .../samples/client/RPCSerializer.java | 32 - .../server/GwtRpcAtmosphereHandler.java | 68 - .../atmosphere/samples/shared/BaseEvent.java | 17 - .../atmosphere/samples/shared/EventBar.java | 41 - .../atmosphere/samples/shared/EventFoo.java | 41 - .../src/main/resources/logging.properties | 34 - .../src/main/webapp/META-INF/MANIFEST.MF | 1 - .../src/main/webapp/META-INF/atmosphere.xml | 8 - .../src/main/webapp/WEB-INF/sun-web.xml | 10 - .../gwt20-rpc/src/main/webapp/WEB-INF/web.xml | 31 - .../gwt/gwt20-rpc/src/main/webapp/index.jsp | 37 - .../gwt/gwt20-websockets/README.md | 32 - .../gwt/gwt20-websockets/README.txt | 87 - .../atmosphere gwt+websockets.jpg | Bin 75009 -> 0 bytes .../gwt20-websockets/gwt20-websockets.launch | 20 - .../gwt/gwt20-websockets/pom.xml | 194 - .../samples/GwtWebsocketsDemo.gwt.xml | 32 - .../samples/client/GwtWebsocketsDemo.java | 90 - .../src/main/webapp/GwtWebsocketsDemo.css | 42 - .../src/main/webapp/GwtWebsocketsDemo.html | 55 - .../src/main/webapp/WEB-INF/web.xml | 6 - .../src/main/webapp/favicon.ico | Bin 1082 -> 0 bytes .../samples/GwtWebsocketsDemoJUnit.gwt.xml | 15 - .../samples/client/GwtWebsocketsDemoTest.java | 68 - extensions-samples/gwt/pom.xml | 125 - extensions-samples/hazelcast/pom.xml | 50 - extensions-samples/jgroups/pom.xml | 51 - extensions-samples/jms/pom.xml | 51 - .../kafka/jersey-pubsub/README.md | 12 - .../kafka/jersey-pubsub/pom.xml | 50 - extensions-samples/pom.xml | 55 - .../rabbitmq/jersey-pubsub/README.md | 11 - .../rabbitmq/jersey-pubsub/pom.xml | 51 - extensions-samples/redis/pom.xml | 51 - extensions-samples/rmi/README.md | 3 - extensions-samples/rmi/pom.xml | 52 - .../org/atmosphere/plugin/rmi/rmi.properties | 4 - .../socketio/native-socketio-chat/pom.xml | 51 - .../samples/chat/ChatJSONObject.java | 55 - .../chat/NativeSocketIOAtmosphereHandler.java | 175 - .../samples/chat/SocketIOBroadcaster.java | 47 - .../src/main/webapp/WEB-INF/web.xml | 41 - .../src/main/webapp/css/style.css | 239 - .../src/main/webapp/dist/WebSocketMain.swf | Bin 175830 -> 0 bytes .../webapp/dist/WebSocketMainInsecure.swf | Bin 175953 -> 0 bytes .../src/main/webapp/dist/jquery-2.0.3.js | 8829 --------------- .../src/main/webapp/dist/socket.io.js | 3796 ------- .../src/main/webapp/dist/socket.io.min.js | 2 - .../src/main/webapp/index.html | 171 - .../socketio/socketio-chat/pom.xml | 64 - .../chat/SocketIOChatAtmosphereHandler.java | 80 - .../src/main/resources/log4j.properties | 5 - .../src/main/webapp/META-INF/MANIFEST.MF | 3 - .../src/main/webapp/WEB-INF/web.xml | 38 - .../socketio-chat/src/main/webapp/index.html | 82 - .../src/main/webapp/javascript/application.js | 84 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- .../webapp/javascript/jquery.stringifyjson.js | 90 - .../src/main/webapp/javascript/socket.io.js | 3796 ------- extensions-samples/sockjs/sockjs-chat/pom.xml | 56 - .../samples/chat/JacksonDecoder.java | 38 - .../samples/chat/JacksonEncoder.java | 38 - .../org/atmosphere/samples/chat/Message.java | 60 - .../atmosphere/samples/chat/SockjsChat.java | 80 - .../samples/chat/custom/Config.java | 18 - .../samples/chat/custom/SampleConfig.java | 38 - .../src/main/webapp/WEB-INF/web.xml | 20 - .../sockjs-chat/src/main/webapp/index.html | 29 - .../src/main/webapp/javascript/application.js | 72 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- .../sockjs/sockjs-demo/README.md | 3 - extensions-samples/sockjs/sockjs-demo/pom.xml | 38 - .../src/main/webapp/WEB-INF/web.xml | 20 - .../sockjs-demo/src/main/webapp/index.html | 29 - .../src/main/webapp/javascript/application.js | 72 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- extensions-samples/spring/spring-echo/pom.xml | 73 - .../atmosphere/samples/ChatController.java | 91 - .../org/atmosphere/samples/SpringContext.java | 90 - .../atmosphere/samples/WebAppInitializer.java | 52 - .../spring-echo/src/main/resources/log4j.xml | 22 - .../src/main/webapp/META-INF/MANIFEST.MF | 3 - .../spring-echo/src/main/webapp/atmosphere.js | 3469 ------ .../spring-echo/src/main/webapp/index.html | 54 - .../spring/spring-inject/pom.xml | 55 - .../samples/chat/JacksonDecoder.java | 42 - .../samples/chat/JacksonEncoder.java | 42 - .../org/atmosphere/samples/chat/Message.java | 60 - .../samples/chat/SpringInjectChat.java | 106 - .../src/main/resources/logback.xml | 22 - .../src/main/webapp/WEB-INF/beans.xml | 6 - .../src/main/webapp/WEB-INF/web.xml | 21 - .../spring-inject/src/main/webapp/index.html | 29 - .../src/main/webapp/javascript/application.js | 124 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- .../spring/spring-websocket/.gitignore | 5 - .../spring/spring-websocket/README.md | 8 - .../spring/spring-websocket/pom.xml | 117 - .../pubsub/config/ComponentConfiguration.java | 51 - .../config/SpringApplicationContext.java | 39 - .../pubsub/config/WebAppConfiguration.java | 74 - .../protocol/DelegatingWebSocketProtocol.java | 96 - .../resolvers/AtmosphereArgumentResolver.java | 42 - .../resolvers/MeteorArgumentResolver.java | 42 - .../pubsub/controllers/ChatController.java | 39 - .../samples/pubsub/dto/BaseCommand.java | 54 - .../samples/pubsub/dto/Command.java | 32 - .../samples/pubsub/dto/EmptyCommand.java | 28 - .../samples/pubsub/dto/SubscribeCommand.java | 30 - .../pubsub/dto/UnsubscribeCommand.java | 30 - .../samples/pubsub/services/ChatService.java | 105 - .../samples/pubsub/utils/AtmosphereUtils.java | 63 - .../src/main/resources/logback.xml | 16 - .../src/main/webapp/WEB-INF/views/home.jsp | 111 - .../src/main/webapp/WEB-INF/web.xml | 54 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- .../src/main/webapp/resources/jquery.form.js | 683 -- .../main/webapp/resources/jquery.tmpl.min.js | 10 - extensions-samples/xmpp/pom.xml | 52 - nettosphere-samples/README.md | 10 - nettosphere-samples/chat/README.md | 9 - nettosphere-samples/chat/pom.xml | 98 - .../chat/src/main/assembly/distribution.xml | 47 - .../chat/src/main/conf/logback.xml | 16 - .../org/nettosphere/samples/chat/Chat.java | 101 - .../samples/chat/NettosphereChat.java | 57 - .../chat/src/main/resources/index.html | 74 - .../main/resources/javascript/application.js | 99 - .../main/resources/javascript/atmosphere.js | 3506 ------ .../main/resources/javascript/jquery-2.0.3.js | 8829 --------------- .../chat/src/main/scripts/nettosphere.sh | 18 - nettosphere-samples/games/README.md | 9 - nettosphere-samples/games/pom.xml | 103 - .../games/src/main/assembly/distribution.xml | 47 - .../games/src/main/conf/logback.xml | 18 - .../nettosphere/samples/games/Direction.java | 36 - .../nettosphere/samples/games/Location.java | 80 - .../samples/games/NettoSphereGamesServer.java | 59 - .../org/nettosphere/samples/games/Snake.java | 152 - .../samples/games/SnakeBroadcaster.java | 117 - .../nettosphere/samples/games/SnakeGame.java | 139 - .../samples/games/SnakeManagedService.java | 84 - .../samples/games/SnakeWebSocket.java | 66 - .../games/src/main/resources/index.html | 273 - .../main/resources/javascript/atmosphere.js | 3506 ------ .../main/resources/javascript/jquery-2.0.3.js | 8829 --------------- .../games/src/main/scripts/nettosphere.sh | 18 - nettosphere-samples/jersey-chat/README.md | 11 - nettosphere-samples/jersey-chat/pom.xml | 99 - .../src/main/assembly/distribution.xml | 47 - .../jersey-chat/src/main/conf/logback.xml | 16 - .../org/nettosphere/samples/chat/Message.java | 32 - .../samples/chat/NettosphereJerseyChat.java | 63 - .../samples/chat/ResourceChat.java | 61 - .../nettosphere/samples/chat/Response.java | 36 - .../jersey-chat/src/main/resources/index.html | 72 - .../main/resources/javascript/application.js | 83 - .../main/resources/javascript/atmosphere.js | 3506 ------ .../main/resources/javascript/jquery-2.0.3.js | 8829 --------------- .../src/main/scripts/nettosphere.sh | 18 - nettosphere-samples/pom.xml | 59 - play-samples/chat/app/Global.java | 43 - .../chat/app/controllers/Application.java | 28 - .../app/org.atmosphere.samples.play/Chat.java | 74 - .../JacksonDecoder.java | 38 - .../JacksonEncoder.java | 38 - .../org.atmosphere.samples.play/Message.java | 60 - play-samples/chat/app/views/index.scala.html | 185 - play-samples/chat/build.sbt | 15 - play-samples/chat/conf/application.conf | 59 - play-samples/chat/conf/routes | 9 - play-samples/chat/project/build.properties | 1 - play-samples/chat/project/plugins.sbt | 8 - play-samples/jersey-chat/app/Global.java | 45 - .../app/controllers/Application.java | 28 - .../ChatResource.java | 56 - .../org.atmosphere.samples.play/Message.java | 49 - .../org.atmosphere.samples.play/Response.java | 61 - .../jersey-chat/app/views/index.scala.html | 169 - .../jersey-chat/conf/application.conf | 59 - play-samples/jersey-chat/conf/routes | 9 - play-samples/jersey-chat/logs/application.log | 358 - play-samples/jersey-chat/pom.xml | 45 - play-samples/jersey-chat/project/Build.scala | 32 - .../jersey-chat/project/build.properties | 1 - play-samples/jersey-chat/project/plugins.sbt | 8 - play-samples/pom.xml | 18 - pom.xml | 337 +- samples/all-api-pubsub/pom.xml | 98 - .../pubsub/websocket/AtmosphereHandler.scala | 55 - .../samples/pubsub/websocket/Console.scala | 84 - .../websocket/DevoxxWebSocketProtocol.scala | 31 - .../samples/pubsub/websocket/Meteor.scala | 59 - .../samples/pubsub/websocket/Resource.scala | 44 - .../src/main/webapp/META-INF/atmosphere.xml | 25 - .../src/main/webapp/WEB-INF/jboss-web.xml | 11 - .../src/main/webapp/WEB-INF/sun-web.xml | 6 - .../src/main/webapp/WEB-INF/web.xml | 29 - .../all-api-pubsub/src/main/webapp/index.html | 190 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- .../src/main/webapp/javascript/jquery.form.js | 683 -- samples/async-annotation-pubsub/pom.xml | 48 - .../samples/pubsub/AsynchronousExecution.java | 48 - .../samples/pubsub/FileResource.java | 45 - .../atmosphere/samples/pubsub/Message.java | 32 - .../atmosphere/samples/pubsub/Response.java | 36 - .../src/main/webapp/WEB-INF/jboss-web.xml | 11 - .../src/main/webapp/WEB-INF/sun-web.xml | 6 - .../src/main/webapp/WEB-INF/web.xml | 27 - .../src/main/webapp/index.html | 27 - .../src/main/webapp/javascript/application.js | 75 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- samples/atmosphere-ee6/pom.xml | 28 - .../samples/ee6/atmosphere/TimerResource.java | 159 - .../src/main/webapp/WEB-INF/sun-web.xml | 12 - .../src/main/webapp/WEB-INF/web.xml | 21 - samples/atmospherehandler-pubsub/pom.xml | 44 - .../pubsub/AtmosphereHandlerPubSub.java | 62 - .../src/main/webapp/WEB-INF/jboss-web.xml | 11 - .../src/main/webapp/WEB-INF/sun-web.xml | 6 - .../src/main/webapp/WEB-INF/web.xml | 24 - .../src/main/webapp/index.html | 171 - samples/channel/pom.xml | 22 - .../samples/pubsub/TypedChannel.java | 60 - .../src/main/webapp/WEB-INF/jboss-web.xml | 11 - .../src/main/webapp/WEB-INF/sun-web.xml | 6 - .../channel/src/main/webapp/WEB-INF/web.xml | 26 - samples/chat-multiroom/pom.xml | 60 - .../atmosphere/samples/chat/ChatProtocol.java | 106 - .../org/atmosphere/samples/chat/ChatRoom.java | 153 - .../samples/chat/JacksonEncoder.java | 46 - .../samples/chat/ObjectMapperInjectable.java | 41 - .../samples/chat/ProtocolDecoder.java | 40 - .../atmosphere/samples/chat/UserDecoder.java | 38 - .../atmosphere/samples/chat/UserMessage.java | 42 - .../services/org.atmosphere.inject.Injectable | 1 - .../src/main/resources/logback.xml | 22 - .../src/main/webapp/WEB-INF/web.xml | 25 - .../chat-multiroom/src/main/webapp/index.html | 35 - .../src/main/webapp/javascript/application.js | 142 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- samples/chat-node-client/README.md | 53 - samples/chat-node-client/pom.xml | 25 - .../src/main/resources/chat-client.js | 122 - samples/chat/pom.xml | 45 +- samples/chat/project/build.properties | 1 + samples/chat/release.properties | 9 + .../chat/resources/jetty-logging.properties | 10 + samples/chat/start.d/deploy.ini | 21 + samples/chat/start.d/http.ini | 47 + samples/chat/start.d/server.ini | 84 + samples/chat/start.d/websocket.ini | 7 + samples/chat/webapps/atmosphere-chat.war | Bin 0 -> 3011372 bytes samples/commons/pom.xml | 26 - .../atmosphere/commons/util/EventsLogger.java | 93 - samples/cxf-chat-osgi/README.md | 105 - samples/cxf-chat-osgi/pom.xml | 148 - .../samples/chat/cxf/ChatResource.java | 70 - .../atmosphere/samples/chat/cxf/Message.java | 32 - .../atmosphere/samples/chat/cxf/Response.java | 36 - .../src/main/webapp/META-INF/atmosphere.xml | 9 - .../src/main/webapp/META-INF/context.xml | 5 - .../src/main/webapp/WEB-INF/jboss-web.xml | 11 - .../src/main/webapp/WEB-INF/sun-web.xml | 6 - .../src/main/webapp/WEB-INF/web.xml | 38 - .../cxf-chat-osgi/src/main/webapp/index.html | 27 - .../src/main/webapp/javascript/application.js | 82 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- samples/cxf-chat/pom.xml | 67 - .../samples/chat/cxf/ChatResource.java | 70 - .../atmosphere/samples/chat/cxf/Message.java | 32 - .../atmosphere/samples/chat/cxf/Response.java | 36 - .../src/main/webapp/META-INF/atmosphere.xml | 9 - .../src/main/webapp/META-INF/context.xml | 5 - .../cxf-chat/src/main/webapp/WEB-INF/web.xml | 35 - samples/cxf-chat/src/main/webapp/index.html | 27 - .../src/main/webapp/javascript/application.js | 82 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- samples/cxf-greeter-swaggersocket/pom.xml | 72 - .../samples/greeter/cxf/DefaultGreeter.java | 134 - .../samples/greeter/cxf/api/DefaultApi.java | 58 - .../samples/greeter/cxf/model/Body.java | 71 - .../samples/greeter/cxf/model/EchoReply.java | 57 - .../samples/greeter/cxf/model/Greeting.java | 71 - .../greeter/cxf/model/GreetingReply.java | 85 - .../greeter/cxf/model/GreetingStatus.java | 71 - .../greeter/cxf/model/GreetingSummary.java | 73 - .../samples/greeter/cxf/model/Pong.java | 57 - .../src/main/webapp/META-INF/atmosphere.xml | 9 - .../src/main/webapp/META-INF/context.xml | 5 - .../src/main/webapp/WEB-INF/web.xml | 39 - .../src/main/webapp/index.html | 110 - .../src/main/webapp/javascript/application.js | 262 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- .../embedded-jetty-websocket-chat/.gitignore | 1 - .../embedded-jetty-websocket-chat/README.md | 7 - samples/embedded-jetty-websocket-chat/pom.xml | 132 - .../org/atmosphere/samples/chat/Main.java | 84 - .../samples/chat/WebSocketChat.java | 105 - .../src/main/webapp/index.html | 27 - .../src/main/webapp/javascript/application.js | 83 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- samples/grails-atmosphere-meteor/README.md | 18 - samples/jersey-pubsub/pom.xml | 77 - .../samples/pubsub/EventsLogger.java | 91 - .../samples/pubsub/FileResource.java | 46 - .../samples/pubsub/JerseyPubSub.java | 58 - .../src/main/webapp/WEB-INF/jboss-web.xml | 11 - .../src/main/webapp/WEB-INF/sun-web.xml | 6 - .../src/main/webapp/WEB-INF/web.xml | 33 - .../jersey-pubsub/src/main/webapp/index.html | 169 - samples/jersey2-chat/pom.xml | 48 - .../samples/chat/jersey/Jersey2Resource.java | 89 - .../src/main/webapp/WEB-INF/web.xml | 29 - .../jersey2-chat/src/main/webapp/index.html | 29 - .../src/main/webapp/javascript/application.js | 82 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- samples/meteor-chat/pom.xml | 47 - .../atmosphere/samples/chat/MeteorChat.java | 87 - .../src/main/webapp/WEB-INF/web.xml | 29 - .../meteor-chat/src/main/webapp/index.html | 27 - .../src/main/webapp/javascript/application.js | 81 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- samples/meteor-pubsub/pom.xml | 48 - .../samples/pubsub/MeteorPubSub.java | 64 - .../src/main/webapp/WEB-INF/web.xml | 24 - .../meteor-pubsub/src/main/webapp/index.html | 167 - samples/pom.xml | 86 - samples/pubsub/pom.xml | 46 - .../samples/pubsub/EventsLogger.java | 62 - .../atmosphere/samples/pubsub/JAXBBean.java | 69 - .../org/atmosphere/samples/pubsub/PubSub.java | 304 - .../samples/pubsub/PubSubBroadcaster.java | 86 - .../src/main/webapp/WEB-INF/jboss-web.xml | 11 - .../src/main/webapp/WEB-INF/sun-web.xml | 6 - .../pubsub/src/main/webapp/WEB-INF/web.xml | 30 - samples/rest-chat/pom.xml | 44 - .../samples/chat/jersey/ChatResource.java | 81 - .../samples/chat/jersey/Message.java | 32 - .../samples/chat/jersey/Response.java | 36 - .../src/main/webapp/WEB-INF/jboss-web.xml | 11 - .../src/main/webapp/WEB-INF/sun-web.xml | 6 - .../rest-chat/src/main/webapp/WEB-INF/web.xml | 29 - samples/rest-chat/src/main/webapp/index.html | 27 - .../src/main/webapp/javascript/application.js | 82 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- samples/scala-chat/pom.xml | 117 - .../samples/scala/chat/Message.scala | 37 - .../samples/scala/chat/Response.scala | 39 - .../samples/scala/chat/ScalaChat.scala | 34 - .../src/main/webapp/WEB-INF/jboss-web.xml | 11 - .../src/main/webapp/WEB-INF/sun-web.xml | 6 - .../src/main/webapp/WEB-INF/web.xml | 28 - samples/scala-chat/src/main/webapp/index.html | 27 - .../src/main/webapp/javascript/application.js | 81 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- .../spring-boot-sample-atmosphere/README.md | 13 - samples/spring-boot-sample-atmosphere/pom.xml | 73 - .../springboot/AtmosphereApplication.java | 82 - .../samples/springboot/ChatService.java | 82 - .../samples/springboot/Message.java | 52 - .../src/main/resources/application.properties | 1 - .../src/main/resources/static/home.html | 72 - .../static/javascript/application.js | 168 - .../static/javascript/jquery-1.9.0.js | 9555 ---------------- .../SampleAtmosphereApplicationTests.java | 135 - samples/sse-chat/pom.xml | 36 - .../samples/chat/SSEAtmosphereHandler.java | 75 - .../sse-chat/src/main/webapp/WEB-INF/web.xml | 25 - samples/sse-chat/src/main/webapp/index.html | 27 - .../src/main/webapp/javascript/EventSource.js | 190 - .../src/main/webapp/javascript/application.js | 93 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- samples/sse-rest-chat/pom.xml | 44 - .../samples/chat/jersey/Message.java | 32 - .../samples/chat/jersey/ResourceChat.java | 57 - .../samples/chat/jersey/Response.java | 36 - .../src/main/webapp/WEB-INF/jboss-web.xml | 11 - .../src/main/webapp/WEB-INF/sun-web.xml | 6 - .../src/main/webapp/WEB-INF/web.xml | 25 - .../sse-rest-chat/src/main/webapp/index.html | 27 - .../src/main/webapp/javascript/application.js | 81 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- samples/twitter-live-feed/pom.xml | 52 - .../samples/twitter/EventsLogger.java | 68 - .../samples/twitter/FileResource.java | 46 - .../samples/twitter/TwitterFeed.java | 166 - .../src/main/webapp/META-INF/context.xml | 5 - .../src/main/webapp/WEB-INF/context.xml | 5 - .../src/main/webapp/WEB-INF/jboss-web.xml | 11 - .../src/main/webapp/WEB-INF/sun-web.xml | 6 - .../src/main/webapp/WEB-INF/web.xml | 41 - .../src/main/webapp/index.html | 131 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- .../src/main/webapp/javascript/jquery.list.js | 53 - samples/webrtc-atmospherehandler/README.md | 13 - samples/webrtc-atmospherehandler/md | 7 - samples/webrtc-atmospherehandler/pom.xml | 45 - .../webrtc/AtmosphereHandlerPubSub.java | 92 - .../src/main/webapp/WEB-INF/sun-web.xml | 11 - .../src/main/webapp/WEB-INF/web.xml | 18 - .../src/main/webapp/index.html | 51 - .../main/webapp/resources/css/videochat.css | 73 - .../src/main/webapp/resources/js/Math.uuid.js | 92 - .../main/webapp/resources/js/jquery-2.2.0.js | 9831 ----------------- .../src/main/webapp/resources/js/json2-min.js | 146 - .../src/main/webapp/resources/js/webrtc.js | 418 - samples/webrtc-jersey/README.md | 13 - samples/webrtc-jersey/pom.xml | 46 - .../samples/webrtc/EventsLogger.java | 103 - .../atmosphere/samples/webrtc/Subscriber.java | 60 - .../src/main/webapp/WEB-INF/web.xml | 22 - .../webrtc-jersey/src/main/webapp/index.html | 51 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- .../main/webapp/resources/css/videochat.css | 73 - .../src/main/webapp/resources/js/Math.uuid.js | 92 - .../main/webapp/resources/js/jquery-2.2.0.js | 9831 ----------------- .../src/main/webapp/resources/js/json2-min.js | 146 - .../src/main/webapp/resources/js/webrtc.js | 418 - samples/websocket-chat/.gitignore | 1 - samples/websocket-chat/pom.xml | 41 - .../samples/chat/WebSocketChat.java | 105 - .../src/main/webapp/WEB-INF/web.xml | 25 - .../websocket-chat/src/main/webapp/index.html | 27 - .../src/main/webapp/javascript/application.js | 83 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- samples/websocket-chat/websocket-chat.launch | 23 - samples/websocket-stream/.gitignore | 1 - samples/websocket-stream/README.md | 10 - samples/websocket-stream/pom.xml | 41 - .../samples/stream/WebSocketStream.java | 99 - .../src/main/webapp/WEB-INF/web.xml | 25 - .../src/main/webapp/index.html | 27 - .../src/main/webapp/javascript/application.js | 62 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- .../websocket-stream/websocket-stream.launch | 23 - samples/websockethandler-pubsub/pom.xml | 43 - .../samples/pubsub/WebSocketPubSub.java | 57 - .../src/main/resources/logback.xml | 22 - .../src/main/webapp/WEB-INF/jboss-web.xml | 11 - .../src/main/webapp/WEB-INF/sun-web.xml | 6 - .../src/main/webapp/WEB-INF/web.xml | 24 - .../src/main/webapp/index.html | 159 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- stomp/pom.xml | 48 - stomp/pubsub/pom.xml | 41 - .../stomp/pubsub/StompEndpointSample.java | 102 - stomp/pubsub/src/main/webapp/WEB-INF/web.xml | 20 - stomp/pubsub/src/main/webapp/app.js | 60 - stomp/pubsub/src/main/webapp/index.html | 49 - .../main/webapp/javascript/jquery-2.0.3.js | 8829 --------------- stomp/pubsub/src/main/webapp/stomp.js | 474 - vertx-samples/chat/README.md | 9 - vertx-samples/chat/pom.xml | 89 - vertx-samples/chat/src/main/conf/logback.xml | 16 - .../vertx/samples/chat/ChatProtocol.java | 106 - .../vertx/samples/chat/ChatRoom.java | 147 - .../vertx/samples/chat/JacksonEncoder.java | 44 - .../vertx/samples/chat/ProtocolDecoder.java | 38 - .../vertx/samples/chat/UserDecoder.java | 38 - .../vertx/samples/chat/UserMessage.java | 42 - .../vertx/samples/chat/VertxChatServer.java | 59 - .../vertx/samples/webroot/index.html | 100 - .../samples/webroot/javascript/application.js | 142 - vertx-samples/jersey-chat/README.md | 9 - vertx-samples/jersey-chat/pom.xml | 93 - .../vertx/samples/chat/Message.java | 32 - .../vertx/samples/chat/ResourceChat.java | 61 - .../vertx/samples/chat/Response.java | 36 - .../vertx/samples/chat/VertxJerseyChat.java | 57 - .../jersey-chat/src/main/webapp/index.html | 72 - .../src/main/webapp/jquery/application.js | 83 - vertx-samples/pom.xml | 18 - 536 files changed, 205 insertions(+), 344733 deletions(-) delete mode 100644 extensions-samples/chat-cdi/README.md delete mode 100644 extensions-samples/chat-cdi/pom.xml delete mode 100644 extensions-samples/chat-cdi/src/main/java/org/atmosphere/samples/chat/CDIChat.java delete mode 100644 extensions-samples/chat-cdi/src/main/java/org/atmosphere/samples/chat/JacksonDecoder.java delete mode 100644 extensions-samples/chat-cdi/src/main/java/org/atmosphere/samples/chat/JacksonEncoder.java delete mode 100644 extensions-samples/chat-cdi/src/main/java/org/atmosphere/samples/chat/Message.java delete mode 100644 extensions-samples/chat-cdi/src/main/resources/logback.xml delete mode 100644 extensions-samples/chat-cdi/src/main/webapp/WEB-INF/beans.xml delete mode 100644 extensions-samples/chat-cdi/src/main/webapp/WEB-INF/web.xml delete mode 100644 extensions-samples/chat-cdi/src/main/webapp/index.html delete mode 100755 extensions-samples/chat-cdi/src/main/webapp/javascript/application.js delete mode 100644 extensions-samples/chat-cdi/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 extensions-samples/cometd/pom.xml delete mode 100644 extensions-samples/cometd/src/main/resources/log4j.properties delete mode 100644 extensions-samples/cometd/src/main/webapp/WEB-INF/web.xml delete mode 100755 extensions-samples/guice/chat-guice/pom.xml delete mode 100644 extensions-samples/guice/chat-guice/src/main/java/org/atmosphere/samples/guice/EventListener.java delete mode 100755 extensions-samples/guice/chat-guice/src/main/java/org/atmosphere/samples/guice/GuiceChatConfig.java delete mode 100755 extensions-samples/guice/chat-guice/src/main/java/org/atmosphere/samples/guice/GuiceChatModule.java delete mode 100644 extensions-samples/guice/chat-guice/src/main/java/org/atmosphere/samples/guice/InjectedService.java delete mode 100644 extensions-samples/guice/chat-guice/src/main/java/org/atmosphere/samples/guice/Message.java delete mode 100644 extensions-samples/guice/chat-guice/src/main/java/org/atmosphere/samples/guice/ResourceChat.java delete mode 100644 extensions-samples/guice/chat-guice/src/main/java/org/atmosphere/samples/guice/Response.java delete mode 100755 extensions-samples/guice/chat-guice/src/main/webapp/WEB-INF/web.xml delete mode 100644 extensions-samples/guice/chat-guice/src/main/webapp/index.html delete mode 100644 extensions-samples/guice/chat-guice/src/main/webapp/javascript/application.js delete mode 100644 extensions-samples/guice/chat-guice/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 extensions-samples/gwt/gwt20-jersey-rpc/pom.xml delete mode 100644 extensions-samples/gwt/gwt20-jersey-rpc/src/main/java/org/atmosphere/samples/GwtJerseyDemo.gwt.xml delete mode 100644 extensions-samples/gwt/gwt20-jersey-rpc/src/main/java/org/atmosphere/samples/client/GwtJerseyDemo.java delete mode 100644 extensions-samples/gwt/gwt20-jersey-rpc/src/main/java/org/atmosphere/samples/client/RPCEvent.java delete mode 100644 extensions-samples/gwt/gwt20-jersey-rpc/src/main/java/org/atmosphere/samples/client/RPCSerializer.java delete mode 100644 extensions-samples/gwt/gwt20-jersey-rpc/src/main/java/org/atmosphere/samples/server/JerseyGwtRpc.java delete mode 100644 extensions-samples/gwt/gwt20-jersey-rpc/src/main/resources/logging.properties delete mode 100644 extensions-samples/gwt/gwt20-jersey-rpc/src/main/webapp/META-INF/MANIFEST.MF delete mode 100644 extensions-samples/gwt/gwt20-jersey-rpc/src/main/webapp/WEB-INF/glassfish-web.xml delete mode 100644 extensions-samples/gwt/gwt20-jersey-rpc/src/main/webapp/WEB-INF/sun-web.xml delete mode 100644 extensions-samples/gwt/gwt20-jersey-rpc/src/main/webapp/WEB-INF/web.xml delete mode 100644 extensions-samples/gwt/gwt20-jersey-rpc/src/main/webapp/index.html delete mode 100644 extensions-samples/gwt/gwt20-json/pom.xml delete mode 100644 extensions-samples/gwt/gwt20-json/src/main/java/org/atmosphere/samples/GwtJsonDemo.gwt.xml delete mode 100644 extensions-samples/gwt/gwt20-json/src/main/java/org/atmosphere/samples/client/Event.java delete mode 100644 extensions-samples/gwt/gwt20-json/src/main/java/org/atmosphere/samples/client/GwtJsonDemo.java delete mode 100644 extensions-samples/gwt/gwt20-json/src/main/java/org/atmosphere/samples/client/MyBeanFactory.java delete mode 100644 extensions-samples/gwt/gwt20-json/src/main/java/org/atmosphere/samples/server/JsonAtmosphereHandler.java delete mode 100644 extensions-samples/gwt/gwt20-json/src/main/resources/logging.properties delete mode 100644 extensions-samples/gwt/gwt20-json/src/main/webapp/META-INF/MANIFEST.MF delete mode 100644 extensions-samples/gwt/gwt20-json/src/main/webapp/META-INF/atmosphere.xml delete mode 100644 extensions-samples/gwt/gwt20-json/src/main/webapp/WEB-INF/sun-web.xml delete mode 100644 extensions-samples/gwt/gwt20-json/src/main/webapp/WEB-INF/web.xml delete mode 100644 extensions-samples/gwt/gwt20-json/src/main/webapp/index.jsp delete mode 100644 extensions-samples/gwt/gwt20-managed-rpc/pom.xml delete mode 100644 extensions-samples/gwt/gwt20-managed-rpc/src/main/java/org/atmosphere/samples/GwtRpcDemo.gwt.xml delete mode 100644 extensions-samples/gwt/gwt20-managed-rpc/src/main/java/org/atmosphere/samples/client/GwtRpcDemo.java delete mode 100644 extensions-samples/gwt/gwt20-managed-rpc/src/main/java/org/atmosphere/samples/server/ManagedGWTResource.java delete mode 100644 extensions-samples/gwt/gwt20-managed-rpc/src/main/resources/logging.properties delete mode 100644 extensions-samples/gwt/gwt20-managed-rpc/src/main/webapp/META-INF/MANIFEST.MF delete mode 100644 extensions-samples/gwt/gwt20-managed-rpc/src/main/webapp/WEB-INF/sun-web.xml delete mode 100644 extensions-samples/gwt/gwt20-managed-rpc/src/main/webapp/WEB-INF/web.xml delete mode 100644 extensions-samples/gwt/gwt20-managed-rpc/src/main/webapp/index.jsp delete mode 100644 extensions-samples/gwt/gwt20-rpc/pom.xml delete mode 100644 extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/GwtRpcDemo.gwt.xml delete mode 100644 extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/client/GwtRpcDemo.java delete mode 100644 extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/client/RPCSerializer.java delete mode 100644 extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/server/GwtRpcAtmosphereHandler.java delete mode 100644 extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/shared/BaseEvent.java delete mode 100644 extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/shared/EventBar.java delete mode 100644 extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/shared/EventFoo.java delete mode 100644 extensions-samples/gwt/gwt20-rpc/src/main/resources/logging.properties delete mode 100644 extensions-samples/gwt/gwt20-rpc/src/main/webapp/META-INF/MANIFEST.MF delete mode 100644 extensions-samples/gwt/gwt20-rpc/src/main/webapp/META-INF/atmosphere.xml delete mode 100644 extensions-samples/gwt/gwt20-rpc/src/main/webapp/WEB-INF/sun-web.xml delete mode 100644 extensions-samples/gwt/gwt20-rpc/src/main/webapp/WEB-INF/web.xml delete mode 100644 extensions-samples/gwt/gwt20-rpc/src/main/webapp/index.jsp delete mode 100644 extensions-samples/gwt/gwt20-websockets/README.md delete mode 100644 extensions-samples/gwt/gwt20-websockets/README.txt delete mode 100644 extensions-samples/gwt/gwt20-websockets/atmosphere gwt+websockets.jpg delete mode 100644 extensions-samples/gwt/gwt20-websockets/gwt20-websockets.launch delete mode 100644 extensions-samples/gwt/gwt20-websockets/pom.xml delete mode 100644 extensions-samples/gwt/gwt20-websockets/src/main/java/org/atmosphere/samples/GwtWebsocketsDemo.gwt.xml delete mode 100644 extensions-samples/gwt/gwt20-websockets/src/main/java/org/atmosphere/samples/client/GwtWebsocketsDemo.java delete mode 100644 extensions-samples/gwt/gwt20-websockets/src/main/webapp/GwtWebsocketsDemo.css delete mode 100644 extensions-samples/gwt/gwt20-websockets/src/main/webapp/GwtWebsocketsDemo.html delete mode 100644 extensions-samples/gwt/gwt20-websockets/src/main/webapp/WEB-INF/web.xml delete mode 100644 extensions-samples/gwt/gwt20-websockets/src/main/webapp/favicon.ico delete mode 100644 extensions-samples/gwt/gwt20-websockets/src/test/java/org/atmosphere/samples/GwtWebsocketsDemoJUnit.gwt.xml delete mode 100644 extensions-samples/gwt/gwt20-websockets/src/test/java/org/atmosphere/samples/client/GwtWebsocketsDemoTest.java delete mode 100644 extensions-samples/gwt/pom.xml delete mode 100644 extensions-samples/hazelcast/pom.xml delete mode 100644 extensions-samples/jgroups/pom.xml delete mode 100644 extensions-samples/jms/pom.xml delete mode 100644 extensions-samples/kafka/jersey-pubsub/README.md delete mode 100644 extensions-samples/kafka/jersey-pubsub/pom.xml delete mode 100755 extensions-samples/pom.xml delete mode 100644 extensions-samples/rabbitmq/jersey-pubsub/README.md delete mode 100644 extensions-samples/rabbitmq/jersey-pubsub/pom.xml delete mode 100644 extensions-samples/redis/pom.xml delete mode 100644 extensions-samples/rmi/README.md delete mode 100644 extensions-samples/rmi/pom.xml delete mode 100644 extensions-samples/rmi/src/main/resources/org/atmosphere/plugin/rmi/rmi.properties delete mode 100755 extensions-samples/socketio/native-socketio-chat/pom.xml delete mode 100755 extensions-samples/socketio/native-socketio-chat/src/main/java/org/atmosphere/samples/chat/ChatJSONObject.java delete mode 100755 extensions-samples/socketio/native-socketio-chat/src/main/java/org/atmosphere/samples/chat/NativeSocketIOAtmosphereHandler.java delete mode 100755 extensions-samples/socketio/native-socketio-chat/src/main/java/org/atmosphere/samples/chat/SocketIOBroadcaster.java delete mode 100755 extensions-samples/socketio/native-socketio-chat/src/main/webapp/WEB-INF/web.xml delete mode 100755 extensions-samples/socketio/native-socketio-chat/src/main/webapp/css/style.css delete mode 100755 extensions-samples/socketio/native-socketio-chat/src/main/webapp/dist/WebSocketMain.swf delete mode 100755 extensions-samples/socketio/native-socketio-chat/src/main/webapp/dist/WebSocketMainInsecure.swf delete mode 100644 extensions-samples/socketio/native-socketio-chat/src/main/webapp/dist/jquery-2.0.3.js delete mode 100755 extensions-samples/socketio/native-socketio-chat/src/main/webapp/dist/socket.io.js delete mode 100755 extensions-samples/socketio/native-socketio-chat/src/main/webapp/dist/socket.io.min.js delete mode 100755 extensions-samples/socketio/native-socketio-chat/src/main/webapp/index.html delete mode 100755 extensions-samples/socketio/socketio-chat/pom.xml delete mode 100755 extensions-samples/socketio/socketio-chat/src/main/java/org/atmosphere/samples/chat/SocketIOChatAtmosphereHandler.java delete mode 100755 extensions-samples/socketio/socketio-chat/src/main/resources/log4j.properties delete mode 100755 extensions-samples/socketio/socketio-chat/src/main/webapp/META-INF/MANIFEST.MF delete mode 100755 extensions-samples/socketio/socketio-chat/src/main/webapp/WEB-INF/web.xml delete mode 100755 extensions-samples/socketio/socketio-chat/src/main/webapp/index.html delete mode 100755 extensions-samples/socketio/socketio-chat/src/main/webapp/javascript/application.js delete mode 100644 extensions-samples/socketio/socketio-chat/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100755 extensions-samples/socketio/socketio-chat/src/main/webapp/javascript/jquery.stringifyjson.js delete mode 100755 extensions-samples/socketio/socketio-chat/src/main/webapp/javascript/socket.io.js delete mode 100644 extensions-samples/sockjs/sockjs-chat/pom.xml delete mode 100644 extensions-samples/sockjs/sockjs-chat/src/main/java/org/atmosphere/samples/chat/JacksonDecoder.java delete mode 100644 extensions-samples/sockjs/sockjs-chat/src/main/java/org/atmosphere/samples/chat/JacksonEncoder.java delete mode 100644 extensions-samples/sockjs/sockjs-chat/src/main/java/org/atmosphere/samples/chat/Message.java delete mode 100644 extensions-samples/sockjs/sockjs-chat/src/main/java/org/atmosphere/samples/chat/SockjsChat.java delete mode 100644 extensions-samples/sockjs/sockjs-chat/src/main/java/org/atmosphere/samples/chat/custom/Config.java delete mode 100644 extensions-samples/sockjs/sockjs-chat/src/main/java/org/atmosphere/samples/chat/custom/SampleConfig.java delete mode 100644 extensions-samples/sockjs/sockjs-chat/src/main/webapp/WEB-INF/web.xml delete mode 100644 extensions-samples/sockjs/sockjs-chat/src/main/webapp/index.html delete mode 100755 extensions-samples/sockjs/sockjs-chat/src/main/webapp/javascript/application.js delete mode 100644 extensions-samples/sockjs/sockjs-chat/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 extensions-samples/sockjs/sockjs-demo/README.md delete mode 100644 extensions-samples/sockjs/sockjs-demo/pom.xml delete mode 100644 extensions-samples/sockjs/sockjs-demo/src/main/webapp/WEB-INF/web.xml delete mode 100644 extensions-samples/sockjs/sockjs-demo/src/main/webapp/index.html delete mode 100755 extensions-samples/sockjs/sockjs-demo/src/main/webapp/javascript/application.js delete mode 100644 extensions-samples/sockjs/sockjs-demo/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 extensions-samples/spring/spring-echo/pom.xml delete mode 100644 extensions-samples/spring/spring-echo/src/main/java/org/atmosphere/samples/ChatController.java delete mode 100644 extensions-samples/spring/spring-echo/src/main/java/org/atmosphere/samples/SpringContext.java delete mode 100644 extensions-samples/spring/spring-echo/src/main/java/org/atmosphere/samples/WebAppInitializer.java delete mode 100644 extensions-samples/spring/spring-echo/src/main/resources/log4j.xml delete mode 100644 extensions-samples/spring/spring-echo/src/main/webapp/META-INF/MANIFEST.MF delete mode 100644 extensions-samples/spring/spring-echo/src/main/webapp/atmosphere.js delete mode 100644 extensions-samples/spring/spring-echo/src/main/webapp/index.html delete mode 100644 extensions-samples/spring/spring-inject/pom.xml delete mode 100644 extensions-samples/spring/spring-inject/src/main/java/org/atmosphere/samples/chat/JacksonDecoder.java delete mode 100644 extensions-samples/spring/spring-inject/src/main/java/org/atmosphere/samples/chat/JacksonEncoder.java delete mode 100644 extensions-samples/spring/spring-inject/src/main/java/org/atmosphere/samples/chat/Message.java delete mode 100644 extensions-samples/spring/spring-inject/src/main/java/org/atmosphere/samples/chat/SpringInjectChat.java delete mode 100644 extensions-samples/spring/spring-inject/src/main/resources/logback.xml delete mode 100644 extensions-samples/spring/spring-inject/src/main/webapp/WEB-INF/beans.xml delete mode 100644 extensions-samples/spring/spring-inject/src/main/webapp/WEB-INF/web.xml delete mode 100644 extensions-samples/spring/spring-inject/src/main/webapp/index.html delete mode 100755 extensions-samples/spring/spring-inject/src/main/webapp/javascript/application.js delete mode 100644 extensions-samples/spring/spring-inject/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 extensions-samples/spring/spring-websocket/.gitignore delete mode 100644 extensions-samples/spring/spring-websocket/README.md delete mode 100644 extensions-samples/spring/spring-websocket/pom.xml delete mode 100644 extensions-samples/spring/spring-websocket/src/main/java/org/atmosphere/samples/pubsub/config/ComponentConfiguration.java delete mode 100644 extensions-samples/spring/spring-websocket/src/main/java/org/atmosphere/samples/pubsub/config/SpringApplicationContext.java delete mode 100644 extensions-samples/spring/spring-websocket/src/main/java/org/atmosphere/samples/pubsub/config/WebAppConfiguration.java delete mode 100644 extensions-samples/spring/spring-websocket/src/main/java/org/atmosphere/samples/pubsub/config/protocol/DelegatingWebSocketProtocol.java delete mode 100644 extensions-samples/spring/spring-websocket/src/main/java/org/atmosphere/samples/pubsub/config/resolvers/AtmosphereArgumentResolver.java delete mode 100644 extensions-samples/spring/spring-websocket/src/main/java/org/atmosphere/samples/pubsub/config/resolvers/MeteorArgumentResolver.java delete mode 100644 extensions-samples/spring/spring-websocket/src/main/java/org/atmosphere/samples/pubsub/controllers/ChatController.java delete mode 100644 extensions-samples/spring/spring-websocket/src/main/java/org/atmosphere/samples/pubsub/dto/BaseCommand.java delete mode 100644 extensions-samples/spring/spring-websocket/src/main/java/org/atmosphere/samples/pubsub/dto/Command.java delete mode 100644 extensions-samples/spring/spring-websocket/src/main/java/org/atmosphere/samples/pubsub/dto/EmptyCommand.java delete mode 100644 extensions-samples/spring/spring-websocket/src/main/java/org/atmosphere/samples/pubsub/dto/SubscribeCommand.java delete mode 100644 extensions-samples/spring/spring-websocket/src/main/java/org/atmosphere/samples/pubsub/dto/UnsubscribeCommand.java delete mode 100644 extensions-samples/spring/spring-websocket/src/main/java/org/atmosphere/samples/pubsub/services/ChatService.java delete mode 100644 extensions-samples/spring/spring-websocket/src/main/java/org/atmosphere/samples/pubsub/utils/AtmosphereUtils.java delete mode 100644 extensions-samples/spring/spring-websocket/src/main/resources/logback.xml delete mode 100644 extensions-samples/spring/spring-websocket/src/main/webapp/WEB-INF/views/home.jsp delete mode 100644 extensions-samples/spring/spring-websocket/src/main/webapp/WEB-INF/web.xml delete mode 100644 extensions-samples/spring/spring-websocket/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 extensions-samples/spring/spring-websocket/src/main/webapp/resources/jquery.form.js delete mode 100644 extensions-samples/spring/spring-websocket/src/main/webapp/resources/jquery.tmpl.min.js delete mode 100644 extensions-samples/xmpp/pom.xml delete mode 100644 nettosphere-samples/README.md delete mode 100644 nettosphere-samples/chat/README.md delete mode 100644 nettosphere-samples/chat/pom.xml delete mode 100644 nettosphere-samples/chat/src/main/assembly/distribution.xml delete mode 100644 nettosphere-samples/chat/src/main/conf/logback.xml delete mode 100644 nettosphere-samples/chat/src/main/java/org/nettosphere/samples/chat/Chat.java delete mode 100644 nettosphere-samples/chat/src/main/java/org/nettosphere/samples/chat/NettosphereChat.java delete mode 100644 nettosphere-samples/chat/src/main/resources/index.html delete mode 100644 nettosphere-samples/chat/src/main/resources/javascript/application.js delete mode 100644 nettosphere-samples/chat/src/main/resources/javascript/atmosphere.js delete mode 100644 nettosphere-samples/chat/src/main/resources/javascript/jquery-2.0.3.js delete mode 100644 nettosphere-samples/chat/src/main/scripts/nettosphere.sh delete mode 100644 nettosphere-samples/games/README.md delete mode 100644 nettosphere-samples/games/pom.xml delete mode 100644 nettosphere-samples/games/src/main/assembly/distribution.xml delete mode 100644 nettosphere-samples/games/src/main/conf/logback.xml delete mode 100644 nettosphere-samples/games/src/main/java/org/nettosphere/samples/games/Direction.java delete mode 100644 nettosphere-samples/games/src/main/java/org/nettosphere/samples/games/Location.java delete mode 100644 nettosphere-samples/games/src/main/java/org/nettosphere/samples/games/NettoSphereGamesServer.java delete mode 100644 nettosphere-samples/games/src/main/java/org/nettosphere/samples/games/Snake.java delete mode 100644 nettosphere-samples/games/src/main/java/org/nettosphere/samples/games/SnakeBroadcaster.java delete mode 100644 nettosphere-samples/games/src/main/java/org/nettosphere/samples/games/SnakeGame.java delete mode 100644 nettosphere-samples/games/src/main/java/org/nettosphere/samples/games/SnakeManagedService.java delete mode 100644 nettosphere-samples/games/src/main/java/org/nettosphere/samples/games/SnakeWebSocket.java delete mode 100644 nettosphere-samples/games/src/main/resources/index.html delete mode 100644 nettosphere-samples/games/src/main/resources/javascript/atmosphere.js delete mode 100644 nettosphere-samples/games/src/main/resources/javascript/jquery-2.0.3.js delete mode 100644 nettosphere-samples/games/src/main/scripts/nettosphere.sh delete mode 100644 nettosphere-samples/jersey-chat/README.md delete mode 100644 nettosphere-samples/jersey-chat/pom.xml delete mode 100644 nettosphere-samples/jersey-chat/src/main/assembly/distribution.xml delete mode 100644 nettosphere-samples/jersey-chat/src/main/conf/logback.xml delete mode 100644 nettosphere-samples/jersey-chat/src/main/java/org/nettosphere/samples/chat/Message.java delete mode 100644 nettosphere-samples/jersey-chat/src/main/java/org/nettosphere/samples/chat/NettosphereJerseyChat.java delete mode 100644 nettosphere-samples/jersey-chat/src/main/java/org/nettosphere/samples/chat/ResourceChat.java delete mode 100644 nettosphere-samples/jersey-chat/src/main/java/org/nettosphere/samples/chat/Response.java delete mode 100644 nettosphere-samples/jersey-chat/src/main/resources/index.html delete mode 100644 nettosphere-samples/jersey-chat/src/main/resources/javascript/application.js delete mode 100644 nettosphere-samples/jersey-chat/src/main/resources/javascript/atmosphere.js delete mode 100644 nettosphere-samples/jersey-chat/src/main/resources/javascript/jquery-2.0.3.js delete mode 100644 nettosphere-samples/jersey-chat/src/main/scripts/nettosphere.sh delete mode 100644 nettosphere-samples/pom.xml delete mode 100644 play-samples/chat/app/Global.java delete mode 100644 play-samples/chat/app/controllers/Application.java delete mode 100644 play-samples/chat/app/org.atmosphere.samples.play/Chat.java delete mode 100644 play-samples/chat/app/org.atmosphere.samples.play/JacksonDecoder.java delete mode 100644 play-samples/chat/app/org.atmosphere.samples.play/JacksonEncoder.java delete mode 100644 play-samples/chat/app/org.atmosphere.samples.play/Message.java delete mode 100644 play-samples/chat/app/views/index.scala.html delete mode 100644 play-samples/chat/build.sbt delete mode 100644 play-samples/chat/conf/application.conf delete mode 100644 play-samples/chat/conf/routes delete mode 100644 play-samples/chat/project/build.properties delete mode 100644 play-samples/chat/project/plugins.sbt delete mode 100644 play-samples/jersey-chat/app/Global.java delete mode 100644 play-samples/jersey-chat/app/controllers/Application.java delete mode 100644 play-samples/jersey-chat/app/org.atmosphere.samples.play/ChatResource.java delete mode 100644 play-samples/jersey-chat/app/org.atmosphere.samples.play/Message.java delete mode 100644 play-samples/jersey-chat/app/org.atmosphere.samples.play/Response.java delete mode 100644 play-samples/jersey-chat/app/views/index.scala.html delete mode 100644 play-samples/jersey-chat/conf/application.conf delete mode 100644 play-samples/jersey-chat/conf/routes delete mode 100644 play-samples/jersey-chat/logs/application.log delete mode 100644 play-samples/jersey-chat/pom.xml delete mode 100644 play-samples/jersey-chat/project/Build.scala delete mode 100644 play-samples/jersey-chat/project/build.properties delete mode 100644 play-samples/jersey-chat/project/plugins.sbt delete mode 100644 play-samples/pom.xml delete mode 100644 samples/all-api-pubsub/pom.xml delete mode 100644 samples/all-api-pubsub/src/main/scala/org/atmosphere/samples/pubsub/websocket/AtmosphereHandler.scala delete mode 100644 samples/all-api-pubsub/src/main/scala/org/atmosphere/samples/pubsub/websocket/Console.scala delete mode 100644 samples/all-api-pubsub/src/main/scala/org/atmosphere/samples/pubsub/websocket/DevoxxWebSocketProtocol.scala delete mode 100644 samples/all-api-pubsub/src/main/scala/org/atmosphere/samples/pubsub/websocket/Meteor.scala delete mode 100644 samples/all-api-pubsub/src/main/scala/org/atmosphere/samples/pubsub/websocket/Resource.scala delete mode 100644 samples/all-api-pubsub/src/main/webapp/META-INF/atmosphere.xml delete mode 100644 samples/all-api-pubsub/src/main/webapp/WEB-INF/jboss-web.xml delete mode 100644 samples/all-api-pubsub/src/main/webapp/WEB-INF/sun-web.xml delete mode 100644 samples/all-api-pubsub/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/all-api-pubsub/src/main/webapp/index.html delete mode 100644 samples/all-api-pubsub/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 samples/all-api-pubsub/src/main/webapp/javascript/jquery.form.js delete mode 100644 samples/async-annotation-pubsub/pom.xml delete mode 100644 samples/async-annotation-pubsub/src/main/java/org/atmosphere/samples/pubsub/AsynchronousExecution.java delete mode 100644 samples/async-annotation-pubsub/src/main/java/org/atmosphere/samples/pubsub/FileResource.java delete mode 100644 samples/async-annotation-pubsub/src/main/java/org/atmosphere/samples/pubsub/Message.java delete mode 100644 samples/async-annotation-pubsub/src/main/java/org/atmosphere/samples/pubsub/Response.java delete mode 100644 samples/async-annotation-pubsub/src/main/webapp/WEB-INF/jboss-web.xml delete mode 100644 samples/async-annotation-pubsub/src/main/webapp/WEB-INF/sun-web.xml delete mode 100644 samples/async-annotation-pubsub/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/async-annotation-pubsub/src/main/webapp/index.html delete mode 100755 samples/async-annotation-pubsub/src/main/webapp/javascript/application.js delete mode 100644 samples/async-annotation-pubsub/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 samples/atmosphere-ee6/pom.xml delete mode 100644 samples/atmosphere-ee6/src/main/java/org/jersey/devoxx/samples/ee6/atmosphere/TimerResource.java delete mode 100644 samples/atmosphere-ee6/src/main/webapp/WEB-INF/sun-web.xml delete mode 100644 samples/atmosphere-ee6/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/atmospherehandler-pubsub/pom.xml delete mode 100644 samples/atmospherehandler-pubsub/src/main/java/org/atmosphere/samples/pubsub/AtmosphereHandlerPubSub.java delete mode 100644 samples/atmospherehandler-pubsub/src/main/webapp/WEB-INF/jboss-web.xml delete mode 100644 samples/atmospherehandler-pubsub/src/main/webapp/WEB-INF/sun-web.xml delete mode 100644 samples/atmospherehandler-pubsub/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/atmospherehandler-pubsub/src/main/webapp/index.html delete mode 100755 samples/channel/pom.xml delete mode 100755 samples/channel/src/main/java/org/atmosphere/samples/pubsub/TypedChannel.java delete mode 100644 samples/channel/src/main/webapp/WEB-INF/jboss-web.xml delete mode 100644 samples/channel/src/main/webapp/WEB-INF/sun-web.xml delete mode 100755 samples/channel/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/chat-multiroom/pom.xml delete mode 100644 samples/chat-multiroom/src/main/java/org/atmosphere/samples/chat/ChatProtocol.java delete mode 100644 samples/chat-multiroom/src/main/java/org/atmosphere/samples/chat/ChatRoom.java delete mode 100644 samples/chat-multiroom/src/main/java/org/atmosphere/samples/chat/JacksonEncoder.java delete mode 100644 samples/chat-multiroom/src/main/java/org/atmosphere/samples/chat/ObjectMapperInjectable.java delete mode 100644 samples/chat-multiroom/src/main/java/org/atmosphere/samples/chat/ProtocolDecoder.java delete mode 100644 samples/chat-multiroom/src/main/java/org/atmosphere/samples/chat/UserDecoder.java delete mode 100644 samples/chat-multiroom/src/main/java/org/atmosphere/samples/chat/UserMessage.java delete mode 100644 samples/chat-multiroom/src/main/resources/META-INF/services/org.atmosphere.inject.Injectable delete mode 100644 samples/chat-multiroom/src/main/resources/logback.xml delete mode 100644 samples/chat-multiroom/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/chat-multiroom/src/main/webapp/index.html delete mode 100755 samples/chat-multiroom/src/main/webapp/javascript/application.js delete mode 100644 samples/chat-multiroom/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 samples/chat-node-client/README.md delete mode 100644 samples/chat-node-client/pom.xml delete mode 100644 samples/chat-node-client/src/main/resources/chat-client.js create mode 100644 samples/chat/project/build.properties create mode 100644 samples/chat/release.properties create mode 100644 samples/chat/resources/jetty-logging.properties create mode 100644 samples/chat/start.d/deploy.ini create mode 100644 samples/chat/start.d/http.ini create mode 100644 samples/chat/start.d/server.ini create mode 100644 samples/chat/start.d/websocket.ini create mode 100644 samples/chat/webapps/atmosphere-chat.war delete mode 100644 samples/commons/pom.xml delete mode 100644 samples/commons/src/main/java/org/atmosphere/commons/util/EventsLogger.java delete mode 100644 samples/cxf-chat-osgi/README.md delete mode 100644 samples/cxf-chat-osgi/pom.xml delete mode 100644 samples/cxf-chat-osgi/src/main/java/org/atmosphere/samples/chat/cxf/ChatResource.java delete mode 100644 samples/cxf-chat-osgi/src/main/java/org/atmosphere/samples/chat/cxf/Message.java delete mode 100644 samples/cxf-chat-osgi/src/main/java/org/atmosphere/samples/chat/cxf/Response.java delete mode 100644 samples/cxf-chat-osgi/src/main/webapp/META-INF/atmosphere.xml delete mode 100644 samples/cxf-chat-osgi/src/main/webapp/META-INF/context.xml delete mode 100644 samples/cxf-chat-osgi/src/main/webapp/WEB-INF/jboss-web.xml delete mode 100644 samples/cxf-chat-osgi/src/main/webapp/WEB-INF/sun-web.xml delete mode 100644 samples/cxf-chat-osgi/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/cxf-chat-osgi/src/main/webapp/index.html delete mode 100644 samples/cxf-chat-osgi/src/main/webapp/javascript/application.js delete mode 100644 samples/cxf-chat-osgi/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 samples/cxf-chat/pom.xml delete mode 100644 samples/cxf-chat/src/main/java/org/atmosphere/samples/chat/cxf/ChatResource.java delete mode 100644 samples/cxf-chat/src/main/java/org/atmosphere/samples/chat/cxf/Message.java delete mode 100644 samples/cxf-chat/src/main/java/org/atmosphere/samples/chat/cxf/Response.java delete mode 100644 samples/cxf-chat/src/main/webapp/META-INF/atmosphere.xml delete mode 100644 samples/cxf-chat/src/main/webapp/META-INF/context.xml delete mode 100644 samples/cxf-chat/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/cxf-chat/src/main/webapp/index.html delete mode 100644 samples/cxf-chat/src/main/webapp/javascript/application.js delete mode 100644 samples/cxf-chat/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 samples/cxf-greeter-swaggersocket/pom.xml delete mode 100644 samples/cxf-greeter-swaggersocket/src/main/java/org/atmosphere/samples/greeter/cxf/DefaultGreeter.java delete mode 100644 samples/cxf-greeter-swaggersocket/src/main/java/org/atmosphere/samples/greeter/cxf/api/DefaultApi.java delete mode 100644 samples/cxf-greeter-swaggersocket/src/main/java/org/atmosphere/samples/greeter/cxf/model/Body.java delete mode 100644 samples/cxf-greeter-swaggersocket/src/main/java/org/atmosphere/samples/greeter/cxf/model/EchoReply.java delete mode 100644 samples/cxf-greeter-swaggersocket/src/main/java/org/atmosphere/samples/greeter/cxf/model/Greeting.java delete mode 100644 samples/cxf-greeter-swaggersocket/src/main/java/org/atmosphere/samples/greeter/cxf/model/GreetingReply.java delete mode 100644 samples/cxf-greeter-swaggersocket/src/main/java/org/atmosphere/samples/greeter/cxf/model/GreetingStatus.java delete mode 100644 samples/cxf-greeter-swaggersocket/src/main/java/org/atmosphere/samples/greeter/cxf/model/GreetingSummary.java delete mode 100644 samples/cxf-greeter-swaggersocket/src/main/java/org/atmosphere/samples/greeter/cxf/model/Pong.java delete mode 100644 samples/cxf-greeter-swaggersocket/src/main/webapp/META-INF/atmosphere.xml delete mode 100644 samples/cxf-greeter-swaggersocket/src/main/webapp/META-INF/context.xml delete mode 100644 samples/cxf-greeter-swaggersocket/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/cxf-greeter-swaggersocket/src/main/webapp/index.html delete mode 100644 samples/cxf-greeter-swaggersocket/src/main/webapp/javascript/application.js delete mode 100644 samples/cxf-greeter-swaggersocket/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 samples/embedded-jetty-websocket-chat/.gitignore delete mode 100644 samples/embedded-jetty-websocket-chat/README.md delete mode 100644 samples/embedded-jetty-websocket-chat/pom.xml delete mode 100644 samples/embedded-jetty-websocket-chat/src/main/java/org/atmosphere/samples/chat/Main.java delete mode 100644 samples/embedded-jetty-websocket-chat/src/main/java/org/atmosphere/samples/chat/WebSocketChat.java delete mode 100644 samples/embedded-jetty-websocket-chat/src/main/webapp/index.html delete mode 100755 samples/embedded-jetty-websocket-chat/src/main/webapp/javascript/application.js delete mode 100644 samples/embedded-jetty-websocket-chat/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 samples/grails-atmosphere-meteor/README.md delete mode 100644 samples/jersey-pubsub/pom.xml delete mode 100644 samples/jersey-pubsub/src/main/java/org/atmosphere/samples/pubsub/EventsLogger.java delete mode 100644 samples/jersey-pubsub/src/main/java/org/atmosphere/samples/pubsub/FileResource.java delete mode 100644 samples/jersey-pubsub/src/main/java/org/atmosphere/samples/pubsub/JerseyPubSub.java delete mode 100644 samples/jersey-pubsub/src/main/webapp/WEB-INF/jboss-web.xml delete mode 100644 samples/jersey-pubsub/src/main/webapp/WEB-INF/sun-web.xml delete mode 100644 samples/jersey-pubsub/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/jersey-pubsub/src/main/webapp/index.html delete mode 100644 samples/jersey2-chat/pom.xml delete mode 100644 samples/jersey2-chat/src/main/java/org/atmosphere/samples/chat/jersey/Jersey2Resource.java delete mode 100644 samples/jersey2-chat/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/jersey2-chat/src/main/webapp/index.html delete mode 100644 samples/jersey2-chat/src/main/webapp/javascript/application.js delete mode 100644 samples/jersey2-chat/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100755 samples/meteor-chat/pom.xml delete mode 100755 samples/meteor-chat/src/main/java/org/atmosphere/samples/chat/MeteorChat.java delete mode 100755 samples/meteor-chat/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/meteor-chat/src/main/webapp/index.html delete mode 100644 samples/meteor-chat/src/main/webapp/javascript/application.js delete mode 100644 samples/meteor-chat/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 samples/meteor-pubsub/pom.xml delete mode 100644 samples/meteor-pubsub/src/main/java/org/atmosphere/samples/pubsub/MeteorPubSub.java delete mode 100644 samples/meteor-pubsub/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/meteor-pubsub/src/main/webapp/index.html delete mode 100755 samples/pom.xml delete mode 100755 samples/pubsub/pom.xml delete mode 100644 samples/pubsub/src/main/java/org/atmosphere/samples/pubsub/EventsLogger.java delete mode 100644 samples/pubsub/src/main/java/org/atmosphere/samples/pubsub/JAXBBean.java delete mode 100755 samples/pubsub/src/main/java/org/atmosphere/samples/pubsub/PubSub.java delete mode 100644 samples/pubsub/src/main/java/org/atmosphere/samples/pubsub/PubSubBroadcaster.java delete mode 100644 samples/pubsub/src/main/webapp/WEB-INF/jboss-web.xml delete mode 100644 samples/pubsub/src/main/webapp/WEB-INF/sun-web.xml delete mode 100755 samples/pubsub/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/rest-chat/pom.xml delete mode 100644 samples/rest-chat/src/main/java/org/atmosphere/samples/chat/jersey/ChatResource.java delete mode 100644 samples/rest-chat/src/main/java/org/atmosphere/samples/chat/jersey/Message.java delete mode 100644 samples/rest-chat/src/main/java/org/atmosphere/samples/chat/jersey/Response.java delete mode 100644 samples/rest-chat/src/main/webapp/WEB-INF/jboss-web.xml delete mode 100644 samples/rest-chat/src/main/webapp/WEB-INF/sun-web.xml delete mode 100644 samples/rest-chat/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/rest-chat/src/main/webapp/index.html delete mode 100644 samples/rest-chat/src/main/webapp/javascript/application.js delete mode 100644 samples/rest-chat/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 samples/scala-chat/pom.xml delete mode 100644 samples/scala-chat/src/main/scala/org/atmosphere/samples/scala/chat/Message.scala delete mode 100644 samples/scala-chat/src/main/scala/org/atmosphere/samples/scala/chat/Response.scala delete mode 100644 samples/scala-chat/src/main/scala/org/atmosphere/samples/scala/chat/ScalaChat.scala delete mode 100644 samples/scala-chat/src/main/webapp/WEB-INF/jboss-web.xml delete mode 100644 samples/scala-chat/src/main/webapp/WEB-INF/sun-web.xml delete mode 100644 samples/scala-chat/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/scala-chat/src/main/webapp/index.html delete mode 100644 samples/scala-chat/src/main/webapp/javascript/application.js delete mode 100644 samples/scala-chat/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 samples/spring-boot-sample-atmosphere/README.md delete mode 100644 samples/spring-boot-sample-atmosphere/pom.xml delete mode 100644 samples/spring-boot-sample-atmosphere/src/main/java/org/atmosphere/samples/springboot/AtmosphereApplication.java delete mode 100644 samples/spring-boot-sample-atmosphere/src/main/java/org/atmosphere/samples/springboot/ChatService.java delete mode 100644 samples/spring-boot-sample-atmosphere/src/main/java/org/atmosphere/samples/springboot/Message.java delete mode 100644 samples/spring-boot-sample-atmosphere/src/main/resources/application.properties delete mode 100644 samples/spring-boot-sample-atmosphere/src/main/resources/static/home.html delete mode 100644 samples/spring-boot-sample-atmosphere/src/main/resources/static/javascript/application.js delete mode 100644 samples/spring-boot-sample-atmosphere/src/main/resources/static/javascript/jquery-1.9.0.js delete mode 100644 samples/spring-boot-sample-atmosphere/src/test/java/sample/SampleAtmosphereApplicationTests.java delete mode 100644 samples/sse-chat/pom.xml delete mode 100644 samples/sse-chat/src/main/java/org/atmosphere/samples/chat/SSEAtmosphereHandler.java delete mode 100644 samples/sse-chat/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/sse-chat/src/main/webapp/index.html delete mode 100644 samples/sse-chat/src/main/webapp/javascript/EventSource.js delete mode 100755 samples/sse-chat/src/main/webapp/javascript/application.js delete mode 100644 samples/sse-chat/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 samples/sse-rest-chat/pom.xml delete mode 100644 samples/sse-rest-chat/src/main/java/org/atmosphere/samples/chat/jersey/Message.java delete mode 100644 samples/sse-rest-chat/src/main/java/org/atmosphere/samples/chat/jersey/ResourceChat.java delete mode 100644 samples/sse-rest-chat/src/main/java/org/atmosphere/samples/chat/jersey/Response.java delete mode 100644 samples/sse-rest-chat/src/main/webapp/WEB-INF/jboss-web.xml delete mode 100644 samples/sse-rest-chat/src/main/webapp/WEB-INF/sun-web.xml delete mode 100644 samples/sse-rest-chat/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/sse-rest-chat/src/main/webapp/index.html delete mode 100644 samples/sse-rest-chat/src/main/webapp/javascript/application.js delete mode 100644 samples/sse-rest-chat/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100755 samples/twitter-live-feed/pom.xml delete mode 100644 samples/twitter-live-feed/src/main/java/org/atmosphere/samples/twitter/EventsLogger.java delete mode 100644 samples/twitter-live-feed/src/main/java/org/atmosphere/samples/twitter/FileResource.java delete mode 100644 samples/twitter-live-feed/src/main/java/org/atmosphere/samples/twitter/TwitterFeed.java delete mode 100644 samples/twitter-live-feed/src/main/webapp/META-INF/context.xml delete mode 100644 samples/twitter-live-feed/src/main/webapp/WEB-INF/context.xml delete mode 100644 samples/twitter-live-feed/src/main/webapp/WEB-INF/jboss-web.xml delete mode 100644 samples/twitter-live-feed/src/main/webapp/WEB-INF/sun-web.xml delete mode 100644 samples/twitter-live-feed/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/twitter-live-feed/src/main/webapp/index.html delete mode 100644 samples/twitter-live-feed/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 samples/twitter-live-feed/src/main/webapp/javascript/jquery.list.js delete mode 100644 samples/webrtc-atmospherehandler/README.md delete mode 100644 samples/webrtc-atmospherehandler/md delete mode 100644 samples/webrtc-atmospherehandler/pom.xml delete mode 100644 samples/webrtc-atmospherehandler/src/main/java/org/atmosphere/samples/webrtc/AtmosphereHandlerPubSub.java delete mode 100644 samples/webrtc-atmospherehandler/src/main/webapp/WEB-INF/sun-web.xml delete mode 100644 samples/webrtc-atmospherehandler/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/webrtc-atmospherehandler/src/main/webapp/index.html delete mode 100644 samples/webrtc-atmospherehandler/src/main/webapp/resources/css/videochat.css delete mode 100644 samples/webrtc-atmospherehandler/src/main/webapp/resources/js/Math.uuid.js delete mode 100644 samples/webrtc-atmospherehandler/src/main/webapp/resources/js/jquery-2.2.0.js delete mode 100755 samples/webrtc-atmospherehandler/src/main/webapp/resources/js/json2-min.js delete mode 100644 samples/webrtc-atmospherehandler/src/main/webapp/resources/js/webrtc.js delete mode 100644 samples/webrtc-jersey/README.md delete mode 100644 samples/webrtc-jersey/pom.xml delete mode 100644 samples/webrtc-jersey/src/main/java/org/atmosphere/samples/webrtc/EventsLogger.java delete mode 100644 samples/webrtc-jersey/src/main/java/org/atmosphere/samples/webrtc/Subscriber.java delete mode 100644 samples/webrtc-jersey/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/webrtc-jersey/src/main/webapp/index.html delete mode 100644 samples/webrtc-jersey/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 samples/webrtc-jersey/src/main/webapp/resources/css/videochat.css delete mode 100644 samples/webrtc-jersey/src/main/webapp/resources/js/Math.uuid.js delete mode 100644 samples/webrtc-jersey/src/main/webapp/resources/js/jquery-2.2.0.js delete mode 100755 samples/webrtc-jersey/src/main/webapp/resources/js/json2-min.js delete mode 100644 samples/webrtc-jersey/src/main/webapp/resources/js/webrtc.js delete mode 100644 samples/websocket-chat/.gitignore delete mode 100644 samples/websocket-chat/pom.xml delete mode 100644 samples/websocket-chat/src/main/java/org/atmosphere/samples/chat/WebSocketChat.java delete mode 100644 samples/websocket-chat/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/websocket-chat/src/main/webapp/index.html delete mode 100755 samples/websocket-chat/src/main/webapp/javascript/application.js delete mode 100644 samples/websocket-chat/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 samples/websocket-chat/websocket-chat.launch delete mode 100644 samples/websocket-stream/.gitignore delete mode 100644 samples/websocket-stream/README.md delete mode 100644 samples/websocket-stream/pom.xml delete mode 100644 samples/websocket-stream/src/main/java/org/atmosphere/samples/stream/WebSocketStream.java delete mode 100644 samples/websocket-stream/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/websocket-stream/src/main/webapp/index.html delete mode 100644 samples/websocket-stream/src/main/webapp/javascript/application.js delete mode 100644 samples/websocket-stream/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 samples/websocket-stream/websocket-stream.launch delete mode 100644 samples/websockethandler-pubsub/pom.xml delete mode 100644 samples/websockethandler-pubsub/src/main/java/org/atmosphere/samples/pubsub/WebSocketPubSub.java delete mode 100644 samples/websockethandler-pubsub/src/main/resources/logback.xml delete mode 100644 samples/websockethandler-pubsub/src/main/webapp/WEB-INF/jboss-web.xml delete mode 100644 samples/websockethandler-pubsub/src/main/webapp/WEB-INF/sun-web.xml delete mode 100644 samples/websockethandler-pubsub/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples/websockethandler-pubsub/src/main/webapp/index.html delete mode 100644 samples/websockethandler-pubsub/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 stomp/pom.xml delete mode 100644 stomp/pubsub/pom.xml delete mode 100644 stomp/pubsub/src/main/java/org/atmosphere/samples/stomp/pubsub/StompEndpointSample.java delete mode 100644 stomp/pubsub/src/main/webapp/WEB-INF/web.xml delete mode 100644 stomp/pubsub/src/main/webapp/app.js delete mode 100644 stomp/pubsub/src/main/webapp/index.html delete mode 100644 stomp/pubsub/src/main/webapp/javascript/jquery-2.0.3.js delete mode 100644 stomp/pubsub/src/main/webapp/stomp.js delete mode 100644 vertx-samples/chat/README.md delete mode 100644 vertx-samples/chat/pom.xml delete mode 100644 vertx-samples/chat/src/main/conf/logback.xml delete mode 100644 vertx-samples/chat/src/main/java/org/atmosphere/vertx/samples/chat/ChatProtocol.java delete mode 100644 vertx-samples/chat/src/main/java/org/atmosphere/vertx/samples/chat/ChatRoom.java delete mode 100644 vertx-samples/chat/src/main/java/org/atmosphere/vertx/samples/chat/JacksonEncoder.java delete mode 100644 vertx-samples/chat/src/main/java/org/atmosphere/vertx/samples/chat/ProtocolDecoder.java delete mode 100644 vertx-samples/chat/src/main/java/org/atmosphere/vertx/samples/chat/UserDecoder.java delete mode 100644 vertx-samples/chat/src/main/java/org/atmosphere/vertx/samples/chat/UserMessage.java delete mode 100644 vertx-samples/chat/src/main/java/org/atmosphere/vertx/samples/chat/VertxChatServer.java delete mode 100644 vertx-samples/chat/src/main/java/org/atmosphere/vertx/samples/webroot/index.html delete mode 100755 vertx-samples/chat/src/main/java/org/atmosphere/vertx/samples/webroot/javascript/application.js delete mode 100644 vertx-samples/jersey-chat/README.md delete mode 100644 vertx-samples/jersey-chat/pom.xml delete mode 100644 vertx-samples/jersey-chat/src/main/java/org/atmosphere/vertx/samples/chat/Message.java delete mode 100644 vertx-samples/jersey-chat/src/main/java/org/atmosphere/vertx/samples/chat/ResourceChat.java delete mode 100644 vertx-samples/jersey-chat/src/main/java/org/atmosphere/vertx/samples/chat/Response.java delete mode 100644 vertx-samples/jersey-chat/src/main/java/org/atmosphere/vertx/samples/chat/VertxJerseyChat.java delete mode 100644 vertx-samples/jersey-chat/src/main/webapp/index.html delete mode 100644 vertx-samples/jersey-chat/src/main/webapp/jquery/application.js delete mode 100644 vertx-samples/pom.xml diff --git a/extensions-samples/chat-cdi/README.md b/extensions-samples/chat-cdi/README.md deleted file mode 100644 index 371e49e8f..000000000 --- a/extensions-samples/chat-cdi/README.md +++ /dev/null @@ -1,2 +0,0 @@ -## Deploying this sample -This sample has been tested with Wildfly 8.x, and use [Weld](http://weld.cdi-spec.org/) for CDI Support. Please refer to [Weld manual](https://docs.jboss.org/weld/reference/1.0.0/en-US/html/environments.html) for Jetty and Tomcat configuration. diff --git a/extensions-samples/chat-cdi/pom.xml b/extensions-samples/chat-cdi/pom.xml deleted file mode 100644 index de78429b6..000000000 --- a/extensions-samples/chat-cdi/pom.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - org.atmosphere - atmosphere-samples-project - 2.7.0-SNAPSHOT - ../../ - - 4.0.0 - org.atmosphere.samples - atmosphere-chat-cdi - war - 2.7.0-SNAPSHOT - atmosphere-chat-cdi - http://maven.apache.org - - - org.atmosphere.client - javascript - ${client-version} - war - - - ch.qos.logback - logback-classic - ${logback-version} - - - javax.enterprise - cdi-api - 1.1 - provided - - - ch.qos.logback - logback-core - ${logback-version} - - - org.atmosphere - atmosphere-runtime - ${atmosphere-version} - - - com.fasterxml.jackson.core - jackson-databind - ${jackson-version} - - - org.atmosphere - atmosphere-cdi - ${extensions-version} - - - diff --git a/extensions-samples/chat-cdi/src/main/java/org/atmosphere/samples/chat/CDIChat.java b/extensions-samples/chat-cdi/src/main/java/org/atmosphere/samples/chat/CDIChat.java deleted file mode 100644 index 06c2248fc..000000000 --- a/extensions-samples/chat-cdi/src/main/java/org/atmosphere/samples/chat/CDIChat.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2008-2021 Async-IO.org - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.atmosphere.samples.chat; - -import org.atmosphere.config.managed.Decoder; -import org.atmosphere.config.managed.Encoder; -import org.atmosphere.config.service.Disconnect; -import org.atmosphere.config.service.ManagedService; -import org.atmosphere.config.service.Ready; -import org.atmosphere.cpr.AtmosphereResource; -import org.atmosphere.cpr.AtmosphereResourceEvent; -import org.atmosphere.cpr.BroadcasterFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.inject.Inject; -import java.io.IOException; - -import static org.atmosphere.cpr.ApplicationConfig.MAX_INACTIVE; - -/** - * Simple annotated class that demonstrate the power of Atmosphere. This class supports all transports, support - * message length garantee, heart beat, message cache thanks to the {@link ManagedService}. - *

- * This class use CDI for creating instance of Encoder and Decoder. - */ -@ManagedService(path = "/chat", atmosphereConfig = MAX_INACTIVE + "=120000") -public class CDIChat { - private final Logger logger = LoggerFactory.getLogger(CDIChat.class); - - // Normally Encoder and Decoder are managed by the @Message annotation, but for this sample we inject them instead. - @Inject - private Decoder decoder; - - @Inject - private Encoder encoder; - - @Inject - BroadcasterFactory factory; - - /** - * Invoked when the connection as been fully established and suspended, e.g ready for receiving messages. - * - * @param r - */ - @Ready - public void onReady(final AtmosphereResource r) { - - logger.info("Browser {} connected.", r.uuid()); - logger.info("Injected Factory {} connected.", factory.getClass().getName()); - - } - - /** - * Invoked when the client disconnect or when an unexpected closing of the underlying connection happens. - * - * @param event - */ - @Disconnect - public void onDisconnect(AtmosphereResourceEvent event) { - if (event.isCancelled()) { - logger.info("Browser {} unexpectedly disconnected", event.getResource().uuid()); - } else if (event.isClosedByClient()) { - logger.info("Browser {} closed the connection", event.getResource().uuid()); - } - } - - @org.atmosphere.config.service.Message - public String onMessage(String s) throws IOException { - Message message = decoder.decode(s); - logger.info("{} just send {}", message.getAuthor(), message.getMessage()); - return encoder.encode(message); - } - -} \ No newline at end of file diff --git a/extensions-samples/chat-cdi/src/main/java/org/atmosphere/samples/chat/JacksonDecoder.java b/extensions-samples/chat-cdi/src/main/java/org/atmosphere/samples/chat/JacksonDecoder.java deleted file mode 100644 index 0fa5347d9..000000000 --- a/extensions-samples/chat-cdi/src/main/java/org/atmosphere/samples/chat/JacksonDecoder.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2008-2021 Async-IO.org - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.atmosphere.samples.chat; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.atmosphere.config.managed.Decoder; - -import javax.enterprise.inject.Default; -import java.io.IOException; - -/** - * Decode a String into a {@link Message}. - */ -@Default -public class JacksonDecoder implements Decoder { - - private final ObjectMapper mapper = new ObjectMapper(); - - public JacksonDecoder(){} - - @Override - public Message decode(String s) { - try { - return mapper.readValue(s, Message.class); - } catch (IOException e) { - throw new RuntimeException(e); - } - } -} diff --git a/extensions-samples/chat-cdi/src/main/java/org/atmosphere/samples/chat/JacksonEncoder.java b/extensions-samples/chat-cdi/src/main/java/org/atmosphere/samples/chat/JacksonEncoder.java deleted file mode 100644 index 79334a053..000000000 --- a/extensions-samples/chat-cdi/src/main/java/org/atmosphere/samples/chat/JacksonEncoder.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2008-2021 Async-IO.org - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.atmosphere.samples.chat; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.atmosphere.config.managed.Encoder; - -import javax.enterprise.inject.Default; -import java.io.IOException; - -/** - * Encode a {@link Message} into a String - */ -@Default -public class JacksonEncoder implements Encoder { - - private final ObjectMapper mapper = new ObjectMapper(); - - public JacksonEncoder(){} - - @Override - public String encode(Message m) { - try { - return mapper.writeValueAsString(m); - } catch (IOException e) { - throw new RuntimeException(e); - } - } -} diff --git a/extensions-samples/chat-cdi/src/main/java/org/atmosphere/samples/chat/Message.java b/extensions-samples/chat-cdi/src/main/java/org/atmosphere/samples/chat/Message.java deleted file mode 100644 index 143fb871b..000000000 --- a/extensions-samples/chat-cdi/src/main/java/org/atmosphere/samples/chat/Message.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2008-2021 Async-IO.org - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.atmosphere.samples.chat; - -import java.util.Date; - -public class Message { - - private String message; - private String author; - private long time; - - public Message() { - this("", ""); - } - - public Message(String author, String message) { - this.author = author; - this.message = message; - this.time = new Date().getTime(); - } - - public String getMessage() { - return message; - } - - public String getAuthor() { - return author; - } - - public void setAuthor(String author) { - this.author = author; - } - - public void setMessage(String message) { - this.message = message; - } - - public long getTime() { - return time; - } - - public void setTime(long time) { - this.time = time; - } - -} diff --git a/extensions-samples/chat-cdi/src/main/resources/logback.xml b/extensions-samples/chat-cdi/src/main/resources/logback.xml deleted file mode 100644 index 0607a9f8e..000000000 --- a/extensions-samples/chat-cdi/src/main/resources/logback.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} %level [%thread] %logger{10} [%file:%line] %msg%n - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/extensions-samples/chat-cdi/src/main/webapp/WEB-INF/beans.xml b/extensions-samples/chat-cdi/src/main/webapp/WEB-INF/beans.xml deleted file mode 100644 index af8f174b5..000000000 --- a/extensions-samples/chat-cdi/src/main/webapp/WEB-INF/beans.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - \ No newline at end of file diff --git a/extensions-samples/chat-cdi/src/main/webapp/WEB-INF/web.xml b/extensions-samples/chat-cdi/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index 125e8d558..000000000 --- a/extensions-samples/chat-cdi/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - webapp - Atmosphere CDI Chat - Atmosphere CDI Chat - - AtmosphereServlet - AtmosphereServlet - org.atmosphere.cpr.AtmosphereServlet - - 0 - true - - - AtmosphereServlet - /chat/* - - - diff --git a/extensions-samples/chat-cdi/src/main/webapp/index.html b/extensions-samples/chat-cdi/src/main/webapp/index.html deleted file mode 100644 index 193196228..000000000 --- a/extensions-samples/chat-cdi/src/main/webapp/index.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - Atmosphere Chat - - - - - - - - -

-
-
- Connecting... - -
- - diff --git a/extensions-samples/chat-cdi/src/main/webapp/javascript/application.js b/extensions-samples/chat-cdi/src/main/webapp/javascript/application.js deleted file mode 100755 index ffbcb3b53..000000000 --- a/extensions-samples/chat-cdi/src/main/webapp/javascript/application.js +++ /dev/null @@ -1,124 +0,0 @@ -$(function () { - "use strict"; - - var header = $('#header'); - var content = $('#content'); - var input = $('#input'); - var status = $('#status'); - var myName = false; - var author = null; - var logged = false; - var socket = atmosphere; - var subSocket; - var transport = 'websocket'; - - // We are now ready to cut the request - var request = { url: document.location.toString() + 'chat', - contentType : "application/json", - logLevel : 'debug', - transport : transport , - trackMessageLength : true, - reconnectInterval : 5000, - enableXDR: true, - timeout : 60000 }; - - - request.onOpen = function(response) { - content.html($('

', { text: 'Atmosphere connected using ' + response.transport })); - input.removeAttr('disabled').focus(); - status.text('Choose name:'); - transport = response.transport; - - // Carry the UUID. This is required if you want to call subscribe(request) again. - request.uuid = response.request.uuid; - }; - - request.onClientTimeout = function(r) { - content.html($('

', { text: 'Client closed the connection after a timeout. Reconnecting in ' + request.reconnectInterval })); - subSocket.push(JSON.stringify({ author: author, message: 'is inactive and closed the connection. Will reconnect in ' + request.reconnectInterval })); - input.attr('disabled', 'disabled'); - setTimeout(function (){ - subSocket = socket.subscribe(request); - }, request.reconnectInterval); - }; - - request.onReopen = function(response) { - input.removeAttr('disabled').focus(); - content.html($('

', { text: 'Atmosphere re-connected using ' + response.transport })); - }; - - // For demonstration of how you can customize the fallbackTransport using the onTransportFailure function - request.onTransportFailure = function(errorMsg, request) { - atmosphere.util.info(errorMsg); - request.fallbackTransport = "long-polling"; - header.html($('

', { text: 'Atmosphere Chat. Default transport is WebSocket, fallback is ' + request.fallbackTransport })); - }; - - request.onMessage = function (response) { - - var message = response.responseBody; - try { - var json = JSON.parse(message); - } catch (e) { - console.log('This doesn\'t look like a valid JSON: ', message); - return; - } - - input.removeAttr('disabled').focus(); - if (!logged && myName) { - logged = true; - status.text(myName + ': ').css('color', 'blue'); - } else { - var me = json.author == author; - var date = typeof(json.time) == 'string' ? parseInt(json.time) : json.time; - addMessage(json.author, json.message, me ? 'blue' : 'black', new Date(date)); - } - }; - - request.onClose = function(response) { - content.html($('

', { text: 'Server closed the connection after a timeout' })); - if (subSocket) { - subSocket.push(JSON.stringify({ author: author, message: 'disconnecting' })); - } - input.attr('disabled', 'disabled'); - }; - - request.onError = function(response) { - content.html($('

', { text: 'Sorry, but there\'s some problem with your ' - + 'socket or the server is down' })); - logged = false; - }; - - request.onReconnect = function(request, response) { - content.html($('

', { text: 'Connection lost, trying to reconnect. Trying to reconnect ' + request.reconnectInterval})); - input.attr('disabled', 'disabled'); - }; - - subSocket = socket.subscribe(request); - - input.keydown(function(e) { - if (e.keyCode === 13) { - var msg = $(this).val(); - - // First message is always the author's name - if (author == null) { - author = msg; - } - - subSocket.push(JSON.stringify({ author: author, message: msg })); - $(this).val(''); - - input.attr('disabled', 'disabled'); - if (myName === false) { - myName = msg; - } - } - }); - - function addMessage(author, message, color, datetime) { - content.append('

' + author + ' @ ' + - + (datetime.getHours() < 10 ? '0' + datetime.getHours() : datetime.getHours()) + ':' - + (datetime.getMinutes() < 10 ? '0' + datetime.getMinutes() : datetime.getMinutes()) - + ': ' + message + '

'); - } -}); diff --git a/extensions-samples/chat-cdi/src/main/webapp/javascript/jquery-2.0.3.js b/extensions-samples/chat-cdi/src/main/webapp/javascript/jquery-2.0.3.js deleted file mode 100644 index e705891f3..000000000 --- a/extensions-samples/chat-cdi/src/main/webapp/javascript/jquery-2.0.3.js +++ /dev/null @@ -1,8829 +0,0 @@ -/*! - * jQuery JavaScript Library v2.0.3 - * http://jquery.com/ - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * - * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2013-07-03T13:30Z - */ -(function( window, undefined ) { - -// Can't do this because several apps including ASP.NET trace -// the stack via arguments.caller.callee and Firefox dies if -// you try to trace through "use strict" call chains. (#13335) -// Support: Firefox 18+ -//"use strict"; -var - // A central reference to the root jQuery(document) - rootjQuery, - - // The deferred used on DOM ready - readyList, - - // Support: IE9 - // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined` - core_strundefined = typeof undefined, - - // Use the correct document accordingly with window argument (sandbox) - location = window.location, - document = window.document, - docElem = document.documentElement, - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$, - - // [[Class]] -> type pairs - class2type = {}, - - // List of deleted data cache ids, so we can reuse them - core_deletedIds = [], - - core_version = "2.0.3", - - // Save a reference to some core methods - core_concat = core_deletedIds.concat, - core_push = core_deletedIds.push, - core_slice = core_deletedIds.slice, - core_indexOf = core_deletedIds.indexOf, - core_toString = class2type.toString, - core_hasOwn = class2type.hasOwnProperty, - core_trim = core_version.trim, - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context, rootjQuery ); - }, - - // Used for matching numbers - core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, - - // Used for splitting on whitespace - core_rnotwhite = /\S+/g, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - - // Match a standalone tag - rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([\da-z])/gi, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }, - - // The ready event handler and self cleanup method - completed = function() { - document.removeEventListener( "DOMContentLoaded", completed, false ); - window.removeEventListener( "load", completed, false ); - jQuery.ready(); - }; - -jQuery.fn = jQuery.prototype = { - // The current version of jQuery being used - jquery: core_version, - - constructor: jQuery, - init: function( selector, context, rootjQuery ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - - // scripts is true for back-compat - jQuery.merge( this, jQuery.parseHTML( - match[1], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[2] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || rootjQuery ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return rootjQuery.ready( selector ); - } - - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }, - - // Start with an empty selector - selector: "", - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return core_slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num == null ? - - // Return a 'clean' array - this.toArray() : - - // Return just the object - ( num < 0 ? this[ this.length + num ] : this[ num ] ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - ret.context = this.context; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - ready: function( fn ) { - // Add the callback - jQuery.ready.promise().done( fn ); - - return this; - }, - - slice: function() { - return this.pushStack( core_slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { - return callback.call( elem, i, elem ); - })); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: core_push, - sort: [].sort, - splice: [].splice -}; - -// Give the init function the jQuery prototype for later instantiation -jQuery.fn.init.prototype = jQuery.fn; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if ( length === i ) { - target = this; - --i; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend({ - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ), - - noConflict: function( deep ) { - if ( window.$ === jQuery ) { - window.$ = _$; - } - - if ( deep && window.jQuery === jQuery ) { - window.jQuery = _jQuery; - } - - return jQuery; - }, - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.trigger ) { - jQuery( document ).trigger("ready").off("ready"); - } - }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - return !isNaN( parseFloat(obj) ) && isFinite( obj ); - }, - - type: function( obj ) { - if ( obj == null ) { - return String( obj ); - } - // Support: Safari <= 5.1 (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ core_toString.call(obj) ] || "object" : - typeof obj; - }, - - isPlainObject: function( obj ) { - // Not plain objects: - // - Any object or value whose internal [[Class]] property is not "[object Object]" - // - DOM nodes - // - window - if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - // Support: Firefox <20 - // The try/catch suppresses exceptions thrown when attempting to access - // the "constructor" property of certain host objects, ie. |window.location| - // https://bugzilla.mozilla.org/show_bug.cgi?id=814622 - try { - if ( obj.constructor && - !core_hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { - return false; - } - } catch ( e ) { - return false; - } - - // If the function hasn't returned already, we're confident that - // |obj| is a plain object, created by {} or constructed with new Object - return true; - }, - - isEmptyObject: function( obj ) { - var name; - for ( name in obj ) { - return false; - } - return true; - }, - - error: function( msg ) { - throw new Error( msg ); - }, - - // data: string of html - // context (optional): If specified, the fragment will be created in this context, defaults to document - // keepScripts (optional): If true, will include scripts passed in the html string - parseHTML: function( data, context, keepScripts ) { - if ( !data || typeof data !== "string" ) { - return null; - } - if ( typeof context === "boolean" ) { - keepScripts = context; - context = false; - } - context = context || document; - - var parsed = rsingleTag.exec( data ), - scripts = !keepScripts && []; - - // Single tag - if ( parsed ) { - return [ context.createElement( parsed[1] ) ]; - } - - parsed = jQuery.buildFragment( [ data ], context, scripts ); - - if ( scripts ) { - jQuery( scripts ).remove(); - } - - return jQuery.merge( [], parsed.childNodes ); - }, - - parseJSON: JSON.parse, - - // Cross-browser xml parsing - parseXML: function( data ) { - var xml, tmp; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE9 - try { - tmp = new DOMParser(); - xml = tmp.parseFromString( data , "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; - }, - - noop: function() {}, - - // Evaluates a script in a global context - globalEval: function( code ) { - var script, - indirect = eval; - - code = jQuery.trim( code ); - - if ( code ) { - // If the code includes a valid, prologue position - // strict mode pragma, execute code by injecting a - // script tag into the document. - if ( code.indexOf("use strict") === 1 ) { - script = document.createElement("script"); - script.text = code; - document.head.appendChild( script ).parentNode.removeChild( script ); - } else { - // Otherwise, avoid the DOM node creation, insertion - // and removal by using an indirect global eval - indirect( code ); - } - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - // args is for internal usage only - each: function( obj, callback, args ) { - var value, - i = 0, - length = obj.length, - isArray = isArraylike( obj ); - - if ( args ) { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } - } - - return obj; - }, - - trim: function( text ) { - return text == null ? "" : core_trim.call( text ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArraylike( Object(arr) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - core_push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : core_indexOf.call( arr, elem, i ); - }, - - merge: function( first, second ) { - var l = second.length, - i = first.length, - j = 0; - - if ( typeof l === "number" ) { - for ( ; j < l; j++ ) { - first[ i++ ] = second[ j ]; - } - } else { - while ( second[j] !== undefined ) { - first[ i++ ] = second[ j++ ]; - } - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, inv ) { - var retVal, - ret = [], - i = 0, - length = elems.length; - inv = !!inv; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - retVal = !!callback( elems[ i ], i ); - if ( inv !== retVal ) { - ret.push( elems[ i ] ); - } - } - - return ret; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, - i = 0, - length = elems.length, - isArray = isArraylike( elems ), - ret = []; - - // Go through the array, translating each of the items to their - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - } - - // Flatten any nested arrays - return core_concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = core_slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - // Multifunctional method to get and set values of a collection - // The value/s can optionally be executed if it's a function - access: function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - length = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < length; i++ ) { - fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); - } - } - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call( elems ) : - length ? fn( elems[0], key ) : emptyGet; - }, - - now: Date.now, - - // A method for quickly swapping in/out CSS properties to get correct calculations. - // Note: this method belongs to the css module but it's needed here for the support module. - // If support gets modularized, this method should be moved back to the css module. - swap: function( elem, options, callback, args ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.apply( elem, args || [] ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; - } -}); - -jQuery.ready.promise = function( obj ) { - if ( !readyList ) { - - readyList = jQuery.Deferred(); - - // Catch cases where $(document).ready() is called after the browser event has already occurred. - // we once tried to use readyState "interactive" here, but it caused issues like the one - // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - setTimeout( jQuery.ready ); - - } else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed, false ); - } - } - return readyList.promise( obj ); -}; - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -function isArraylike( obj ) { - var length = obj.length, - type = jQuery.type( obj ); - - if ( jQuery.isWindow( obj ) ) { - return false; - } - - if ( obj.nodeType === 1 && length ) { - return true; - } - - return type === "array" || type !== "function" && - ( length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj ); -} - -// All jQuery objects should point back to these -rootjQuery = jQuery(document); -/*! - * Sizzle CSS Selector Engine v1.9.4-pre - * http://sizzlejs.com/ - * - * Copyright 2013 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2013-06-03 - */ -(function( window, undefined ) { - -var i, - support, - cachedruns, - Expr, - getText, - isXML, - compile, - outermostContext, - sortInput, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + -(new Date()), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - hasDuplicate = false, - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - return 0; - } - return 0; - }, - - // General-purpose constants - strundefined = typeof undefined, - MAX_NEGATIVE = 1 << 31, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf if we can't use a native one - indexOf = arr.indexOf || function( elem ) { - var i = 0, - len = this.length; - for ( ; i < len; i++ ) { - if ( this[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - // http://www.w3.org/TR/css3-syntax/#characters - characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", - - // Loosely modeled on CSS identifier characters - // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors - // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = characterEncoding.replace( "w", "w#" ), - - // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + - "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]", - - // Prefer arguments quoted, - // then not containing pseudos/brackets, - // then attribute selectors/non-parenthetical expressions, - // then anything else - // These preferences are here to reduce the number of selectors - // needing tokenize in the PSEUDO preFilter - pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rsibling = new RegExp( whitespace + "*[+~]" ), - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + characterEncoding + ")" ), - "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), - "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rescape = /'|\\/g, - - // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - // BMP codepoint - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }; - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var match, elem, m, nodeType, - // QSA vars - i, groups, old, nid, newContext, newSelector; - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - - context = context || document; - results = results || []; - - if ( !selector || typeof selector !== "string" ) { - return results; - } - - if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { - return []; - } - - if ( documentIsHTML && !seed ) { - - // Shortcuts - if ( (match = rquickExpr.exec( selector )) ) { - // Speed-up: Sizzle("#ID") - if ( (m = match[1]) ) { - if ( nodeType === 9 ) { - elem = context.getElementById( m ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE, Opera, and Webkit return items - // by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - } else { - // Context is not a document - if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && - contains( context, elem ) && elem.id === m ) { - results.push( elem ); - return results; - } - } - - // Speed-up: Sizzle("TAG") - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Speed-up: Sizzle(".CLASS") - } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // QSA path - if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - nid = old = expando; - newContext = context; - newSelector = nodeType === 9 && selector; - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - groups = tokenize( selector ); - - if ( (old = context.getAttribute("id")) ) { - nid = old.replace( rescape, "\\$&" ); - } else { - context.setAttribute( "id", nid ); - } - nid = "[id='" + nid + "'] "; - - i = groups.length; - while ( i-- ) { - groups[i] = nid + toSelector( groups[i] ); - } - newContext = rsibling.test( selector ) && context.parentNode || context; - newSelector = groups.join(","); - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch(qsaError) { - } finally { - if ( !old ) { - context.removeAttribute("id"); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {Function(string, Object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key += " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created div and expects a boolean result - */ -function assert( fn ) { - var div = document.createElement("div"); - - try { - return !!fn( div ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( div.parentNode ) { - div.parentNode.removeChild( div ); - } - // release memory in IE - div = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = attrs.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - ( ~b.sourceIndex || MAX_NEGATIVE ) - - ( ~a.sourceIndex || MAX_NEGATIVE ); - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Detect xml - * @param {Element|Object} elem An element or a document - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var doc = node ? node.ownerDocument || node : preferredDoc, - parent = doc.defaultView; - - // If no document and documentElement is available, return - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Set our document - document = doc; - docElem = doc.documentElement; - - // Support tests - documentIsHTML = !isXML( doc ); - - // Support: IE>8 - // If iframe document is assigned to "document" variable and if iframe has been reloaded, - // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 - // IE6-8 do not support the defaultView property so parent will be undefined - if ( parent && parent.attachEvent && parent !== parent.top ) { - parent.attachEvent( "onbeforeunload", function() { - setDocument(); - }); - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) - support.attributes = assert(function( div ) { - div.className = "i"; - return !div.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( div ) { - div.appendChild( doc.createComment("") ); - return !div.getElementsByTagName("*").length; - }); - - // Check if getElementsByClassName can be trusted - support.getElementsByClassName = assert(function( div ) { - div.innerHTML = "
"; - - // Support: Safari<4 - // Catch class over-caching - div.firstChild.className = "i"; - // Support: Opera<10 - // Catch gEBCN failure to find non-leading classes - return div.getElementsByClassName("i").length === 2; - }); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( div ) { - docElem.appendChild( div ).id = expando; - return !doc.getElementsByName || !doc.getElementsByName( expando ).length; - }); - - // ID find and filter - if ( support.getById ) { - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== strundefined && documentIsHTML ) { - var m = context.getElementById( id ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - }; - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - } else { - // Support: IE6/7 - // getElementById is not reliable as a find shortcut - delete Expr.find["ID"]; - - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== strundefined ) { - return context.getElementsByTagName( tag ); - } - } : - function( tag, context ) { - var elem, - tmp = [], - i = 0, - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See http://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( div ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // http://bugs.jquery.com/ticket/12359 - div.innerHTML = ""; - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !div.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - }); - - assert(function( div ) { - - // Support: Opera 10-12/IE8 - // ^= $= *= and empty values - // Should not select anything - // Support: Windows 8 Native Apps - // The type attribute is restricted during .innerHTML assignment - var input = doc.createElement("input"); - input.setAttribute( "type", "hidden" ); - div.appendChild( input ).setAttribute( "t", "" ); - - if ( div.querySelectorAll("[t^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":enabled").length ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - div.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( div ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( div, "div" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( div, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - - // Element contains another - // Purposefully does not implement inclusive descendent - // As in, an element does not contain itself - contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = docElem.compareDocumentPosition ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b ); - - if ( compare ) { - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === doc || contains(preferredDoc, a) ) { - return -1; - } - if ( b === doc || contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } - - // Not directly comparable, sort on existence of method - return a.compareDocumentPosition ? -1 : 1; - } : - function( a, b ) { - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - - // Parentless nodes are either documents or disconnected - } else if ( !aup || !bup ) { - return a === doc ? -1 : - b === doc ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return doc; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch(e) {} - } - - return Sizzle( expr, document, null, [elem] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val === undefined ? - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null : - val; -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - for ( ; (node = elem[i]); i++ ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (see #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[5] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] && match[4] !== undefined ) { - match[2] = match[4]; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, outerCache, node, diff, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - // Seek `elem` from a previously-cached index - outerCache = parent[ expando ] || (parent[ expando ] = {}); - cache = outerCache[ type ] || []; - nodeIndex = cache[0] === dirruns && cache[1]; - diff = cache[0] === dirruns && cache[2]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - outerCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - // Use previously-cached element index if available - } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { - diff = cache[1]; - - // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) - } else { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { - // Cache the index of each encountered element - if ( useCache ) { - (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf.call( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": function( elem ) { - return elem.disabled === false; - }, - - "disabled": function( elem ) { - return elem.disabled === true; - }, - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)), - // not comment, processing instructions, or others - // Thanks to Diego Perini for the nodeName shortcut - // Greater than "@" means alpha characters (specifically not starting with "#" or "?") - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) - // use getAttribute instead to test this case - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -function tokenize( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( tokens = [] ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -} - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - checkNonElements = base && dir === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var data, cache, outerCache, - dirkey = dirruns + " " + doneName; - - // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) { - if ( (data = cache[1]) === true || data === cachedruns ) { - return data === true; - } - } else { - cache = outerCache[ dir ] = [ dirkey ]; - cache[1] = matcher( elem, context, xml ) || cachedruns; - if ( cache[1] === true ) { - return true; - } - } - } - } - } - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf.call( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - // A counter to specify which element is currently being matched - var matcherCachedRuns = 0, - bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, expandContext ) { - var elem, j, matcher, - setMatched = [], - matchedCount = 0, - i = "0", - unmatched = seed && [], - outermost = expandContext != null, - contextBackup = outermostContext, - // We must always have either seed elements or context - elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1); - - if ( outermost ) { - outermostContext = context !== document && context; - cachedruns = matcherCachedRuns; - } - - // Add elements passing elementMatchers directly to results - // Keep `i` a string if there are no elements so `matchedCount` will be "00" below - for ( ; (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - cachedruns = ++matcherCachedRuns; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // Apply set filters to unmatched elements - matchedCount += i; - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !group ) { - group = tokenize( selector ); - } - i = group.length; - while ( i-- ) { - cached = matcherFromTokens( group[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - } - return cached; -}; - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function select( selector, context, results, seed ) { - var i, tokens, token, type, find, - match = tokenize( selector ); - - if ( !seed ) { - // Try to minimize operations if there is only one group - if ( match.length === 1 ) { - - // Take a shortcut and set the context if the root selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - support.getById && context.nodeType === 9 && documentIsHTML && - Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - } - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && context.parentNode || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - } - - // Compile and execute a filtering function - // Provide `match` to avoid retokenization if we modified the selector above - compile( selector, match )( - seed, - context, - !documentIsHTML, - results, - rsibling.test( selector ) - ); - return results; -} - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome<14 -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( div1 ) { - // Should return 1, but returns 4 (following) - return div1.compareDocumentPosition( document.createElement("div") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( div ) { - div.innerHTML = ""; - return div.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( div ) { - div.innerHTML = ""; - div.firstChild.setAttribute( "value", "" ); - return div.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( div ) { - return div.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - elem[ name ] === true ? name.toLowerCase() : null; - } - }); -} - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.pseudos; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - -})( window ); -// String to Object options format cache -var optionsCache = {}; - -// Convert String-formatted options into Object-formatted ones and store in cache -function createOptions( options ) { - var object = optionsCache[ options ] = {}; - jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) { - object[ flag ] = true; - }); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - ( optionsCache[ options ] || createOptions( options ) ) : - jQuery.extend( {}, options ); - - var // Last fire value (for non-forgettable lists) - memory, - // Flag to know if list was already fired - fired, - // Flag to know if list is currently firing - firing, - // First callback to fire (used internally by add and fireWith) - firingStart, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, - // Actual callback list - list = [], - // Stack of fire calls for repeatable lists - stack = !options.once && [], - // Fire callbacks - fire = function( data ) { - memory = options.memory && data; - fired = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - firing = true; - for ( ; list && firingIndex < firingLength; firingIndex++ ) { - if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { - memory = false; // To prevent further calls using add - break; - } - } - firing = false; - if ( list ) { - if ( stack ) { - if ( stack.length ) { - fire( stack.shift() ); - } - } else if ( memory ) { - list = []; - } else { - self.disable(); - } - } - }, - // Actual Callbacks object - self = { - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - // First, we save the current length - var start = list.length; - (function add( args ) { - jQuery.each( args, function( _, arg ) { - var type = jQuery.type( arg ); - if ( type === "function" ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && type !== "string" ) { - // Inspect recursively - add( arg ); - } - }); - })( arguments ); - // Do we need to add the callbacks to the - // current firing batch? - if ( firing ) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away - } else if ( memory ) { - firingStart = start; - fire( memory ); - } - } - return this; - }, - // Remove a callback from the list - remove: function() { - if ( list ) { - jQuery.each( arguments, function( _, arg ) { - var index; - while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - // Handle firing indexes - if ( firing ) { - if ( index <= firingLength ) { - firingLength--; - } - if ( index <= firingIndex ) { - firingIndex--; - } - } - } - }); - } - return this; - }, - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); - }, - // Remove all callbacks from the list - empty: function() { - list = []; - firingLength = 0; - return this; - }, - // Have the list do nothing anymore - disable: function() { - list = stack = memory = undefined; - return this; - }, - // Is it disabled? - disabled: function() { - return !list; - }, - // Lock the list in its current state - lock: function() { - stack = undefined; - if ( !memory ) { - self.disable(); - } - return this; - }, - // Is it locked? - locked: function() { - return !stack; - }, - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( list && ( !fired || stack ) ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - if ( firing ) { - stack.push( args ); - } else { - fire( args ); - } - } - return this; - }, - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; -jQuery.extend({ - - Deferred: function( func ) { - var tuples = [ - // action, add listener, listener list, final state - [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], - [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], - [ "notify", "progress", jQuery.Callbacks("memory") ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - then: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - return jQuery.Deferred(function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - var action = tuple[ 0 ], - fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; - // deferred[ done | fail | progress ] for forwarding actions to newDefer - deferred[ tuple[1] ](function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .done( newDefer.resolve ) - .fail( newDefer.reject ) - .progress( newDefer.notify ); - } else { - newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); - } - }); - }); - fns = null; - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Keep pipe for back-compat - promise.pipe = promise.then; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 3 ]; - - // promise[ done | fail | progress ] = list.add - promise[ tuple[1] ] = list.add; - - // Handle state - if ( stateString ) { - list.add(function() { - // state = [ resolved | rejected ] - state = stateString; - - // [ reject_list | resolve_list ].disable; progress_list.lock - }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); - } - - // deferred[ resolve | reject | notify ] - deferred[ tuple[0] ] = function() { - deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); - return this; - }; - deferred[ tuple[0] + "With" ] = list.fireWith; - }); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( subordinate /* , ..., subordinateN */ ) { - var i = 0, - resolveValues = core_slice.call( arguments ), - length = resolveValues.length, - - // the count of uncompleted subordinates - remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, - - // the master Deferred. If resolveValues consist of only a single Deferred, just use that. - deferred = remaining === 1 ? subordinate : jQuery.Deferred(), - - // Update function for both resolve and progress values - updateFunc = function( i, contexts, values ) { - return function( value ) { - contexts[ i ] = this; - values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value; - if( values === progressValues ) { - deferred.notifyWith( contexts, values ); - } else if ( !( --remaining ) ) { - deferred.resolveWith( contexts, values ); - } - }; - }, - - progressValues, progressContexts, resolveContexts; - - // add listeners to Deferred subordinates; treat others as resolved - if ( length > 1 ) { - progressValues = new Array( length ); - progressContexts = new Array( length ); - resolveContexts = new Array( length ); - for ( ; i < length; i++ ) { - if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { - resolveValues[ i ].promise() - .done( updateFunc( i, resolveContexts, resolveValues ) ) - .fail( deferred.reject ) - .progress( updateFunc( i, progressContexts, progressValues ) ); - } else { - --remaining; - } - } - } - - // if we're not waiting on anything, resolve the master - if ( !remaining ) { - deferred.resolveWith( resolveContexts, resolveValues ); - } - - return deferred.promise(); - } -}); -jQuery.support = (function( support ) { - var input = document.createElement("input"), - fragment = document.createDocumentFragment(), - div = document.createElement("div"), - select = document.createElement("select"), - opt = select.appendChild( document.createElement("option") ); - - // Finish early in limited environments - if ( !input.type ) { - return support; - } - - input.type = "checkbox"; - - // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 - // Check the default checkbox/radio value ("" on old WebKit; "on" elsewhere) - support.checkOn = input.value !== ""; - - // Must access the parent to make an option select properly - // Support: IE9, IE10 - support.optSelected = opt.selected; - - // Will be defined later - support.reliableMarginRight = true; - support.boxSizingReliable = true; - support.pixelPosition = false; - - // Make sure checked status is properly cloned - // Support: IE9, IE10 - input.checked = true; - support.noCloneChecked = input.cloneNode( true ).checked; - - // Make sure that the options inside disabled selects aren't marked as disabled - // (WebKit marks them as disabled) - select.disabled = true; - support.optDisabled = !opt.disabled; - - // Check if an input maintains its value after becoming a radio - // Support: IE9, IE10 - input = document.createElement("input"); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; - - // #11217 - WebKit loses check when the name is after the checked attribute - input.setAttribute( "checked", "t" ); - input.setAttribute( "name", "t" ); - - fragment.appendChild( input ); - - // Support: Safari 5.1, Android 4.x, Android 2.3 - // old WebKit doesn't clone checked state correctly in fragments - support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: Firefox, Chrome, Safari - // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) - support.focusinBubbles = "onfocusin" in window; - - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - // Run tests that need a body at doc ready - jQuery(function() { - var container, marginDiv, - // Support: Firefox, Android 2.3 (Prefixed box-sizing versions). - divReset = "padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box", - body = document.getElementsByTagName("body")[ 0 ]; - - if ( !body ) { - // Return for frameset docs that don't have a body - return; - } - - container = document.createElement("div"); - container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px"; - - // Check box-sizing and margin behavior. - body.appendChild( container ).appendChild( div ); - div.innerHTML = ""; - // Support: Firefox, Android 2.3 (Prefixed box-sizing versions). - div.style.cssText = "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%"; - - // Workaround failing boxSizing test due to offsetWidth returning wrong value - // with some non-1 values of body zoom, ticket #13543 - jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() { - support.boxSizing = div.offsetWidth === 4; - }); - - // Use window.getComputedStyle because jsdom on node.js will break without it. - if ( window.getComputedStyle ) { - support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%"; - support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px"; - - // Support: Android 2.3 - // Check if div with explicit width and no margin-right incorrectly - // gets computed margin-right based on width of container. (#3333) - // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right - marginDiv = div.appendChild( document.createElement("div") ); - marginDiv.style.cssText = div.style.cssText = divReset; - marginDiv.style.marginRight = marginDiv.style.width = "0"; - div.style.width = "1px"; - - support.reliableMarginRight = - !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight ); - } - - body.removeChild( container ); - }); - - return support; -})( {} ); - -/* - Implementation Summary - - 1. Enforce API surface and semantic compatibility with 1.9.x branch - 2. Improve the module's maintainability by reducing the storage - paths to a single mechanism. - 3. Use the same single mechanism to support "private" and "user" data. - 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) - 5. Avoid exposing implementation details on user objects (eg. expando properties) - 6. Provide a clear path for implementation upgrade to WeakMap in 2014 -*/ -var data_user, data_priv, - rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, - rmultiDash = /([A-Z])/g; - -function Data() { - // Support: Android < 4, - // Old WebKit does not have Object.preventExtensions/freeze method, - // return new empty object instead with no [[set]] accessor - Object.defineProperty( this.cache = {}, 0, { - get: function() { - return {}; - } - }); - - this.expando = jQuery.expando + Math.random(); -} - -Data.uid = 1; - -Data.accepts = function( owner ) { - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType ? - owner.nodeType === 1 || owner.nodeType === 9 : true; -}; - -Data.prototype = { - key: function( owner ) { - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return the key for a frozen object. - if ( !Data.accepts( owner ) ) { - return 0; - } - - var descriptor = {}, - // Check if the owner object already has a cache key - unlock = owner[ this.expando ]; - - // If not, create one - if ( !unlock ) { - unlock = Data.uid++; - - // Secure it in a non-enumerable, non-writable property - try { - descriptor[ this.expando ] = { value: unlock }; - Object.defineProperties( owner, descriptor ); - - // Support: Android < 4 - // Fallback to a less secure definition - } catch ( e ) { - descriptor[ this.expando ] = unlock; - jQuery.extend( owner, descriptor ); - } - } - - // Ensure the cache object - if ( !this.cache[ unlock ] ) { - this.cache[ unlock ] = {}; - } - - return unlock; - }, - set: function( owner, data, value ) { - var prop, - // There may be an unlock assigned to this node, - // if there is no entry for this "owner", create one inline - // and set the unlock as though an owner entry had always existed - unlock = this.key( owner ), - cache = this.cache[ unlock ]; - - // Handle: [ owner, key, value ] args - if ( typeof data === "string" ) { - cache[ data ] = value; - - // Handle: [ owner, { properties } ] args - } else { - // Fresh assignments by object are shallow copied - if ( jQuery.isEmptyObject( cache ) ) { - jQuery.extend( this.cache[ unlock ], data ); - // Otherwise, copy the properties one-by-one to the cache object - } else { - for ( prop in data ) { - cache[ prop ] = data[ prop ]; - } - } - } - return cache; - }, - get: function( owner, key ) { - // Either a valid cache is found, or will be created. - // New caches will be created and the unlock returned, - // allowing direct access to the newly created - // empty data object. A valid owner object must be provided. - var cache = this.cache[ this.key( owner ) ]; - - return key === undefined ? - cache : cache[ key ]; - }, - access: function( owner, key, value ) { - var stored; - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ((key && typeof key === "string") && value === undefined) ) { - - stored = this.get( owner, key ); - - return stored !== undefined ? - stored : this.get( owner, jQuery.camelCase(key) ); - } - - // [*]When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, name, camel, - unlock = this.key( owner ), - cache = this.cache[ unlock ]; - - if ( key === undefined ) { - this.cache[ unlock ] = {}; - - } else { - // Support array or space separated string of keys - if ( jQuery.isArray( key ) ) { - // If "name" is an array of keys... - // When data is initially created, via ("key", "val") signature, - // keys will be converted to camelCase. - // Since there is no way to tell _how_ a key was added, remove - // both plain key and camelCase key. #12786 - // This will only penalize the array argument path. - name = key.concat( key.map( jQuery.camelCase ) ); - } else { - camel = jQuery.camelCase( key ); - // Try the string as a key before any manipulation - if ( key in cache ) { - name = [ key, camel ]; - } else { - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - name = camel; - name = name in cache ? - [ name ] : ( name.match( core_rnotwhite ) || [] ); - } - } - - i = name.length; - while ( i-- ) { - delete cache[ name[ i ] ]; - } - } - }, - hasData: function( owner ) { - return !jQuery.isEmptyObject( - this.cache[ owner[ this.expando ] ] || {} - ); - }, - discard: function( owner ) { - if ( owner[ this.expando ] ) { - delete this.cache[ owner[ this.expando ] ]; - } - } -}; - -// These may be used throughout the jQuery core codebase -data_user = new Data(); -data_priv = new Data(); - - -jQuery.extend({ - acceptData: Data.accepts, - - hasData: function( elem ) { - return data_user.hasData( elem ) || data_priv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return data_user.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - data_user.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to data_priv methods, these can be deprecated. - _data: function( elem, name, data ) { - return data_priv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - data_priv.remove( elem, name ); - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var attrs, name, - elem = this[ 0 ], - i = 0, - data = null; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = data_user.get( elem ); - - if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) { - attrs = elem.attributes; - for ( ; i < attrs.length; i++ ) { - name = attrs[ i ].name; - - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice(5) ); - dataAttr( elem, name, data[ name ] ); - } - } - data_priv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each(function() { - data_user.set( this, key ); - }); - } - - return jQuery.access( this, function( value ) { - var data, - camelKey = jQuery.camelCase( key ); - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - // Attempt to get data from the cache - // with the key as-is - data = data_user.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to get data from the cache - // with the key camelized - data = data_user.get( elem, camelKey ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, camelKey, undefined ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each(function() { - // First, attempt to store a copy or reference of any - // data that might've been store with a camelCased key. - var data = data_user.get( this, camelKey ); - - // For HTML5 data-* attribute interop, we have to - // store property names with dashes in a camelCase form. - // This might not apply to all properties...* - data_user.set( this, camelKey, value ); - - // *... In the case of properties that might _actually_ - // have dashes, we need to also store a copy of that - // unchanged property. - if ( key.indexOf("-") !== -1 && data !== undefined ) { - data_user.set( this, key, value ); - } - }); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each(function() { - data_user.remove( this, key ); - }); - } -}); - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test( data ) ? JSON.parse( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - data_user.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} -jQuery.extend({ - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = data_priv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || jQuery.isArray( data ) ) { - queue = data_priv.access( elem, type, jQuery.makeArray(data) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // not intended for public consumption - generates a queueHooks object, or returns the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return data_priv.get( elem, key ) || data_priv.access( elem, key, { - empty: jQuery.Callbacks("once memory").add(function() { - data_priv.remove( elem, [ type + "queue", key ] ); - }) - }); - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[0], type ); - } - - return data === undefined ? - this : - this.each(function() { - var queue = jQuery.queue( this, type, data ); - - // ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - // Based off of the plugin by Clint Helfers, with permission. - // http://blindsignals.com/index.php/2009/07/jquery-delay/ - delay: function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = setTimeout( next, time ); - hooks.stop = function() { - clearTimeout( timeout ); - }; - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while( i-- ) { - tmp = data_priv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -}); -var nodeHook, boolHook, - rclass = /[\t\r\n\f]/g, - rreturn = /\r/g, - rfocusable = /^(?:input|select|textarea|button)$/i; - -jQuery.fn.extend({ - attr: function( name, value ) { - return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each(function() { - jQuery.removeAttr( this, name ); - }); - }, - - prop: function( name, value ) { - return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each(function() { - delete this[ jQuery.propFix[ name ] || name ]; - }); - }, - - addClass: function( value ) { - var classes, elem, cur, clazz, j, - i = 0, - len = this.length, - proceed = typeof value === "string" && value; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).addClass( value.call( this, j, this.className ) ); - }); - } - - if ( proceed ) { - // The disjunction here is for better compressibility (see removeClass) - classes = ( value || "" ).match( core_rnotwhite ) || []; - - for ( ; i < len; i++ ) { - elem = this[ i ]; - cur = elem.nodeType === 1 && ( elem.className ? - ( " " + elem.className + " " ).replace( rclass, " " ) : - " " - ); - - if ( cur ) { - j = 0; - while ( (clazz = classes[j++]) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - elem.className = jQuery.trim( cur ); - - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, clazz, j, - i = 0, - len = this.length, - proceed = arguments.length === 0 || typeof value === "string" && value; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).removeClass( value.call( this, j, this.className ) ); - }); - } - if ( proceed ) { - classes = ( value || "" ).match( core_rnotwhite ) || []; - - for ( ; i < len; i++ ) { - elem = this[ i ]; - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( elem.className ? - ( " " + elem.className + " " ).replace( rclass, " " ) : - "" - ); - - if ( cur ) { - j = 0; - while ( (clazz = classes[j++]) ) { - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) >= 0 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - elem.className = value ? jQuery.trim( cur ) : ""; - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value; - - if ( typeof stateVal === "boolean" && type === "string" ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( jQuery.isFunction( value ) ) { - return this.each(function( i ) { - jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); - }); - } - - return this.each(function() { - if ( type === "string" ) { - // toggle individual class names - var className, - i = 0, - self = jQuery( this ), - classNames = value.match( core_rnotwhite ) || []; - - while ( (className = classNames[ i++ ]) ) { - // check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( type === core_strundefined || type === "boolean" ) { - if ( this.className ) { - // store className if set - data_priv.set( this, "__className__", this.className ); - } - - // If the element has a class name or if we're passed "false", - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || ""; - } - }); - }, - - hasClass: function( selector ) { - var className = " " + selector + " ", - i = 0, - l = this.length; - for ( ; i < l; i++ ) { - if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) { - return true; - } - } - - return false; - }, - - val: function( value ) { - var hooks, ret, isFunction, - elem = this[0]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { - return ret; - } - - ret = elem.value; - - return typeof ret === "string" ? - // handle most common string cases - ret.replace(rreturn, "") : - // handle cases where value is null/undef or number - ret == null ? "" : ret; - } - - return; - } - - isFunction = jQuery.isFunction( value ); - - return this.each(function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - } else if ( typeof val === "number" ) { - val += ""; - } else if ( jQuery.isArray( val ) ) { - val = jQuery.map(val, function ( value ) { - return value == null ? "" : value + ""; - }); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - }); - } -}); - -jQuery.extend({ - valHooks: { - option: { - get: function( elem ) { - // attributes.value is undefined in Blackberry 4.7 but - // uses .value. See #6932 - var val = elem.attributes.value; - return !val || val.specified ? elem.value : elem.text; - } - }, - select: { - get: function( elem ) { - var value, option, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one" || index < 0, - values = one ? null : [], - max = one ? index + 1 : options.length, - i = index < 0 ? - max : - one ? index : 0; - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // IE6-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - // Don't return options that are disabled or in a disabled optgroup - ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) && - ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) { - optionSet = true; - } - } - - // force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - }, - - attr: function( elem, name, value ) { - var hooks, ret, - nType = elem.nodeType; - - // don't get/set attributes on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === core_strundefined ) { - return jQuery.prop( elem, name, value ); - } - - // All attributes are lowercase - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - name = name.toLowerCase(); - hooks = jQuery.attrHooks[ name ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook ); - } - - if ( value !== undefined ) { - - if ( value === null ) { - jQuery.removeAttr( elem, name ); - - } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - elem.setAttribute( name, value + "" ); - return value; - } - - } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? - undefined : - ret; - } - }, - - removeAttr: function( elem, value ) { - var name, propName, - i = 0, - attrNames = value && value.match( core_rnotwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( (name = attrNames[i++]) ) { - propName = jQuery.propFix[ name ] || name; - - // Boolean attributes get special treatment (#10870) - if ( jQuery.expr.match.bool.test( name ) ) { - // Set corresponding property to false - elem[ propName ] = false; - } - - elem.removeAttribute( name ); - } - } - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { - // Setting the type on a radio button after the value resets the value in IE6-9 - // Reset value to default in case type is set after value during creation - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - }, - - prop: function( elem, name, value ) { - var ret, hooks, notxml, - nType = elem.nodeType; - - // don't get/set properties on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - if ( notxml ) { - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ? - ret : - ( elem[ name ] = value ); - - } else { - return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ? - ret : - elem[ name ]; - } - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ? - elem.tabIndex : - -1; - } - } - } -}); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { - var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr; - - jQuery.expr.attrHandle[ name ] = function( elem, name, isXML ) { - var fn = jQuery.expr.attrHandle[ name ], - ret = isXML ? - undefined : - /* jshint eqeqeq: false */ - // Temporarily disable this handler to check existence - (jQuery.expr.attrHandle[ name ] = undefined) != - getter( elem, name, isXML ) ? - - name.toLowerCase() : - null; - - // Restore handler - jQuery.expr.attrHandle[ name ] = fn; - - return ret; - }; -}); - -// Support: IE9+ -// Selectedness for an option in an optgroup can be inaccurate -if ( !jQuery.support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - } - }; -} - -jQuery.each([ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -}); - -// Radios and checkboxes getter/setter -jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( jQuery.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); - } - } - }; - if ( !jQuery.support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - // Support: Webkit - // "" is returned instead of "on" if a value isn't specified - return elem.getAttribute("value") === null ? "on" : elem.value; - }; - } -}); -var rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = data_priv.get( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !(events = elemData.events) ) { - events = elemData.events = {}; - } - if ( !(eventHandle = elemData.handle) ) { - eventHandle = elemData.handle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : - undefined; - }; - // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events - eventHandle.elem = elem; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( core_rnotwhite ) || [""]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend({ - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join(".") - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !(handlers = events[ type ]) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = data_priv.hasData( elem ) && data_priv.get( elem ); - - if ( !elemData || !(events = elemData.events) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( core_rnotwhite ) || [""]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - delete elemData.handle; - data_priv.remove( elem, "events" ); - } - }, - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, - eventPath = [ elem || document ], - type = core_hasOwn.call( event, "type" ) ? event.type : event, - namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf(".") >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf(":") < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join("."); - event.namespace_re = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === (elem.ownerDocument || document) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) { - event.preventDefault(); - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && - jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event ); - - var i, j, ret, matched, handleObj, - handlerQueue = [], - args = core_slice.call( arguments ), - handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). - if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) - .apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( (event.result = ret) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, matches, sel, handleObj, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - // Black-hole SVG instance trees (#13180) - // Avoid non-left-click bubbling in Firefox (#3861) - if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.disabled !== true || event.type !== "click" ) { - matches = []; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matches[ sel ] === undefined ) { - matches[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) >= 0 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matches[ sel ] ) { - matches.push( handleObj ); - } - } - if ( matches.length ) { - handlerQueue.push({ elem: cur, handlers: matches }); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if ( delegateCount < handlers.length ) { - handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); - } - - return handlerQueue; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split(" "), - filter: function( event, original ) { - - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function( event, original ) { - var eventDoc, doc, body, - button = original.button; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } - }, - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, copy, - type = event.type, - originalEvent = event, - fixHook = this.fixHooks[ type ]; - - if ( !fixHook ) { - this.fixHooks[ type ] = fixHook = - rmouseEvent.test( type ) ? this.mouseHooks : - rkeyEvent.test( type ) ? this.keyHooks : - {}; - } - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = new jQuery.Event( originalEvent ); - - i = copy.length; - while ( i-- ) { - prop = copy[ i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Support: Cordova 2.5 (WebKit) (#13255) - // All events should have a target; Cordova deviceready doesn't - if ( !event.target ) { - event.target = document; - } - - // Support: Safari 6.0+, Chrome < 28 - // Target should not be a text node (#504, #13143) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - return fixHook.filter? fixHook.filter( event, originalEvent ) : event; - }, - - special: { - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return jQuery.nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined ) { - event.originalEvent.returnValue = event.result; - } - } - } - }, - - simulate: function( type, elem, event, bubble ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true, - originalEvent: {} - } - ); - if ( bubble ) { - jQuery.event.trigger( e, null, elem ); - } else { - jQuery.event.dispatch.call( elem, e ); - } - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } - } -}; - -jQuery.removeEvent = function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } -}; - -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !(this instanceof jQuery.Event) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = ( src.defaultPrevented || - src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && e.preventDefault ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && e.stopPropagation ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - this.isImmediatePropagationStopped = returnTrue; - this.stopPropagation(); - } -}; - -// Create mouseenter/leave events using mouseover/out and event-time checks -// Support: Chrome 15+ -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || (related !== target && !jQuery.contains( target, related )) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -}); - -// Create "bubbling" focus and blur events -// Support: Firefox, Chrome, Safari -if ( !jQuery.support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler while someone wants focusin/focusout - var attaches = 0, - handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - if ( attaches++ === 0 ) { - document.addEventListener( orig, handler, true ); - } - }, - teardown: function() { - if ( --attaches === 0 ) { - document.removeEventListener( orig, handler, true ); - } - } - }; - }); -} - -jQuery.fn.extend({ - - on: function( types, selector, data, fn, /*INTERNAL*/ one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - this.on( type, selector, data, types[ type ], one ); - } - return this; - } - - if ( data == null && fn == null ) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return this; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return this.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - }); - }, - one: function( types, selector, data, fn ) { - return this.on( types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each(function() { - jQuery.event.remove( this, types, fn, selector ); - }); - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - triggerHandler: function( type, data ) { - var elem = this[0]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -}); -var isSimple = /^.[^:#\[\.,]*$/, - rparentsprev = /^(?:parents|prev(?:Until|All))/, - rneedsContext = jQuery.expr.match.needsContext, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend({ - find: function( selector ) { - var i, - ret = [], - self = this, - len = self.length; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter(function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - }) ); - } - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - // Needed because $( selector, context ) becomes $( context ).find( selector ) - ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); - ret.selector = this.selector ? this.selector + " " + selector : selector; - return ret; - }, - - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter(function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - not: function( selector ) { - return this.pushStack( winnow(this, selector || [], true) ); - }, - - filter: function( selector ) { - return this.pushStack( winnow(this, selector || [], false) ); - }, - - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - pos = ( rneedsContext.test( selectors ) || typeof selectors !== "string" ) ? - jQuery( selectors, context || this.context ) : - 0; - - for ( ; i < l; i++ ) { - for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { - // Always skip document fragments - if ( cur.nodeType < 11 && (pos ? - pos.index(cur) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector(cur, selectors)) ) { - - cur = matched.push( cur ); - break; - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // index in selector - if ( typeof elem === "string" ) { - return core_indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return core_indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - var set = typeof selector === "string" ? - jQuery( selector, context ) : - jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), - all = jQuery.merge( this.get(), set ); - - return this.pushStack( jQuery.unique(all) ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter(selector) - ); - } -}); - -function sibling( cur, dir ) { - while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {} - - return cur; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return elem.contentDocument || jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.unique( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -}); - -jQuery.extend({ - filter: function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 && elem.nodeType === 1 ? - jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : - jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - })); - }, - - dir: function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; - }, - - sibling: function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; - } -}); - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - /* jshint -W018 */ - return !!qualifier.call( elem, i, elem ) !== not; - }); - - } - - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - }); - - } - - if ( typeof qualifier === "string" ) { - if ( isSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - qualifier = jQuery.filter( qualifier, elements ); - } - - return jQuery.grep( elements, function( elem ) { - return ( core_indexOf.call( qualifier, elem ) >= 0 ) !== not; - }); -} -var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, - rtagName = /<([\w:]+)/, - rhtml = /<|&#?\w+;/, - rnoInnerhtml = /<(?:script|style|link)/i, - manipulation_rcheckableType = /^(?:checkbox|radio)$/i, - // checked="checked" or checked - rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, - rscriptType = /^$|\/(?:java|ecma)script/i, - rscriptTypeMasked = /^true\/(.*)/, - rcleanScript = /^\s*\s*$/g, - - // We have to close these tags to support XHTML (#13200) - wrapMap = { - - // Support: IE 9 - option: [ 1, "" ], - - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] - }; - -// Support: IE 9 -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -jQuery.fn.extend({ - text: function( value ) { - return jQuery.access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().append( ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) ); - }, null, value, arguments.length ); - }, - - append: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - }); - }, - - prepend: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - }); - }, - - before: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - }); - }, - - after: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - }); - }, - - // keepData is for internal use only--do not document - remove: function( selector, keepData ) { - var elem, - elems = selector ? jQuery.filter( selector, this ) : this, - i = 0; - - for ( ; (elem = elems[i]) != null; i++ ) { - if ( !keepData && elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem ) ); - } - - if ( elem.parentNode ) { - if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { - setGlobalEval( getAll( elem, "script" ) ); - } - elem.parentNode.removeChild( elem ); - } - } - - return this; - }, - - empty: function() { - var elem, - i = 0; - - for ( ; (elem = this[i]) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function () { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - }); - }, - - html: function( value ) { - return jQuery.access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = value.replace( rxhtmlTag, "<$1>" ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var - // Snapshot the DOM in case .domManip sweeps something relevant into its fragment - args = jQuery.map( this, function( elem ) { - return [ elem.nextSibling, elem.parentNode ]; - }), - i = 0; - - // Make the changes, replacing each context element with the new content - this.domManip( arguments, function( elem ) { - var next = args[ i++ ], - parent = args[ i++ ]; - - if ( parent ) { - // Don't use the snapshot next if it has moved (#13810) - if ( next && next.parentNode !== parent ) { - next = this.nextSibling; - } - jQuery( this ).remove(); - parent.insertBefore( elem, next ); - } - // Allow new content to include elements from the context set - }, true ); - - // Force removal if there was no new content (e.g., from empty arguments) - return i ? this : this.remove(); - }, - - detach: function( selector ) { - return this.remove( selector, true ); - }, - - domManip: function( args, callback, allowIntersection ) { - - // Flatten any nested arrays - args = core_concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = this.length, - set = this, - iNoClone = l - 1, - value = args[ 0 ], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) { - return this.each(function( index ) { - var self = set.eq( index ); - if ( isFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - self.domManip( args, callback, allowIntersection ); - }); - } - - if ( l ) { - fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - if ( first ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - // Support: QtWebKit - // jQuery.merge because core_push.apply(_, arraylike) throws - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( this[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { - - if ( node.src ) { - // Hope ajax is available... - jQuery._evalUrl( node.src ); - } else { - jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); - } - } - } - } - } - } - - return this; - } -}); - -jQuery.each({ - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: QtWebKit - // .get() because core_push.apply(_, arraylike) throws - core_push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -}); - -jQuery.extend({ - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); - - // Support: IE >= 9 - // Fix Cloning issues - if ( !jQuery.support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - buildFragment: function( elems, context, scripts, selection ) { - var elem, tmp, tag, wrap, contains, j, - i = 0, - l = elems.length, - fragment = context.createDocumentFragment(), - nodes = []; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - // Support: QtWebKit - // jQuery.merge because core_push.apply(_, arraylike) throws - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement("div") ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || ["", ""] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: QtWebKit - // jQuery.merge because core_push.apply(_, arraylike) throws - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Fixes #12346 - // Support: Webkit, IE - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( (elem = nodes[ i++ ]) ) { - - // #4087 - If origin and destination elements are the same, and this is - // that element, do not do anything - if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( (elem = tmp[ j++ ]) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; - }, - - cleanData: function( elems ) { - var data, elem, events, type, key, j, - special = jQuery.event.special, - i = 0; - - for ( ; (elem = elems[ i ]) !== undefined; i++ ) { - if ( Data.accepts( elem ) ) { - key = elem[ data_priv.expando ]; - - if ( key && (data = data_priv.cache[ key ]) ) { - events = Object.keys( data.events || {} ); - if ( events.length ) { - for ( j = 0; (type = events[j]) !== undefined; j++ ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - if ( data_priv.cache[ key ] ) { - // Discard any remaining `private` data - delete data_priv.cache[ key ]; - } - } - } - // Discard any remaining `user` data - delete data_user.cache[ elem[ data_user.expando ] ]; - } - }, - - _evalUrl: function( url ) { - return jQuery.ajax({ - url: url, - type: "GET", - dataType: "script", - async: false, - global: false, - "throws": true - }); - } -}); - -// Support: 1.x compatibility -// Manipulating tables requires a tbody -function manipulationTarget( elem, content ) { - return jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ? - - elem.getElementsByTagName("tbody")[0] || - elem.appendChild( elem.ownerDocument.createElement("tbody") ) : - elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - - if ( match ) { - elem.type = match[ 1 ]; - } else { - elem.removeAttribute("type"); - } - - return elem; -} - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var l = elems.length, - i = 0; - - for ( ; i < l; i++ ) { - data_priv.set( - elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" ) - ); - } -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( data_priv.hasData( src ) ) { - pdataOld = data_priv.access( src ); - pdataCur = data_priv.set( dest, pdataOld ); - events = pdataOld.events; - - if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( data_user.hasData( src ) ) { - udataOld = data_user.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - data_user.set( dest, udataCur ); - } -} - - -function getAll( context, tag ) { - var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) : - context.querySelectorAll ? context.querySelectorAll( tag || "*" ) : - []; - - return tag === undefined || tag && jQuery.nodeName( context, tag ) ? - jQuery.merge( [ context ], ret ) : - ret; -} - -// Support: IE >= 9 -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} -jQuery.fn.extend({ - wrapAll: function( html ) { - var wrap; - - if ( jQuery.isFunction( html ) ) { - return this.each(function( i ) { - jQuery( this ).wrapAll( html.call(this, i) ); - }); - } - - if ( this[ 0 ] ) { - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map(function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - }).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each(function( i ) { - jQuery( this ).wrapInner( html.call(this, i) ); - }); - } - - return this.each(function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - }); - }, - - wrap: function( html ) { - var isFunction = jQuery.isFunction( html ); - - return this.each(function( i ) { - jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); - }); - }, - - unwrap: function() { - return this.parent().each(function() { - if ( !jQuery.nodeName( this, "body" ) ) { - jQuery( this ).replaceWith( this.childNodes ); - } - }).end(); - } -}); -var curCSS, iframe, - // swappable if display is none or starts with table except "table", "table-cell", or "table-caption" - // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rmargin = /^margin/, - rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ), - rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ), - rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ), - elemdisplay = { BODY: "block" }, - - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: 0, - fontWeight: 400 - }, - - cssExpand = [ "Top", "Right", "Bottom", "Left" ], - cssPrefixes = [ "Webkit", "O", "Moz", "ms" ]; - -// return a css property mapped to a potentially vendor prefixed property -function vendorPropName( style, name ) { - - // shortcut for names that are not vendor prefixed - if ( name in style ) { - return name; - } - - // check for vendor prefixed names - var capName = name.charAt(0).toUpperCase() + name.slice(1), - origName = name, - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in style ) { - return name; - } - } - - return origName; -} - -function isHidden( elem, el ) { - // isHidden might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); -} - -// NOTE: we've included the "window" in window.getComputedStyle -// because jsdom on node.js will break without it. -function getStyles( elem ) { - return window.getComputedStyle( elem, null ); -} - -function showHide( elements, show ) { - var display, elem, hidden, - values = [], - index = 0, - length = elements.length; - - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - values[ index ] = data_priv.get( elem, "olddisplay" ); - display = elem.style.display; - if ( show ) { - // Reset the inline display of this element to learn if it is - // being hidden by cascaded rules or not - if ( !values[ index ] && display === "none" ) { - elem.style.display = ""; - } - - // Set elements which have been overridden with display: none - // in a stylesheet to whatever the default browser style is - // for such an element - if ( elem.style.display === "" && isHidden( elem ) ) { - values[ index ] = data_priv.access( elem, "olddisplay", css_defaultDisplay(elem.nodeName) ); - } - } else { - - if ( !values[ index ] ) { - hidden = isHidden( elem ); - - if ( display && display !== "none" || !hidden ) { - data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css(elem, "display") ); - } - } - } - } - - // Set the display of most of the elements in a second loop - // to avoid the constant reflow - for ( index = 0; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - if ( !show || elem.style.display === "none" || elem.style.display === "" ) { - elem.style.display = show ? values[ index ] || "" : "none"; - } - } - - return elements; -} - -jQuery.fn.extend({ - css: function( name, value ) { - return jQuery.access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( jQuery.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - }, - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each(function() { - if ( isHidden( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - }); - } -}); - -jQuery.extend({ - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "columnCount": true, - "fillOpacity": true, - "fontWeight": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: { - // normalize float css property - "float": "cssFloat" - }, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = jQuery.camelCase( name ), - style = elem.style; - - name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) ); - - // gets hook for the prefixed version - // followed by the unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // convert relative number strings (+= or -=) to relative numbers. #7345 - if ( type === "string" && (ret = rrelNum.exec( value )) ) { - value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) ); - // Fixes bug #9237 - type = "number"; - } - - // Make sure that NaN and null values aren't set. See: #7116 - if ( value == null || type === "number" && isNaN( value ) ) { - return; - } - - // If a number was passed in, add 'px' to the (except for certain CSS properties) - if ( type === "number" && !jQuery.cssNumber[ origName ] ) { - value += "px"; - } - - // Fixes #8908, it can be done more correctly by specifying setters in cssHooks, - // but it would mean to define eight (for every problematic property) identical functions - if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) { - style[ name ] = value; - } - - } else { - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = jQuery.camelCase( name ); - - // Make sure that we're working with the right name - name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) ); - - // gets hook for the prefixed version - // followed by the unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - //convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Return, converting to number if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || jQuery.isNumeric( num ) ? num || 0 : val; - } - return val; - } -}); - -curCSS = function( elem, name, _computed ) { - var width, minWidth, maxWidth, - computed = _computed || getStyles( elem ), - - // Support: IE9 - // getPropertyValue is only needed for .css('filter') in IE9, see #12537 - ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined, - style = elem.style; - - if ( computed ) { - - if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { - ret = jQuery.style( elem, name ); - } - - // Support: Safari 5.1 - // A tribute to the "awesome hack by Dean Edwards" - // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels - // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values - if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret; -}; - - -function setPositiveNumber( elem, value, subtract ) { - var matches = rnumsplit.exec( value ); - return matches ? - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : - value; -} - -function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { - var i = extra === ( isBorderBox ? "border" : "content" ) ? - // If we already have the right measurement, avoid augmentation - 4 : - // Otherwise initialize for horizontal or vertical properties - name === "width" ? 1 : 0, - - val = 0; - - for ( ; i < 4; i += 2 ) { - // both box models exclude margin, so add it if we want it - if ( extra === "margin" ) { - val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); - } - - if ( isBorderBox ) { - // border-box includes padding, so remove it if we want content - if ( extra === "content" ) { - val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // at this point, extra isn't border nor margin, so remove border - if ( extra !== "margin" ) { - val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } else { - // at this point, extra isn't content, so add padding - val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // at this point, extra isn't content nor padding, so add border - if ( extra !== "padding" ) { - val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - return val; -} - -function getWidthOrHeight( elem, name, extra ) { - - // Start with offset property, which is equivalent to the border-box value - var valueIsBorderBox = true, - val = name === "width" ? elem.offsetWidth : elem.offsetHeight, - styles = getStyles( elem ), - isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // some non-html elements return undefined for offsetWidth, so check for null/undefined - // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 - // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 - if ( val <= 0 || val == null ) { - // Fall back to computed then uncomputed css if necessary - val = curCSS( elem, name, styles ); - if ( val < 0 || val == null ) { - val = elem.style[ name ]; - } - - // Computed unit is not pixels. Stop here and return. - if ( rnumnonpx.test(val) ) { - return val; - } - - // we need the check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] ); - - // Normalize "", auto, and prepare for extra - val = parseFloat( val ) || 0; - } - - // use the active box-sizing model to add/subtract irrelevant styles - return ( val + - augmentWidthOrHeight( - elem, - name, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles - ) - ) + "px"; -} - -// Try to determine the default display value of an element -function css_defaultDisplay( nodeName ) { - var doc = document, - display = elemdisplay[ nodeName ]; - - if ( !display ) { - display = actualDisplay( nodeName, doc ); - - // If the simple way fails, read from inside an iframe - if ( display === "none" || !display ) { - // Use the already-created iframe if possible - iframe = ( iframe || - jQuery(" - -

GWT Jersey Demo for atmosphere

-
-
- - diff --git a/extensions-samples/gwt/gwt20-json/pom.xml b/extensions-samples/gwt/gwt20-json/pom.xml deleted file mode 100644 index 3fc4ace04..000000000 --- a/extensions-samples/gwt/gwt20-json/pom.xml +++ /dev/null @@ -1,130 +0,0 @@ - - 4.0.0 - - org.atmosphere.extensions - atmosphere-samples-gwt20-project - 2.7.0-SNAPSHOT - ../ - - org.atmosphere.samples - gwt20-json - 2.7.0-SNAPSHOT - war - gwt20-json - - - GwtJsonDemo - org.atmosphere.samples.${gwtModuleName} - ${basedir}/src/main/webapp - false - true - PRETTY - true - true - ${war.target}/WEB-INF/classes - - - - ${project.build.directory}/${project.build.finalName}/WEB-INF/classes - - - org.codehaus.mojo - gwt-maven-plugin - ${gwt-version} - - ${gwtModule} - ${gwt-version} - http://localhost:8888/index.jsp - false - true - -Djava.util.logging.config.file=${project.build.outputDirectory}/logging.properties - - - - - -Xmx512m - - - generateAsync - compile - - - - - - - maven-clean-plugin - 2.4 - - - - ${outputDir} - - - ${war.target}/${gwtModuleName} - - - ${war.target}/WEB-INF/lib - - *.jar - - - - ${war.target}/WEB-INF/deploy - - - ${basedir}/src/main - - gwt-unitCache/** - - - - - - - - - - - - org.atmosphere.extensions - atmosphere-gwt20-client - provided - - - org.atmosphere.client - javascript - ${client-version} - war - compile - - - org.atmosphere - atmosphere-runtime - ${atmosphere-version} - - - org.atmosphere.extensions - atmosphere-gwt20-server - - - org.atmosphere.extensions - atmosphere-gwt20-jackson - - - com.google.gwt - gwt-user - provided - - - com.google.gwt - gwt-servlet - runtime - - - org.slf4j - slf4j-jdk14 - - - - diff --git a/extensions-samples/gwt/gwt20-json/src/main/java/org/atmosphere/samples/GwtJsonDemo.gwt.xml b/extensions-samples/gwt/gwt20-json/src/main/java/org/atmosphere/samples/GwtJsonDemo.gwt.xml deleted file mode 100644 index bf166ce15..000000000 --- a/extensions-samples/gwt/gwt20-json/src/main/java/org/atmosphere/samples/GwtJsonDemo.gwt.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/extensions-samples/gwt/gwt20-json/src/main/java/org/atmosphere/samples/client/Event.java b/extensions-samples/gwt/gwt20-json/src/main/java/org/atmosphere/samples/client/Event.java deleted file mode 100644 index 8148191b6..000000000 --- a/extensions-samples/gwt/gwt20-json/src/main/java/org/atmosphere/samples/client/Event.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2008-2021 Async-IO.org - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.atmosphere.samples.client; - -/** - * simple event - * @author jotec - */ -public interface Event { - - String getData(); - - void setData(String data); - -} diff --git a/extensions-samples/gwt/gwt20-json/src/main/java/org/atmosphere/samples/client/GwtJsonDemo.java b/extensions-samples/gwt/gwt20-json/src/main/java/org/atmosphere/samples/client/GwtJsonDemo.java deleted file mode 100644 index 1b8fa447c..000000000 --- a/extensions-samples/gwt/gwt20-json/src/main/java/org/atmosphere/samples/client/GwtJsonDemo.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright 2008-2021 Async-IO.org - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.atmosphere.samples.client; - -import com.google.gwt.core.client.EntryPoint; -import com.google.gwt.core.client.GWT; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.logging.client.HasWidgetsLogHandler; -import com.google.gwt.user.client.rpc.SerializationException; -import com.google.gwt.user.client.ui.Button; -import com.google.gwt.user.client.ui.HTMLPanel; -import com.google.gwt.user.client.ui.HorizontalPanel; -import com.google.gwt.user.client.ui.RootPanel; -import com.google.gwt.user.client.ui.TextBox; -import com.google.gwt.user.client.ui.Widget; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; -import org.atmosphere.gwt20.client.Atmosphere; -import org.atmosphere.gwt20.client.AtmosphereCloseHandler; -import org.atmosphere.gwt20.client.AtmosphereMessageHandler; -import org.atmosphere.gwt20.client.AtmosphereOpenHandler; -import org.atmosphere.gwt20.client.AtmosphereRequest; -import org.atmosphere.gwt20.client.AtmosphereRequestConfig; -import org.atmosphere.gwt20.client.AtmosphereResponse; -import org.atmosphere.gwt20.client.AutoBeanClientSerializer; - -/** - * - * @author jotec - */ -public class GwtJsonDemo implements EntryPoint { - - static final Logger logger = Logger.getLogger(GwtJsonDemo.class.getName()); - - private MyBeanFactory beanFactory = GWT.create(MyBeanFactory.class); - - @Override - public void onModuleLoad() { - - GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() { - @Override - public void onUncaughtException(Throwable e) { - logger.log(Level.SEVERE, "Uncaught exception", e); - } - }); - - - HorizontalPanel buttons = new HorizontalPanel(); - final TextBox messageInput = new TextBox(); - buttons.add(messageInput); - - Button sendJSON = new Button("send (JSON)"); - buttons.add(sendJSON); - - - RootPanel.get("buttonbar").add(buttons); - - - HTMLPanel logPanel = new HTMLPanel("") { - @Override - public void add(Widget widget) { - super.add(widget); - widget.getElement().scrollIntoView(); - } - }; - RootPanel.get("logger").add(logPanel); - Logger.getLogger("").addHandler(new HasWidgetsLogHandler(logPanel)); - - - AutoBeanClientSerializer json_serializer = new AutoBeanClientSerializer(); - json_serializer.registerBeanFactory(beanFactory, Event.class); - - // setup JSON Atmosphere connection - AtmosphereRequestConfig jsonRequestConfig = AtmosphereRequestConfig.create(json_serializer); - jsonRequestConfig.setUrl(GWT.getModuleBaseURL() + "atmosphere/json"); - jsonRequestConfig.setContentType("application/json; charset=UTF-8"); - jsonRequestConfig.setTransport(AtmosphereRequestConfig.Transport.STREAMING); - jsonRequestConfig.setFallbackTransport(AtmosphereRequestConfig.Transport.LONG_POLLING); - jsonRequestConfig.setOpenHandler(new AtmosphereOpenHandler() { - @Override - public void onOpen(AtmosphereResponse response) { - logger.info("JSON Connection opened"); - } - }); - jsonRequestConfig.setCloseHandler(new AtmosphereCloseHandler() { - @Override - public void onClose(AtmosphereResponse response) { - logger.info("JSON Connection closed"); - } - }); - jsonRequestConfig.setMessageHandler(new AtmosphereMessageHandler() { - @Override - public void onMessage(AtmosphereResponse response) { - List events = response.getMessages(); - for (Event event : events) { - logger.info("received message through JSON: " + event.getData()); - } - } - }); - - - Atmosphere atmosphere = Atmosphere.create(); - final AtmosphereRequest jsonRequest = atmosphere.subscribe(jsonRequestConfig); - - - sendJSON.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - if (messageInput.getText().trim().length() > 0) { - try { - // service.sendEvent(new Event(messageInput.getText()), callback); - Event myevent = beanFactory.create(Event.class).as(); - myevent.setData(messageInput.getText()); - jsonRequest.push(myevent); - } catch (SerializationException ex) { - logger.log(Level.SEVERE, "Failed to serialize message", ex); - } - } - } - }); - - - } - -} diff --git a/extensions-samples/gwt/gwt20-json/src/main/java/org/atmosphere/samples/client/MyBeanFactory.java b/extensions-samples/gwt/gwt20-json/src/main/java/org/atmosphere/samples/client/MyBeanFactory.java deleted file mode 100644 index 9d0a8bcc8..000000000 --- a/extensions-samples/gwt/gwt20-json/src/main/java/org/atmosphere/samples/client/MyBeanFactory.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package org.atmosphere.samples.client; - -import com.google.web.bindery.autobean.shared.AutoBean; -import com.google.web.bindery.autobean.shared.AutoBeanFactory; - -/** - * - * @author rinchen tenpel - */ -public interface MyBeanFactory extends AutoBeanFactory { - AutoBean event(Event event); -} diff --git a/extensions-samples/gwt/gwt20-json/src/main/java/org/atmosphere/samples/server/JsonAtmosphereHandler.java b/extensions-samples/gwt/gwt20-json/src/main/java/org/atmosphere/samples/server/JsonAtmosphereHandler.java deleted file mode 100644 index 794c3533d..000000000 --- a/extensions-samples/gwt/gwt20-json/src/main/java/org/atmosphere/samples/server/JsonAtmosphereHandler.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright 2008-2021 Async-IO.org - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.atmosphere.samples.server; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.OutputStream; -import java.nio.charset.Charset; -import java.util.logging.Level; -import java.util.logging.Logger; -import org.atmosphere.cpr.AtmosphereResource; -import org.atmosphere.cpr.DefaultBroadcasterFactory; -import org.atmosphere.cpr.Serializer; -import org.atmosphere.gwt20.jackson.JacksonSerializerProvider; -import org.atmosphere.gwt20.server.SerializationException; -import org.atmosphere.gwt20.server.ServerSerializer; -import org.atmosphere.handler.AbstractReflectorAtmosphereHandler; - -/** - * This is a simple handler to show how to use JSON with the gwt-wrapper client - * - * @author p.havelaar - */ -public class JsonAtmosphereHandler extends AbstractReflectorAtmosphereHandler { - - static final Logger logger = Logger.getLogger("AtmosphereHandler"); - @Override - public void onRequest(AtmosphereResource ar) throws IOException { - if (ar.getRequest().getMethod().equals("GET") ) { - doGet(ar); - } else if (ar.getRequest().getMethod().equals("POST") ) { - doPost(ar); - } - } - - private ServerSerializer serializer = new JacksonSerializerProvider().getServerSerializer(); - - public void doGet(final AtmosphereResource ar) { - - ar.getResponse().setCharacterEncoding(ar.getRequest().getCharacterEncoding()); - ar.getResponse().setContentType("application/json"); - - // lookup the broadcaster, if not found create it. Name is arbitrary - ar.setBroadcaster(ar.getAtmosphereConfig().getBroadcasterFactory().lookup("MyBroadcaster", true)); - - ar.setSerializer(new Serializer() { - Charset charset = Charset.forName(ar.getResponse().getCharacterEncoding()); - @Override - public void write(OutputStream os, Object o) throws IOException { - try { - logger.info("Writing object to JSON outputstream with charset: " + charset.displayName()); - String payload = serializer.serialize(o); - os.write(payload.getBytes(charset)); - os.flush(); - } catch (SerializationException ex) { - throw new IOException("Failed to serialize object to JSON", ex); - } - } - }); - - ar.suspend(); - } - - public void doPost(AtmosphereResource ar) throws IOException { - StringBuilder data = new StringBuilder(); - BufferedReader requestReader; - try { - requestReader = ar.getRequest().getReader(); - char[] buf = new char[5120]; - int read = -1; - while ((read = requestReader.read(buf)) > 0) { - data.append(buf, 0, read); - } - logger.info("Received json message from client: " + data.toString()); - - Object message = serializer.deserialize(data.toString()); - ar.getAtmosphereConfig().getBroadcasterFactory().lookup("MyBroadcaster").broadcast(message); - - } catch (SerializationException ex) { - logger.log(Level.SEVERE, "Failed to read request data", ex); - } - - } - - - @Override - public void destroy() { - - } - -} diff --git a/extensions-samples/gwt/gwt20-json/src/main/resources/logging.properties b/extensions-samples/gwt/gwt20-json/src/main/resources/logging.properties deleted file mode 100644 index 580ab7860..000000000 --- a/extensions-samples/gwt/gwt20-json/src/main/resources/logging.properties +++ /dev/null @@ -1,34 +0,0 @@ -# To change this template, choose Tools | Templates -# and open the template in the editor. - -handlers=java.util.logging.ConsoleHandler -#handlers=java.util.logging.ConsoleHandler,java.util.logging.FileHandler - -.level=INFO - -java.util.logging.ConsoleHandler.level=ALL -java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter - -# --- FileHandler --- -# Override of global logging level -java.util.logging.FileHandler.level=ALL - -# Naming style for the output file: -# (The output file is placed in the directory -# defined by the "user.home" System property.) -java.util.logging.FileHandler.pattern=gwt-wrapper-%u.log - -# Limiting size of output file in bytes: -java.util.logging.FileHandler.limit=50000 - -# Number of output files to cycle through, by appending an -# integer to the base file name: -java.util.logging.FileHandler.count=1 - -# Style of output (Simple or XML): -java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter - - -org.atmosphere.level=FINEST -org.atmosphere.extensions.level=FINEST -org.atmosphere.samples.level=FINEST \ No newline at end of file diff --git a/extensions-samples/gwt/gwt20-json/src/main/webapp/META-INF/MANIFEST.MF b/extensions-samples/gwt/gwt20-json/src/main/webapp/META-INF/MANIFEST.MF deleted file mode 100644 index 348f1bdd3..000000000 --- a/extensions-samples/gwt/gwt20-json/src/main/webapp/META-INF/MANIFEST.MF +++ /dev/null @@ -1 +0,0 @@ -Manifest-Version: 1.0 \ No newline at end of file diff --git a/extensions-samples/gwt/gwt20-json/src/main/webapp/META-INF/atmosphere.xml b/extensions-samples/gwt/gwt20-json/src/main/webapp/META-INF/atmosphere.xml deleted file mode 100644 index 951e99069..000000000 --- a/extensions-samples/gwt/gwt20-json/src/main/webapp/META-INF/atmosphere.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/extensions-samples/gwt/gwt20-json/src/main/webapp/WEB-INF/sun-web.xml b/extensions-samples/gwt/gwt20-json/src/main/webapp/WEB-INF/sun-web.xml deleted file mode 100644 index efbaa7bb9..000000000 --- a/extensions-samples/gwt/gwt20-json/src/main/webapp/WEB-INF/sun-web.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - Keep a copy of the generated servlet class' java code. - - - diff --git a/extensions-samples/gwt/gwt20-json/src/main/webapp/WEB-INF/web.xml b/extensions-samples/gwt/gwt20-json/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index faca508d7..000000000 --- a/extensions-samples/gwt/gwt20-json/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - gwt-test - - - AtmosphereServlet - AtmosphereServlet - org.atmosphere.cpr.AtmosphereServlet - - 1 - - true - - - AtmosphereServlet - /GwtJsonDemo/atmosphere/* - - - - index.jsp - - diff --git a/extensions-samples/gwt/gwt20-json/src/main/webapp/index.jsp b/extensions-samples/gwt/gwt20-json/src/main/webapp/index.jsp deleted file mode 100644 index 667f47de9..000000000 --- a/extensions-samples/gwt/gwt20-json/src/main/webapp/index.jsp +++ /dev/null @@ -1,37 +0,0 @@ -<%@page contentType="text/html" pageEncoding="UTF-8"%> - - - - - GWT JSON demo for atmosphere - - - - - - - - - - - - - - - - - - -

GWT JSON demo for atmosphere

-
-
- - diff --git a/extensions-samples/gwt/gwt20-managed-rpc/pom.xml b/extensions-samples/gwt/gwt20-managed-rpc/pom.xml deleted file mode 100644 index e5fbe7004..000000000 --- a/extensions-samples/gwt/gwt20-managed-rpc/pom.xml +++ /dev/null @@ -1,133 +0,0 @@ - - 4.0.0 - - org.atmosphere.extensions - atmosphere-samples-gwt20-project - 2.7.0-SNAPSHOT - ../ - - org.atmosphere.samples - gwt20-managed-rpc - 2.7.0-SNAPSHOT - war - gwt20-managed-rpc - - - GwtRpcDemo - org.atmosphere.samples.${gwtModuleName} - ${basedir}/src/main/webapp - false - true - PRETTY - true - true - ${war.target}/WEB-INF/classes - - - - ${project.artifactId} - ${project.build.directory}/${project.build.finalName}/WEB-INF/classes - - - org.codehaus.mojo - gwt-maven-plugin - ${gwt-version} - - ${gwtModule} - ${gwt-version} - http://localhost:8888/index.jsp - false - true - -Djava.util.logging.config.file=${project.build.outputDirectory}/logging.properties - - - - - -Xmx512m - - - generateAsync - compile - - - - - - - maven-clean-plugin - 2.4 - - - - ${outputDir} - - - ${war.target}/${gwtModuleName} - - - ${war.target}/WEB-INF/lib - - *.jar - - - - ${war.target}/WEB-INF/deploy - - - ${basedir}/src/main - - gwt-unitCache/** - - - - - - - - - - - - org.atmosphere - atmosphere-runtime - ${atmosphere-version} - - - org.atmosphere.client - javascript - ${client-version} - war - compile - - - org.atmosphere.extensions - atmosphere-gwt20-client - - - org.atmosphere.extensions - atmosphere-gwt20-managed - - - com.google.gwt - gwt-user - provided - - - com.google.gwt - gwt-servlet - runtime - - - ch.qos.logback - logback-classic - ${logback-version} - - - - ch.qos.logback - logback-core - ${logback-version} - - - - diff --git a/extensions-samples/gwt/gwt20-managed-rpc/src/main/java/org/atmosphere/samples/GwtRpcDemo.gwt.xml b/extensions-samples/gwt/gwt20-managed-rpc/src/main/java/org/atmosphere/samples/GwtRpcDemo.gwt.xml deleted file mode 100644 index 9c08c74aa..000000000 --- a/extensions-samples/gwt/gwt20-managed-rpc/src/main/java/org/atmosphere/samples/GwtRpcDemo.gwt.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/extensions-samples/gwt/gwt20-managed-rpc/src/main/java/org/atmosphere/samples/client/GwtRpcDemo.java b/extensions-samples/gwt/gwt20-managed-rpc/src/main/java/org/atmosphere/samples/client/GwtRpcDemo.java deleted file mode 100644 index e86524be9..000000000 --- a/extensions-samples/gwt/gwt20-managed-rpc/src/main/java/org/atmosphere/samples/client/GwtRpcDemo.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright 2008-2021 Async-IO.org - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.atmosphere.samples.client; - -import com.google.gwt.core.client.EntryPoint; -import com.google.gwt.core.client.GWT; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.logging.client.HasWidgetsLogHandler; -import com.google.gwt.user.client.rpc.SerializationException; -import com.google.gwt.user.client.ui.Button; -import com.google.gwt.user.client.ui.HTMLPanel; -import com.google.gwt.user.client.ui.HorizontalPanel; -import com.google.gwt.user.client.ui.RootPanel; -import com.google.gwt.user.client.ui.TextBox; -import com.google.gwt.user.client.ui.Widget; -import org.atmosphere.gwt20.client.Atmosphere; -import org.atmosphere.gwt20.client.AtmosphereCloseHandler; -import org.atmosphere.gwt20.client.AtmosphereMessage; -import org.atmosphere.gwt20.client.AtmosphereMessageHandler; -import org.atmosphere.gwt20.client.AtmosphereOpenHandler; -import org.atmosphere.gwt20.client.AtmosphereReopenHandler; -import org.atmosphere.gwt20.client.AtmosphereRequest; -import org.atmosphere.gwt20.client.AtmosphereRequestConfig; -import org.atmosphere.gwt20.client.AtmosphereResponse; -import org.atmosphere.gwt20.client.managed.RPCEvent; -import org.atmosphere.gwt20.client.managed.RPCSerializer; - -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -public class GwtRpcDemo implements EntryPoint { - - static final Logger logger = Logger.getLogger(GwtRpcDemo.class.getName()); - - @Override - public void onModuleLoad() { - - GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() { - @Override - public void onUncaughtException(Throwable e) { - logger.log(Level.SEVERE, "Uncaught exception", e); - } - }); - - - HorizontalPanel buttons = new HorizontalPanel(); - final TextBox messageInput = new TextBox(); - buttons.add(messageInput); - - Button sendRPC = new Button("send (GWT-RPC)"); - buttons.add(sendRPC); - - - RootPanel.get("buttonbar").add(buttons); - - - HTMLPanel logPanel = new HTMLPanel("") { - @Override - public void add(Widget widget) { - super.add(widget); - widget.getElement().scrollIntoView(); - } - }; - RootPanel.get("logger").add(logPanel); - Logger.getLogger("").addHandler(new HasWidgetsLogHandler(logPanel)); - - - RPCSerializer rpc_serializer = GWT.create(RPCSerializer.class); - - AtmosphereRequestConfig rpcRequestConfig = AtmosphereRequestConfig.create(rpc_serializer); - rpcRequestConfig.setUrl(GWT.getModuleBaseURL() + "atmosphere/rpc"); - rpcRequestConfig.setTransport(AtmosphereRequestConfig.Transport.WEBSOCKET); - rpcRequestConfig.setFallbackTransport(AtmosphereRequestConfig.Transport.LONG_POLLING); - rpcRequestConfig.setOpenHandler(new AtmosphereOpenHandler() { - @Override - public void onOpen(AtmosphereResponse response) { - logger.info("RPC Connection opened"); - } - }); - rpcRequestConfig.setReopenHandler(new AtmosphereReopenHandler() { - @Override - public void onReopen(AtmosphereResponse response) { - logger.info("RPC Connection reopened"); - } - }); - rpcRequestConfig.setCloseHandler(new AtmosphereCloseHandler() { - @Override - public void onClose(AtmosphereResponse response) { - logger.info("RPC Connection closed"); - } - }); - rpcRequestConfig.setMessageHandler(new AtmosphereMessageHandler() { - @Override - public void onMessage(AtmosphereResponse response) { - List messages = response.getMessages(); - for (RPCEvent event : messages) { - logger.info("received message through RPC: " + event.getMessage()); - } - } - }); - rpcRequestConfig.setFlags(AtmosphereRequestConfig.Flags.enableProtocol); - rpcRequestConfig.setFlags(AtmosphereRequestConfig.Flags.trackMessageLength); - - - Atmosphere atmosphere = Atmosphere.create(); - final AtmosphereRequest rpcRequest = atmosphere.subscribe(rpcRequestConfig); - - sendRPC.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - if (messageInput.getText().trim().length() > 0) { - try { - // service.sendEvent(new Event(messageInput.getText()), callback); - AtmosphereMessage myevent = new RPCEvent(); - myevent.setMessage(messageInput.getText()); - rpcRequest.push(myevent); - } catch (SerializationException ex) { - logger.log(Level.SEVERE, "Failed to serialize message", ex); - } - } - } - }); - } - -} diff --git a/extensions-samples/gwt/gwt20-managed-rpc/src/main/java/org/atmosphere/samples/server/ManagedGWTResource.java b/extensions-samples/gwt/gwt20-managed-rpc/src/main/java/org/atmosphere/samples/server/ManagedGWTResource.java deleted file mode 100644 index 46f48820e..000000000 --- a/extensions-samples/gwt/gwt20-managed-rpc/src/main/java/org/atmosphere/samples/server/ManagedGWTResource.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2008-2021 Async-IO.org - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.atmosphere.samples.server; - -import org.atmosphere.client.TrackMessageSizeInterceptor; -import org.atmosphere.config.service.Disconnect; -import org.atmosphere.config.service.ManagedService; -import org.atmosphere.config.service.Post; -import org.atmosphere.config.service.Ready; -import org.atmosphere.cpr.AtmosphereResource; -import org.atmosphere.cpr.AtmosphereResourceEvent; -import org.atmosphere.cpr.BroadcasterFactory; -import org.atmosphere.gwt20.server.GwtRpcInterceptor; -import org.atmosphere.gwt20.managed.AtmosphereMessageInterceptor; -import org.atmosphere.interceptor.AtmosphereResourceLifecycleInterceptor; -import org.atmosphere.interceptor.BroadcastOnPostAtmosphereInterceptor; -import org.atmosphere.interceptor.IdleResourceInterceptor; -import org.atmosphere.interceptor.SuspendTrackerInterceptor; - -import java.util.logging.Logger; - -/** - * Super simple managed echo application that use two broadcaster for pushing data back to the client. - * - * @author Jeanfrancois Arcand - */ -@ManagedService(path = "/GwtRpcDemo/atmosphere/rpc", - interceptors = { - /** - * Handle lifecycle for us - */ - AtmosphereResourceLifecycleInterceptor.class, - /** - * Send to the client the size of the message to prevent serialization error. - */ - TrackMessageSizeInterceptor.class, - /** - * Serialize/Deserialize GWT message for us - */ - GwtRpcInterceptor.class, - /** - * Make sure our {@link AtmosphereResourceEventListener#onSuspend} is only called once for transport - * that reconnect on every requests. - */ - SuspendTrackerInterceptor.class, - /** - * Deserialize the GWT message - */ - AtmosphereMessageInterceptor.class, - /** - * Echo the messages we are receiving from the client either as w WebSocket message or an HTTP Post. - */ - BroadcastOnPostAtmosphereInterceptor.class, - /** - * Discard idle AtmosphereResource in case the network didn't advise us the client disconnected - */ - IdleResourceInterceptor.class -}) -public class ManagedGWTResource { - - static final Logger logger = Logger.getLogger("AtmosphereHandler"); - - @Ready - public void onReady(final AtmosphereResource r) { - logger.info("Received RPC GET"); - // Look up a new Broadcaster used for pushing who is connected. - BroadcasterFactory f = r.getAtmosphereConfig().getBroadcasterFactory(); - f.lookup("Connected users", true).addAtmosphereResource(r) - .broadcast("Browser UUID: " + r.uuid() + " connected."); - } - - @Disconnect - public void disconnected(AtmosphereResourceEvent event){ - // isCancelled == true. means the client didn't send the close event, so an unexpected network glitch or browser - // crash occurred. - if (event.isCancelled()) { - logger.info("User:" + event.getResource().uuid() + " unexpectedly disconnected"); - } else if (event.isClosedByClient()) { - logger.info("User:" + event.getResource().uuid() + " closed the connection"); - } - } - - @Post - public void post(AtmosphereResource r) { - // Don't need to do anything, the interceptor took care of it for us. - logger.info("POST received with transport + " + r.transport()); - } - -} diff --git a/extensions-samples/gwt/gwt20-managed-rpc/src/main/resources/logging.properties b/extensions-samples/gwt/gwt20-managed-rpc/src/main/resources/logging.properties deleted file mode 100644 index 580ab7860..000000000 --- a/extensions-samples/gwt/gwt20-managed-rpc/src/main/resources/logging.properties +++ /dev/null @@ -1,34 +0,0 @@ -# To change this template, choose Tools | Templates -# and open the template in the editor. - -handlers=java.util.logging.ConsoleHandler -#handlers=java.util.logging.ConsoleHandler,java.util.logging.FileHandler - -.level=INFO - -java.util.logging.ConsoleHandler.level=ALL -java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter - -# --- FileHandler --- -# Override of global logging level -java.util.logging.FileHandler.level=ALL - -# Naming style for the output file: -# (The output file is placed in the directory -# defined by the "user.home" System property.) -java.util.logging.FileHandler.pattern=gwt-wrapper-%u.log - -# Limiting size of output file in bytes: -java.util.logging.FileHandler.limit=50000 - -# Number of output files to cycle through, by appending an -# integer to the base file name: -java.util.logging.FileHandler.count=1 - -# Style of output (Simple or XML): -java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter - - -org.atmosphere.level=FINEST -org.atmosphere.extensions.level=FINEST -org.atmosphere.samples.level=FINEST \ No newline at end of file diff --git a/extensions-samples/gwt/gwt20-managed-rpc/src/main/webapp/META-INF/MANIFEST.MF b/extensions-samples/gwt/gwt20-managed-rpc/src/main/webapp/META-INF/MANIFEST.MF deleted file mode 100644 index 348f1bdd3..000000000 --- a/extensions-samples/gwt/gwt20-managed-rpc/src/main/webapp/META-INF/MANIFEST.MF +++ /dev/null @@ -1 +0,0 @@ -Manifest-Version: 1.0 \ No newline at end of file diff --git a/extensions-samples/gwt/gwt20-managed-rpc/src/main/webapp/WEB-INF/sun-web.xml b/extensions-samples/gwt/gwt20-managed-rpc/src/main/webapp/WEB-INF/sun-web.xml deleted file mode 100644 index efbaa7bb9..000000000 --- a/extensions-samples/gwt/gwt20-managed-rpc/src/main/webapp/WEB-INF/sun-web.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - Keep a copy of the generated servlet class' java code. - - - diff --git a/extensions-samples/gwt/gwt20-managed-rpc/src/main/webapp/WEB-INF/web.xml b/extensions-samples/gwt/gwt20-managed-rpc/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index c06f8acb7..000000000 --- a/extensions-samples/gwt/gwt20-managed-rpc/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - gwt-test - - - AtmosphereServlet - AtmosphereServlet - org.atmosphere.cpr.AtmosphereServlet - - org.atmosphere.cpr.packages - org.atmosphere.samples.server - - 1 - true - - - AtmosphereServlet - /GwtRpcDemo/atmosphere/* - - - - index.jsp - - diff --git a/extensions-samples/gwt/gwt20-managed-rpc/src/main/webapp/index.jsp b/extensions-samples/gwt/gwt20-managed-rpc/src/main/webapp/index.jsp deleted file mode 100644 index dc992f72f..000000000 --- a/extensions-samples/gwt/gwt20-managed-rpc/src/main/webapp/index.jsp +++ /dev/null @@ -1,35 +0,0 @@ -<%@page contentType="text/html" pageEncoding="UTF-8"%> - - - - - GWT RPC demo for atmosphere - - - - - - - - - - - - - - - - -

GWT RPC demo for atmosphere

-
-
- - diff --git a/extensions-samples/gwt/gwt20-rpc/pom.xml b/extensions-samples/gwt/gwt20-rpc/pom.xml deleted file mode 100644 index 9aba73e00..000000000 --- a/extensions-samples/gwt/gwt20-rpc/pom.xml +++ /dev/null @@ -1,126 +0,0 @@ - - 4.0.0 - - org.atmosphere.extensions - atmosphere-samples-gwt20-project - 2.7.0-SNAPSHOT - ../ - - org.atmosphere.samples - gwt20-rpc - 2.7.0-SNAPSHOT - war - gwt20-rpc - - - GwtRpcDemo - org.atmosphere.samples.${gwtModuleName} - ${basedir}/src/main/webapp - false - true - PRETTY - true - true - ${war.target}/WEB-INF/classes - - - - ${project.build.directory}/${project.build.finalName}/WEB-INF/classes - - - org.codehaus.mojo - gwt-maven-plugin - ${gwt-version} - - ${gwtModule} - ${gwt-version} - http://localhost:8888/index.jsp - false - true - -Djava.util.logging.config.file=${project.build.outputDirectory}/logging.properties - - - - - -Xmx512m - - - generateAsync - compile - - - - - - - maven-clean-plugin - 2.4 - - - - ${outputDir} - - - ${war.target}/${gwtModuleName} - - - ${war.target}/WEB-INF/lib - - *.jar - - - - ${war.target}/WEB-INF/deploy - - - ${basedir}/src/main - - gwt-unitCache/** - - - - - - - - - - - - org.atmosphere.extensions - atmosphere-gwt20-client - provided - - - org.atmosphere - atmosphere-runtime - ${atmosphere-version} - - - org.atmosphere.client - javascript - ${client-version} - war - compile - - - org.atmosphere.extensions - atmosphere-gwt20-server - - - com.google.gwt - gwt-user - provided - - - com.google.gwt - gwt-servlet - runtime - - - org.slf4j - slf4j-jdk14 - - - - diff --git a/extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/GwtRpcDemo.gwt.xml b/extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/GwtRpcDemo.gwt.xml deleted file mode 100644 index 3d581fab9..000000000 --- a/extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/GwtRpcDemo.gwt.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/client/GwtRpcDemo.java b/extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/client/GwtRpcDemo.java deleted file mode 100644 index 5665bdaf9..000000000 --- a/extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/client/GwtRpcDemo.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright 2008-2021 Async-IO.org - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.atmosphere.samples.client; - -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.atmosphere.gwt20.client.Atmosphere; -import org.atmosphere.gwt20.client.AtmosphereCloseHandler; -import org.atmosphere.gwt20.client.AtmosphereMessageHandler; -import org.atmosphere.gwt20.client.AtmosphereOpenHandler; -import org.atmosphere.gwt20.client.AtmosphereReopenHandler; -import org.atmosphere.gwt20.client.AtmosphereRequest; -import org.atmosphere.gwt20.client.AtmosphereRequestConfig; -import org.atmosphere.gwt20.client.AtmosphereResponse; -import org.atmosphere.samples.shared.BaseEvent; -import org.atmosphere.samples.shared.EventBar; -import org.atmosphere.samples.shared.EventFoo; - -import com.google.gwt.core.client.EntryPoint; -import com.google.gwt.core.client.GWT; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.logging.client.HasWidgetsLogHandler; -import com.google.gwt.user.client.rpc.SerializationException; -import com.google.gwt.user.client.ui.Button; -import com.google.gwt.user.client.ui.HTMLPanel; -import com.google.gwt.user.client.ui.HorizontalPanel; -import com.google.gwt.user.client.ui.RootPanel; -import com.google.gwt.user.client.ui.TextBox; -import com.google.gwt.user.client.ui.Widget; - -/** - * - * @author jotec - */ -public class GwtRpcDemo implements EntryPoint { - - static final Logger logger = Logger.getLogger(GwtRpcDemo.class.getName()); - - @Override - public void onModuleLoad() { - - GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() { - @Override - public void onUncaughtException(Throwable e) { - logger.log(Level.SEVERE, "Uncaught exception", e); - } - }); - - - HorizontalPanel buttons = new HorizontalPanel(); - final TextBox messageInput = new TextBox(); - buttons.add(messageInput); - - Button sendRPC = new Button("send (GWT-RPC)"); - buttons.add(sendRPC); - - RootPanel.get("buttonbar").add(buttons); - - HTMLPanel logPanel = new HTMLPanel("") { - @Override - public void add(Widget widget) { - super.add(widget); - widget.getElement().scrollIntoView(); - } - }; - RootPanel.get("logger").add(logPanel); - Logger.getLogger("").addHandler(new HasWidgetsLogHandler(logPanel)); - - RPCSerializer rpc_serializer = GWT.create(RPCSerializer.class); - - AtmosphereRequestConfig rpcRequestConfig = AtmosphereRequestConfig.create(rpc_serializer); - rpcRequestConfig.setUrl(GWT.getModuleBaseURL() + "atmosphere/rpc"); - rpcRequestConfig.setTransport(AtmosphereRequestConfig.Transport.STREAMING); - rpcRequestConfig.setFallbackTransport(AtmosphereRequestConfig.Transport.LONG_POLLING); - rpcRequestConfig.setOpenHandler(new AtmosphereOpenHandler() { - @Override - public void onOpen(AtmosphereResponse response) { - logger.info("RPC Connection opened"); - } - }); - rpcRequestConfig.setReopenHandler(new AtmosphereReopenHandler() { - @Override - public void onReopen(AtmosphereResponse response) { - logger.info("RPC Connection reopened"); - } - }); - rpcRequestConfig.setCloseHandler(new AtmosphereCloseHandler() { - @Override - public void onClose(AtmosphereResponse response) { - logger.info("RPC Connection closed"); - } - }); - rpcRequestConfig.setMessageHandler(new AtmosphereMessageHandler() { - @Override - public void onMessage(AtmosphereResponse response) { - List messages = response.getMessages(); - for (BaseEvent event : messages) { - logger.info("received message through RPC: " + event.toString()); - } - } - }); - - // trackMessageLength is not required but makes the connection more - // robust, does not seem to work with - // unicode characters - // rpcRequestConfig.setFlags(Flags.trackMessageLength); - - Atmosphere atmosphere = Atmosphere.create(); - final AtmosphereRequest rpcRequest = atmosphere.subscribe(rpcRequestConfig); - - sendRPC.addClickHandler(new ClickHandler() { - private boolean bToogle = false; - - @Override - public void onClick(ClickEvent event) { - if (messageInput.getText().trim().length() > 0) { - try { - if (bToogle) { - EventFoo myevent2 = new EventFoo(); - myevent2.setData1(messageInput.getText()); - myevent2.setData2(messageInput.getText()); - rpcRequest.push(myevent2); - bToogle = false; - - } else { - EventBar myevent2 = new EventBar(); - myevent2.setData1(messageInput.getText()); - myevent2.setData2(messageInput.getText()); - rpcRequest.push(myevent2); - bToogle = true; - - } - } catch (SerializationException ex) { - logger.log(Level.SEVERE, "Failed to serialize message", ex); - } - } - } - }); - - } - -} diff --git a/extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/client/RPCSerializer.java b/extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/client/RPCSerializer.java deleted file mode 100644 index dc7bb69a4..000000000 --- a/extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/client/RPCSerializer.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2008-2021 Async-IO.org - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.atmosphere.samples.client; - -import org.atmosphere.gwt20.client.GwtRpcClientSerializer; -import org.atmosphere.gwt20.client.GwtRpcSerialTypes; -import org.atmosphere.gwt20.client.managed.RPCEvent; -import org.atmosphere.samples.shared.BaseEvent; -import org.atmosphere.samples.shared.EventBar; -import org.atmosphere.samples.shared.EventFoo; - -/** - * - * @author jotec - */ -@GwtRpcSerialTypes({BaseEvent.class,EventFoo.class, EventBar.class}) -abstract public class RPCSerializer extends GwtRpcClientSerializer { - -} diff --git a/extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/server/GwtRpcAtmosphereHandler.java b/extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/server/GwtRpcAtmosphereHandler.java deleted file mode 100644 index 033067085..000000000 --- a/extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/server/GwtRpcAtmosphereHandler.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2008-2021 Async-IO.org - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.atmosphere.samples.server; - -import java.io.IOException; -import java.util.logging.Logger; -import org.atmosphere.cpr.AtmosphereResource; -import org.atmosphere.cpr.DefaultBroadcasterFactory; -import org.atmosphere.gwt20.shared.Constants; -import org.atmosphere.handler.AbstractReflectorAtmosphereHandler; - -/** - * This is a simple handler example to show how to use GWT RPC serialization - * - * @author p.havelaar - */ -public class GwtRpcAtmosphereHandler extends AbstractReflectorAtmosphereHandler { - - static final Logger logger = Logger.getLogger("AtmosphereHandler"); - @Override - public void onRequest(AtmosphereResource ar) throws IOException { - if (ar.getRequest().getMethod().equals("GET") ) { - doGet(ar); - } else if (ar.getRequest().getMethod().equals("POST") ) { - doPost(ar); - } - } - - public void doGet(AtmosphereResource ar) { - - // lookup the broadcaster, if not found create it. Name is arbitrary - ar.setBroadcaster(ar.getAtmosphereConfig().getBroadcasterFactory().lookup("MyBroadcaster", true)); - - ar.suspend(); - } - - /** - * receive push message from client - **/ - public void doPost(AtmosphereResource ar) { - Object msg = ar.getRequest().getAttribute(Constants.MESSAGE_OBJECT); - if (msg != null) { - logger.info("received RPC post: " + msg.toString()); - // for demonstration purposes we will broadcast the message to all connections - ar.getAtmosphereConfig().getBroadcasterFactory().lookup("MyBroadcaster").broadcast(msg); - } - } - - - @Override - public void destroy() { - - } - -} diff --git a/extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/shared/BaseEvent.java b/extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/shared/BaseEvent.java deleted file mode 100644 index 12b9cd35c..000000000 --- a/extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/shared/BaseEvent.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.atmosphere.samples.shared; - -import java.io.Serializable; - -public class BaseEvent implements Serializable { - /** - * - */ - private static final long serialVersionUID = 1L; - String eventyp; - - @Override - public String toString() { - return "BaseEvent [eventyp=" + eventyp + "]"; - } - -} diff --git a/extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/shared/EventBar.java b/extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/shared/EventBar.java deleted file mode 100644 index e89d276ae..000000000 --- a/extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/shared/EventBar.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.atmosphere.samples.shared; - -import java.io.Serializable; - -public class EventBar extends BaseEvent implements Serializable { - /** - * - */ - private static final long serialVersionUID = 1L; - - public EventBar() { - super(); - eventyp = "EventBar"; - - } - - @Override - public String toString() { - return "EventBar [data1=" + data1 + ", data2=" + data2 + ", toString()=" + super.toString() + "]"; - } - - public String getData1() { - return data1; - } - - public void setData1(String data1) { - this.data1 = data1; - } - - public String getData2() { - return data2; - } - - public void setData2(String data2) { - this.data2 = data2; - } - - String data1; - String data2; - -} diff --git a/extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/shared/EventFoo.java b/extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/shared/EventFoo.java deleted file mode 100644 index f1e9c89d3..000000000 --- a/extensions-samples/gwt/gwt20-rpc/src/main/java/org/atmosphere/samples/shared/EventFoo.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.atmosphere.samples.shared; - -import java.io.Serializable; - -public class EventFoo extends BaseEvent implements Serializable { - /** - * - */ - private static final long serialVersionUID = 1L; - - public EventFoo() { - super(); - eventyp = "EventFoo"; - - } - - @Override - public String toString() { - return "EventFoo [data1=" + data1 + ", data2=" + data2 + ", toString()=" + super.toString() + "]"; - } - - public String getData1() { - return data1; - } - - public void setData1(String data1) { - this.data1 = data1; - } - - public String getData2() { - return data2; - } - - public void setData2(String data2) { - this.data2 = data2; - } - - String data1; - String data2; - -} diff --git a/extensions-samples/gwt/gwt20-rpc/src/main/resources/logging.properties b/extensions-samples/gwt/gwt20-rpc/src/main/resources/logging.properties deleted file mode 100644 index 580ab7860..000000000 --- a/extensions-samples/gwt/gwt20-rpc/src/main/resources/logging.properties +++ /dev/null @@ -1,34 +0,0 @@ -# To change this template, choose Tools | Templates -# and open the template in the editor. - -handlers=java.util.logging.ConsoleHandler -#handlers=java.util.logging.ConsoleHandler,java.util.logging.FileHandler - -.level=INFO - -java.util.logging.ConsoleHandler.level=ALL -java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter - -# --- FileHandler --- -# Override of global logging level -java.util.logging.FileHandler.level=ALL - -# Naming style for the output file: -# (The output file is placed in the directory -# defined by the "user.home" System property.) -java.util.logging.FileHandler.pattern=gwt-wrapper-%u.log - -# Limiting size of output file in bytes: -java.util.logging.FileHandler.limit=50000 - -# Number of output files to cycle through, by appending an -# integer to the base file name: -java.util.logging.FileHandler.count=1 - -# Style of output (Simple or XML): -java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter - - -org.atmosphere.level=FINEST -org.atmosphere.extensions.level=FINEST -org.atmosphere.samples.level=FINEST \ No newline at end of file diff --git a/extensions-samples/gwt/gwt20-rpc/src/main/webapp/META-INF/MANIFEST.MF b/extensions-samples/gwt/gwt20-rpc/src/main/webapp/META-INF/MANIFEST.MF deleted file mode 100644 index 348f1bdd3..000000000 --- a/extensions-samples/gwt/gwt20-rpc/src/main/webapp/META-INF/MANIFEST.MF +++ /dev/null @@ -1 +0,0 @@ -Manifest-Version: 1.0 \ No newline at end of file diff --git a/extensions-samples/gwt/gwt20-rpc/src/main/webapp/META-INF/atmosphere.xml b/extensions-samples/gwt/gwt20-rpc/src/main/webapp/META-INF/atmosphere.xml deleted file mode 100644 index 781f8b04d..000000000 --- a/extensions-samples/gwt/gwt20-rpc/src/main/webapp/META-INF/atmosphere.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/extensions-samples/gwt/gwt20-rpc/src/main/webapp/WEB-INF/sun-web.xml b/extensions-samples/gwt/gwt20-rpc/src/main/webapp/WEB-INF/sun-web.xml deleted file mode 100644 index efbaa7bb9..000000000 --- a/extensions-samples/gwt/gwt20-rpc/src/main/webapp/WEB-INF/sun-web.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - Keep a copy of the generated servlet class' java code. - - - diff --git a/extensions-samples/gwt/gwt20-rpc/src/main/webapp/WEB-INF/web.xml b/extensions-samples/gwt/gwt20-rpc/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index 79d362f18..000000000 --- a/extensions-samples/gwt/gwt20-rpc/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - gwt-test - - - AtmosphereServlet - AtmosphereServlet - org.atmosphere.cpr.AtmosphereServlet - - org.atmosphere.cpr.AtmosphereInterceptor - org.atmosphere.gwt20.server.GwtRpcInterceptor - - - 1 - - true - - - AtmosphereServlet - /GwtRpcDemo/atmosphere/* - - - - index.jsp - - diff --git a/extensions-samples/gwt/gwt20-rpc/src/main/webapp/index.jsp b/extensions-samples/gwt/gwt20-rpc/src/main/webapp/index.jsp deleted file mode 100644 index e84465930..000000000 --- a/extensions-samples/gwt/gwt20-rpc/src/main/webapp/index.jsp +++ /dev/null @@ -1,37 +0,0 @@ -<%@page contentType="text/html" pageEncoding="UTF-8"%> - - - - - GWT RPC demo for atmosphere - - - - - - - - - - - - - - - - - - -

GWT RPC demo for atmosphere

-
-
- - diff --git a/extensions-samples/gwt/gwt20-websockets/README.md b/extensions-samples/gwt/gwt20-websockets/README.md deleted file mode 100644 index d88c90af7..000000000 --- a/extensions-samples/gwt/gwt20-websockets/README.md +++ /dev/null @@ -1,32 +0,0 @@ -GWT Webockets -============= - -Command-Line Users -================== -First run the samples/websocket-stream example -- mvn jetty:run - -Verify streaming operation at this URL: http://localhost:8080. You should see a client page built using jQuery, with a streaming JSON -message containing two keys: time and count. These should increment once per second. - -Next run this sample as a gwt application: -- mvn gwt:run - -This should launch the GWT designer page, starting Jetty to serve the GWT application. Launch the default browser page through this -user-interface. The full URL to launch this page is: http://127.0.0.1:8888/GwtWebsocketsDemo.html?gwt.codesvr=127.0.0.1:9997 -The first time launch will take a few seconds because GWT is compiling code for the javascript of the -page. - -This should show a page titled "GWT Websockets Demo", with a streamed JSON message as above, but with a page built using GWT. -Note that the streams on the two pages are independent of each other, they have different times and counts. - -Eclipse Users -============= -Eclipse users can use the .launch configuration files to run the websocket-stream and gwt-websockets -examples directly from the workspace, provided you have the m2 eclipse plugin. Right-click|Run As on the -.launch files to bring them up. - -Flow Diagram -============ -![Alt example flow](atmosphere%20gwt%2Bwebsockets.jpg?raw=true "Example Flow") - diff --git a/extensions-samples/gwt/gwt20-websockets/README.txt b/extensions-samples/gwt/gwt20-websockets/README.txt deleted file mode 100644 index 0f0112881..000000000 --- a/extensions-samples/gwt/gwt20-websockets/README.txt +++ /dev/null @@ -1,87 +0,0 @@ ---- Generated by GWT WebAppCreator --- - -Congratulations, you've successfully generated a starter project! What next? - --- Option A: Import your project into Eclipse (recommended) -- - -If you use Eclipse, you can simply import the generated project into Eclipse. -We've tested against Eclipse 3.4 and 3.5. Later versions will likely also -work, earlier versions may not. - -If the directory containing this file does not have a .classpath or .project -file, generate them by running 'ant eclipse.generate' - -In Eclipse, go to the File menu and choose: - - File -> Import... -> Existing Projects into Workspace - - Browse to the directory containing this file, - select "GwtWebsocketsDemo". - - Be sure to uncheck "Copy projects into workspace" if it is checked. - - Click Finish. - -You can now browse the project in Eclipse. - -To launch your web app in GWT development mode, go to the Run menu and choose: - - Run -> Open Debug Dialog... - - Under Java Application, you should find a launch configuration - named "GwtWebsocketsDemo". Select and click "Debug". - - You can now use the built-in debugger to debug your web app in development mode. - -If you supplied the junit path when invoking webAppCreator, you should see -launch configurations for running your tests in development and production -mode. - --- Option B: Build from the command line with Ant -- - -If you prefer to work from the command line, you can use Ant to build your -project. (http://ant.apache.org/) Ant uses the generated 'build.xml' file -which describes exactly how to build your project. This file has been tested -to work against Ant 1.7.1. The following assumes 'ant' is on your command -line path. - -To run development mode, just type 'ant devmode'. - -To use Super Dev Mode, you will need to run two commands in separate -windows. Run 'ant devmode' and also 'ant superdevmode'. - -To compile your project for deployment, just type 'ant'. - -To compile and also bundle into a .war file, type 'ant war'. - -If you supplied the junit path when invoking webAppCreator, you can type 'ant -test' to run tests in development and production mode. - -For a full listing of other targets, type 'ant -p'. - --- Option C: Using another IDE -- - -GWT projects can be run in other IDEs as well, but will require some manual -setup. If you go this route, be sure to: - -* Have your IDE build .class files into 'war/WEB-INF/classes'. -* Add gwt-user.jar and gwt-dev.jar to your project build path. -* When creating a launch configuration, add a classpath entry for your 'src' - folder (this is somewhat unusual but GWT needs access to your source files). - -If you get stuck, try to mimic what the Ant 'build.xml' would do. - --- Option D: Using Maven -- - -If you have generated your project with the option '-maven', you have a 'pom.xml' -file ready to use. Assuming you have 'maven2' installed in your system, 'mvn' is -in your path, and you have access to maven repositories, you should be able to run: - -mvn clean # delete temporary stuff -mvn test # run all the tests (gwt and junit) -mvn gwt:run # run development mode -mvn gwt:compile # compile to javascript -mvn package # generate a .war package ready to deploy - -For more information about other available goals, read maven and gwt-maven-plugin -documentation (http://maven.apache.org, http://mojo.codehaus.org/gwt-maven-plugin) diff --git a/extensions-samples/gwt/gwt20-websockets/atmosphere gwt+websockets.jpg b/extensions-samples/gwt/gwt20-websockets/atmosphere gwt+websockets.jpg deleted file mode 100644 index 68b5f69589fea9b3a543d1b8025e5245ad8bed67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75009 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%0DHh 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 - - - - - - - - - - - - - - - - - - - diff --git a/extensions-samples/gwt/gwt20-websockets/pom.xml b/extensions-samples/gwt/gwt20-websockets/pom.xml deleted file mode 100644 index bbf8ffbb3..000000000 --- a/extensions-samples/gwt/gwt20-websockets/pom.xml +++ /dev/null @@ -1,194 +0,0 @@ - - - - - 4.0.0 - org.atmosphere.samples - GwtWebsocketsDemo - war - 1.0-SNAPSHOT - org.atmosphere.samples.GwtWebsocketsDemo - - - - 2.6.1 - - 1.6 - 1.6 - - - - - com.google.gwt - gwt-servlet - ${gwtVersion} - runtime - - - com.google.gwt - gwt-user - ${gwtVersion} - provided - - - com.google.gwt - gwt-dev - ${gwtVersion} - test - - - junit - junit - 4.13.1 - test - - - javax.validation - validation-api - 1.0.0.GA - provided - - - javax.validation - validation-api - 1.0.0.GA - sources - provided - - - com.sksamuel.gwt - gwt-websockets - 1.0.4 - - - - - - target/www/WEB-INF/classes - - - - - - org.codehaus.mojo - gwt-maven-plugin - 2.2.0 - - - com.google.gwt - gwt-user - ${gwtVersion} - - - com.google.gwt - gwt-dev - ${gwtVersion} - - - com.google.gwt - gwt-servlet - ${gwtVersion} - - - - - - prepare-package - - compile - - - - - - - GwtWebsocketsDemo.html - - target/www - - true - - - - - - maven-surefire-plugin - 2.5 - - - ${project.build.sourceDirectory} - ${project.build.testSourceDirectory} - - false - always - - - - - gwt.args - -war target/www - - - - - - - - maven-resources-plugin - 2.4.2 - - - compile - - copy-resources - - - target/www - - - src/main/webapp - - - - - - - - - - maven-clean-plugin - 2.3 - - - src/main/webapp/gwtwebsocketsdemo - src/main/webapp/WEB-INF/classes - tomcat - www-test - .gwt-tmp - - - - - - maven-eclipse-plugin - 2.7 - - true - false - 2.0 - - - com.google.gwt.eclipse.core.gwtProjectValidator - - - - com.google.gwt.eclipse.core.gwtNature - - - - - - - diff --git a/extensions-samples/gwt/gwt20-websockets/src/main/java/org/atmosphere/samples/GwtWebsocketsDemo.gwt.xml b/extensions-samples/gwt/gwt20-websockets/src/main/java/org/atmosphere/samples/GwtWebsocketsDemo.gwt.xml deleted file mode 100644 index 3c330f4d5..000000000 --- a/extensions-samples/gwt/gwt20-websockets/src/main/java/org/atmosphere/samples/GwtWebsocketsDemo.gwt.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/extensions-samples/gwt/gwt20-websockets/src/main/java/org/atmosphere/samples/client/GwtWebsocketsDemo.java b/extensions-samples/gwt/gwt20-websockets/src/main/java/org/atmosphere/samples/client/GwtWebsocketsDemo.java deleted file mode 100644 index 16eccb5ef..000000000 --- a/extensions-samples/gwt/gwt20-websockets/src/main/java/org/atmosphere/samples/client/GwtWebsocketsDemo.java +++ /dev/null @@ -1,90 +0,0 @@ -package org.atmosphere.samples.client; - -import com.google.gwt.core.client.EntryPoint; -import com.google.gwt.dom.client.Element; -import com.google.gwt.user.client.DOM; -import com.google.gwt.user.client.ui.Button; -import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.TextBox; -import com.sksamuel.gwt.websockets.Websocket; -import com.sksamuel.gwt.websockets.WebsocketListener; - -/** - * Entry point classes define onModuleLoad(). - */ -public class GwtWebsocketsDemo implements EntryPoint { - /** - * The message displayed to the user when the server cannot be reached or - * returns an error. - */ - private static final String SERVER_ERROR = "An error occurred while " - + "attempting to contact the server. Please check your network " - + "connection and try again."; - - - protected static native void _log(String text) - /*-{ - console.log(text); - }-*/; - - protected class Console { - public void log(String text) { - _log(text); - } - } - - protected Console console = new Console(); - - /** - * This is the entry point method. - */ - public void onModuleLoad() { - final Button sendButton = new Button("Send"); - final TextBox nameField = new TextBox(); - nameField.setText("GWT User"); - final Label errorLabel = new Label(); - - final Label outputLabel = new Label(); - - final Element output = DOM.getElementById("output"); - final Element status = DOM.getElementById("status"); - - final Console console = new Console(); - - - console.log("adding websocket"); - - // Establish a websocket communication channel to the atmosphere chat service. - // Websocket socket = new Websocket("ws://localhost:8080/chat?X-Atmosphere-tracking-id=5ebed4c5-0b90-4166-88b2-9f273719ab75&X-Atmosphere-Framework=2.2.1-jquery&X-Atmosphere-Transport=websocket&Content-Type=application/json&X-atmo-protocol=true"); - final String url = "ws://localhost:8080/stream"; - Websocket socket = new Websocket(url); - - socket.addListener(new WebsocketListener() { - - @Override - public void onClose() { - // do something on close - } - - @Override - public void onMessage(String msg) { - // a message is received - console.log("onMessage(): " + msg); - outputLabel.setText("websocket " + url + ": " + msg); - output.setInnerText(msg); - } - - @Override - public void onOpen() { - // do something on open - console.log("onOpen()"); - status.setInnerText("connected: " + url); - } - }); - - socket.open(); - - console.log("websocket is open"); - - } -} diff --git a/extensions-samples/gwt/gwt20-websockets/src/main/webapp/GwtWebsocketsDemo.css b/extensions-samples/gwt/gwt20-websockets/src/main/webapp/GwtWebsocketsDemo.css deleted file mode 100644 index 8c4c2f7fd..000000000 --- a/extensions-samples/gwt/gwt20-websockets/src/main/webapp/GwtWebsocketsDemo.css +++ /dev/null @@ -1,42 +0,0 @@ -/** Add css rules here for your application. */ - - -/** Example rules used by the template application (remove for your app) */ -h1 { - font-size: 2em; - font-weight: bold; - color: #777777; - margin: 40px 0px 70px; - text-align: center; -} - -#status, #message, #output, #errorLabelContainer { - font-size: 2em; - font-weight: bold; - color: #777777; - margin: 40px 0px 70px; - text-align: center; -} - -.sendButton { - display: block; - font-size: 16pt; -} - -/** Most GWT widgets already have a style name defined */ -.gwt-DialogBox { - width: 400px; -} - -.dialogVPanel { - margin: 5px; -} - -.serverResponseLabelError { - color: red; -} - -/** Set ids using widget.getElement().setId("idOfElement") */ -#closeButton { - margin: 15px 6px 6px; -} diff --git a/extensions-samples/gwt/gwt20-websockets/src/main/webapp/GwtWebsocketsDemo.html b/extensions-samples/gwt/gwt20-websockets/src/main/webapp/GwtWebsocketsDemo.html deleted file mode 100644 index e0ad023e0..000000000 --- a/extensions-samples/gwt/gwt20-websockets/src/main/webapp/GwtWebsocketsDemo.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - GWT Websockets Demo - - - - - - - - - - - - - - - - - - - - - - -

GWT Websockets Demo

- -
connecting...
-
- -
- - - diff --git a/extensions-samples/gwt/gwt20-websockets/src/main/webapp/WEB-INF/web.xml b/extensions-samples/gwt/gwt20-websockets/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index 029e06f90..000000000 --- a/extensions-samples/gwt/gwt20-websockets/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - GwtWebsocketsDemo.html - - \ No newline at end of file diff --git a/extensions-samples/gwt/gwt20-websockets/src/main/webapp/favicon.ico b/extensions-samples/gwt/gwt20-websockets/src/main/webapp/favicon.ico deleted file mode 100644 index 858a707523f540b16b6bd2cd79d8e870e5be524e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1082 zcmZ`%ZETZO6uxD(Y;;{a>DsOByS{zfwcXaP?KZm7ZL*C*$bz2`oQXsMV+;XBQWYWr zYPJc6iP}IxBVpqQ{7{GsCSoK&zqdJ}*@R%GfJNp6J26{7Sl7o}lPdi1+&uT3oR8<6 zb8`vd(IXKPdb32wCqzaFF;Ykmn-B47&A#g@=I{@kviGeTm7B8>BFG2x znvr(r&4;vx+4o87i{n`_doHasp1I3#$0pRw!NdB>cUIZNPvu5=NEoSyFw&lXd~E5? zS2&j+jhmBLP#(r2HUtUx4djL|AuJoXD_G2F>pSGS3Nf=cL+sl+FyDB6W8y76rG3697TyP3Ylpb+NM$PRZ*1cFF~W& z_c>=hF}blXfooG4)OUVI>jEJ15J<^I_#@L;SQ(}}1t4Jj;FSmPh$?_$?GQ>00cg}8 zd~0bwnf@aU3||GLRo_FT8HJF$i~>~{o7_KQ#dBj2RfQp^GpyNkmBykFaUn=+!{Bs> z;--dUzuulo!{bSzu`Y$ymJ}Ks@oaTN3@XzVtl980R&`y&lP~;)Uhgju>LTbjMc8pct~ zjzVrc2X%SR2_D%Z=92?1MXC3-D)sRr?T+plr+GCRYKM}}`q-?)GCNaWoygjZXJO#( zz-FF+$r72@>iZK4;hXjc|01>d&p*@F-`-dewVT(Su^P93Z87*F4$DU~%k7mcFN5b%ULc)s3%Ms*f*gs@bMx qKWr^5TrSP^$>&dkkc&AiBV_MF>di6z%a+gjPv4-iKWScu=Kl?kF{Cg6 diff --git a/extensions-samples/gwt/gwt20-websockets/src/test/java/org/atmosphere/samples/GwtWebsocketsDemoJUnit.gwt.xml b/extensions-samples/gwt/gwt20-websockets/src/test/java/org/atmosphere/samples/GwtWebsocketsDemoJUnit.gwt.xml deleted file mode 100644 index fe0d39e87..000000000 --- a/extensions-samples/gwt/gwt20-websockets/src/test/java/org/atmosphere/samples/GwtWebsocketsDemoJUnit.gwt.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - diff --git a/extensions-samples/gwt/gwt20-websockets/src/test/java/org/atmosphere/samples/client/GwtWebsocketsDemoTest.java b/extensions-samples/gwt/gwt20-websockets/src/test/java/org/atmosphere/samples/client/GwtWebsocketsDemoTest.java deleted file mode 100644 index 38b2aec50..000000000 --- a/extensions-samples/gwt/gwt20-websockets/src/test/java/org/atmosphere/samples/client/GwtWebsocketsDemoTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.atmosphere.samples.client; - -import org.atmosphere.samples.shared.FieldVerifier; -import com.google.gwt.core.client.GWT; -import com.google.gwt.junit.client.GWTTestCase; -import com.google.gwt.user.client.rpc.AsyncCallback; -import com.google.gwt.user.client.rpc.ServiceDefTarget; - -/** - * GWT JUnit tests must extend GWTTestCase. - */ -public class GwtWebsocketsDemoTest extends GWTTestCase { - - /** - * Must refer to a valid module that sources this class. - */ - public String getModuleName() { - return "org.atmosphere.samples.GwtWebsocketsDemoJUnit"; - } - - /** - * Tests the FieldVerifier. - */ - public void testFieldVerifier() { - assertFalse(FieldVerifier.isValidName(null)); - assertFalse(FieldVerifier.isValidName("")); - assertFalse(FieldVerifier.isValidName("a")); - assertFalse(FieldVerifier.isValidName("ab")); - assertFalse(FieldVerifier.isValidName("abc")); - assertTrue(FieldVerifier.isValidName("abcd")); - } - - /** - * This test will send a request to the server using the greetServer method in - * GreetingService and verify the response. - */ - public void testGreetingService() { - // Create the service that we will test. - GreetingServiceAsync greetingService = GWT.create(GreetingService.class); - ServiceDefTarget target = (ServiceDefTarget) greetingService; - target.setServiceEntryPoint(GWT.getModuleBaseURL() + "gwtwebsocketsdemo/greet"); - - // Since RPC calls are asynchronous, we will need to wait for a response - // after this test method returns. This line tells the test runner to wait - // up to 10 seconds before timing out. - delayTestFinish(10000); - - // Send a request to the server. - greetingService.greetServer("GWT User", new AsyncCallback() { - public void onFailure(Throwable caught) { - // The request resulted in an unexpected error. - fail("Request failure: " + caught.getMessage()); - } - - public void onSuccess(String result) { - // Verify that the response is correct. - assertTrue(result.startsWith("Hello, GWT User!")); - - // Now that we have received a response, we need to tell the test runner - // that the test is complete. You must call finishTest() after an - // asynchronous test finishes successfully, or the test will time out. - finishTest(); - } - }); - } - - -} diff --git a/extensions-samples/gwt/pom.xml b/extensions-samples/gwt/pom.xml deleted file mode 100644 index 84bdc691d..000000000 --- a/extensions-samples/gwt/pom.xml +++ /dev/null @@ -1,125 +0,0 @@ - - - 4.0.0 - - org.atmosphere - atmosphere-samples-project - 2.7.0-SNAPSHOT - ../../ - - org.atmosphere.extensions - atmosphere-samples-gwt20-project - atmosphere-samples-gwt20-project - 2.7.0-SNAPSHOT - pom - - https://github.com/Atmosphere/atmosphere-extensions/gwt20 - - - 2.9.0 - - - - - - gwt20-managed-rpc - gwt20-rpc - - - - - - org.jvnet.wagon-svn - wagon-svn - 1.9 - - - - - - - - org.atmosphere.extensions - atmosphere-gwt20-common - ${extensions-version} - - - org.atmosphere.extensions - atmosphere-gwt20-client - ${extensions-version} - - - org.atmosphere.extensions - atmosphere-gwt20-server - ${extensions-version} - - - org.atmosphere.extensions - atmosphere-gwt20-managed - ${extensions-version} - - - org.atmosphere.extensions - atmosphere-gwt20-jersey - ${extensions-version} - - - org.atmosphere.extensions - atmosphere-gwt20-jackson - ${extensions-version} - - - com.google.gwt - gwt-user - ${gwt-version} - provided - - - com.google.gwt - gwt-dev - ${gwt-version} - provided - - - com.google.gwt - gwt-servlet - ${gwt-version} - runtime - - - org.atmosphere - atmosphere-runtime - ${atmosphere-version} - - - org.atmosphere - atmosphere-jersey - ${atmosphere-version} - - - org.atmosphere - gwtprojsonserializer - 1.0.0 - provided - - - org.slf4j - slf4j-api - ${slf4j-version} - - - org.slf4j - slf4j-jdk14 - ${slf4j-version} - runtime - - - junit - junit - 4.13.1 - test - - - - - diff --git a/extensions-samples/hazelcast/pom.xml b/extensions-samples/hazelcast/pom.xml deleted file mode 100644 index 6bc353fe1..000000000 --- a/extensions-samples/hazelcast/pom.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - org.atmosphere - atmosphere-samples-project - 2.7.0-SNAPSHOT - ../../ - - 4.0.0 - atmosphere-hazelcast-demo - war - atmosphere-hazelcast-demo - - install - - - maven-war-plugin - 2.4 - - - - org.atmosphere.samples - atmosphere-jersey-pubsub - - - - - - - - - - org.atmosphere - atmosphere-hazelcast - ${extensions-version} - - - org.atmosphere.samples - atmosphere-jersey-pubsub - ${project.version} - war - - - org.apache.geronimo.specs - geronimo-servlet_3.0_spec - 1.0 - provided - - - - diff --git a/extensions-samples/jgroups/pom.xml b/extensions-samples/jgroups/pom.xml deleted file mode 100644 index 20e34ea86..000000000 --- a/extensions-samples/jgroups/pom.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - org.atmosphere - atmosphere-samples-project - 2.7.0-SNAPSHOT - ../../ - - 4.0.0 - atmosphere-jgroups-demo - war - atmosphere-jgroups-demo - - - install - - - maven-war-plugin - 2.4 - - - - org.atmosphere.samples - atmosphere-jersey-pubsub - - - - - - - - - - org.atmosphere - atmosphere-jgroups - ${extensions-version} - - - org.atmosphere.samples - atmosphere-jersey-pubsub - ${project.version} - war - - - org.apache.geronimo.specs - geronimo-servlet_3.0_spec - 1.0 - provided - - - - diff --git a/extensions-samples/jms/pom.xml b/extensions-samples/jms/pom.xml deleted file mode 100644 index aed1b9268..000000000 --- a/extensions-samples/jms/pom.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - org.atmosphere - atmosphere-samples-project - 2.3.1-SNAPSHOT - ../../ - - 4.0.0 - atmosphere-jms-demo - war - atmosphere-jms-demo - - - install - - - maven-war-plugin - 2.4 - - - - org.atmosphere.samples - atmosphere-jersey-pubsub - - - - - - - - - - org.atmosphere - atmosphere-jms - ${extensions-version} - - - org.atmosphere.samples - atmosphere-jersey-pubsub - ${atmosphere-version} - war - - - org.apache.geronimo.specs - geronimo-servlet_3.0_spec - 1.0 - provided - - - - diff --git a/extensions-samples/kafka/jersey-pubsub/README.md b/extensions-samples/kafka/jersey-pubsub/README.md deleted file mode 100644 index 677de5b4e..000000000 --- a/extensions-samples/kafka/jersey-pubsub/README.md +++ /dev/null @@ -1,12 +0,0 @@ -This sample assumes Apache Kafka -For more information on Kafka, refer to http://kafka.apache.org/documentation.html -If Kafka is running at its default host and port localhost:9092, you will need to adjust -parameter bootstrap.servers in a configuration file specified by the init paramter -org.atmosphere.kafka.propertiesFile. - -Run this sample twice with this command lines : -- 1st instance : mvn jetty:run-war -Djetty.port=8080 -- 2nd instance : mvn jetty:run-war -Djetty.port=9090 - -You can use your browser to connect to either http://localhost:8080 or http://localhost:9090 and -observe the messages posted to the same topic are broadcasted to its subscribers. diff --git a/extensions-samples/kafka/jersey-pubsub/pom.xml b/extensions-samples/kafka/jersey-pubsub/pom.xml deleted file mode 100644 index 3c0113e6b..000000000 --- a/extensions-samples/kafka/jersey-pubsub/pom.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - org.atmosphere - atmosphere-samples-project - 2.7.0-SNAPSHOT - ../../../ - - 4.0.0 - atmosphere-kafka-demo - war - atmosphere-kafka-demo - - install - - - maven-war-plugin - 2.4 - - - - org.atmosphere.samples - atmosphere-jersey-pubsub - - - - - - - - - - org.atmosphere - atmosphere-kafka - ${extensions-version} - - - org.atmosphere.samples - atmosphere-jersey-pubsub - ${project.version} - war - - - org.apache.geronimo.specs - geronimo-servlet_3.0_spec - 1.0 - provided - - - - diff --git a/extensions-samples/pom.xml b/extensions-samples/pom.xml deleted file mode 100755 index 30a980e55..000000000 --- a/extensions-samples/pom.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - org.atmosphere - atmosphere-samples-project - 2.7.0-SNAPSHOT - ../ - - 4.0.0 - org.atmosphere.samples - atmosphere-extensions-samples - pom - 2.7.0-SNAPSHOT - atmosphere-extensions-samples - - chat-cdi/ - sockjs/sockjs-chat - sockjs/sockjs-demo - guice/chat-guice - - hazelcast - jgroups - kafka/jersey-pubsub - rabbitmq/jersey-pubsub - redis - rmi - socketio/native-socketio-chat - socketio/socketio-chat - spring/spring-inject - spring/spring-echo - spring/spring-websocket - xmpp - cometd - - - - - org.atmosphere - atmosphere-runtime - ${atmosphere-version} - - - org.apache.geronimo.specs - geronimo-servlet_3.0_spec - 1.0 - provided - - - ch.qos.logback - logback-classic - ${logback-version} - - - - diff --git a/extensions-samples/rabbitmq/jersey-pubsub/README.md b/extensions-samples/rabbitmq/jersey-pubsub/README.md deleted file mode 100644 index bcdfba7e8..000000000 --- a/extensions-samples/rabbitmq/jersey-pubsub/README.md +++ /dev/null @@ -1,11 +0,0 @@ -This sample assumes RabbitMQ is running on localhost at default port 5672. -For more information on RabbitMQ, refer to http://www.rabbitmq.com/download.html -If RabbitMQ is running on a different host or at port, you will need to adjust the connection -parameters in web.xml. - -Run this sample twice with this command lines : -- 1st instance : mvn jetty:run -Djetty.port=8080 -- 2nd instance : mvn jetty:run -Djetty.port=9090 - -You can use your browser to connect to either http://localhost:8080 or http://localhost:9090 and -observe the messages posted to the same topic are broadcasted to its subscribers. diff --git a/extensions-samples/rabbitmq/jersey-pubsub/pom.xml b/extensions-samples/rabbitmq/jersey-pubsub/pom.xml deleted file mode 100644 index 108386a4c..000000000 --- a/extensions-samples/rabbitmq/jersey-pubsub/pom.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - org.atmosphere - atmosphere-samples-project - 2.7.0-SNAPSHOT - ../../../ - - 4.0.0 - atmosphere-rabbitmq-demo - war - atmosphere-rabbitmq-demo - - - install - - - maven-war-plugin - 2.4 - - - - org.atmosphere.samples - atmosphere-jersey-pubsub - - - - - - - - - - org.atmosphere - atmosphere-rabbitmq - ${extensions-version} - - - org.atmosphere.samples - atmosphere-jersey-pubsub - ${project.version} - war - - - org.apache.geronimo.specs - geronimo-servlet_3.0_spec - 1.0 - provided - - - - diff --git a/extensions-samples/redis/pom.xml b/extensions-samples/redis/pom.xml deleted file mode 100644 index 4c5d55bcf..000000000 --- a/extensions-samples/redis/pom.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - org.atmosphere - atmosphere-samples-project - 2.7.0-SNAPSHOT - ../../ - - 4.0.0 - atmosphere-redis-demo - war - atmosphere-redis-demo - - - install - - - maven-war-plugin - 2.4 - - - - org.atmosphere.samples - atmosphere-jersey-pubsub - - - - - - - - - - org.atmosphere - atmosphere-redis - ${extensions-version} - - - org.atmosphere.samples - atmosphere-jersey-pubsub - ${project.version} - war - - - org.apache.geronimo.specs - geronimo-servlet_3.0_spec - 1.0 - provided - - - - diff --git a/extensions-samples/rmi/README.md b/extensions-samples/rmi/README.md deleted file mode 100644 index ab25d3fce..000000000 --- a/extensions-samples/rmi/README.md +++ /dev/null @@ -1,3 +0,0 @@ -Run this sample twice with this command lines : -- 1st instance : mvn jetty:run-war -Djetty.port=8080 -Dorg.atmosphere.rmi.peer.server1=localhost:4000 -Dorg.atmosphere.rmi.server.port=4001 -- 2nd instance : mvn jetty:run-war -Djetty.port=9090 -Dorg.atmosphere.rmi.peer.server1=localhost:4001 -Dorg.atmosphere.rmi.server.port=4000 \ No newline at end of file diff --git a/extensions-samples/rmi/pom.xml b/extensions-samples/rmi/pom.xml deleted file mode 100644 index 409682ede..000000000 --- a/extensions-samples/rmi/pom.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - org.atmosphere - atmosphere-samples-project - 2.7.0-SNAPSHOT - ../../ - - 4.0.0 - - atmosphere-rmi-demo - atmosphere-rmi-demo - war - - - install - - - maven-war-plugin - 2.4 - - - - org.atmosphere.samples - atmosphere-jersey-pubsub - - - - - - - - - - org.atmosphere.extensions - atmosphere-rmi - ${extensions-version} - - - org.atmosphere.samples - atmosphere-jersey-pubsub - ${project.version} - war - - - org.apache.geronimo.specs - geronimo-servlet_3.0_spec - 1.0 - provided - - - \ No newline at end of file diff --git a/extensions-samples/rmi/src/main/resources/org/atmosphere/plugin/rmi/rmi.properties b/extensions-samples/rmi/src/main/resources/org/atmosphere/plugin/rmi/rmi.properties deleted file mode 100644 index 3ae920cd1..000000000 --- a/extensions-samples/rmi/src/main/resources/org/atmosphere/plugin/rmi/rmi.properties +++ /dev/null @@ -1,4 +0,0 @@ -# Please run your server with a system property which overrides this property : -# -Dorg.atmosphere.rmi.peer.server1=: -Dorg.atmosphere.rmi.server.peer -rmi.server.port= -rmi.peer.server1= \ No newline at end of file diff --git a/extensions-samples/socketio/native-socketio-chat/pom.xml b/extensions-samples/socketio/native-socketio-chat/pom.xml deleted file mode 100755 index 12bcd91bc..000000000 --- a/extensions-samples/socketio/native-socketio-chat/pom.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - org.atmosphere - atmosphere-samples-project - 2.7.0-SNAPSHOT - ../../../ - - 4.0.0 - org.atmosphere.samples - atmosphere-nativesocketio-chat - war - 2.7.0-SNAPSHOT - atmosphere-nativesocketio-chat - http://maven.apache.org - - - org.atmosphere - atmosphere-runtime - ${atmosphere-version} - - - org.atmosphere - atmosphere-socketio - ${extensions-version} - - - org.apache.geronimo.specs - geronimo-servlet_3.0_spec - 1.0 - provided - - - org.slf4j - slf4j-log4j12 - 1.7.2 - - - - eu.infomas - annotation-detector - 3.0.0 - - - com.fasterxml.jackson.core - jackson-databind - ${jackson-version} - - - diff --git a/extensions-samples/socketio/native-socketio-chat/src/main/java/org/atmosphere/samples/chat/ChatJSONObject.java b/extensions-samples/socketio/native-socketio-chat/src/main/java/org/atmosphere/samples/chat/ChatJSONObject.java deleted file mode 100755 index 5fcb07581..000000000 --- a/extensions-samples/socketio/native-socketio-chat/src/main/java/org/atmosphere/samples/chat/ChatJSONObject.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2008-2018 Sebastien Dionne - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.atmosphere.samples.chat; - -import java.util.ArrayList; -import java.util.Collection; - -/** - * @author Sebastien Dionne : sebastien.dionne@gmail.com - */ -public class ChatJSONObject { - - public static final String LOGIN = "nickname"; - public static final String USERCONNECTEDLIST = "nicknames"; - public static final String MESSAGE = "user message"; - public static final String ANNONCEMENT = "announcement"; - - public String name; - public Collection args = new ArrayList(); - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Collection getArgs() { - return args; - } - - public void setArgs(Collection args) { - this.args = args; - } - - @Override - public String toString() { - return "ChatJSONObject [name=" + name + ", args=" + args + "]"; - } - -} diff --git a/extensions-samples/socketio/native-socketio-chat/src/main/java/org/atmosphere/samples/chat/NativeSocketIOAtmosphereHandler.java b/extensions-samples/socketio/native-socketio-chat/src/main/java/org/atmosphere/samples/chat/NativeSocketIOAtmosphereHandler.java deleted file mode 100755 index fa3bd4349..000000000 --- a/extensions-samples/socketio/native-socketio-chat/src/main/java/org/atmosphere/samples/chat/NativeSocketIOAtmosphereHandler.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright 2008-2018 Sebastien Dionne - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.atmosphere.samples.chat; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.ConcurrentSkipListMap; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.atmosphere.cache.UUIDBroadcasterCache; -import org.atmosphere.config.service.AtmosphereHandlerService; -import org.atmosphere.cpr.AtmosphereResource; -import org.atmosphere.cpr.Broadcaster; -import org.atmosphere.socketio.SocketIOSessionOutbound; -import org.atmosphere.socketio.cache.SocketIOBroadcasterCache; -import org.atmosphere.socketio.cpr.SocketIOAtmosphereHandler; -import org.atmosphere.socketio.transport.DisconnectReason; -import org.atmosphere.socketio.transport.SocketIOPacketImpl; -import org.atmosphere.socketio.transport.SocketIOPacketImpl.PacketType; -import org.atmosphere.util.ExcludeSessionBroadcaster; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Simple SocketIOAtmosphereHandler that implements the logic to build a - * SocketIO Chat application. - * - * @author Sebastien Dionne : sebastien.dionne@gmail.com - */ -@AtmosphereHandlerService( - path = "/*", - supportSession=true, - //broadcasterCache=UUIDBroadcasterCache.class) - broadcasterCache=SocketIOBroadcasterCache.class) -public class NativeSocketIOAtmosphereHandler extends SocketIOAtmosphereHandler { - - private static final Logger logger = LoggerFactory.getLogger(NativeSocketIOAtmosphereHandler.class); - private final ConcurrentMap loggedUserMap = new ConcurrentSkipListMap(); - private final ObjectMapper mapper = new ObjectMapper(); - private Broadcaster broadcaster; - - public void onConnect(AtmosphereResource r, SocketIOSessionOutbound outbound) throws IOException { - logger.debug("onConnect"); - broadcaster = r.getBroadcaster(); - } - - public void onMessage(AtmosphereResource r, SocketIOSessionOutbound outbound, String message) { - - if (outbound == null || message == null || message.length() == 0) { - return; - } - - try { - logger.debug("onMessage on SessionID=" + outbound.getSessionId() + " : Message Received = " + message); - ChatJSONObject chat = mapper.readValue(message, ChatJSONObject.class); - - if (ChatJSONObject.LOGIN.equalsIgnoreCase(chat.name)) { - r.session().setAttribute("LOGINNAME", chat.getArgs().toArray()[0]); - String username = (String) chat.getArgs().toArray()[0]; - - // username already in use ? - if (loggedUserMap.containsValue(username)) { - outbound.sendMessage(new SocketIOPacketImpl(PacketType.ACK, "1+[true]").toString()); - } else { - loggedUserMap.put(outbound.getSessionId(), username); - - try { - ChatJSONObject out = new ChatJSONObject(); - - out.setName(ChatJSONObject.USERCONNECTEDLIST); - List> list = new ArrayList>(); - - list.add(loggedUserMap); - - out.setArgs(list); - - List loginMessagesList = new ArrayList(2); - - // send login confirmation - loginMessagesList.add(new SocketIOPacketImpl(PacketType.ACK, "1+[false]")); - - // send a list of connected users - loginMessagesList.add(new SocketIOPacketImpl(PacketType.EVENT, mapper.writeValueAsString(out))); - - // send the list only for this user (will not be broadcasted) - outbound.sendMessage(loginMessagesList); - - // send the new list of connected users to the users already connected - broadcaster.broadcast(mapper.writeValueAsString(out), r); - - // send a Event to all clients telling that a new user was connected - broadcaster.broadcast("{\"args\":[\"" + chat.getArgs().toArray()[0] + " connected\"],\"name\":\"announcement\"}", r); - - - logger.trace("Broadcasting on SessionID=" + outbound.getSessionId() + " LOGIN is completed"); - - } catch (Exception e) { - logger.error("", e); - outbound.disconnect(); - } - - } - - } else if (ChatJSONObject.MESSAGE.equalsIgnoreCase(chat.name)) { - - String username = loggedUserMap.get(outbound.getSessionId()); - - List msg = new ArrayList(); - msg.add(username); - msg.addAll(chat.args); - - ChatJSONObject out = new ChatJSONObject(); - - out.setName(ChatJSONObject.MESSAGE); - out.setArgs(msg); - - // broadcast the message to all other users - broadcaster.broadcast(mapper.writeValueAsString(out), r); - - logger.trace("Broadcasting on SessionID=" + outbound.getSessionId() + " MESSAGE is completed"); - } - - } catch (IOException e) { - logger.error("", e); - } - } - - public void onDisconnect(AtmosphereResource r, SocketIOSessionOutbound outbound, DisconnectReason reason) { - logger.debug("onDisconnect from sessionid = " + outbound.getSessionId() + " username=" + loggedUserMap.get(outbound.getSessionId())); - - String sessionid = outbound.getSessionId(); - - String username = loggedUserMap.get(sessionid); - - // broadcast to other user that his user is disconnected - broadcaster.broadcast("{\"name\":\"announcement\",\"args\":[\"" + username + " disconnected\"]}",r); - - // remove the username from the cache - loggedUserMap.remove(sessionid); - - // regenerate the list of connected users and broadcast it - ObjectMapper mapper = new ObjectMapper(); - - ChatJSONObject out = new ChatJSONObject(); - out.setName(ChatJSONObject.USERCONNECTEDLIST); - List> list = new ArrayList>(); - list.add(loggedUserMap); - out.setArgs(list); - - try { - broadcaster.broadcast(new SocketIOPacketImpl(PacketType.EVENT, mapper.writeValueAsString(out), false).toString(), r); - } catch (Exception e) { - logger.error("", e); - } - - logger.trace("Broadcasting on SessionID=" + outbound.getSessionId() + " DISCONNECT is completed"); - - } - -} diff --git a/extensions-samples/socketio/native-socketio-chat/src/main/java/org/atmosphere/samples/chat/SocketIOBroadcaster.java b/extensions-samples/socketio/native-socketio-chat/src/main/java/org/atmosphere/samples/chat/SocketIOBroadcaster.java deleted file mode 100755 index 12cc1559a..000000000 --- a/extensions-samples/socketio/native-socketio-chat/src/main/java/org/atmosphere/samples/chat/SocketIOBroadcaster.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2008-2018 Sebastien Dionne - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.atmosphere.samples.chat; - -import org.atmosphere.config.service.BroadcasterService; -import org.atmosphere.cpr.AtmosphereResource; -import org.atmosphere.socketio.transport.SocketIOPacketImpl; -import org.atmosphere.util.ExcludeSessionBroadcaster; - -import java.util.Set; -import java.util.concurrent.Future; - -@BroadcasterService -public class SocketIOBroadcaster extends ExcludeSessionBroadcaster { - - @Override - public Future broadcast(Object m) { - Object msg = new SocketIOPacketImpl(SocketIOPacketImpl.PacketType.EVENT, m.toString()).toString(); - return super.broadcast(msg); - } - - @Override - public Future broadcast(Object m, AtmosphereResource resource) { - Object msg = new SocketIOPacketImpl(SocketIOPacketImpl.PacketType.EVENT, m.toString()).toString(); - return super.broadcast(msg, resource); - } - - @Override - public Future broadcast(Object m, Set subset) { - Object msg = new SocketIOPacketImpl(SocketIOPacketImpl.PacketType.EVENT, m.toString()).toString(); - return super.broadcast(msg, subset); - } - -} \ No newline at end of file diff --git a/extensions-samples/socketio/native-socketio-chat/src/main/webapp/WEB-INF/web.xml b/extensions-samples/socketio/native-socketio-chat/src/main/webapp/WEB-INF/web.xml deleted file mode 100755 index b4f5cd299..000000000 --- a/extensions-samples/socketio/native-socketio-chat/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - SocketIOChat - - AtmosphereServlet - AtmosphereServlet - org.atmosphere.cpr.AtmosphereServlet - - socketio-transport - websocket,xhr-polling,jsonp-polling - - - socketio-timeout - 25000 - - - socketio-heartbeat - 15000 - - - socketio-suspendTime - 30000 - - - org.atmosphere.cpr.sessionSupport - true - - 0 - true - - - AtmosphereServlet - /ChatAtmosphereHandler/* - - - index.html - - \ No newline at end of file diff --git a/extensions-samples/socketio/native-socketio-chat/src/main/webapp/css/style.css b/extensions-samples/socketio/native-socketio-chat/src/main/webapp/css/style.css deleted file mode 100755 index 4995852f6..000000000 --- a/extensions-samples/socketio/native-socketio-chat/src/main/webapp/css/style.css +++ /dev/null @@ -1,239 +0,0 @@ -#manualDisconnectGet { - background: yellow; - height: 30px; - left: 0; - top: 0; - text-align: center; - width: 150px; - font: 15px Georgia; - color: #666; -} - -#manualDisconnectPost { - background: green; - height: 30px; - left: 0; - top: 0; - text-align: center; - width: 150px; - font: 15px Georgia; - color: #666; -} - -#chat,#nickname,#messages { - width: 600px; -} - -#chat { - position: relative; - border: 1px solid #ccc; -} - -#nickname,#connecting { - position: absolute; - height: 410px; - z-index: 100; - left: 0; - top: 0; - background: #fff; - text-align: center; - width: 600px; - font: 15px Georgia; - color: #666; - display: block; -} - -#nickname .wrap,#connecting .wrap { - padding-top: 150px; -} - -#nickname input { - border: 1px solid #ccc; - padding: 10px; -} - -#nickname input:focus { - border-color: #999; - outline: 0; -} - -#nickname #nickname-err { - color: #8b0000; - font-size: 12px; - visibility: hidden; -} - -.connected #connecting { - display: none; -} - -.nickname-set #nickname { - display: none; -} - -#messages { - height: 380px; - background: #eee; -} - -#messages em { - text-shadow: 0 1px 0 #fff; - color: #999; -} - -#messages p { - padding: 0; - margin: 0; - font: 12px Helvetica, Arial; - padding: 5px 10px; -} - -#messages p b { - display: inline-block; - padding-right: 10px; -} - -#messages p:nth-child(even) { - background: #fafafa; -} - -#messages #nicknames { - background: #ccc; - padding: 2px 4px 4px; - font: 11px Helvetica; -} - -#messages #nicknames span { - color: #000; -} - -#messages #nicknames b { - display: inline-block; - color: #fff; - background: #999; - padding: 3px 6px; - margin-right: 5px; - -webkit-border-radius: 10px; - -moz-border-radius: 10px; - border-radius: 10px; - text-shadow: 0 1px 0 #666; -} - -#messages #lines { - height: 355px; - overflow: auto; - overflow-x: hidden; - overflow-y: auto; -} - -#messages #lines::-webkit-scrollbar { - width: 6px; - height: 6px; -} - -#messages #lines::-webkit-scrollbar-button:start:decrement,#messages #lines ::-webkit-scrollbar-button:end:increment - { - display: block; - height: 10px; -} - -#messages #lines::-webkit-scrollbar-button:vertical:increment { - background-color: #fff; -} - -#messages #lines::-webkit-scrollbar-track-piece { - background-color: #fff; - -webkit-border-radius: 3px; -} - -#messages #lines::-webkit-scrollbar-thumb:vertical { - height: 50px; - background-color: #ccc; - -webkit-border-radius: 3px; -} - -#messages #lines::-webkit-scrollbar-thumb:horizontal { - width: 50px; - background-color: #fff; - -webkit-border-radius: 3px; -} - -#send-message { - background: #fff; - position: relative; -} - -#send-message input { - border: none; - height: 30px; - padding: 0 10px; - line-height: 30px; - vertical-align: middle; - width: 580px; -} - -#send-message input:focus { - outline: 0; -} - -#send-message button { - position: absolute; - top: 5px; - right: 5px; -} - -button { - margin: 0; - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; - display: inline-block; - text-decoration: none; - background: #43a1f7; - background: -webkit-gradient(linear, left top, left bottom, color-stop(0, #43a1f7), - color-stop(1, #377ad0) ); - background: -webkit-linear-gradient(top, #43a1f7 0%, #377ad0 100%); - background: -moz-linear-gradient(top, #43a1f7 0%, #377ad0 100%); - background: linear-gradient(top, #43a1f7 0%, #377ad0 100%); - border: 1px solid #2e70c4; - -webkit-border-radius: 16px; - -moz-border-radius: 16px; - border-radius: 16px; - color: #fff; - font-family: "lucida grande", sans-serif; - font-size: 11px; - font-weight: normal; - line-height: 1; - padding: 3px 10px 5px 10px; - text-align: center; - text-shadow: 0 -1px 1px #2d6dc0; -} - -button:hover,button.hover { - background: darker; - background: -webkit-gradient(linear, left top, left bottom, color-stop(0, #43a1f7), - color-stop(1, #2e70c4) ); - background: -webkit-linear-gradient(top, #43a1f7 0%, #2e70c4 100%); - background: -moz-linear-gradient(top, #43a1f7 0%, #2e70c4 100%); - background: linear-gradient(top, #43a1f7 0%, #2e70c4 100%); - border: 1px solid #2e70c4; - cursor: pointer; - text-shadow: 0 -1px 1px #2c6bbb; -} - -button:active,button.active { - background: #2e70c4; - border: 1px solid #2e70c4; - border-bottom: 1px solid #2861aa; - text-shadow: 0 -1px 1px #2b67b5; -} - -button:focus,button.focus { - outline: none; - -webkit-box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.4), 0 0 4px 0 - #377ad0; - -moz-box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.4), 0 0 4px 0 #377ad0; - box-shadow: 0 1px 0# -T 127.0 .0 .1:5000-> 127.0 .0 .1:40127[AFP] - 0 rgba(255, 255, 255, 0.4), 0 0 4px 0 #377ad0; -} \ No newline at end of file diff --git a/extensions-samples/socketio/native-socketio-chat/src/main/webapp/dist/WebSocketMain.swf b/extensions-samples/socketio/native-socketio-chat/src/main/webapp/dist/WebSocketMain.swf deleted file mode 100755 index 20a451f57ba342d27b1a485d2e3931ea79ed988b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175830 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 z 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 diff --git a/extensions-samples/socketio/native-socketio-chat/src/main/webapp/dist/WebSocketMainInsecure.swf b/extensions-samples/socketio/native-socketio-chat/src/main/webapp/dist/WebSocketMainInsecure.swf deleted file mode 100755 index 5949ff3d09e4dc669cb25144fa5775dba071b684..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175953 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

6_4TzBh#=34(fx0_pa7FIaK3=>Pm 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±k#VeO;J63S6QrHJIUFH4_gkHxsAIz7p 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 LboTr|Wyc*1(*E2! diff --git a/extensions-samples/socketio/native-socketio-chat/src/main/webapp/dist/jquery-2.0.3.js b/extensions-samples/socketio/native-socketio-chat/src/main/webapp/dist/jquery-2.0.3.js deleted file mode 100644 index e705891f3..000000000 --- a/extensions-samples/socketio/native-socketio-chat/src/main/webapp/dist/jquery-2.0.3.js +++ /dev/null @@ -1,8829 +0,0 @@ -/*! - * jQuery JavaScript Library v2.0.3 - * http://jquery.com/ - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * - * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2013-07-03T13:30Z - */ -(function( window, undefined ) { - -// Can't do this because several apps including ASP.NET trace -// the stack via arguments.caller.callee and Firefox dies if -// you try to trace through "use strict" call chains. (#13335) -// Support: Firefox 18+ -//"use strict"; -var - // A central reference to the root jQuery(document) - rootjQuery, - - // The deferred used on DOM ready - readyList, - - // Support: IE9 - // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined` - core_strundefined = typeof undefined, - - // Use the correct document accordingly with window argument (sandbox) - location = window.location, - document = window.document, - docElem = document.documentElement, - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$, - - // [[Class]] -> type pairs - class2type = {}, - - // List of deleted data cache ids, so we can reuse them - core_deletedIds = [], - - core_version = "2.0.3", - - // Save a reference to some core methods - core_concat = core_deletedIds.concat, - core_push = core_deletedIds.push, - core_slice = core_deletedIds.slice, - core_indexOf = core_deletedIds.indexOf, - core_toString = class2type.toString, - core_hasOwn = class2type.hasOwnProperty, - core_trim = core_version.trim, - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context, rootjQuery ); - }, - - // Used for matching numbers - core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, - - // Used for splitting on whitespace - core_rnotwhite = /\S+/g, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - - // Match a standalone tag - rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([\da-z])/gi, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }, - - // The ready event handler and self cleanup method - completed = function() { - document.removeEventListener( "DOMContentLoaded", completed, false ); - window.removeEventListener( "load", completed, false ); - jQuery.ready(); - }; - -jQuery.fn = jQuery.prototype = { - // The current version of jQuery being used - jquery: core_version, - - constructor: jQuery, - init: function( selector, context, rootjQuery ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - - // scripts is true for back-compat - jQuery.merge( this, jQuery.parseHTML( - match[1], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[2] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || rootjQuery ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return rootjQuery.ready( selector ); - } - - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }, - - // Start with an empty selector - selector: "", - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return core_slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num == null ? - - // Return a 'clean' array - this.toArray() : - - // Return just the object - ( num < 0 ? this[ this.length + num ] : this[ num ] ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - ret.context = this.context; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - ready: function( fn ) { - // Add the callback - jQuery.ready.promise().done( fn ); - - return this; - }, - - slice: function() { - return this.pushStack( core_slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { - return callback.call( elem, i, elem ); - })); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: core_push, - sort: [].sort, - splice: [].splice -}; - -// Give the init function the jQuery prototype for later instantiation -jQuery.fn.init.prototype = jQuery.fn; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if ( length === i ) { - target = this; - --i; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend({ - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ), - - noConflict: function( deep ) { - if ( window.$ === jQuery ) { - window.$ = _$; - } - - if ( deep && window.jQuery === jQuery ) { - window.jQuery = _jQuery; - } - - return jQuery; - }, - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.trigger ) { - jQuery( document ).trigger("ready").off("ready"); - } - }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - return !isNaN( parseFloat(obj) ) && isFinite( obj ); - }, - - type: function( obj ) { - if ( obj == null ) { - return String( obj ); - } - // Support: Safari <= 5.1 (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ core_toString.call(obj) ] || "object" : - typeof obj; - }, - - isPlainObject: function( obj ) { - // Not plain objects: - // - Any object or value whose internal [[Class]] property is not "[object Object]" - // - DOM nodes - // - window - if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - // Support: Firefox <20 - // The try/catch suppresses exceptions thrown when attempting to access - // the "constructor" property of certain host objects, ie. |window.location| - // https://bugzilla.mozilla.org/show_bug.cgi?id=814622 - try { - if ( obj.constructor && - !core_hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { - return false; - } - } catch ( e ) { - return false; - } - - // If the function hasn't returned already, we're confident that - // |obj| is a plain object, created by {} or constructed with new Object - return true; - }, - - isEmptyObject: function( obj ) { - var name; - for ( name in obj ) { - return false; - } - return true; - }, - - error: function( msg ) { - throw new Error( msg ); - }, - - // data: string of html - // context (optional): If specified, the fragment will be created in this context, defaults to document - // keepScripts (optional): If true, will include scripts passed in the html string - parseHTML: function( data, context, keepScripts ) { - if ( !data || typeof data !== "string" ) { - return null; - } - if ( typeof context === "boolean" ) { - keepScripts = context; - context = false; - } - context = context || document; - - var parsed = rsingleTag.exec( data ), - scripts = !keepScripts && []; - - // Single tag - if ( parsed ) { - return [ context.createElement( parsed[1] ) ]; - } - - parsed = jQuery.buildFragment( [ data ], context, scripts ); - - if ( scripts ) { - jQuery( scripts ).remove(); - } - - return jQuery.merge( [], parsed.childNodes ); - }, - - parseJSON: JSON.parse, - - // Cross-browser xml parsing - parseXML: function( data ) { - var xml, tmp; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE9 - try { - tmp = new DOMParser(); - xml = tmp.parseFromString( data , "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; - }, - - noop: function() {}, - - // Evaluates a script in a global context - globalEval: function( code ) { - var script, - indirect = eval; - - code = jQuery.trim( code ); - - if ( code ) { - // If the code includes a valid, prologue position - // strict mode pragma, execute code by injecting a - // script tag into the document. - if ( code.indexOf("use strict") === 1 ) { - script = document.createElement("script"); - script.text = code; - document.head.appendChild( script ).parentNode.removeChild( script ); - } else { - // Otherwise, avoid the DOM node creation, insertion - // and removal by using an indirect global eval - indirect( code ); - } - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - // args is for internal usage only - each: function( obj, callback, args ) { - var value, - i = 0, - length = obj.length, - isArray = isArraylike( obj ); - - if ( args ) { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } - } - - return obj; - }, - - trim: function( text ) { - return text == null ? "" : core_trim.call( text ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArraylike( Object(arr) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - core_push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : core_indexOf.call( arr, elem, i ); - }, - - merge: function( first, second ) { - var l = second.length, - i = first.length, - j = 0; - - if ( typeof l === "number" ) { - for ( ; j < l; j++ ) { - first[ i++ ] = second[ j ]; - } - } else { - while ( second[j] !== undefined ) { - first[ i++ ] = second[ j++ ]; - } - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, inv ) { - var retVal, - ret = [], - i = 0, - length = elems.length; - inv = !!inv; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - retVal = !!callback( elems[ i ], i ); - if ( inv !== retVal ) { - ret.push( elems[ i ] ); - } - } - - return ret; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, - i = 0, - length = elems.length, - isArray = isArraylike( elems ), - ret = []; - - // Go through the array, translating each of the items to their - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - } - - // Flatten any nested arrays - return core_concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = core_slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - // Multifunctional method to get and set values of a collection - // The value/s can optionally be executed if it's a function - access: function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - length = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < length; i++ ) { - fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); - } - } - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call( elems ) : - length ? fn( elems[0], key ) : emptyGet; - }, - - now: Date.now, - - // A method for quickly swapping in/out CSS properties to get correct calculations. - // Note: this method belongs to the css module but it's needed here for the support module. - // If support gets modularized, this method should be moved back to the css module. - swap: function( elem, options, callback, args ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.apply( elem, args || [] ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; - } -}); - -jQuery.ready.promise = function( obj ) { - if ( !readyList ) { - - readyList = jQuery.Deferred(); - - // Catch cases where $(document).ready() is called after the browser event has already occurred. - // we once tried to use readyState "interactive" here, but it caused issues like the one - // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - setTimeout( jQuery.ready ); - - } else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed, false ); - } - } - return readyList.promise( obj ); -}; - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -function isArraylike( obj ) { - var length = obj.length, - type = jQuery.type( obj ); - - if ( jQuery.isWindow( obj ) ) { - return false; - } - - if ( obj.nodeType === 1 && length ) { - return true; - } - - return type === "array" || type !== "function" && - ( length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj ); -} - -// All jQuery objects should point back to these -rootjQuery = jQuery(document); -/*! - * Sizzle CSS Selector Engine v1.9.4-pre - * http://sizzlejs.com/ - * - * Copyright 2013 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2013-06-03 - */ -(function( window, undefined ) { - -var i, - support, - cachedruns, - Expr, - getText, - isXML, - compile, - outermostContext, - sortInput, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + -(new Date()), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - hasDuplicate = false, - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - return 0; - } - return 0; - }, - - // General-purpose constants - strundefined = typeof undefined, - MAX_NEGATIVE = 1 << 31, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf if we can't use a native one - indexOf = arr.indexOf || function( elem ) { - var i = 0, - len = this.length; - for ( ; i < len; i++ ) { - if ( this[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - // http://www.w3.org/TR/css3-syntax/#characters - characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", - - // Loosely modeled on CSS identifier characters - // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors - // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = characterEncoding.replace( "w", "w#" ), - - // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + - "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]", - - // Prefer arguments quoted, - // then not containing pseudos/brackets, - // then attribute selectors/non-parenthetical expressions, - // then anything else - // These preferences are here to reduce the number of selectors - // needing tokenize in the PSEUDO preFilter - pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rsibling = new RegExp( whitespace + "*[+~]" ), - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + characterEncoding + ")" ), - "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), - "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rescape = /'|\\/g, - - // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - // BMP codepoint - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }; - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var match, elem, m, nodeType, - // QSA vars - i, groups, old, nid, newContext, newSelector; - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - - context = context || document; - results = results || []; - - if ( !selector || typeof selector !== "string" ) { - return results; - } - - if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { - return []; - } - - if ( documentIsHTML && !seed ) { - - // Shortcuts - if ( (match = rquickExpr.exec( selector )) ) { - // Speed-up: Sizzle("#ID") - if ( (m = match[1]) ) { - if ( nodeType === 9 ) { - elem = context.getElementById( m ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE, Opera, and Webkit return items - // by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - } else { - // Context is not a document - if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && - contains( context, elem ) && elem.id === m ) { - results.push( elem ); - return results; - } - } - - // Speed-up: Sizzle("TAG") - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Speed-up: Sizzle(".CLASS") - } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // QSA path - if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - nid = old = expando; - newContext = context; - newSelector = nodeType === 9 && selector; - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - groups = tokenize( selector ); - - if ( (old = context.getAttribute("id")) ) { - nid = old.replace( rescape, "\\$&" ); - } else { - context.setAttribute( "id", nid ); - } - nid = "[id='" + nid + "'] "; - - i = groups.length; - while ( i-- ) { - groups[i] = nid + toSelector( groups[i] ); - } - newContext = rsibling.test( selector ) && context.parentNode || context; - newSelector = groups.join(","); - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch(qsaError) { - } finally { - if ( !old ) { - context.removeAttribute("id"); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {Function(string, Object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key += " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created div and expects a boolean result - */ -function assert( fn ) { - var div = document.createElement("div"); - - try { - return !!fn( div ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( div.parentNode ) { - div.parentNode.removeChild( div ); - } - // release memory in IE - div = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = attrs.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - ( ~b.sourceIndex || MAX_NEGATIVE ) - - ( ~a.sourceIndex || MAX_NEGATIVE ); - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Detect xml - * @param {Element|Object} elem An element or a document - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var doc = node ? node.ownerDocument || node : preferredDoc, - parent = doc.defaultView; - - // If no document and documentElement is available, return - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Set our document - document = doc; - docElem = doc.documentElement; - - // Support tests - documentIsHTML = !isXML( doc ); - - // Support: IE>8 - // If iframe document is assigned to "document" variable and if iframe has been reloaded, - // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 - // IE6-8 do not support the defaultView property so parent will be undefined - if ( parent && parent.attachEvent && parent !== parent.top ) { - parent.attachEvent( "onbeforeunload", function() { - setDocument(); - }); - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) - support.attributes = assert(function( div ) { - div.className = "i"; - return !div.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( div ) { - div.appendChild( doc.createComment("") ); - return !div.getElementsByTagName("*").length; - }); - - // Check if getElementsByClassName can be trusted - support.getElementsByClassName = assert(function( div ) { - div.innerHTML = "

"; - - // Support: Safari<4 - // Catch class over-caching - div.firstChild.className = "i"; - // Support: Opera<10 - // Catch gEBCN failure to find non-leading classes - return div.getElementsByClassName("i").length === 2; - }); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( div ) { - docElem.appendChild( div ).id = expando; - return !doc.getElementsByName || !doc.getElementsByName( expando ).length; - }); - - // ID find and filter - if ( support.getById ) { - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== strundefined && documentIsHTML ) { - var m = context.getElementById( id ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - }; - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - } else { - // Support: IE6/7 - // getElementById is not reliable as a find shortcut - delete Expr.find["ID"]; - - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== strundefined ) { - return context.getElementsByTagName( tag ); - } - } : - function( tag, context ) { - var elem, - tmp = [], - i = 0, - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See http://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( div ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // http://bugs.jquery.com/ticket/12359 - div.innerHTML = ""; - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !div.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - }); - - assert(function( div ) { - - // Support: Opera 10-12/IE8 - // ^= $= *= and empty values - // Should not select anything - // Support: Windows 8 Native Apps - // The type attribute is restricted during .innerHTML assignment - var input = doc.createElement("input"); - input.setAttribute( "type", "hidden" ); - div.appendChild( input ).setAttribute( "t", "" ); - - if ( div.querySelectorAll("[t^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":enabled").length ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - div.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( div ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( div, "div" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( div, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - - // Element contains another - // Purposefully does not implement inclusive descendent - // As in, an element does not contain itself - contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = docElem.compareDocumentPosition ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b ); - - if ( compare ) { - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === doc || contains(preferredDoc, a) ) { - return -1; - } - if ( b === doc || contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } - - // Not directly comparable, sort on existence of method - return a.compareDocumentPosition ? -1 : 1; - } : - function( a, b ) { - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - - // Parentless nodes are either documents or disconnected - } else if ( !aup || !bup ) { - return a === doc ? -1 : - b === doc ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return doc; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch(e) {} - } - - return Sizzle( expr, document, null, [elem] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val === undefined ? - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null : - val; -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - for ( ; (node = elem[i]); i++ ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (see #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[5] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] && match[4] !== undefined ) { - match[2] = match[4]; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, outerCache, node, diff, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - // Seek `elem` from a previously-cached index - outerCache = parent[ expando ] || (parent[ expando ] = {}); - cache = outerCache[ type ] || []; - nodeIndex = cache[0] === dirruns && cache[1]; - diff = cache[0] === dirruns && cache[2]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - outerCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - // Use previously-cached element index if available - } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { - diff = cache[1]; - - // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) - } else { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { - // Cache the index of each encountered element - if ( useCache ) { - (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf.call( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": function( elem ) { - return elem.disabled === false; - }, - - "disabled": function( elem ) { - return elem.disabled === true; - }, - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)), - // not comment, processing instructions, or others - // Thanks to Diego Perini for the nodeName shortcut - // Greater than "@" means alpha characters (specifically not starting with "#" or "?") - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) - // use getAttribute instead to test this case - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -function tokenize( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( tokens = [] ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -} - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - checkNonElements = base && dir === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var data, cache, outerCache, - dirkey = dirruns + " " + doneName; - - // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) { - if ( (data = cache[1]) === true || data === cachedruns ) { - return data === true; - } - } else { - cache = outerCache[ dir ] = [ dirkey ]; - cache[1] = matcher( elem, context, xml ) || cachedruns; - if ( cache[1] === true ) { - return true; - } - } - } - } - } - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf.call( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - // A counter to specify which element is currently being matched - var matcherCachedRuns = 0, - bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, expandContext ) { - var elem, j, matcher, - setMatched = [], - matchedCount = 0, - i = "0", - unmatched = seed && [], - outermost = expandContext != null, - contextBackup = outermostContext, - // We must always have either seed elements or context - elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1); - - if ( outermost ) { - outermostContext = context !== document && context; - cachedruns = matcherCachedRuns; - } - - // Add elements passing elementMatchers directly to results - // Keep `i` a string if there are no elements so `matchedCount` will be "00" below - for ( ; (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - cachedruns = ++matcherCachedRuns; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // Apply set filters to unmatched elements - matchedCount += i; - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !group ) { - group = tokenize( selector ); - } - i = group.length; - while ( i-- ) { - cached = matcherFromTokens( group[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - } - return cached; -}; - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function select( selector, context, results, seed ) { - var i, tokens, token, type, find, - match = tokenize( selector ); - - if ( !seed ) { - // Try to minimize operations if there is only one group - if ( match.length === 1 ) { - - // Take a shortcut and set the context if the root selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - support.getById && context.nodeType === 9 && documentIsHTML && - Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - } - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && context.parentNode || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - } - - // Compile and execute a filtering function - // Provide `match` to avoid retokenization if we modified the selector above - compile( selector, match )( - seed, - context, - !documentIsHTML, - results, - rsibling.test( selector ) - ); - return results; -} - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome<14 -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( div1 ) { - // Should return 1, but returns 4 (following) - return div1.compareDocumentPosition( document.createElement("div") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( div ) { - div.innerHTML = ""; - return div.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( div ) { - div.innerHTML = ""; - div.firstChild.setAttribute( "value", "" ); - return div.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( div ) { - return div.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - elem[ name ] === true ? name.toLowerCase() : null; - } - }); -} - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.pseudos; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - -})( window ); -// String to Object options format cache -var optionsCache = {}; - -// Convert String-formatted options into Object-formatted ones and store in cache -function createOptions( options ) { - var object = optionsCache[ options ] = {}; - jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) { - object[ flag ] = true; - }); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - ( optionsCache[ options ] || createOptions( options ) ) : - jQuery.extend( {}, options ); - - var // Last fire value (for non-forgettable lists) - memory, - // Flag to know if list was already fired - fired, - // Flag to know if list is currently firing - firing, - // First callback to fire (used internally by add and fireWith) - firingStart, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, - // Actual callback list - list = [], - // Stack of fire calls for repeatable lists - stack = !options.once && [], - // Fire callbacks - fire = function( data ) { - memory = options.memory && data; - fired = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - firing = true; - for ( ; list && firingIndex < firingLength; firingIndex++ ) { - if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { - memory = false; // To prevent further calls using add - break; - } - } - firing = false; - if ( list ) { - if ( stack ) { - if ( stack.length ) { - fire( stack.shift() ); - } - } else if ( memory ) { - list = []; - } else { - self.disable(); - } - } - }, - // Actual Callbacks object - self = { - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - // First, we save the current length - var start = list.length; - (function add( args ) { - jQuery.each( args, function( _, arg ) { - var type = jQuery.type( arg ); - if ( type === "function" ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && type !== "string" ) { - // Inspect recursively - add( arg ); - } - }); - })( arguments ); - // Do we need to add the callbacks to the - // current firing batch? - if ( firing ) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away - } else if ( memory ) { - firingStart = start; - fire( memory ); - } - } - return this; - }, - // Remove a callback from the list - remove: function() { - if ( list ) { - jQuery.each( arguments, function( _, arg ) { - var index; - while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - // Handle firing indexes - if ( firing ) { - if ( index <= firingLength ) { - firingLength--; - } - if ( index <= firingIndex ) { - firingIndex--; - } - } - } - }); - } - return this; - }, - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); - }, - // Remove all callbacks from the list - empty: function() { - list = []; - firingLength = 0; - return this; - }, - // Have the list do nothing anymore - disable: function() { - list = stack = memory = undefined; - return this; - }, - // Is it disabled? - disabled: function() { - return !list; - }, - // Lock the list in its current state - lock: function() { - stack = undefined; - if ( !memory ) { - self.disable(); - } - return this; - }, - // Is it locked? - locked: function() { - return !stack; - }, - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( list && ( !fired || stack ) ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - if ( firing ) { - stack.push( args ); - } else { - fire( args ); - } - } - return this; - }, - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; -jQuery.extend({ - - Deferred: function( func ) { - var tuples = [ - // action, add listener, listener list, final state - [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], - [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], - [ "notify", "progress", jQuery.Callbacks("memory") ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - then: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - return jQuery.Deferred(function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - var action = tuple[ 0 ], - fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; - // deferred[ done | fail | progress ] for forwarding actions to newDefer - deferred[ tuple[1] ](function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .done( newDefer.resolve ) - .fail( newDefer.reject ) - .progress( newDefer.notify ); - } else { - newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); - } - }); - }); - fns = null; - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Keep pipe for back-compat - promise.pipe = promise.then; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 3 ]; - - // promise[ done | fail | progress ] = list.add - promise[ tuple[1] ] = list.add; - - // Handle state - if ( stateString ) { - list.add(function() { - // state = [ resolved | rejected ] - state = stateString; - - // [ reject_list | resolve_list ].disable; progress_list.lock - }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); - } - - // deferred[ resolve | reject | notify ] - deferred[ tuple[0] ] = function() { - deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); - return this; - }; - deferred[ tuple[0] + "With" ] = list.fireWith; - }); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( subordinate /* , ..., subordinateN */ ) { - var i = 0, - resolveValues = core_slice.call( arguments ), - length = resolveValues.length, - - // the count of uncompleted subordinates - remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, - - // the master Deferred. If resolveValues consist of only a single Deferred, just use that. - deferred = remaining === 1 ? subordinate : jQuery.Deferred(), - - // Update function for both resolve and progress values - updateFunc = function( i, contexts, values ) { - return function( value ) { - contexts[ i ] = this; - values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value; - if( values === progressValues ) { - deferred.notifyWith( contexts, values ); - } else if ( !( --remaining ) ) { - deferred.resolveWith( contexts, values ); - } - }; - }, - - progressValues, progressContexts, resolveContexts; - - // add listeners to Deferred subordinates; treat others as resolved - if ( length > 1 ) { - progressValues = new Array( length ); - progressContexts = new Array( length ); - resolveContexts = new Array( length ); - for ( ; i < length; i++ ) { - if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { - resolveValues[ i ].promise() - .done( updateFunc( i, resolveContexts, resolveValues ) ) - .fail( deferred.reject ) - .progress( updateFunc( i, progressContexts, progressValues ) ); - } else { - --remaining; - } - } - } - - // if we're not waiting on anything, resolve the master - if ( !remaining ) { - deferred.resolveWith( resolveContexts, resolveValues ); - } - - return deferred.promise(); - } -}); -jQuery.support = (function( support ) { - var input = document.createElement("input"), - fragment = document.createDocumentFragment(), - div = document.createElement("div"), - select = document.createElement("select"), - opt = select.appendChild( document.createElement("option") ); - - // Finish early in limited environments - if ( !input.type ) { - return support; - } - - input.type = "checkbox"; - - // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 - // Check the default checkbox/radio value ("" on old WebKit; "on" elsewhere) - support.checkOn = input.value !== ""; - - // Must access the parent to make an option select properly - // Support: IE9, IE10 - support.optSelected = opt.selected; - - // Will be defined later - support.reliableMarginRight = true; - support.boxSizingReliable = true; - support.pixelPosition = false; - - // Make sure checked status is properly cloned - // Support: IE9, IE10 - input.checked = true; - support.noCloneChecked = input.cloneNode( true ).checked; - - // Make sure that the options inside disabled selects aren't marked as disabled - // (WebKit marks them as disabled) - select.disabled = true; - support.optDisabled = !opt.disabled; - - // Check if an input maintains its value after becoming a radio - // Support: IE9, IE10 - input = document.createElement("input"); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; - - // #11217 - WebKit loses check when the name is after the checked attribute - input.setAttribute( "checked", "t" ); - input.setAttribute( "name", "t" ); - - fragment.appendChild( input ); - - // Support: Safari 5.1, Android 4.x, Android 2.3 - // old WebKit doesn't clone checked state correctly in fragments - support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: Firefox, Chrome, Safari - // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) - support.focusinBubbles = "onfocusin" in window; - - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - // Run tests that need a body at doc ready - jQuery(function() { - var container, marginDiv, - // Support: Firefox, Android 2.3 (Prefixed box-sizing versions). - divReset = "padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box", - body = document.getElementsByTagName("body")[ 0 ]; - - if ( !body ) { - // Return for frameset docs that don't have a body - return; - } - - container = document.createElement("div"); - container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px"; - - // Check box-sizing and margin behavior. - body.appendChild( container ).appendChild( div ); - div.innerHTML = ""; - // Support: Firefox, Android 2.3 (Prefixed box-sizing versions). - div.style.cssText = "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%"; - - // Workaround failing boxSizing test due to offsetWidth returning wrong value - // with some non-1 values of body zoom, ticket #13543 - jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() { - support.boxSizing = div.offsetWidth === 4; - }); - - // Use window.getComputedStyle because jsdom on node.js will break without it. - if ( window.getComputedStyle ) { - support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%"; - support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px"; - - // Support: Android 2.3 - // Check if div with explicit width and no margin-right incorrectly - // gets computed margin-right based on width of container. (#3333) - // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right - marginDiv = div.appendChild( document.createElement("div") ); - marginDiv.style.cssText = div.style.cssText = divReset; - marginDiv.style.marginRight = marginDiv.style.width = "0"; - div.style.width = "1px"; - - support.reliableMarginRight = - !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight ); - } - - body.removeChild( container ); - }); - - return support; -})( {} ); - -/* - Implementation Summary - - 1. Enforce API surface and semantic compatibility with 1.9.x branch - 2. Improve the module's maintainability by reducing the storage - paths to a single mechanism. - 3. Use the same single mechanism to support "private" and "user" data. - 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) - 5. Avoid exposing implementation details on user objects (eg. expando properties) - 6. Provide a clear path for implementation upgrade to WeakMap in 2014 -*/ -var data_user, data_priv, - rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, - rmultiDash = /([A-Z])/g; - -function Data() { - // Support: Android < 4, - // Old WebKit does not have Object.preventExtensions/freeze method, - // return new empty object instead with no [[set]] accessor - Object.defineProperty( this.cache = {}, 0, { - get: function() { - return {}; - } - }); - - this.expando = jQuery.expando + Math.random(); -} - -Data.uid = 1; - -Data.accepts = function( owner ) { - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType ? - owner.nodeType === 1 || owner.nodeType === 9 : true; -}; - -Data.prototype = { - key: function( owner ) { - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return the key for a frozen object. - if ( !Data.accepts( owner ) ) { - return 0; - } - - var descriptor = {}, - // Check if the owner object already has a cache key - unlock = owner[ this.expando ]; - - // If not, create one - if ( !unlock ) { - unlock = Data.uid++; - - // Secure it in a non-enumerable, non-writable property - try { - descriptor[ this.expando ] = { value: unlock }; - Object.defineProperties( owner, descriptor ); - - // Support: Android < 4 - // Fallback to a less secure definition - } catch ( e ) { - descriptor[ this.expando ] = unlock; - jQuery.extend( owner, descriptor ); - } - } - - // Ensure the cache object - if ( !this.cache[ unlock ] ) { - this.cache[ unlock ] = {}; - } - - return unlock; - }, - set: function( owner, data, value ) { - var prop, - // There may be an unlock assigned to this node, - // if there is no entry for this "owner", create one inline - // and set the unlock as though an owner entry had always existed - unlock = this.key( owner ), - cache = this.cache[ unlock ]; - - // Handle: [ owner, key, value ] args - if ( typeof data === "string" ) { - cache[ data ] = value; - - // Handle: [ owner, { properties } ] args - } else { - // Fresh assignments by object are shallow copied - if ( jQuery.isEmptyObject( cache ) ) { - jQuery.extend( this.cache[ unlock ], data ); - // Otherwise, copy the properties one-by-one to the cache object - } else { - for ( prop in data ) { - cache[ prop ] = data[ prop ]; - } - } - } - return cache; - }, - get: function( owner, key ) { - // Either a valid cache is found, or will be created. - // New caches will be created and the unlock returned, - // allowing direct access to the newly created - // empty data object. A valid owner object must be provided. - var cache = this.cache[ this.key( owner ) ]; - - return key === undefined ? - cache : cache[ key ]; - }, - access: function( owner, key, value ) { - var stored; - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ((key && typeof key === "string") && value === undefined) ) { - - stored = this.get( owner, key ); - - return stored !== undefined ? - stored : this.get( owner, jQuery.camelCase(key) ); - } - - // [*]When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, name, camel, - unlock = this.key( owner ), - cache = this.cache[ unlock ]; - - if ( key === undefined ) { - this.cache[ unlock ] = {}; - - } else { - // Support array or space separated string of keys - if ( jQuery.isArray( key ) ) { - // If "name" is an array of keys... - // When data is initially created, via ("key", "val") signature, - // keys will be converted to camelCase. - // Since there is no way to tell _how_ a key was added, remove - // both plain key and camelCase key. #12786 - // This will only penalize the array argument path. - name = key.concat( key.map( jQuery.camelCase ) ); - } else { - camel = jQuery.camelCase( key ); - // Try the string as a key before any manipulation - if ( key in cache ) { - name = [ key, camel ]; - } else { - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - name = camel; - name = name in cache ? - [ name ] : ( name.match( core_rnotwhite ) || [] ); - } - } - - i = name.length; - while ( i-- ) { - delete cache[ name[ i ] ]; - } - } - }, - hasData: function( owner ) { - return !jQuery.isEmptyObject( - this.cache[ owner[ this.expando ] ] || {} - ); - }, - discard: function( owner ) { - if ( owner[ this.expando ] ) { - delete this.cache[ owner[ this.expando ] ]; - } - } -}; - -// These may be used throughout the jQuery core codebase -data_user = new Data(); -data_priv = new Data(); - - -jQuery.extend({ - acceptData: Data.accepts, - - hasData: function( elem ) { - return data_user.hasData( elem ) || data_priv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return data_user.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - data_user.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to data_priv methods, these can be deprecated. - _data: function( elem, name, data ) { - return data_priv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - data_priv.remove( elem, name ); - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var attrs, name, - elem = this[ 0 ], - i = 0, - data = null; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = data_user.get( elem ); - - if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) { - attrs = elem.attributes; - for ( ; i < attrs.length; i++ ) { - name = attrs[ i ].name; - - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice(5) ); - dataAttr( elem, name, data[ name ] ); - } - } - data_priv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each(function() { - data_user.set( this, key ); - }); - } - - return jQuery.access( this, function( value ) { - var data, - camelKey = jQuery.camelCase( key ); - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - // Attempt to get data from the cache - // with the key as-is - data = data_user.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to get data from the cache - // with the key camelized - data = data_user.get( elem, camelKey ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, camelKey, undefined ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each(function() { - // First, attempt to store a copy or reference of any - // data that might've been store with a camelCased key. - var data = data_user.get( this, camelKey ); - - // For HTML5 data-* attribute interop, we have to - // store property names with dashes in a camelCase form. - // This might not apply to all properties...* - data_user.set( this, camelKey, value ); - - // *... In the case of properties that might _actually_ - // have dashes, we need to also store a copy of that - // unchanged property. - if ( key.indexOf("-") !== -1 && data !== undefined ) { - data_user.set( this, key, value ); - } - }); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each(function() { - data_user.remove( this, key ); - }); - } -}); - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test( data ) ? JSON.parse( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - data_user.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} -jQuery.extend({ - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = data_priv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || jQuery.isArray( data ) ) { - queue = data_priv.access( elem, type, jQuery.makeArray(data) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // not intended for public consumption - generates a queueHooks object, or returns the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return data_priv.get( elem, key ) || data_priv.access( elem, key, { - empty: jQuery.Callbacks("once memory").add(function() { - data_priv.remove( elem, [ type + "queue", key ] ); - }) - }); - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[0], type ); - } - - return data === undefined ? - this : - this.each(function() { - var queue = jQuery.queue( this, type, data ); - - // ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - // Based off of the plugin by Clint Helfers, with permission. - // http://blindsignals.com/index.php/2009/07/jquery-delay/ - delay: function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = setTimeout( next, time ); - hooks.stop = function() { - clearTimeout( timeout ); - }; - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while( i-- ) { - tmp = data_priv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -}); -var nodeHook, boolHook, - rclass = /[\t\r\n\f]/g, - rreturn = /\r/g, - rfocusable = /^(?:input|select|textarea|button)$/i; - -jQuery.fn.extend({ - attr: function( name, value ) { - return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each(function() { - jQuery.removeAttr( this, name ); - }); - }, - - prop: function( name, value ) { - return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each(function() { - delete this[ jQuery.propFix[ name ] || name ]; - }); - }, - - addClass: function( value ) { - var classes, elem, cur, clazz, j, - i = 0, - len = this.length, - proceed = typeof value === "string" && value; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).addClass( value.call( this, j, this.className ) ); - }); - } - - if ( proceed ) { - // The disjunction here is for better compressibility (see removeClass) - classes = ( value || "" ).match( core_rnotwhite ) || []; - - for ( ; i < len; i++ ) { - elem = this[ i ]; - cur = elem.nodeType === 1 && ( elem.className ? - ( " " + elem.className + " " ).replace( rclass, " " ) : - " " - ); - - if ( cur ) { - j = 0; - while ( (clazz = classes[j++]) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - elem.className = jQuery.trim( cur ); - - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, clazz, j, - i = 0, - len = this.length, - proceed = arguments.length === 0 || typeof value === "string" && value; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).removeClass( value.call( this, j, this.className ) ); - }); - } - if ( proceed ) { - classes = ( value || "" ).match( core_rnotwhite ) || []; - - for ( ; i < len; i++ ) { - elem = this[ i ]; - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( elem.className ? - ( " " + elem.className + " " ).replace( rclass, " " ) : - "" - ); - - if ( cur ) { - j = 0; - while ( (clazz = classes[j++]) ) { - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) >= 0 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - elem.className = value ? jQuery.trim( cur ) : ""; - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value; - - if ( typeof stateVal === "boolean" && type === "string" ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( jQuery.isFunction( value ) ) { - return this.each(function( i ) { - jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); - }); - } - - return this.each(function() { - if ( type === "string" ) { - // toggle individual class names - var className, - i = 0, - self = jQuery( this ), - classNames = value.match( core_rnotwhite ) || []; - - while ( (className = classNames[ i++ ]) ) { - // check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( type === core_strundefined || type === "boolean" ) { - if ( this.className ) { - // store className if set - data_priv.set( this, "__className__", this.className ); - } - - // If the element has a class name or if we're passed "false", - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || ""; - } - }); - }, - - hasClass: function( selector ) { - var className = " " + selector + " ", - i = 0, - l = this.length; - for ( ; i < l; i++ ) { - if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) { - return true; - } - } - - return false; - }, - - val: function( value ) { - var hooks, ret, isFunction, - elem = this[0]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { - return ret; - } - - ret = elem.value; - - return typeof ret === "string" ? - // handle most common string cases - ret.replace(rreturn, "") : - // handle cases where value is null/undef or number - ret == null ? "" : ret; - } - - return; - } - - isFunction = jQuery.isFunction( value ); - - return this.each(function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - } else if ( typeof val === "number" ) { - val += ""; - } else if ( jQuery.isArray( val ) ) { - val = jQuery.map(val, function ( value ) { - return value == null ? "" : value + ""; - }); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - }); - } -}); - -jQuery.extend({ - valHooks: { - option: { - get: function( elem ) { - // attributes.value is undefined in Blackberry 4.7 but - // uses .value. See #6932 - var val = elem.attributes.value; - return !val || val.specified ? elem.value : elem.text; - } - }, - select: { - get: function( elem ) { - var value, option, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one" || index < 0, - values = one ? null : [], - max = one ? index + 1 : options.length, - i = index < 0 ? - max : - one ? index : 0; - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // IE6-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - // Don't return options that are disabled or in a disabled optgroup - ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) && - ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) { - optionSet = true; - } - } - - // force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - }, - - attr: function( elem, name, value ) { - var hooks, ret, - nType = elem.nodeType; - - // don't get/set attributes on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === core_strundefined ) { - return jQuery.prop( elem, name, value ); - } - - // All attributes are lowercase - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - name = name.toLowerCase(); - hooks = jQuery.attrHooks[ name ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook ); - } - - if ( value !== undefined ) { - - if ( value === null ) { - jQuery.removeAttr( elem, name ); - - } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - elem.setAttribute( name, value + "" ); - return value; - } - - } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? - undefined : - ret; - } - }, - - removeAttr: function( elem, value ) { - var name, propName, - i = 0, - attrNames = value && value.match( core_rnotwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( (name = attrNames[i++]) ) { - propName = jQuery.propFix[ name ] || name; - - // Boolean attributes get special treatment (#10870) - if ( jQuery.expr.match.bool.test( name ) ) { - // Set corresponding property to false - elem[ propName ] = false; - } - - elem.removeAttribute( name ); - } - } - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { - // Setting the type on a radio button after the value resets the value in IE6-9 - // Reset value to default in case type is set after value during creation - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - }, - - prop: function( elem, name, value ) { - var ret, hooks, notxml, - nType = elem.nodeType; - - // don't get/set properties on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - if ( notxml ) { - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ? - ret : - ( elem[ name ] = value ); - - } else { - return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ? - ret : - elem[ name ]; - } - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ? - elem.tabIndex : - -1; - } - } - } -}); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { - var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr; - - jQuery.expr.attrHandle[ name ] = function( elem, name, isXML ) { - var fn = jQuery.expr.attrHandle[ name ], - ret = isXML ? - undefined : - /* jshint eqeqeq: false */ - // Temporarily disable this handler to check existence - (jQuery.expr.attrHandle[ name ] = undefined) != - getter( elem, name, isXML ) ? - - name.toLowerCase() : - null; - - // Restore handler - jQuery.expr.attrHandle[ name ] = fn; - - return ret; - }; -}); - -// Support: IE9+ -// Selectedness for an option in an optgroup can be inaccurate -if ( !jQuery.support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - } - }; -} - -jQuery.each([ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -}); - -// Radios and checkboxes getter/setter -jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( jQuery.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); - } - } - }; - if ( !jQuery.support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - // Support: Webkit - // "" is returned instead of "on" if a value isn't specified - return elem.getAttribute("value") === null ? "on" : elem.value; - }; - } -}); -var rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = data_priv.get( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !(events = elemData.events) ) { - events = elemData.events = {}; - } - if ( !(eventHandle = elemData.handle) ) { - eventHandle = elemData.handle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : - undefined; - }; - // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events - eventHandle.elem = elem; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( core_rnotwhite ) || [""]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend({ - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join(".") - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !(handlers = events[ type ]) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = data_priv.hasData( elem ) && data_priv.get( elem ); - - if ( !elemData || !(events = elemData.events) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( core_rnotwhite ) || [""]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - delete elemData.handle; - data_priv.remove( elem, "events" ); - } - }, - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, - eventPath = [ elem || document ], - type = core_hasOwn.call( event, "type" ) ? event.type : event, - namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf(".") >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf(":") < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join("."); - event.namespace_re = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === (elem.ownerDocument || document) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) { - event.preventDefault(); - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && - jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event ); - - var i, j, ret, matched, handleObj, - handlerQueue = [], - args = core_slice.call( arguments ), - handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). - if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) - .apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( (event.result = ret) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, matches, sel, handleObj, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - // Black-hole SVG instance trees (#13180) - // Avoid non-left-click bubbling in Firefox (#3861) - if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.disabled !== true || event.type !== "click" ) { - matches = []; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matches[ sel ] === undefined ) { - matches[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) >= 0 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matches[ sel ] ) { - matches.push( handleObj ); - } - } - if ( matches.length ) { - handlerQueue.push({ elem: cur, handlers: matches }); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if ( delegateCount < handlers.length ) { - handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); - } - - return handlerQueue; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split(" "), - filter: function( event, original ) { - - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function( event, original ) { - var eventDoc, doc, body, - button = original.button; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } - }, - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, copy, - type = event.type, - originalEvent = event, - fixHook = this.fixHooks[ type ]; - - if ( !fixHook ) { - this.fixHooks[ type ] = fixHook = - rmouseEvent.test( type ) ? this.mouseHooks : - rkeyEvent.test( type ) ? this.keyHooks : - {}; - } - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = new jQuery.Event( originalEvent ); - - i = copy.length; - while ( i-- ) { - prop = copy[ i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Support: Cordova 2.5 (WebKit) (#13255) - // All events should have a target; Cordova deviceready doesn't - if ( !event.target ) { - event.target = document; - } - - // Support: Safari 6.0+, Chrome < 28 - // Target should not be a text node (#504, #13143) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - return fixHook.filter? fixHook.filter( event, originalEvent ) : event; - }, - - special: { - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return jQuery.nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined ) { - event.originalEvent.returnValue = event.result; - } - } - } - }, - - simulate: function( type, elem, event, bubble ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true, - originalEvent: {} - } - ); - if ( bubble ) { - jQuery.event.trigger( e, null, elem ); - } else { - jQuery.event.dispatch.call( elem, e ); - } - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } - } -}; - -jQuery.removeEvent = function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } -}; - -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !(this instanceof jQuery.Event) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = ( src.defaultPrevented || - src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && e.preventDefault ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && e.stopPropagation ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - this.isImmediatePropagationStopped = returnTrue; - this.stopPropagation(); - } -}; - -// Create mouseenter/leave events using mouseover/out and event-time checks -// Support: Chrome 15+ -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || (related !== target && !jQuery.contains( target, related )) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -}); - -// Create "bubbling" focus and blur events -// Support: Firefox, Chrome, Safari -if ( !jQuery.support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler while someone wants focusin/focusout - var attaches = 0, - handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - if ( attaches++ === 0 ) { - document.addEventListener( orig, handler, true ); - } - }, - teardown: function() { - if ( --attaches === 0 ) { - document.removeEventListener( orig, handler, true ); - } - } - }; - }); -} - -jQuery.fn.extend({ - - on: function( types, selector, data, fn, /*INTERNAL*/ one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - this.on( type, selector, data, types[ type ], one ); - } - return this; - } - - if ( data == null && fn == null ) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return this; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return this.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - }); - }, - one: function( types, selector, data, fn ) { - return this.on( types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each(function() { - jQuery.event.remove( this, types, fn, selector ); - }); - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - triggerHandler: function( type, data ) { - var elem = this[0]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -}); -var isSimple = /^.[^:#\[\.,]*$/, - rparentsprev = /^(?:parents|prev(?:Until|All))/, - rneedsContext = jQuery.expr.match.needsContext, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend({ - find: function( selector ) { - var i, - ret = [], - self = this, - len = self.length; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter(function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - }) ); - } - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - // Needed because $( selector, context ) becomes $( context ).find( selector ) - ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); - ret.selector = this.selector ? this.selector + " " + selector : selector; - return ret; - }, - - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter(function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - not: function( selector ) { - return this.pushStack( winnow(this, selector || [], true) ); - }, - - filter: function( selector ) { - return this.pushStack( winnow(this, selector || [], false) ); - }, - - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - pos = ( rneedsContext.test( selectors ) || typeof selectors !== "string" ) ? - jQuery( selectors, context || this.context ) : - 0; - - for ( ; i < l; i++ ) { - for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { - // Always skip document fragments - if ( cur.nodeType < 11 && (pos ? - pos.index(cur) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector(cur, selectors)) ) { - - cur = matched.push( cur ); - break; - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // index in selector - if ( typeof elem === "string" ) { - return core_indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return core_indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - var set = typeof selector === "string" ? - jQuery( selector, context ) : - jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), - all = jQuery.merge( this.get(), set ); - - return this.pushStack( jQuery.unique(all) ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter(selector) - ); - } -}); - -function sibling( cur, dir ) { - while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {} - - return cur; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return elem.contentDocument || jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.unique( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -}); - -jQuery.extend({ - filter: function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 && elem.nodeType === 1 ? - jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : - jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - })); - }, - - dir: function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; - }, - - sibling: function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; - } -}); - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - /* jshint -W018 */ - return !!qualifier.call( elem, i, elem ) !== not; - }); - - } - - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - }); - - } - - if ( typeof qualifier === "string" ) { - if ( isSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - qualifier = jQuery.filter( qualifier, elements ); - } - - return jQuery.grep( elements, function( elem ) { - return ( core_indexOf.call( qualifier, elem ) >= 0 ) !== not; - }); -} -var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, - rtagName = /<([\w:]+)/, - rhtml = /<|&#?\w+;/, - rnoInnerhtml = /<(?:script|style|link)/i, - manipulation_rcheckableType = /^(?:checkbox|radio)$/i, - // checked="checked" or checked - rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, - rscriptType = /^$|\/(?:java|ecma)script/i, - rscriptTypeMasked = /^true\/(.*)/, - rcleanScript = /^\s*\s*$/g, - - // We have to close these tags to support XHTML (#13200) - wrapMap = { - - // Support: IE 9 - option: [ 1, "" ], - - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] - }; - -// Support: IE 9 -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -jQuery.fn.extend({ - text: function( value ) { - return jQuery.access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().append( ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) ); - }, null, value, arguments.length ); - }, - - append: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - }); - }, - - prepend: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - }); - }, - - before: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - }); - }, - - after: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - }); - }, - - // keepData is for internal use only--do not document - remove: function( selector, keepData ) { - var elem, - elems = selector ? jQuery.filter( selector, this ) : this, - i = 0; - - for ( ; (elem = elems[i]) != null; i++ ) { - if ( !keepData && elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem ) ); - } - - if ( elem.parentNode ) { - if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { - setGlobalEval( getAll( elem, "script" ) ); - } - elem.parentNode.removeChild( elem ); - } - } - - return this; - }, - - empty: function() { - var elem, - i = 0; - - for ( ; (elem = this[i]) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function () { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - }); - }, - - html: function( value ) { - return jQuery.access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = value.replace( rxhtmlTag, "<$1>" ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var - // Snapshot the DOM in case .domManip sweeps something relevant into its fragment - args = jQuery.map( this, function( elem ) { - return [ elem.nextSibling, elem.parentNode ]; - }), - i = 0; - - // Make the changes, replacing each context element with the new content - this.domManip( arguments, function( elem ) { - var next = args[ i++ ], - parent = args[ i++ ]; - - if ( parent ) { - // Don't use the snapshot next if it has moved (#13810) - if ( next && next.parentNode !== parent ) { - next = this.nextSibling; - } - jQuery( this ).remove(); - parent.insertBefore( elem, next ); - } - // Allow new content to include elements from the context set - }, true ); - - // Force removal if there was no new content (e.g., from empty arguments) - return i ? this : this.remove(); - }, - - detach: function( selector ) { - return this.remove( selector, true ); - }, - - domManip: function( args, callback, allowIntersection ) { - - // Flatten any nested arrays - args = core_concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = this.length, - set = this, - iNoClone = l - 1, - value = args[ 0 ], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) { - return this.each(function( index ) { - var self = set.eq( index ); - if ( isFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - self.domManip( args, callback, allowIntersection ); - }); - } - - if ( l ) { - fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - if ( first ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - // Support: QtWebKit - // jQuery.merge because core_push.apply(_, arraylike) throws - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( this[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { - - if ( node.src ) { - // Hope ajax is available... - jQuery._evalUrl( node.src ); - } else { - jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); - } - } - } - } - } - } - - return this; - } -}); - -jQuery.each({ - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: QtWebKit - // .get() because core_push.apply(_, arraylike) throws - core_push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -}); - -jQuery.extend({ - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); - - // Support: IE >= 9 - // Fix Cloning issues - if ( !jQuery.support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - buildFragment: function( elems, context, scripts, selection ) { - var elem, tmp, tag, wrap, contains, j, - i = 0, - l = elems.length, - fragment = context.createDocumentFragment(), - nodes = []; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - // Support: QtWebKit - // jQuery.merge because core_push.apply(_, arraylike) throws - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement("div") ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || ["", ""] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: QtWebKit - // jQuery.merge because core_push.apply(_, arraylike) throws - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Fixes #12346 - // Support: Webkit, IE - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( (elem = nodes[ i++ ]) ) { - - // #4087 - If origin and destination elements are the same, and this is - // that element, do not do anything - if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( (elem = tmp[ j++ ]) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; - }, - - cleanData: function( elems ) { - var data, elem, events, type, key, j, - special = jQuery.event.special, - i = 0; - - for ( ; (elem = elems[ i ]) !== undefined; i++ ) { - if ( Data.accepts( elem ) ) { - key = elem[ data_priv.expando ]; - - if ( key && (data = data_priv.cache[ key ]) ) { - events = Object.keys( data.events || {} ); - if ( events.length ) { - for ( j = 0; (type = events[j]) !== undefined; j++ ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - if ( data_priv.cache[ key ] ) { - // Discard any remaining `private` data - delete data_priv.cache[ key ]; - } - } - } - // Discard any remaining `user` data - delete data_user.cache[ elem[ data_user.expando ] ]; - } - }, - - _evalUrl: function( url ) { - return jQuery.ajax({ - url: url, - type: "GET", - dataType: "script", - async: false, - global: false, - "throws": true - }); - } -}); - -// Support: 1.x compatibility -// Manipulating tables requires a tbody -function manipulationTarget( elem, content ) { - return jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ? - - elem.getElementsByTagName("tbody")[0] || - elem.appendChild( elem.ownerDocument.createElement("tbody") ) : - elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - - if ( match ) { - elem.type = match[ 1 ]; - } else { - elem.removeAttribute("type"); - } - - return elem; -} - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var l = elems.length, - i = 0; - - for ( ; i < l; i++ ) { - data_priv.set( - elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" ) - ); - } -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( data_priv.hasData( src ) ) { - pdataOld = data_priv.access( src ); - pdataCur = data_priv.set( dest, pdataOld ); - events = pdataOld.events; - - if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( data_user.hasData( src ) ) { - udataOld = data_user.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - data_user.set( dest, udataCur ); - } -} - - -function getAll( context, tag ) { - var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) : - context.querySelectorAll ? context.querySelectorAll( tag || "*" ) : - []; - - return tag === undefined || tag && jQuery.nodeName( context, tag ) ? - jQuery.merge( [ context ], ret ) : - ret; -} - -// Support: IE >= 9 -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} -jQuery.fn.extend({ - wrapAll: function( html ) { - var wrap; - - if ( jQuery.isFunction( html ) ) { - return this.each(function( i ) { - jQuery( this ).wrapAll( html.call(this, i) ); - }); - } - - if ( this[ 0 ] ) { - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map(function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - }).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each(function( i ) { - jQuery( this ).wrapInner( html.call(this, i) ); - }); - } - - return this.each(function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - }); - }, - - wrap: function( html ) { - var isFunction = jQuery.isFunction( html ); - - return this.each(function( i ) { - jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); - }); - }, - - unwrap: function() { - return this.parent().each(function() { - if ( !jQuery.nodeName( this, "body" ) ) { - jQuery( this ).replaceWith( this.childNodes ); - } - }).end(); - } -}); -var curCSS, iframe, - // swappable if display is none or starts with table except "table", "table-cell", or "table-caption" - // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rmargin = /^margin/, - rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ), - rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ), - rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ), - elemdisplay = { BODY: "block" }, - - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: 0, - fontWeight: 400 - }, - - cssExpand = [ "Top", "Right", "Bottom", "Left" ], - cssPrefixes = [ "Webkit", "O", "Moz", "ms" ]; - -// return a css property mapped to a potentially vendor prefixed property -function vendorPropName( style, name ) { - - // shortcut for names that are not vendor prefixed - if ( name in style ) { - return name; - } - - // check for vendor prefixed names - var capName = name.charAt(0).toUpperCase() + name.slice(1), - origName = name, - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in style ) { - return name; - } - } - - return origName; -} - -function isHidden( elem, el ) { - // isHidden might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); -} - -// NOTE: we've included the "window" in window.getComputedStyle -// because jsdom on node.js will break without it. -function getStyles( elem ) { - return window.getComputedStyle( elem, null ); -} - -function showHide( elements, show ) { - var display, elem, hidden, - values = [], - index = 0, - length = elements.length; - - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - values[ index ] = data_priv.get( elem, "olddisplay" ); - display = elem.style.display; - if ( show ) { - // Reset the inline display of this element to learn if it is - // being hidden by cascaded rules or not - if ( !values[ index ] && display === "none" ) { - elem.style.display = ""; - } - - // Set elements which have been overridden with display: none - // in a stylesheet to whatever the default browser style is - // for such an element - if ( elem.style.display === "" && isHidden( elem ) ) { - values[ index ] = data_priv.access( elem, "olddisplay", css_defaultDisplay(elem.nodeName) ); - } - } else { - - if ( !values[ index ] ) { - hidden = isHidden( elem ); - - if ( display && display !== "none" || !hidden ) { - data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css(elem, "display") ); - } - } - } - } - - // Set the display of most of the elements in a second loop - // to avoid the constant reflow - for ( index = 0; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - if ( !show || elem.style.display === "none" || elem.style.display === "" ) { - elem.style.display = show ? values[ index ] || "" : "none"; - } - } - - return elements; -} - -jQuery.fn.extend({ - css: function( name, value ) { - return jQuery.access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( jQuery.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - }, - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each(function() { - if ( isHidden( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - }); - } -}); - -jQuery.extend({ - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "columnCount": true, - "fillOpacity": true, - "fontWeight": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: { - // normalize float css property - "float": "cssFloat" - }, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = jQuery.camelCase( name ), - style = elem.style; - - name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) ); - - // gets hook for the prefixed version - // followed by the unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // convert relative number strings (+= or -=) to relative numbers. #7345 - if ( type === "string" && (ret = rrelNum.exec( value )) ) { - value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) ); - // Fixes bug #9237 - type = "number"; - } - - // Make sure that NaN and null values aren't set. See: #7116 - if ( value == null || type === "number" && isNaN( value ) ) { - return; - } - - // If a number was passed in, add 'px' to the (except for certain CSS properties) - if ( type === "number" && !jQuery.cssNumber[ origName ] ) { - value += "px"; - } - - // Fixes #8908, it can be done more correctly by specifying setters in cssHooks, - // but it would mean to define eight (for every problematic property) identical functions - if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) { - style[ name ] = value; - } - - } else { - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = jQuery.camelCase( name ); - - // Make sure that we're working with the right name - name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) ); - - // gets hook for the prefixed version - // followed by the unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - //convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Return, converting to number if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || jQuery.isNumeric( num ) ? num || 0 : val; - } - return val; - } -}); - -curCSS = function( elem, name, _computed ) { - var width, minWidth, maxWidth, - computed = _computed || getStyles( elem ), - - // Support: IE9 - // getPropertyValue is only needed for .css('filter') in IE9, see #12537 - ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined, - style = elem.style; - - if ( computed ) { - - if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { - ret = jQuery.style( elem, name ); - } - - // Support: Safari 5.1 - // A tribute to the "awesome hack by Dean Edwards" - // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels - // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values - if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret; -}; - - -function setPositiveNumber( elem, value, subtract ) { - var matches = rnumsplit.exec( value ); - return matches ? - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : - value; -} - -function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { - var i = extra === ( isBorderBox ? "border" : "content" ) ? - // If we already have the right measurement, avoid augmentation - 4 : - // Otherwise initialize for horizontal or vertical properties - name === "width" ? 1 : 0, - - val = 0; - - for ( ; i < 4; i += 2 ) { - // both box models exclude margin, so add it if we want it - if ( extra === "margin" ) { - val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); - } - - if ( isBorderBox ) { - // border-box includes padding, so remove it if we want content - if ( extra === "content" ) { - val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // at this point, extra isn't border nor margin, so remove border - if ( extra !== "margin" ) { - val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } else { - // at this point, extra isn't content, so add padding - val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // at this point, extra isn't content nor padding, so add border - if ( extra !== "padding" ) { - val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - return val; -} - -function getWidthOrHeight( elem, name, extra ) { - - // Start with offset property, which is equivalent to the border-box value - var valueIsBorderBox = true, - val = name === "width" ? elem.offsetWidth : elem.offsetHeight, - styles = getStyles( elem ), - isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // some non-html elements return undefined for offsetWidth, so check for null/undefined - // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 - // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 - if ( val <= 0 || val == null ) { - // Fall back to computed then uncomputed css if necessary - val = curCSS( elem, name, styles ); - if ( val < 0 || val == null ) { - val = elem.style[ name ]; - } - - // Computed unit is not pixels. Stop here and return. - if ( rnumnonpx.test(val) ) { - return val; - } - - // we need the check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] ); - - // Normalize "", auto, and prepare for extra - val = parseFloat( val ) || 0; - } - - // use the active box-sizing model to add/subtract irrelevant styles - return ( val + - augmentWidthOrHeight( - elem, - name, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles - ) - ) + "px"; -} - -// Try to determine the default display value of an element -function css_defaultDisplay( nodeName ) { - var doc = document, - display = elemdisplay[ nodeName ]; - - if ( !display ) { - display = actualDisplay( nodeName, doc ); - - // If the simple way fails, read from inside an iframe - if ( display === "none" || !display ) { - // Use the already-created iframe if possible - iframe = ( iframe || - jQuery("