From d4f0fc0fd7ae6d5d2f61959e57d3516a9d8fc82f Mon Sep 17 00:00:00 2001 From: zfy Date: Thu, 12 Jan 2017 09:51:39 +0800 Subject: [PATCH 01/60] update --- src/main/resources/application.yaml | 3 +- .../{logback.xml => logback-springboot.xml} | 39 ++++++------------- 2 files changed, 13 insertions(+), 29 deletions(-) rename src/main/resources/{logback.xml => logback-springboot.xml} (64%) diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 5d604a5..38e8cb6 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -2,7 +2,8 @@ spring: profiles: active: dev logging: - config: classpath:logback.xml + # loback配置文件命名为logback.xml会导致启动不起来 + config: classpath:logback-springboot.xml # 环境变量 --- diff --git a/src/main/resources/logback.xml b/src/main/resources/logback-springboot.xml similarity index 64% rename from src/main/resources/logback.xml rename to src/main/resources/logback-springboot.xml index dd52673..116d7d1 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback-springboot.xml @@ -52,23 +52,15 @@ --> - + + - - - - - - - - + + @@ -80,26 +72,17 @@ - - - - - - - - - - + + + + - - - + + + From a1d7e9cfc7844a6d9ace004189e509883aae9e86 Mon Sep 17 00:00:00 2001 From: zfy Date: Thu, 12 Jan 2017 16:47:44 +0800 Subject: [PATCH 02/60] update --- .../controller/IndexController.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java index 384c741..a699b54 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java @@ -149,6 +149,13 @@ public String testthrowException() { throw new RuntimeException("test error"); } + @RequestMapping("/sysexit") + public String sysexit(){ + //退出当前jvm,导致容器停止(tomcat关闭等) + System.exit(-1); + return "exit"; + } + @ExceptionHandler public ModelAndView handleAllException(Exception ex) { ModelAndView mav = new ModelAndView("500"); From 0985b689393848b6bd4185b53d195dd17ad7b0b4 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 12 Jan 2017 22:04:29 +0800 Subject: [PATCH 03/60] update --- pom.xml | 177 ++++++++++++++-------------- src/main/java/README.md | 22 ++++ src/main/resources/application.yaml | 6 +- 3 files changed, 116 insertions(+), 89 deletions(-) diff --git a/pom.xml b/pom.xml index 243ab99..42429e6 100644 --- a/pom.xml +++ b/pom.xml @@ -1,101 +1,106 @@ - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - cn.com.ttblog - spring-boot-bootstrap_table - 0.0.1-SNAPSHOT - jar + cn.com.ttblog + spring-boot-bootstrap_table + 0.0.1-SNAPSHOT + jar - spring-boot-bootstrap_table - Demo project for Spring Boot + spring-boot-bootstrap_table + Demo project for Spring Boot - - org.springframework.boot - spring-boot-starter-parent - 1.4.3.RELEASE - - + + org.springframework.boot + spring-boot-starter-parent + 1.4.3.RELEASE + + - - UTF-8 - UTF-8 - 1.7 - + + UTF-8 + UTF-8 + 1.7 + - - - org.springframework.boot - spring-boot-starter-aop - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-web - + + + org.springframework.boot + spring-boot-starter-aop + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + - - org.springframework.boot - spring-boot-starter-test - test - + + org.springframework.boot + spring-boot-starter-test + test + - - mysql - mysql-connector-java - 5.1.38 - + + org.springframework.boot + spring-boot-starter-actuator + - - com.alibaba - fastjson - 1.2.23 - + + mysql + mysql-connector-java + 5.1.38 + - - org.apache.commons - commons-lang3 - 3.4 - - - joda-time - joda-time - 2.9.2 - - - commons-fileupload - commons-fileupload - 1.3.1 - - - commons-io - commons-io - 2.4 - - - commons-beanutils - commons-beanutils - 1.9.2 - - - commons-codec - commons-codec - 1.10 - - + + com.alibaba + fastjson + 1.2.23 + - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + org.apache.commons + commons-lang3 + 3.4 + + + joda-time + joda-time + 2.9.2 + + + commons-fileupload + commons-fileupload + 1.3.1 + + + commons-io + commons-io + 2.4 + + + commons-beanutils + commons-beanutils + 1.9.2 + + + commons-codec + commons-codec + 1.10 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + diff --git a/src/main/java/README.md b/src/main/java/README.md index 56672a5..288f24d 100644 --- a/src/main/java/README.md +++ b/src/main/java/README.md @@ -1 +1,23 @@ ### 备注 +````html + spring-boot-starter 核心 POM,包含自动配置支持、日志库和对 YAML 配置文件的支持。 + spring-boot-starter-amqp 通过 spring-rabbit 支持 AMQP。 + spring-boot-starter-aop 包含 spring-aop 和 AspectJ 来支持面向切面编程(AOP)。 + spring-boot-starter-batch 支持 Spring Batch,包含 HSQLDB。 + spring-boot-starter-data-jpa 包含 spring-data-jpa、spring-orm 和 Hibernate 来支持 JPA。 + spring-boot-starter-data-mongodb 包含 spring-data-mongodb 来支持 MongoDB。 + spring-boot-starter-data-rest 通过 spring-data-rest-webmvc 支持以 REST 方式暴露 Spring Data 仓库。 + spring-boot-starter-jdbc 支持使用 JDBC 访问数据库。 + spring-boot-starter-security 包含 spring-security。 + spring-boot-starter-test 包含常用的测试所需的依赖,如 JUnit、Hamcrest、Mockito 和 spring-test 等。 + spring-boot-starter-velocity 支持使用 Velocity 作为模板引擎。 + spring-boot-starter-web 支持 Web 应用开发,包含 Tomcat 和 spring-mvc。 + spring-boot-starter-websocket 支持使用 Tomcat 开发 WebSocket 应用。 + spring-boot-starter-ws 支持 Spring Web Services。 + spring-boot-starter-actuator 添加适用于生产环境的功能,如性能指标和监测等功能。 + spring-boot-starter-remote-shell 添加远程 SSH 支持。 + spring-boot-starter-jetty 使用 Jetty 而不是默认的 Tomcat 作为应用服务器。 + spring-boot-starter-log4j 添加 Log4j 的支持。 + spring-boot-starter-logging 使用 Spring Boot 默认的日志框架 Logback。 + spring-boot-starter-tomcat 使用 Spring Boot 默认的 Tomcat 作为应用服务器。 +```` \ No newline at end of file diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 38e8cb6..5c7114f 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -1,9 +1,9 @@ spring: profiles: active: dev -logging: - # loback配置文件命名为logback.xml会导致启动不起来 - config: classpath:logback-springboot.xml +#logging: +# # loback配置文件命名为logback.xml会导致启动不起来 +# config: classpath:logback-springboot.xml # 环境变量 --- From 461a0b6593a1e484da0b46e042b960838a6f7ea8 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 12 Jan 2017 22:35:10 +0800 Subject: [PATCH 04/60] update --- pom.xml | 21 +++++ .../controller/IndexController.java | 8 +- src/main/resources/application-dev.yaml | 6 +- src/main/resources/application.yaml | 5 +- src/main/webapp/index.jsp | 79 +++++++++++++++++++ 5 files changed, 115 insertions(+), 4 deletions(-) create mode 100644 src/main/webapp/index.jsp diff --git a/pom.xml b/pom.xml index 42429e6..2e680b4 100644 --- a/pom.xml +++ b/pom.xml @@ -48,6 +48,10 @@ org.springframework.boot spring-boot-starter-actuator + + org.springframework.boot + spring-boot-starter-thymeleaf + mysql @@ -55,6 +59,16 @@ 5.1.38 + + javax.servlet + javax.servlet-api + provided + + + javax.servlet + jstl + + com.alibaba fastjson @@ -99,6 +113,13 @@ org.springframework.boot spring-boot-maven-plugin + + maven-compiler-plugin + + 1.7 + 1.7 + + diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java index a699b54..64ff092 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java @@ -43,7 +43,13 @@ public IndexController(){ @Autowired private ApplicationContext applicationContext; - + + @RequestMapping(method = RequestMethod.GET) + public String index(){ + logger.info("index页面"); + return "index"; + } + @RequestMapping("/login") public String login(HttpSession session, HttpServletRequest request, HttpServletResponse response, String username, String password,@RequestParam(value="requri",required=false) String requri) { diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index 048605c..1346701 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -8,5 +8,7 @@ spring: driver-class-name: com.mysql.jdbc.Driver mvc: view: - prefix: /WEB-INF/ - suffix: .jsp \ No newline at end of file + suffix: .jsp + prefix: / +# prefix: /templates/ +# suffix: .html \ No newline at end of file diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 5c7114f..ef41133 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -9,9 +9,12 @@ spring: --- spring: profiles: dev + mvc: + static-path-pattern: /** + resources: + static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/ server: context-path: /dev - --- spring: profiles: test diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp new file mode 100644 index 0000000..8925d40 --- /dev/null +++ b/src/main/webapp/index.jsp @@ -0,0 +1,79 @@ +<%@ page language="java" isErrorPage="true" errorPage="500.jsp" + contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> + + + Hello World---------jsp + + + + +

Hello World!

+ user/showUser
+ ${pageContext.request.scheme }
+ ${pageContext.request.serverName }
+ ${pageContext.request.serverPort }
+ ${pageContext.request.contextPath }
+ 通过EL设置basepath + + ${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath } + + ${basepath }
+
+	${pageContext.request.queryString} 取得请求的参数字符串
+	${pageContext.request.requestURL} 取得请求的URL,不包括参数字符串
+	${pageContext.request.contextPath}         服务的web application 的名称
+	${pageContext.request.method}           取得HTTP 的方法(GET、POST)
+	${pageContext.request.protocol}         取得使用的协议(HTTP/1.1、HTTP/1.0)
+	${pageContext.request.remoteUser}         取得用户名称
+	${pageContext.request.remoteAddr }         取得用户的IP 地址
+	${pageContext.session.id}               取得session 的ID
+	${pageContext.servletContext.serverInfo}   取得主机端的服务信息
+	
+ +
+ metrics + + From c0c42c03adeb7f20051384b247eb9a85c78b9a2a Mon Sep 17 00:00:00 2001 From: zfy Date: Tue, 17 Jan 2017 19:41:22 +0800 Subject: [PATCH 05/60] add druid --- pom.xml | 10 +- .../SpringBootBootstrapTableApplication.java | 7 +- .../config/DruidConfiguration.java | 44 ++ .../config/MvcConfiguration.java | 58 -- .../controller/IndexController.java | 6 + src/main/resources/application-dev.yaml | 16 +- src/main/resources/application.yaml | 6 +- src/main/resources/logback-springboot.xml | 2 +- src/main/resources/templates/404.html | 18 - src/main/resources/templates/index.html | 121 ---- src/main/resources/templates/index.jsp | 81 --- src/main/resources/templates/manage.html | 520 ------------------ src/main/webapp/{ => WEB-INF/jsp}/index.jsp | 4 +- src/main/webapp/WEB-INF/jsp/welcome.jsp | 18 + 14 files changed, 91 insertions(+), 820 deletions(-) create mode 100644 src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/DruidConfiguration.java delete mode 100644 src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfiguration.java delete mode 100644 src/main/resources/templates/404.html delete mode 100644 src/main/resources/templates/index.html delete mode 100644 src/main/resources/templates/index.jsp delete mode 100644 src/main/resources/templates/manage.html rename src/main/webapp/{ => WEB-INF/jsp}/index.jsp (94%) create mode 100644 src/main/webapp/WEB-INF/jsp/welcome.jsp diff --git a/pom.xml b/pom.xml index 2e680b4..d854c08 100644 --- a/pom.xml +++ b/pom.xml @@ -59,11 +59,6 @@ 5.1.38
- - javax.servlet - javax.servlet-api - provided - javax.servlet jstl @@ -74,6 +69,11 @@ fastjson 1.2.23 + + com.alibaba + druid + 1.0.21 + org.apache.commons diff --git a/src/main/java/cn/com/ttblog/SpringBootBootstrapTableApplication.java b/src/main/java/cn/com/ttblog/SpringBootBootstrapTableApplication.java index 0b117cb..4b33c04 100644 --- a/src/main/java/cn/com/ttblog/SpringBootBootstrapTableApplication.java +++ b/src/main/java/cn/com/ttblog/SpringBootBootstrapTableApplication.java @@ -5,8 +5,7 @@ @SpringBootApplication public class SpringBootBootstrapTableApplication { - - public static void main(String[] args) { - SpringApplication.run(SpringBootBootstrapTableApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(SpringBootBootstrapTableApplication.class, args); + } } diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/DruidConfiguration.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/DruidConfiguration.java new file mode 100644 index 0000000..cc73c3c --- /dev/null +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/DruidConfiguration.java @@ -0,0 +1,44 @@ +package cn.com.ttblog.spring_boot_bootstrap_table.config; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.support.http.StatViewServlet; +import com.alibaba.druid.support.http.WebStatFilter; +import org.springframework.boot.context.embedded.FilterRegistrationBean; +import org.springframework.boot.context.embedded.ServletRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import javax.sql.DataSource; +import java.sql.SQLException; + +@Configuration +public class DruidConfiguration { + + @Bean + public ServletRegistrationBean druidServlet() { + return new ServletRegistrationBean(new StatViewServlet(), "/druid/*"); + } + + @Bean + public DataSource druidDataSource() { + DruidDataSource druidDataSource = new DruidDataSource(); + druidDataSource.setDriverClassName("com.mysql.jdbc.Driver"); + druidDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/u"); + druidDataSource.setUsername("root"); + druidDataSource.setPassword("root"); + try { + druidDataSource.setFilters("stat, wall"); + } catch (SQLException e) { + e.printStackTrace(); + } + return druidDataSource; + } + + @Bean + public FilterRegistrationBean filterRegistrationBean() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); + filterRegistrationBean.setFilter(new WebStatFilter()); + filterRegistrationBean.addUrlPatterns("/*"); + filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); + return filterRegistrationBean; + } +} \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfiguration.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfiguration.java deleted file mode 100644 index 49e6d76..0000000 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfiguration.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.com.ttblog.spring_boot_bootstrap_table.config; - -import cn.com.ttblog.spring_boot_bootstrap_table.viewresolver.JsonViewResolver; -import com.alibaba.fastjson.serializer.SerializerFeature; -import com.alibaba.fastjson.support.config.FastJsonConfig; -import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; -import org.springframework.boot.autoconfigure.web.HttpMessageConverters; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.web.servlet.ViewResolver; -import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; -import org.springframework.web.servlet.view.ContentNegotiatingViewResolver; -import org.springframework.web.servlet.view.InternalResourceViewResolver; - -import java.util.ArrayList; -import java.util.List; - -@Configuration -@EnableWebMvc -public class MvcConfiguration extends WebMvcConfigurerAdapter { - - @Bean - public ViewResolver getViewResolver() { - ContentNegotiatingViewResolver contentNegotiatingViewResolver = new ContentNegotiatingViewResolver(); - List resolverList = new ArrayList(); - JsonViewResolver jsonViewResolver=new JsonViewResolver(); - InternalResourceViewResolver resolver = new InternalResourceViewResolver(); - resolver.setPrefix("/"); - resolver.setSuffix(".jsp"); - resolverList.add(resolver); - resolverList.add(jsonViewResolver); - contentNegotiatingViewResolver.setViewResolvers(resolverList); - return contentNegotiatingViewResolver; - } - - @Bean - public HttpMessageConverters fastJsonHttpMessageConverters() { - FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();//2 - - FastJsonConfig fastJsonConfig = new FastJsonConfig(); - fastJsonConfig.setSerializerFeatures( - SerializerFeature.PrettyFormat, - SerializerFeature.WriteClassName - ); - fastConverter.setFastJsonConfig(fastJsonConfig); - HttpMessageConverter converter = fastConverter; - return new HttpMessageConverters(converter); - } - - @Override - public void configureDefaultServletHandling( - DefaultServletHandlerConfigurer configurer) { - configurer.enable(); - } -} \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java index 64ff092..2c02474 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java @@ -50,6 +50,12 @@ public String index(){ return "index"; } + @RequestMapping(value = "/welcome",method = RequestMethod.GET) + public String welcome(){ + logger.info("welcome页面"); + return "welcome"; + } + @RequestMapping("/login") public String login(HttpSession session, HttpServletRequest request, HttpServletResponse response, String username, String password,@RequestParam(value="requri",required=false) String requri) { diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index 1346701..1e1308f 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -1,14 +1,16 @@ server: port: 8081 -spring: - datasource: - url: jdbc:mysql://127.0.0.1:3306/u - username: root - password: root - driver-class-name: com.mysql.jdbc.Driver +#spring: +# datasource: +# type: com.alibaba.druid.pool.DruidDataSource +# driver-class-name: com.mysql.jdbc.Driver +# url: jdbc:mysql://127.0.0.1:3306/u +# username: root +# password: root +# initial-size: 3 mvc: view: suffix: .jsp - prefix: / + prefix: /WEB-INF/jsp/ # prefix: /templates/ # suffix: .html \ No newline at end of file diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index ef41133..d97d570 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -1,9 +1,9 @@ spring: profiles: active: dev -#logging: -# # loback配置文件命名为logback.xml会导致启动不起来 -# config: classpath:logback-springboot.xml +logging: + # loback配置文件命名为logback.xml会导致启动不起来 + config: classpath:logback-springboot.xml # 环境变量 --- diff --git a/src/main/resources/logback-springboot.xml b/src/main/resources/logback-springboot.xml index 116d7d1..32168aa 100644 --- a/src/main/resources/logback-springboot.xml +++ b/src/main/resources/logback-springboot.xml @@ -51,7 +51,7 @@ --> - + diff --git a/src/main/resources/templates/404.html b/src/main/resources/templates/404.html deleted file mode 100644 index 65e0192..0000000 --- a/src/main/resources/templates/404.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - -404 - - - - -
-

^_^--------页面未找到...

-
- - \ No newline at end of file diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html deleted file mode 100644 index 91898d4..0000000 --- a/src/main/resources/templates/index.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - -登陆系统 - - - - - - - - - - - - - - - -
-
-
-
-
-
-

- 欢迎使用 -

-
-

- This is a free responsive login form made with Bootstrap. - Download it on AZMIND, - customize and use it as you like! -

-
-
-
-
-
-
-
-

登陆

-

Enter your username and password to log on:

-
-
-
-
- -
-
-
-
- -
-
-
-
-
- - \ No newline at end of file diff --git a/src/main/resources/templates/index.jsp b/src/main/resources/templates/index.jsp deleted file mode 100644 index b3fe93d..0000000 --- a/src/main/resources/templates/index.jsp +++ /dev/null @@ -1,81 +0,0 @@ - -<%-- <%@ page trimDirectiveWhitespaces="true"%> --%> -<%@ page language="java" isErrorPage="true" errorPage="500.jsp" - contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> -<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> - - - Hello World - - - - -

Hello World!

- user/showUser
- ${pageContext.request.scheme }
- ${pageContext.request.serverName }
- ${pageContext.request.serverPort }
- ${pageContext.request.contextPath }
- 通过EL设置basepath - - ${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath } - - ${basepath }
-
-	${pageContext.request.queryString} 取得请求的参数字符串
-	${pageContext.request.requestURL} 取得请求的URL,不包括参数字符串
-	${pageContext.request.contextPath}         服务的web application 的名称
-	${pageContext.request.method}           取得HTTP 的方法(GET、POST)
-	${pageContext.request.protocol}         取得使用的协议(HTTP/1.1、HTTP/1.0)
-	${pageContext.request.remoteUser}         取得用户名称
-	${pageContext.request.remoteAddr }         取得用户的IP 地址
-	${pageContext.session.id}               取得session 的ID
-	${pageContext.servletContext.serverInfo}   取得主机端的服务信息
-	
- -
- metrics - - diff --git a/src/main/resources/templates/manage.html b/src/main/resources/templates/manage.html deleted file mode 100644 index 4ef925c..0000000 --- a/src/main/resources/templates/manage.html +++ /dev/null @@ -1,520 +0,0 @@ - - - - - -信息管理页 - - - - - - - - - - - - - - - - - - - - -
-

- -
-
-
-
-
-
- - -

支持中文首字母查询

- - - - - - - - - - - - - - -
姓名性别年龄手机号收货地址添加时间操作
- - - - - -
- - - - diff --git a/src/main/webapp/index.jsp b/src/main/webapp/WEB-INF/jsp/index.jsp similarity index 94% rename from src/main/webapp/index.jsp rename to src/main/webapp/WEB-INF/jsp/index.jsp index 8925d40..f43f0d6 100644 --- a/src/main/webapp/index.jsp +++ b/src/main/webapp/WEB-INF/jsp/index.jsp @@ -1,6 +1,6 @@ -<%@ page language="java" isErrorPage="true" errorPage="500.jsp" - contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> Hello World---------jsp diff --git a/src/main/webapp/WEB-INF/jsp/welcome.jsp b/src/main/webapp/WEB-INF/jsp/welcome.jsp new file mode 100644 index 0000000..3196dac --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/welcome.jsp @@ -0,0 +1,18 @@ + + +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> + + + + + + + Spring URL: ${springUrl} at ${time} +
+ JSTL URL: ${url} +
+ Message: ${message} + + + From 842ee4f764c8af34efc34e62fdf9fc7972bba59b Mon Sep 17 00:00:00 2001 From: zfy Date: Wed, 18 Jan 2017 12:02:37 +0800 Subject: [PATCH 06/60] add jsp --- README.md | 5 +- pom.xml | 34 ++++- .../SpringBootBootstrapTableApplication.java | 11 +- .../config/MvcConfig.java | 29 +++++ .../controller/IndexController.java | 5 +- .../viewresolver/JsonViewResolver.java | 16 --- .../MarshallingXmlViewResolver.java | 28 ---- src/main/resources/application-dev.yaml | 5 +- src/main/resources/application.yaml | 7 +- src/main/resources/logback-springboot.xml | 10 +- src/main/webapp/index.html | 121 ++++++++++++++++++ src/main/webapp/{WEB-INF/jsp => }/index.jsp | 0 src/main/webapp/{WEB-INF/jsp => }/welcome.jsp | 13 +- 13 files changed, 217 insertions(+), 67 deletions(-) create mode 100644 src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfig.java delete mode 100644 src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/viewresolver/JsonViewResolver.java delete mode 100644 src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/viewresolver/MarshallingXmlViewResolver.java create mode 100644 src/main/webapp/index.html rename src/main/webapp/{WEB-INF/jsp => }/index.jsp (100%) rename src/main/webapp/{WEB-INF/jsp => }/welcome.jsp (81%) diff --git a/README.md b/README.md index 602bfdb..74b344e 100644 --- a/README.md +++ b/README.md @@ -1 +1,4 @@ -### spring-boot bootstrap_table demo \ No newline at end of file +### spring-boot bootstrap_table demo +--- +* spring-boot 1.4.3 +* integration with jsp \ No newline at end of file diff --git a/pom.xml b/pom.xml index d854c08..08e8462 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,11 @@ cn.com.ttblog spring-boot-bootstrap_table 0.0.1-SNAPSHOT - jar + + war spring-boot-bootstrap_table Demo project for Spring Boot @@ -48,9 +52,19 @@ org.springframework.boot spring-boot-starter-actuator
+ + + + org.springframework.boot - spring-boot-starter-thymeleaf + spring-boot-starter-tomcat + + + + org.apache.tomcat.embed + tomcat-embed-jasper + @@ -59,10 +73,25 @@ 5.1.38 + + javax.servlet + javax.servlet-api + javax.servlet jstl + + javax.el + javax.el-api + 3.0.0 + + + javax.servlet.jsp + jsp-api + 2.2.1-b03 + provided + com.alibaba @@ -108,6 +137,7 @@ + spring-boot-bootstrap_table org.springframework.boot diff --git a/src/main/java/cn/com/ttblog/SpringBootBootstrapTableApplication.java b/src/main/java/cn/com/ttblog/SpringBootBootstrapTableApplication.java index 4b33c04..35b47b8 100644 --- a/src/main/java/cn/com/ttblog/SpringBootBootstrapTableApplication.java +++ b/src/main/java/cn/com/ttblog/SpringBootBootstrapTableApplication.java @@ -2,10 +2,19 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.support.SpringBootServletInitializer; @SpringBootApplication -public class SpringBootBootstrapTableApplication { +public class SpringBootBootstrapTableApplication extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(SpringBootBootstrapTableApplication.class); + } + public static void main(String[] args) { SpringApplication.run(SpringBootBootstrapTableApplication.class, args); } + } diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfig.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfig.java new file mode 100644 index 0000000..0a62ed7 --- /dev/null +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfig.java @@ -0,0 +1,29 @@ +package cn.com.ttblog.spring_boot_bootstrap_table.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.ViewResolver; +import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.view.InternalResourceViewResolver; +import org.springframework.web.servlet.view.JstlView; + +@Configuration +@EnableWebMvc +public class MvcConfig extends WebMvcConfigurerAdapter{ + + @Bean + public ViewResolver internalResourceViewResolver () { + InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); + viewResolver.setPrefix("/"); + viewResolver.setSuffix(".jsp"); + viewResolver.setViewClass(JstlView.class); + return viewResolver; + } + + @Override + public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { + configurer.enable(); + } +} diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java index 2c02474..6ad6f90 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java @@ -47,12 +47,13 @@ public IndexController(){ @RequestMapping(method = RequestMethod.GET) public String index(){ logger.info("index页面"); - return "index"; + return "redirect:index.html"; } @RequestMapping(value = "/welcome",method = RequestMethod.GET) - public String welcome(){ + public String welcome(Model m){ logger.info("welcome页面"); + m.addAttribute("user","world"); return "welcome"; } diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/viewresolver/JsonViewResolver.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/viewresolver/JsonViewResolver.java deleted file mode 100644 index 033615f..0000000 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/viewresolver/JsonViewResolver.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.com.ttblog.spring_boot_bootstrap_table.viewresolver; - -import com.alibaba.fastjson.support.spring.FastJsonJsonView; -import org.springframework.web.servlet.View; -import org.springframework.web.servlet.ViewResolver; - -import java.util.Locale; - -public class JsonViewResolver implements ViewResolver { - - @Override - public View resolveViewName(String viewName, Locale locale) throws Exception { - FastJsonJsonView jsonJsonView=new FastJsonJsonView(); - return jsonJsonView; - } -} \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/viewresolver/MarshallingXmlViewResolver.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/viewresolver/MarshallingXmlViewResolver.java deleted file mode 100644 index aeff022..0000000 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/viewresolver/MarshallingXmlViewResolver.java +++ /dev/null @@ -1,28 +0,0 @@ -//package cn.com.ttblog.spring_boot_bootstrap_table.viewresolver; -// -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.web.servlet.View; -//import org.springframework.web.servlet.ViewResolver; -//import org.springframework.web.servlet.view.xml.MarshallingView; -//import java.util.Locale; -// -///** -// * View resolver for returning XML in a view-based system. -// */ -//public class MarshallingXmlViewResolver implements ViewResolver { -// -// private Marshaller marshaller; -// -// @Autowired -// public MarshallingXmlViewResolver(Marshaller marshaller) { -// this.marshaller = marshaller; -// } -// -// @Override -// public View resolveViewName(String viewName, Locale locale) -// throws Exception { -// MarshallingView view = new MarshallingView(); -// view.setMarshaller(marshaller); -// return view; -// } -//} \ No newline at end of file diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index 1e1308f..ddc705f 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -8,9 +8,10 @@ server: # username: root # password: root # initial-size: 3 +spring: mvc: view: - suffix: .jsp - prefix: /WEB-INF/jsp/ + prefix: / + suffix: .jspaa # prefix: /templates/ # suffix: .html \ No newline at end of file diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index d97d570..1b6a019 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -4,15 +4,14 @@ spring: logging: # loback配置文件命名为logback.xml会导致启动不起来 config: classpath:logback-springboot.xml +endpoints: + shutdown: + enabled: true # 环境变量 --- spring: profiles: dev - mvc: - static-path-pattern: /** - resources: - static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/ server: context-path: /dev --- diff --git a/src/main/resources/logback-springboot.xml b/src/main/resources/logback-springboot.xml index 32168aa..2124956 100644 --- a/src/main/resources/logback-springboot.xml +++ b/src/main/resources/logback-springboot.xml @@ -1,7 +1,7 @@ - - + + @@ -54,13 +54,13 @@ - + - + @@ -74,7 +74,7 @@ - + diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html new file mode 100644 index 0000000..91898d4 --- /dev/null +++ b/src/main/webapp/index.html @@ -0,0 +1,121 @@ + + + + + + +登陆系统 + + + + + + + + + + + + + + + +
+
+
+
+
+
+

+ 欢迎使用 +

+
+

+ This is a free responsive login form made with Bootstrap. + Download it on AZMIND, + customize and use it as you like! +

+
+
+
+
+
+
+
+

登陆

+

Enter your username and password to log on:

+
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/index.jsp b/src/main/webapp/index.jsp similarity index 100% rename from src/main/webapp/WEB-INF/jsp/index.jsp rename to src/main/webapp/index.jsp diff --git a/src/main/webapp/WEB-INF/jsp/welcome.jsp b/src/main/webapp/welcome.jsp similarity index 81% rename from src/main/webapp/WEB-INF/jsp/welcome.jsp rename to src/main/webapp/welcome.jsp index 3196dac..50e723d 100644 --- a/src/main/webapp/WEB-INF/jsp/welcome.jsp +++ b/src/main/webapp/welcome.jsp @@ -1,18 +1,19 @@ - - <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> - + - + + hello + - + Spring URL: ${springUrl} at ${time}
JSTL URL: ${url}
- Message: ${message} + Message: ${message}
+ hello:${user} From 58c28abe4742d5f2b6e01752aa465b257be7a6cc Mon Sep 17 00:00:00 2001 From: netbuffer Date: Wed, 18 Jan 2017 21:46:57 +0800 Subject: [PATCH 07/60] test ContentNegotiatingViewResolver --- .../Constant/ConfigConstant.java | 2 +- ...sonHttpMessageConvertersConfiguration.java | 32 ++ .../config/MvcConfig.java | 50 +- .../controller/IndexController.java | 97 +--- .../servlet/TestServlet.java | 20 + .../views/JsonViewResolver.java | 17 + src/main/resources/application-dev.yaml | 11 +- src/main/webapp/404.html | 18 + src/main/webapp/500.jsp | 36 ++ src/main/webapp/demolist.html | 46 ++ src/main/webapp/favicon.ico | Bin 0 -> 5430 bytes src/main/webapp/manage.html | 520 ++++++++++++++++++ 12 files changed, 767 insertions(+), 82 deletions(-) create mode 100644 src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/FastJsonHttpMessageConvertersConfiguration.java create mode 100644 src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/servlet/TestServlet.java create mode 100644 src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/views/JsonViewResolver.java create mode 100644 src/main/webapp/404.html create mode 100644 src/main/webapp/500.jsp create mode 100644 src/main/webapp/demolist.html create mode 100644 src/main/webapp/favicon.ico create mode 100644 src/main/webapp/manage.html diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/Constant/ConfigConstant.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/Constant/ConfigConstant.java index fa99ddc..4a185fd 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/Constant/ConfigConstant.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/Constant/ConfigConstant.java @@ -6,7 +6,7 @@ public class ConfigConstant { */ public static final String USERTABLE="user"; public static final String ISLOGIN = "islogin"; - public static final String USERNAME = "username"; + public static final String USERNAME = "admin"; public static final String EXCELSTR = "xls"; public static final String PROJECTNAME = "spring-boot-bootstrap_table"; } diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/FastJsonHttpMessageConvertersConfiguration.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/FastJsonHttpMessageConvertersConfiguration.java new file mode 100644 index 0000000..cfffc48 --- /dev/null +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/FastJsonHttpMessageConvertersConfiguration.java @@ -0,0 +1,32 @@ +package cn.com.ttblog.spring_boot_bootstrap_table.config; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.alibaba.fastjson.support.config.FastJsonConfig; +import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.web.HttpMessageConverters; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.HttpMessageConverter; + +@Configuration +@ConditionalOnClass({JSON.class}) //1 +public class FastJsonHttpMessageConvertersConfiguration { + + @Bean + public HttpMessageConverters fastJsonHttpMessageConverters() { + FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();//2 + + FastJsonConfig fastJsonConfig = new FastJsonConfig(); + fastJsonConfig.setSerializerFeatures( + SerializerFeature.PrettyFormat, + SerializerFeature.WriteClassName + ); + fastConverter.setFastJsonConfig(fastJsonConfig); + + HttpMessageConverter converter = fastConverter; + + return new HttpMessageConverters(converter); + } +} \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfig.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfig.java index 0a62ed7..a8394e8 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfig.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfig.java @@ -1,18 +1,48 @@ package cn.com.ttblog.spring_boot_bootstrap_table.config; +import cn.com.ttblog.spring_boot_bootstrap_table.views.JsonViewResolver; +import com.alibaba.fastjson.support.spring.FastJsonJsonView; +import org.springframework.beans.factory.BeanFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.MediaType; +import org.springframework.web.accept.ContentNegotiationManager; +import org.springframework.web.multipart.MultipartResolver; +import org.springframework.web.multipart.commons.CommonsMultipartResolver; import org.springframework.web.servlet.ViewResolver; -import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.config.annotation.*; +import org.springframework.web.servlet.view.ContentNegotiatingViewResolver; import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; +import java.util.ArrayList; +import java.util.List; + @Configuration @EnableWebMvc public class MvcConfig extends WebMvcConfigurerAdapter{ + @Override + public void configureContentNegotiation( + ContentNegotiationConfigurer configurer) { + configurer.ignoreAcceptHeader(false).defaultContentType(MediaType.TEXT_HTML); + } + + // 在此---配置ContentNegotiatingViewResolver,通过此代理到不同的viewResolover + @Bean + public ViewResolver contentNegotiatingViewResolver( + ContentNegotiationManager manager) { + ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver(); + resolver.setContentNegotiationManager(manager); + List resolvers = new ArrayList(); + // jsp view resolver + resolvers.add(internalResourceViewResolver()); + JsonViewResolver jsonViewResolver=new JsonViewResolver(); + resolvers.add(jsonViewResolver); + resolver.setViewResolvers(resolvers); + return resolver; + } + @Bean public ViewResolver internalResourceViewResolver () { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); @@ -22,6 +52,20 @@ public ViewResolver internalResourceViewResolver () { return viewResolver; } + // 注册自定义拦截器 +// @Override +// public void addInterceptors(InterceptorRegistry registry) { +// registry.addInterceptor(); +// } + + // 文件上传设置 + @Bean + public MultipartResolver multipartResolver() { + CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); + multipartResolver.setMaxUploadSize(1000000); + return multipartResolver; + } + @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java index 6ad6f90..0e49231 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java @@ -2,34 +2,27 @@ import cn.com.ttblog.spring_boot_bootstrap_table.Constant.ConfigConstant; import cn.com.ttblog.spring_boot_bootstrap_table.service.IUserService; -import com.alibaba.fastjson.JSONArray; import org.apache.commons.codec.binary.Base64; import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; -import org.springframework.core.io.FileSystemResource; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; import javax.annotation.Resource; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; -import java.io.File; -import java.text.DecimalFormat; import java.util.HashMap; -import java.util.List; import java.util.Map; -//import com.codahale.metrics.annotation.Timed; - -/** - * index - */ @Controller(value="mainindex") @RequestMapping("/") public class IndexController { @@ -57,7 +50,20 @@ public String welcome(Model m){ return "welcome"; } - @RequestMapping("/login") + @RequestMapping(value = "/error",method = RequestMethod.GET) + public String error(){ + logger.info("error页面"); + return "500"; + } + + //打开登录 + @RequestMapping(value = "/login",method = RequestMethod.GET) + public String login(@RequestParam(value="requri",required=false) String requri) { + return "redirect:/index.html?requri="+requri; + } + + //登录处理 + @RequestMapping(value = "/login",method = RequestMethod.POST) public String login(HttpSession session, HttpServletRequest request, HttpServletResponse response, String username, String password,@RequestParam(value="requri",required=false) String requri) { // RequestContextUtils.getWebApplicationContext(request) @@ -77,8 +83,6 @@ public String login(HttpSession session, HttpServletRequest request, String uri=new String(Base64.decodeBase64(requri)); String touri=uri.substring(request.getContextPath().length()+1); logger.debug("request.getContextPath():{} decode-requri:{} touri:{}",request.getContextPath(),uri,touri); -// /sssbootstrap_table -// /sssbootstrap_table/test/form?null return "redirect:/"+touri; } return "redirect:/manage.html"; @@ -86,14 +90,16 @@ public String login(HttpSession session, HttpServletRequest request, return "redirect:/index.html?requri="+requri; } } - - @RequestMapping("/demo") + + //demo页面 + @RequestMapping(value = "/demo",method = RequestMethod.GET) public String demolist() { logger.debug("demo"); return "redirect:/demolist.html"; } - @RequestMapping("/exit") + //退出系统 + @RequestMapping(value = "/exit",method = RequestMethod.GET) public String exit(HttpSession session,HttpServletRequest request, HttpServletResponse response) { logger.debug("用户{}退出系统",session.getAttribute(ConfigConstant.USERNAME)); @@ -105,63 +111,8 @@ public String exit(HttpSession session,HttpServletRequest request, response.addCookie(cookie); return "redirect:/index.html"; } - - @RequestMapping("/newdata") - public String newdata(HttpSession session, Model model) { - DecimalFormat df = new DecimalFormat("0.00"); - // Display the total amount of memory in the Java virtual machine. - long totalMem = Runtime.getRuntime().totalMemory() / 1024 / 1024; - System.out.println(df.format(totalMem) + " MB"); - // Display the maximum amount of memory that the Java virtual machine - // will attempt to use. - long maxMem = Runtime.getRuntime().maxMemory() / 1024 / 1024; - System.out.println(df.format(maxMem) + " MB"); - // Display the amount of free memory in the Java Virtual Machine. - long freeMem = Runtime.getRuntime().freeMemory() / 1024 / 1024; - System.out.println(df.format(freeMem) + " MB"); - logger.info("执行前:{}", model); - int newcount = userService.getNewData(); - String username = session.getAttribute(ConfigConstant.USERNAME).toString(); - model.addAttribute("newcount", newcount); - model.addAttribute("username", username); - logger.info("执行后:{}", model); - return "newdata"; - } - - @RequestMapping("teststr") - public @ResponseBody String teststr() { - return "this is str"; - } - -// @Timed - @RequestMapping("/datacount") - public @ResponseBody Map datacount() { - logger.debug("获取datacount"); - List> counts = userService.getDataSum(); - JSONArray categorys = new JSONArray(); - JSONArray nums = new JSONArray(); - for (Map m : counts) { - categorys.add(m.get("adddate")==null?"":m.get("adddate").toString()); - nums.add(m.get("num").toString()); - } - logger.debug("categorys:{},nums:{}", categorys, nums); - Map data = new HashMap(); - data.put("c", categorys); - data.put("d", nums); - return data; - } - - @RequestMapping(value = "/files/{file_name}", method = RequestMethod.GET) -// @ResponseBody - public FileSystemResource getFile(@PathVariable("file_name") String fileName,HttpServletRequest request) { - return new FileSystemResource(new File(request.getServletContext().getRealPath("export")+ File.separator+fileName+".xls")); - } - - @RequestMapping("/testerror") - public String testthrowException() { - throw new RuntimeException("test error"); - } + //终止服务器 @RequestMapping("/sysexit") public String sysexit(){ //退出当前jvm,导致容器停止(tomcat关闭等) diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/servlet/TestServlet.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/servlet/TestServlet.java new file mode 100644 index 0000000..b0f5adb --- /dev/null +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/servlet/TestServlet.java @@ -0,0 +1,20 @@ +package cn.com.ttblog.spring_boot_bootstrap_table.servlet; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(name = "TestServlet",urlPatterns = "/testservlet") +public class TestServlet extends HttpServlet { + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.getWriter().write("post message"); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.getWriter().write("get message"); + } +} diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/views/JsonViewResolver.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/views/JsonViewResolver.java new file mode 100644 index 0000000..9a16fc5 --- /dev/null +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/views/JsonViewResolver.java @@ -0,0 +1,17 @@ +package cn.com.ttblog.spring_boot_bootstrap_table.views; + +import com.alibaba.fastjson.support.spring.FastJsonJsonView; +import org.springframework.web.servlet.View; +import org.springframework.web.servlet.ViewResolver; +import java.util.Locale; + +public class JsonViewResolver implements ViewResolver { + + @Override + public View resolveViewName(String viewName, Locale locale) + throws Exception { + FastJsonJsonView jsonView=new FastJsonJsonView(); + return jsonView; + } + +} \ No newline at end of file diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index ddc705f..bac4fe8 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -8,10 +8,11 @@ server: # username: root # password: root # initial-size: 3 -spring: - mvc: - view: - prefix: / - suffix: .jspaa +# 测试发现在Config文件中配置jsp的路径才有效,这里配置不生效 +#spring: +# mvc: +# view: +# prefix: / +# suffix: .jspaa # prefix: /templates/ # suffix: .html \ No newline at end of file diff --git a/src/main/webapp/404.html b/src/main/webapp/404.html new file mode 100644 index 0000000..65e0192 --- /dev/null +++ b/src/main/webapp/404.html @@ -0,0 +1,18 @@ + + + + + + +404 + + + + +
+

^_^--------页面未找到...

+
+ + \ No newline at end of file diff --git a/src/main/webapp/500.jsp b/src/main/webapp/500.jsp new file mode 100644 index 0000000..d7e986b --- /dev/null +++ b/src/main/webapp/500.jsp @@ -0,0 +1,36 @@ +<%@ page language="java" isErrorPage="true" errorPage="500.jsp" + contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> +<%-- <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> --%> + + + + + + +500 + + + + + +
+ 发生错误啦: + +

校验信息错误

+
+

错误数量:${result.errorCount}

+

错误对象名:${result.objectName}

+ + ${error.code }/${error.defaultMessage }
+
+
+ +
错误信息:${errMsg } +
+ ${exception} +
+ + \ No newline at end of file diff --git a/src/main/webapp/demolist.html b/src/main/webapp/demolist.html new file mode 100644 index 0000000..b0d5d9a --- /dev/null +++ b/src/main/webapp/demolist.html @@ -0,0 +1,46 @@ + + + + + demo list + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/favicon.ico b/src/main/webapp/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b48b3442ad90fd9b5bcbef8a9f703c1852de1561 GIT binary patch literal 5430 zcmchb`BM}}6vrn=RerU~e}JE;{1#6HHI^o#f*c}>As#Wtm_$)Ph+G1TXayBe6BCaj zBvFZYti~%*t5QJ(qGiBR5RfGTyDo=F)D_J}U0&Yn+3uO1JtUi$srpv;&d&7rGu>}y z-Wx@ENqJcb3R18QQYuF%O0c3RBe134AHS+74cLDj_u(PRR21!J8}2u50HBb1J8i-H z^GnJy-(Fx}HF~CN<)|6J^~tDkV0r`F0EJ_@GTutC@5?VP>+P@wb6;w&{Zbd38W!W= ze*Rj)LQDa&q=ZI0uKrvT%db0iVypwN8I1DBq5m%sCSss@IAAI*OG0mw(cjx|y|2Ii zaF}QV#&}i&4y?7>yht*>uTqszL3?#w9`!A4Z<>(o%HDl46i*XPO*DN?& zb`b9M^*>*|{m|8FfeVLE!M5e;>^k)8=WDIjjEw|M5!hG7nJyeUiDCNBwxOXRXuNnC zGN#S<8B?4mdE9JB9v2D8$U)Lr)P8jU{+za>sTGn#qWs2o3iBrhy)+)9{~fCxj&9xU z)-G&!!HFGTLyh?iIR3cLtwmc=xLu7YA90j2J_=IC&sK#D#G_}bK6FZqMIB51b;BHK zYnC^A2{PQ1j&H2K>^HVk(O)l>M`QBlFV@Vbk$#>yQ|#@a7WaH<^Ca#$WJ(K(L4T6Q!TZE>@$hMBJPY}= zHPhyZui3gO@i5TcD;-a9;XSrhp0o)uAW873Oh$iOYddUTmabD8?EEMb4i@eJEB>e7 zT+g1t*2Qal#x`-KPly$gINV${hU?dl@2~H2x!_poUca$TYxZgA9H#V8SHqH^P+ore`&~wWw7>02EzsdYeFz}e>EoaI=f0E$P z_mRh&zn)LOX2**62!HCd)YW^$w()+;m^c@N!m!VzF?sqod7UR>I=cBQ$^VYcF3pv< z_|8Osy#xz!AxrJiAEhzd8_?e{N3?E*(aXTzc1t>z)`Q29w>2Z4tV!|cZ?+Yr}0hH@s)ccGAh%fLfy1}1r~v~}ZarnOoeQH&d78-Kfs z=B(%;e{TwmN#l85Y;THLZa=;>VAT__liOn98CMPQolSFYlORrV7lW##0>eLEH9wJJq<#YCS8{-=$+ zs?f6&z3DpzeU=D9iSHEn4a2zMGiBu7wFTzY<073@yA0=hMAFy@=N>$Votw77Eb1}c zw+&tg`5TkQNC}B@vf9*L8;h~rb-R8X-sd$qaj?2hmxH%mxdwj@K9ckh-z`+P6}`KP z)opwnYFU1*tI;~KwxW%4pBuGTptVZ_u;qTt=VdsCFRV4C$s;9-fAMBM=kVy!~kovz!EF=d`RZ&qtT_5G>kr(HMHW9fZ7(A|gi`CXu#m#%$FVv>}5QhmUm z_dLh5y3en~yq)I;2Xc#<|L>S%sCkmRCc!#{J-c=J5kLP>;pZYB+LyhVoj-X0ff$ot zcb1f6%mse_gZ=^N>#)Iqy%(rnppEi2DPO=mTz*H#!&S^Jy4yP?*_tgZU)m74RL&_w z;~;NpqEme~xt~cM?=~b;aDKnO#LS+}hG(*IOzqw1eh=YwAIRQneste4 nvNEsKToAs + + + + +信息管理页 + + + + + + + + + + + + + + + + + + + + +
+

+ +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + +
姓名性别年龄手机号收货地址添加时间操作
+ + + + + +
+ + + + From 278f680f13906d7b2167c242fa3df4bbde45da95 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 19 Jan 2017 10:04:06 +0800 Subject: [PATCH 08/60] update --- .../controller/UserController.java | 43 + src/main/resources/application-dev.yaml | 6 + src/main/webapp/css/css.css | 27 + src/main/webapp/css/font-awesome.css | 4 + src/main/webapp/css/form-elements.css | 74 + src/main/webapp/css/jquery-weui.css | 2007 ++ src/main/webapp/css/register.css | 1 + src/main/webapp/css/style.css | 185 + src/main/webapp/demolist.html | 30 +- src/main/webapp/image/b.jpg | Bin 0 -> 706 bytes src/main/webapp/image/backimg.jpg | Bin 0 -> 170790 bytes src/main/webapp/image/demo.gif | Bin 0 -> 602021 bytes src/main/webapp/image/sys1.png | Bin 0 -> 150267 bytes src/main/webapp/image/sys2.png | Bin 0 -> 97603 bytes src/main/webapp/js/city-picker.js | 13401 +++++++ src/main/webapp/js/jquery-cloneya.min.js | 1 + src/main/webapp/js/jquery-weui.js | 2904 ++ src/main/webapp/js/laytpl.js | 9 + src/main/webapp/js/moment.min.js | 7 + src/main/webapp/js/moment.zh-cn.js | 127 + src/main/webapp/js/ue/jsp/config.json | 94 + src/main/webapp/js/ue/jsp/controller.jsp | 14 + src/main/webapp/js/ue/lang/en/en.js | 684 + .../webapp/js/ue/lang/en/images/addimage.png | Bin 0 -> 3373 bytes .../lang/en/images/alldeletebtnhoverskin.png | Bin 0 -> 743 bytes .../ue/lang/en/images/alldeletebtnupskin.png | Bin 0 -> 743 bytes .../js/ue/lang/en/images/background.png | Bin 0 -> 3854 bytes .../webapp/js/ue/lang/en/images/button.png | Bin 0 -> 4929 bytes src/main/webapp/js/ue/lang/en/images/copy.png | Bin 0 -> 1222 bytes .../js/ue/lang/en/images/deletedisable.png | Bin 0 -> 649 bytes .../js/ue/lang/en/images/deleteenable.png | Bin 0 -> 664 bytes .../js/ue/lang/en/images/listbackground.png | Bin 0 -> 3750 bytes .../js/ue/lang/en/images/localimage.png | Bin 0 -> 3083 bytes .../webapp/js/ue/lang/en/images/music.png | Bin 0 -> 91561 bytes .../ue/lang/en/images/rotateleftdisable.png | Bin 0 -> 719 bytes .../js/ue/lang/en/images/rotateleftenable.png | Bin 0 -> 952 bytes .../ue/lang/en/images/rotaterightdisable.png | Bin 0 -> 754 bytes .../ue/lang/en/images/rotaterightenable.png | Bin 0 -> 1007 bytes .../webapp/js/ue/lang/en/images/upload.png | Bin 0 -> 3941 bytes .../webapp/js/ue/lang/zh-cn/images/copy.png | Bin 0 -> 4319 bytes .../js/ue/lang/zh-cn/images/localimage.png | Bin 0 -> 6979 bytes .../webapp/js/ue/lang/zh-cn/images/music.png | Bin 0 -> 23106 bytes .../webapp/js/ue/lang/zh-cn/images/upload.png | Bin 0 -> 6608 bytes src/main/webapp/js/ue/lang/zh-cn/zh-cn.js | 669 + .../js/ue/themes/default/css/ueditor.css | 1903 + .../js/ue/themes/default/css/ueditor.min.css | 8 + .../js/ue/themes/default/dialogbase.css | 100 + .../js/ue/themes/default/images/anchor.gif | Bin 0 -> 184 bytes .../js/ue/themes/default/images/arrow.png | Bin 0 -> 1173 bytes .../ue/themes/default/images/arrow_down.png | Bin 0 -> 1610 bytes .../js/ue/themes/default/images/arrow_up.png | Bin 0 -> 1649 bytes .../js/ue/themes/default/images/button-bg.gif | Bin 0 -> 1114 bytes .../ue/themes/default/images/cancelbutton.gif | Bin 0 -> 1227 bytes .../js/ue/themes/default/images/charts.png | Bin 0 -> 518 bytes .../js/ue/themes/default/images/cursor_h.gif | Bin 0 -> 253 bytes .../js/ue/themes/default/images/cursor_h.png | Bin 0 -> 175 bytes .../js/ue/themes/default/images/cursor_v.gif | Bin 0 -> 370 bytes .../js/ue/themes/default/images/cursor_v.png | Bin 0 -> 177 bytes .../themes/default/images/dialog-title-bg.png | Bin 0 -> 938 bytes .../js/ue/themes/default/images/filescan.png | Bin 0 -> 4282 bytes .../ue/themes/default/images/highlighted.gif | Bin 0 -> 111 bytes .../js/ue/themes/default/images/icons-all.gif | Bin 0 -> 3750 bytes .../js/ue/themes/default/images/icons.gif | Bin 0 -> 20947 bytes .../js/ue/themes/default/images/icons.png | Bin 0 -> 19694 bytes .../js/ue/themes/default/images/loaderror.png | Bin 0 -> 3209 bytes .../js/ue/themes/default/images/loading.gif | Bin 0 -> 734 bytes .../js/ue/themes/default/images/lock.gif | Bin 0 -> 1062 bytes .../default/images/neweditor-tab-bg.png | Bin 0 -> 216 bytes .../js/ue/themes/default/images/pagebreak.gif | Bin 0 -> 54 bytes .../js/ue/themes/default/images/scale.png | Bin 0 -> 167 bytes .../js/ue/themes/default/images/sortable.png | Bin 0 -> 2851 bytes .../js/ue/themes/default/images/spacer.gif | Bin 0 -> 43 bytes .../ue/themes/default/images/sparator_v.png | Bin 0 -> 122 bytes .../default/images/table-cell-align.png | Bin 0 -> 1847 bytes .../default/images/tangram-colorpicker.png | Bin 0 -> 17355 bytes .../ue/themes/default/images/toolbar_bg.png | Bin 0 -> 170 bytes .../themes/default/images/unhighlighted.gif | Bin 0 -> 111 bytes .../js/ue/themes/default/images/upload.png | Bin 0 -> 6608 bytes .../js/ue/themes/default/images/videologo.gif | Bin 0 -> 1604 bytes .../js/ue/themes/default/images/word.gif | Bin 0 -> 1019 bytes .../js/ue/themes/default/images/wordpaste.png | Bin 0 -> 6467 bytes src/main/webapp/js/ue/themes/iframe.css | 1 + .../third-party/SyntaxHighlighter/shCore.js | 3655 ++ .../SyntaxHighlighter/shCoreDefault.css | 1 + .../ue/third-party/codemirror/codemirror.css | 104 + .../ue/third-party/codemirror/codemirror.js | 3581 ++ .../highcharts/adapters/mootools-adapter.js | 13 + .../adapters/mootools-adapter.src.js | 313 + .../highcharts/adapters/prototype-adapter.js | 15 + .../adapters/prototype-adapter.src.js | 316 + .../adapters/standalone-framework.js | 17 + .../adapters/standalone-framework.src.js | 583 + .../third-party/highcharts/highcharts-more.js | 50 + .../highcharts/highcharts-more.src.js | 2430 ++ .../ue/third-party/highcharts/highcharts.js | 283 + .../third-party/highcharts/highcharts.src.js | 16974 +++++++++ .../highcharts/modules/annotations.js | 7 + .../highcharts/modules/annotations.src.js | 401 + .../highcharts/modules/canvas-tools.js | 133 + .../highcharts/modules/canvas-tools.src.js | 3113 ++ .../ue/third-party/highcharts/modules/data.js | 17 + .../highcharts/modules/data.src.js | 582 + .../highcharts/modules/drilldown.js | 11 + .../highcharts/modules/drilldown.src.js | 447 + .../highcharts/modules/exporting.js | 22 + .../highcharts/modules/exporting.src.js | 709 + .../third-party/highcharts/modules/funnel.js | 12 + .../highcharts/modules/funnel.src.js | 289 + .../third-party/highcharts/modules/heatmap.js | 1 + .../highcharts/modules/heatmap.src.js | 53 + .../ue/third-party/highcharts/modules/map.js | 27 + .../third-party/highcharts/modules/map.src.js | 1002 + .../highcharts/modules/no-data-to-display.js | 12 + .../modules/no-data-to-display.src.js | 128 + .../highcharts/themes/dark-blue.js | 254 + .../highcharts/themes/dark-green.js | 255 + .../ue/third-party/highcharts/themes/gray.js | 257 + .../ue/third-party/highcharts/themes/grid.js | 103 + .../ue/third-party/highcharts/themes/skies.js | 89 + .../webapp/js/ue/third-party/jquery-1.10.2.js | 9789 +++++ .../js/ue/third-party/jquery-1.10.2.min.js | 6 + .../js/ue/third-party/jquery-1.10.2.min.map | 1 + .../snapscreen/UEditorSnapscreen.exe | Bin 0 -> 519936 bytes .../js/ue/third-party/video-js/font/vjs.eot | Bin 0 -> 3536 bytes .../js/ue/third-party/video-js/font/vjs.svg | 65 + .../js/ue/third-party/video-js/font/vjs.ttf | Bin 0 -> 3372 bytes .../js/ue/third-party/video-js/font/vjs.woff | Bin 0 -> 4228 bytes .../js/ue/third-party/video-js/video-js.css | 766 + .../ue/third-party/video-js/video-js.min.css | 5 + .../js/ue/third-party/video-js/video-js.swf | Bin 0 -> 16745 bytes .../js/ue/third-party/video-js/video.dev.js | 7108 ++++ .../js/ue/third-party/video-js/video.js | 129 + .../ue/third-party/webuploader/Uploader.swf | Bin 0 -> 49382 bytes .../third-party/webuploader/webuploader.css | 28 + .../webuploader/webuploader.custom.js | 5670 +++ .../webuploader/webuploader.custom.min.js | 2 + .../webuploader/webuploader.flashonly.js | 4176 +++ .../webuploader/webuploader.flashonly.min.js | 2 + .../webuploader/webuploader.html5only.js | 5559 +++ .../webuploader/webuploader.html5only.min.js | 2 + .../ue/third-party/webuploader/webuploader.js | 6733 ++++ .../webuploader/webuploader.min.js | 2 + .../webuploader/webuploader.withoutimage.js | 4593 +++ .../webuploader.withoutimage.min.js | 2 + src/main/webapp/js/ue/third-party/xss.min.js | 1 + .../zeroclipboard/ZeroClipboard.js | 1256 + .../zeroclipboard/ZeroClipboard.min.js | 9 + .../zeroclipboard/ZeroClipboard.swf | Bin 0 -> 3933 bytes src/main/webapp/js/ue/ueditor.all.js | 29568 ++++++++++++++++ src/main/webapp/js/ue/ueditor.all.min.js | 18 + src/main/webapp/js/ue/ueditor.config.js | 497 + src/main/webapp/js/ue/ueditor.parse.js | 1022 + src/main/webapp/js/ue/ueditor.parse.min.js | 7 + src/main/webapp/manage.html | 24 +- 154 files changed, 135567 insertions(+), 31 deletions(-) create mode 100644 src/main/webapp/css/css.css create mode 100644 src/main/webapp/css/font-awesome.css create mode 100644 src/main/webapp/css/form-elements.css create mode 100644 src/main/webapp/css/jquery-weui.css create mode 100644 src/main/webapp/css/register.css create mode 100644 src/main/webapp/css/style.css create mode 100644 src/main/webapp/image/b.jpg create mode 100644 src/main/webapp/image/backimg.jpg create mode 100644 src/main/webapp/image/demo.gif create mode 100644 src/main/webapp/image/sys1.png create mode 100644 src/main/webapp/image/sys2.png create mode 100644 src/main/webapp/js/city-picker.js create mode 100644 src/main/webapp/js/jquery-cloneya.min.js create mode 100644 src/main/webapp/js/jquery-weui.js create mode 100644 src/main/webapp/js/laytpl.js create mode 100644 src/main/webapp/js/moment.min.js create mode 100644 src/main/webapp/js/moment.zh-cn.js create mode 100644 src/main/webapp/js/ue/jsp/config.json create mode 100644 src/main/webapp/js/ue/jsp/controller.jsp create mode 100644 src/main/webapp/js/ue/lang/en/en.js create mode 100644 src/main/webapp/js/ue/lang/en/images/addimage.png create mode 100644 src/main/webapp/js/ue/lang/en/images/alldeletebtnhoverskin.png create mode 100644 src/main/webapp/js/ue/lang/en/images/alldeletebtnupskin.png create mode 100644 src/main/webapp/js/ue/lang/en/images/background.png create mode 100644 src/main/webapp/js/ue/lang/en/images/button.png create mode 100644 src/main/webapp/js/ue/lang/en/images/copy.png create mode 100644 src/main/webapp/js/ue/lang/en/images/deletedisable.png create mode 100644 src/main/webapp/js/ue/lang/en/images/deleteenable.png create mode 100644 src/main/webapp/js/ue/lang/en/images/listbackground.png create mode 100644 src/main/webapp/js/ue/lang/en/images/localimage.png create mode 100644 src/main/webapp/js/ue/lang/en/images/music.png create mode 100644 src/main/webapp/js/ue/lang/en/images/rotateleftdisable.png create mode 100644 src/main/webapp/js/ue/lang/en/images/rotateleftenable.png create mode 100644 src/main/webapp/js/ue/lang/en/images/rotaterightdisable.png create mode 100644 src/main/webapp/js/ue/lang/en/images/rotaterightenable.png create mode 100644 src/main/webapp/js/ue/lang/en/images/upload.png create mode 100644 src/main/webapp/js/ue/lang/zh-cn/images/copy.png create mode 100644 src/main/webapp/js/ue/lang/zh-cn/images/localimage.png create mode 100644 src/main/webapp/js/ue/lang/zh-cn/images/music.png create mode 100644 src/main/webapp/js/ue/lang/zh-cn/images/upload.png create mode 100644 src/main/webapp/js/ue/lang/zh-cn/zh-cn.js create mode 100644 src/main/webapp/js/ue/themes/default/css/ueditor.css create mode 100644 src/main/webapp/js/ue/themes/default/css/ueditor.min.css create mode 100644 src/main/webapp/js/ue/themes/default/dialogbase.css create mode 100644 src/main/webapp/js/ue/themes/default/images/anchor.gif create mode 100644 src/main/webapp/js/ue/themes/default/images/arrow.png create mode 100644 src/main/webapp/js/ue/themes/default/images/arrow_down.png create mode 100644 src/main/webapp/js/ue/themes/default/images/arrow_up.png create mode 100644 src/main/webapp/js/ue/themes/default/images/button-bg.gif create mode 100644 src/main/webapp/js/ue/themes/default/images/cancelbutton.gif create mode 100644 src/main/webapp/js/ue/themes/default/images/charts.png create mode 100644 src/main/webapp/js/ue/themes/default/images/cursor_h.gif create mode 100644 src/main/webapp/js/ue/themes/default/images/cursor_h.png create mode 100644 src/main/webapp/js/ue/themes/default/images/cursor_v.gif create mode 100644 src/main/webapp/js/ue/themes/default/images/cursor_v.png create mode 100644 src/main/webapp/js/ue/themes/default/images/dialog-title-bg.png create mode 100644 src/main/webapp/js/ue/themes/default/images/filescan.png create mode 100644 src/main/webapp/js/ue/themes/default/images/highlighted.gif create mode 100644 src/main/webapp/js/ue/themes/default/images/icons-all.gif create mode 100644 src/main/webapp/js/ue/themes/default/images/icons.gif create mode 100644 src/main/webapp/js/ue/themes/default/images/icons.png create mode 100644 src/main/webapp/js/ue/themes/default/images/loaderror.png create mode 100644 src/main/webapp/js/ue/themes/default/images/loading.gif create mode 100644 src/main/webapp/js/ue/themes/default/images/lock.gif create mode 100644 src/main/webapp/js/ue/themes/default/images/neweditor-tab-bg.png create mode 100644 src/main/webapp/js/ue/themes/default/images/pagebreak.gif create mode 100644 src/main/webapp/js/ue/themes/default/images/scale.png create mode 100644 src/main/webapp/js/ue/themes/default/images/sortable.png create mode 100644 src/main/webapp/js/ue/themes/default/images/spacer.gif create mode 100644 src/main/webapp/js/ue/themes/default/images/sparator_v.png create mode 100644 src/main/webapp/js/ue/themes/default/images/table-cell-align.png create mode 100644 src/main/webapp/js/ue/themes/default/images/tangram-colorpicker.png create mode 100644 src/main/webapp/js/ue/themes/default/images/toolbar_bg.png create mode 100644 src/main/webapp/js/ue/themes/default/images/unhighlighted.gif create mode 100644 src/main/webapp/js/ue/themes/default/images/upload.png create mode 100644 src/main/webapp/js/ue/themes/default/images/videologo.gif create mode 100644 src/main/webapp/js/ue/themes/default/images/word.gif create mode 100644 src/main/webapp/js/ue/themes/default/images/wordpaste.png create mode 100644 src/main/webapp/js/ue/themes/iframe.css create mode 100644 src/main/webapp/js/ue/third-party/SyntaxHighlighter/shCore.js create mode 100644 src/main/webapp/js/ue/third-party/SyntaxHighlighter/shCoreDefault.css create mode 100644 src/main/webapp/js/ue/third-party/codemirror/codemirror.css create mode 100644 src/main/webapp/js/ue/third-party/codemirror/codemirror.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/adapters/mootools-adapter.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/adapters/mootools-adapter.src.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/adapters/prototype-adapter.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/adapters/prototype-adapter.src.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/adapters/standalone-framework.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/adapters/standalone-framework.src.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/highcharts-more.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/highcharts-more.src.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/highcharts.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/highcharts.src.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/modules/annotations.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/modules/annotations.src.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/modules/canvas-tools.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/modules/canvas-tools.src.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/modules/data.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/modules/data.src.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/modules/drilldown.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/modules/drilldown.src.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/modules/exporting.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/modules/exporting.src.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/modules/funnel.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/modules/funnel.src.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/modules/heatmap.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/modules/heatmap.src.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/modules/map.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/modules/map.src.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/modules/no-data-to-display.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/modules/no-data-to-display.src.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/themes/dark-blue.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/themes/dark-green.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/themes/gray.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/themes/grid.js create mode 100644 src/main/webapp/js/ue/third-party/highcharts/themes/skies.js create mode 100644 src/main/webapp/js/ue/third-party/jquery-1.10.2.js create mode 100644 src/main/webapp/js/ue/third-party/jquery-1.10.2.min.js create mode 100644 src/main/webapp/js/ue/third-party/jquery-1.10.2.min.map create mode 100644 src/main/webapp/js/ue/third-party/snapscreen/UEditorSnapscreen.exe create mode 100644 src/main/webapp/js/ue/third-party/video-js/font/vjs.eot create mode 100644 src/main/webapp/js/ue/third-party/video-js/font/vjs.svg create mode 100644 src/main/webapp/js/ue/third-party/video-js/font/vjs.ttf create mode 100644 src/main/webapp/js/ue/third-party/video-js/font/vjs.woff create mode 100644 src/main/webapp/js/ue/third-party/video-js/video-js.css create mode 100644 src/main/webapp/js/ue/third-party/video-js/video-js.min.css create mode 100644 src/main/webapp/js/ue/third-party/video-js/video-js.swf create mode 100644 src/main/webapp/js/ue/third-party/video-js/video.dev.js create mode 100644 src/main/webapp/js/ue/third-party/video-js/video.js create mode 100644 src/main/webapp/js/ue/third-party/webuploader/Uploader.swf create mode 100644 src/main/webapp/js/ue/third-party/webuploader/webuploader.css create mode 100644 src/main/webapp/js/ue/third-party/webuploader/webuploader.custom.js create mode 100644 src/main/webapp/js/ue/third-party/webuploader/webuploader.custom.min.js create mode 100644 src/main/webapp/js/ue/third-party/webuploader/webuploader.flashonly.js create mode 100644 src/main/webapp/js/ue/third-party/webuploader/webuploader.flashonly.min.js create mode 100644 src/main/webapp/js/ue/third-party/webuploader/webuploader.html5only.js create mode 100644 src/main/webapp/js/ue/third-party/webuploader/webuploader.html5only.min.js create mode 100644 src/main/webapp/js/ue/third-party/webuploader/webuploader.js create mode 100644 src/main/webapp/js/ue/third-party/webuploader/webuploader.min.js create mode 100644 src/main/webapp/js/ue/third-party/webuploader/webuploader.withoutimage.js create mode 100644 src/main/webapp/js/ue/third-party/webuploader/webuploader.withoutimage.min.js create mode 100644 src/main/webapp/js/ue/third-party/xss.min.js create mode 100644 src/main/webapp/js/ue/third-party/zeroclipboard/ZeroClipboard.js create mode 100644 src/main/webapp/js/ue/third-party/zeroclipboard/ZeroClipboard.min.js create mode 100644 src/main/webapp/js/ue/third-party/zeroclipboard/ZeroClipboard.swf create mode 100644 src/main/webapp/js/ue/ueditor.all.js create mode 100644 src/main/webapp/js/ue/ueditor.all.min.js create mode 100644 src/main/webapp/js/ue/ueditor.config.js create mode 100644 src/main/webapp/js/ue/ueditor.parse.js create mode 100644 src/main/webapp/js/ue/ueditor.parse.min.js diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/UserController.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/UserController.java index dc39708..50d31d5 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/UserController.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/UserController.java @@ -1,7 +1,9 @@ package cn.com.ttblog.spring_boot_bootstrap_table.controller; +import cn.com.ttblog.spring_boot_bootstrap_table.Constant.ConfigConstant; import cn.com.ttblog.spring_boot_bootstrap_table.model.User; import cn.com.ttblog.spring_boot_bootstrap_table.service.IUserService; +import com.alibaba.fastjson.JSONArray; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; @@ -11,8 +13,10 @@ import org.springframework.web.servlet.ModelAndView; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; import javax.validation.Valid; import java.io.UnsupportedEncodingException; +import java.text.DecimalFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -97,6 +101,45 @@ public Map update(@Valid @ModelAttribute("u") User user, BindingResult br){ return result; } + @RequestMapping("/datacount") + public @ResponseBody Map datacount() { + logger.debug("获取datacount"); + List> counts = userService.getDataSum(); + JSONArray categorys = new JSONArray(); + JSONArray nums = new JSONArray(); + for (Map m : counts) { + categorys.add(m.get("adddate")==null?"":m.get("adddate").toString()); + nums.add(m.get("num").toString()); + } + logger.debug("categorys:{},nums:{}", categorys, nums); + Map data = new HashMap(); + data.put("c", categorys); + data.put("d", nums); + return data; + } + + @RequestMapping("/newdata") + public String newdata(HttpSession session, Model model) { + DecimalFormat df = new DecimalFormat("0.00"); + // Display the total amount of memory in the Java virtual machine. + long totalMem = Runtime.getRuntime().totalMemory() / 1024 / 1024; + System.out.println(df.format(totalMem) + " MB"); + // Display the maximum amount of memory that the Java virtual machine + // will attempt to use. + long maxMem = Runtime.getRuntime().maxMemory() / 1024 / 1024; + System.out.println(df.format(maxMem) + " MB"); + // Display the amount of free memory in the Java Virtual Machine. + long freeMem = Runtime.getRuntime().freeMemory() / 1024 / 1024; + System.out.println(df.format(freeMem) + " MB"); + logger.info("执行前:{}", model); + int newcount = userService.getNewData(); + String username = session.getAttribute(ConfigConstant.USERNAME).toString(); + model.addAttribute("newcount", newcount); + model.addAttribute("username", username); + logger.info("执行后:{}", model); + return "newdata"; + } + @RequestMapping(value="/photos",method={RequestMethod.GET,RequestMethod.HEAD}) public String photos() { logger.debug("go to user-photos"); diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index bac4fe8..15a5239 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -1,5 +1,11 @@ server: port: 8081 +endpoints: + enabled: true #可以在这里禁用actuator + shutdown: + enabled: true #启用shutdown +management: + context-path: /mge #actuator访问路径前缀,便于做统一的拦截处理 #spring: # datasource: # type: com.alibaba.druid.pool.DruidDataSource diff --git a/src/main/webapp/css/css.css b/src/main/webapp/css/css.css new file mode 100644 index 0000000..f200843 --- /dev/null +++ b/src/main/webapp/css/css.css @@ -0,0 +1,27 @@ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 100; + src: local('Roboto Thin'), local('Roboto-Thin'), url(http://fonts.gstatic.com/s/roboto/v15/2tsd397wLxj96qwHyNIkxPesZW2xOQ-xsNqO47m55DA.woff2) format('woff2'); +} +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: local('Roboto Light'), local('Roboto-Light'), url(http://fonts.gstatic.com/s/roboto/v15/Hgo13k-tfSpn0qi1SFdUfVtXRa8TVwTICgirnJhmVJw.woff2) format('woff2'); +} +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: local('Roboto'), local('Roboto-Regular'), url(http://fonts.gstatic.com/s/roboto/v15/CWB0XYA8bzo0kSThX0UTuA.woff2) format('woff2'); +} +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: local('Roboto Medium'), local('Roboto-Medium'), url(http://fonts.gstatic.com/s/roboto/v15/RxZJdnzeo3R5zSexge8UUVtXRa8TVwTICgirnJhmVJw.woff2) format('woff2'); +} +.formError .formErrorContent { + background-color: #c0c0c0; +} \ No newline at end of file diff --git a/src/main/webapp/css/font-awesome.css b/src/main/webapp/css/font-awesome.css new file mode 100644 index 0000000..24fcc04 --- /dev/null +++ b/src/main/webapp/css/font-awesome.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.3.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-genderless:before,.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"} \ No newline at end of file diff --git a/src/main/webapp/css/form-elements.css b/src/main/webapp/css/form-elements.css new file mode 100644 index 0000000..8cb71a2 --- /dev/null +++ b/src/main/webapp/css/form-elements.css @@ -0,0 +1,74 @@ + +input[type="text"], +input[type="password"], +textarea, +textarea.form-control { + height: 50px; + margin: 0; + padding: 0 20px; + vertical-align: middle; + background: #f8f8f8; + border: 3px solid #ddd; + font-family: 'Roboto', sans-serif; + font-size: 16px; + font-weight: 300; + line-height: 50px; + color: #888; + -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; + -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; + -o-transition: all .3s; -moz-transition: all .3s; -webkit-transition: all .3s; -ms-transition: all .3s; transition: all .3s; +} + +textarea, +textarea.form-control { + padding-top: 10px; + padding-bottom: 10px; + line-height: 30px; +} + +input[type="text"]:focus, +input[type="password"]:focus, +textarea:focus, +textarea.form-control:focus { + outline: 0; + background: #fff; + border: 3px solid #ccc; + -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; +} + +input[type="text"]:-moz-placeholder, input[type="password"]:-moz-placeholder, +textarea:-moz-placeholder, textarea.form-control:-moz-placeholder { color: #888; } + +input[type="text"]:-ms-input-placeholder, input[type="password"]:-ms-input-placeholder, +textarea:-ms-input-placeholder, textarea.form-control:-ms-input-placeholder { color: #888; } + +input[type="text"]::-webkit-input-placeholder, input[type="password"]::-webkit-input-placeholder, +textarea::-webkit-input-placeholder, textarea.form-control::-webkit-input-placeholder { color: #888; } + + + +button.btn { + height: 50px; + margin: 0; + padding: 0 20px; + vertical-align: middle; + background: #de995e; + border: 0; + font-family: 'Roboto', sans-serif; + font-size: 16px; + font-weight: 300; + line-height: 50px; + color: #fff; + -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; + text-shadow: none; + -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; + -o-transition: all .3s; -moz-transition: all .3s; -webkit-transition: all .3s; -ms-transition: all .3s; transition: all .3s; +} + +button.btn:hover { opacity: 0.6; color: #fff; } + +button.btn:active { outline: 0; opacity: 0.6; color: #fff; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; } + +button.btn:focus { outline: 0; opacity: 0.6; background: #de995e; color: #fff; } + +button.btn:active:focus, button.btn.active:focus { outline: 0; opacity: 0.6; background: #de995e; color: #fff; } diff --git a/src/main/webapp/css/jquery-weui.css b/src/main/webapp/css/jquery-weui.css new file mode 100644 index 0000000..88e2c4a --- /dev/null +++ b/src/main/webapp/css/jquery-weui.css @@ -0,0 +1,2007 @@ +.preloader { + width: 20px; + height: 20px; + -webkit-transform-origin: 50%; + transform-origin: 50%; + -webkit-animation: preloader-spin 1s steps(12, end) infinite; + animation: preloader-spin 1s steps(12, end) infinite; +} +.preloader:after { + display: block; + width: 100%; + height: 100%; + content: ""; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); + background-repeat: no-repeat; + background-position: 50%; + background-size: 100%; +} +@-webkit-keyframes preloader-spin { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@keyframes preloader-spin { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +/* +.hairline(@position, @color) when (@position = top) { + border-top: 1px solid @color; +} +.hairline(@position, @color) when (@position = left) { + border-left: 1px solid @color; +} +.hairline(@position, @color) when (@position = bottom) { + border-bottom: 1px solid @color; +} +.hairline(@position, @color) when (@position = right) { + border-right: 1px solid @color; +} +// For right and bottom +.hairline-remove(@position) when not (@position = left) and not (@position = top) { + border-left: 0; + border-bottom: 0; +} +// For left and top +.hairline-remove(@position) when not (@position = right) and not (@position = bottom) { + border-right: 0; + border-top: 0; +} +// For right and bottom +.hairline-color(@position, @color) when not (@position = left) and not (@position = top) { + border-right-color: @color; + border-bottom-color: @color; +} +// For left and top +.hairline-color(@position, @color) when not (@position = right) and not (@position = bottom) { + border-left-color: @color; + border-top-color: @color; +} +*/ +html { + font-size: 20px; +} +body { + font-size: 16px; +} +@media only screen and (min-width: 400px) { + html { + font-size: 21.33333333px !important; + } +} +@media only screen and (min-width: 414px) { + html { + font-size: 22.08px !important; + } +} +@media only screen and (min-width: 480px) { + html { + font-size: 25.6px !important; + } +} +/* === Grid === */ +.weui-row { + display: -webkit-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + -webkit-justify-content: space-between; + justify-content: space-between; + -webkit-box-lines: multiple; + -moz-box-lines: multiple; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-align: start; + -ms-flex-align: start; + -webkit-align-items: flex-start; + align-items: flex-start; +} +.weui-row > [class*="col-"] { + box-sizing: border-box; +} +.weui-row .col-auto { + width: 100%; +} +.weui-row .weui-col-100 { + width: 100%; + width: calc((100% - 15px*0) / 1); +} +.weui-row.weui-no-gutter .weui-col-100 { + width: 100%; +} +.weui-row .weui-col-95 { + width: 95%; + width: calc((100% - 15px*0.05263157894736836) / 1.0526315789473684); +} +.weui-row.weui-no-gutter .weui-col-95 { + width: 95%; +} +.weui-row .weui-col-90 { + width: 90%; + width: calc((100% - 15px*0.11111111111111116) / 1.1111111111111112); +} +.weui-row.weui-no-gutter .weui-col-90 { + width: 90%; +} +.weui-row .weui-col-85 { + width: 85%; + width: calc((100% - 15px*0.17647058823529416) / 1.1764705882352942); +} +.weui-row.weui-no-gutter .weui-col-85 { + width: 85%; +} +.weui-row .weui-col-80 { + width: 80%; + width: calc((100% - 15px*0.25) / 1.25); +} +.weui-row.weui-no-gutter .weui-col-80 { + width: 80%; +} +.weui-row .weui-col-75 { + width: 75%; + width: calc((100% - 15px*0.33333333333333326) / 1.3333333333333333); +} +.weui-row.weui-no-gutter .weui-col-75 { + width: 75%; +} +.weui-row .weui-col-66 { + width: 66.66666666666666%; + width: calc((100% - 15px*0.5000000000000002) / 1.5000000000000002); +} +.weui-row.weui-no-gutter .weui-col-66 { + width: 66.66666666666666%; +} +.weui-row .weui-col-60 { + width: 60%; + width: calc((100% - 15px*0.6666666666666667) / 1.6666666666666667); +} +.weui-row.weui-no-gutter .weui-col-60 { + width: 60%; +} +.weui-row .weui-col-50 { + width: 50%; + width: calc((100% - 15px*1) / 2); +} +.weui-row.weui-no-gutter .weui-col-50 { + width: 50%; +} +.weui-row .weui-col-40 { + width: 40%; + width: calc((100% - 15px*1.5) / 2.5); +} +.weui-row.weui-no-gutter .weui-col-40 { + width: 40%; +} +.weui-row .weui-col-33 { + width: 33.333333333333336%; + width: calc((100% - 15px*2) / 3); +} +.weui-row.weui-no-gutter .weui-col-33 { + width: 33.333333333333336%; +} +.weui-row .weui-col-25 { + width: 25%; + width: calc((100% - 15px*3) / 4); +} +.weui-row.weui-no-gutter .weui-col-25 { + width: 25%; +} +.weui-row .weui-col-20 { + width: 20%; + width: calc((100% - 15px*4) / 5); +} +.weui-row.weui-no-gutter .weui-col-20 { + width: 20%; +} +.weui-row .weui-col-15 { + width: 15%; + width: calc((100% - 15px*5.666666666666667) / 6.666666666666667); +} +.weui-row.weui-no-gutter .weui-col-15 { + width: 15%; +} +.weui-row .weui-col-10 { + width: 10%; + width: calc((100% - 15px*9) / 10); +} +.weui-row.weui-no-gutter .weui-col-10 { + width: 10%; +} +.weui-row .weui-col-5 { + width: 5%; + width: calc((100% - 15px*19) / 20); +} +.weui-row.weui-no-gutter .weui-col-5 { + width: 5%; +} +.weui-row .weui-col-auto:nth-last-child(1), +.weui-row .weui-col-auto:nth-last-child(1) ~ .weui-col-auto { + width: 100%; + width: calc((100% - 15px*0) / 1); +} +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(1), +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(1) ~ .weui-col-auto { + width: 100%; +} +.weui-row .weui-col-auto:nth-last-child(2), +.weui-row .weui-col-auto:nth-last-child(2) ~ .weui-col-auto { + width: 50%; + width: calc((100% - 15px*1) / 2); +} +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(2), +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(2) ~ .weui-col-auto { + width: 50%; +} +.weui-row .weui-col-auto:nth-last-child(3), +.weui-row .weui-col-auto:nth-last-child(3) ~ .weui-col-auto { + width: 33.33333333%; + width: calc((100% - 15px*2) / 3); +} +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(3), +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(3) ~ .weui-col-auto { + width: 33.33333333%; +} +.weui-row .weui-col-auto:nth-last-child(4), +.weui-row .weui-col-auto:nth-last-child(4) ~ .weui-col-auto { + width: 25%; + width: calc((100% - 15px*3) / 4); +} +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(4), +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(4) ~ .weui-col-auto { + width: 25%; +} +.weui-row .weui-col-auto:nth-last-child(5), +.weui-row .weui-col-auto:nth-last-child(5) ~ .weui-col-auto { + width: 20%; + width: calc((100% - 15px*4) / 5); +} +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(5), +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(5) ~ .weui-col-auto { + width: 20%; +} +.weui-row .weui-col-auto:nth-last-child(6), +.weui-row .weui-col-auto:nth-last-child(6) ~ .weui-col-auto { + width: 16.66666667%; + width: calc((100% - 15px*5) / 6); +} +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(6), +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(6) ~ .weui-col-auto { + width: 16.66666667%; +} +.weui-row .weui-col-auto:nth-last-child(7), +.weui-row .weui-col-auto:nth-last-child(7) ~ .weui-col-auto { + width: 14.28571429%; + width: calc((100% - 15px*6) / 7); +} +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(7), +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(7) ~ .weui-col-auto { + width: 14.28571429%; +} +.weui-row .weui-col-auto:nth-last-child(8), +.weui-row .weui-col-auto:nth-last-child(8) ~ .weui-col-auto { + width: 12.5%; + width: calc((100% - 15px*7) / 8); +} +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(8), +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(8) ~ .weui-col-auto { + width: 12.5%; +} +.weui-row .weui-col-auto:nth-last-child(9), +.weui-row .weui-col-auto:nth-last-child(9) ~ .weui-col-auto { + width: 11.11111111%; + width: calc((100% - 15px*8) / 9); +} +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(9), +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(9) ~ .weui-col-auto { + width: 11.11111111%; +} +.weui-row .weui-col-auto:nth-last-child(10), +.weui-row .weui-col-auto:nth-last-child(10) ~ .weui-col-auto { + width: 10%; + width: calc((100% - 15px*9) / 10); +} +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(10), +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(10) ~ .weui-col-auto { + width: 10%; +} +.weui-row .weui-col-auto:nth-last-child(11), +.weui-row .weui-col-auto:nth-last-child(11) ~ .weui-col-auto { + width: 9.09090909%; + width: calc((100% - 15px*10) / 11); +} +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(11), +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(11) ~ .weui-col-auto { + width: 9.09090909%; +} +.weui-row .weui-col-auto:nth-last-child(12), +.weui-row .weui-col-auto:nth-last-child(12) ~ .weui-col-auto { + width: 8.33333333%; + width: calc((100% - 15px*11) / 12); +} +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(12), +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(12) ~ .weui-col-auto { + width: 8.33333333%; +} +.weui-row .weui-col-auto:nth-last-child(13), +.weui-row .weui-col-auto:nth-last-child(13) ~ .weui-col-auto { + width: 7.69230769%; + width: calc((100% - 15px*12) / 13); +} +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(13), +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(13) ~ .weui-col-auto { + width: 7.69230769%; +} +.weui-row .weui-col-auto:nth-last-child(14), +.weui-row .weui-col-auto:nth-last-child(14) ~ .weui-col-auto { + width: 7.14285714%; + width: calc((100% - 15px*13) / 14); +} +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(14), +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(14) ~ .weui-col-auto { + width: 7.14285714%; +} +.weui-row .weui-col-auto:nth-last-child(15), +.weui-row .weui-col-auto:nth-last-child(15) ~ .weui-col-auto { + width: 6.66666667%; + width: calc((100% - 15px*14) / 15); +} +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(15), +.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(15) ~ .weui-col-auto { + width: 6.66666667%; +} +@media all and (min-width: 768px) { + .row .tablet-100 { + width: 100%; + width: calc((100% - 15px*0) / 1); + } + .row.no-gutter .tablet-100 { + width: 100%; + } + .row .tablet-95 { + width: 95%; + width: calc((100% - 15px*0.05263157894736836) / 1.0526315789473684); + } + .row.no-gutter .tablet-95 { + width: 95%; + } + .row .tablet-90 { + width: 90%; + width: calc((100% - 15px*0.11111111111111116) / 1.1111111111111112); + } + .row.no-gutter .tablet-90 { + width: 90%; + } + .row .tablet-85 { + width: 85%; + width: calc((100% - 15px*0.17647058823529416) / 1.1764705882352942); + } + .row.no-gutter .tablet-85 { + width: 85%; + } + .row .tablet-80 { + width: 80%; + width: calc((100% - 15px*0.25) / 1.25); + } + .row.no-gutter .tablet-80 { + width: 80%; + } + .row .tablet-75 { + width: 75%; + width: calc((100% - 15px*0.33333333333333326) / 1.3333333333333333); + } + .row.no-gutter .tablet-75 { + width: 75%; + } + .row .tablet-66 { + width: 66.66666666666666%; + width: calc((100% - 15px*0.5000000000000002) / 1.5000000000000002); + } + .row.no-gutter .tablet-66 { + width: 66.66666666666666%; + } + .row .tablet-60 { + width: 60%; + width: calc((100% - 15px*0.6666666666666667) / 1.6666666666666667); + } + .row.no-gutter .tablet-60 { + width: 60%; + } + .row .tablet-50 { + width: 50%; + width: calc((100% - 15px*1) / 2); + } + .row.no-gutter .tablet-50 { + width: 50%; + } + .row .tablet-40 { + width: 40%; + width: calc((100% - 15px*1.5) / 2.5); + } + .row.no-gutter .tablet-40 { + width: 40%; + } + .row .tablet-33 { + width: 33.333333333333336%; + width: calc((100% - 15px*2) / 3); + } + .row.no-gutter .tablet-33 { + width: 33.333333333333336%; + } + .row .tablet-25 { + width: 25%; + width: calc((100% - 15px*3) / 4); + } + .row.no-gutter .tablet-25 { + width: 25%; + } + .row .tablet-20 { + width: 20%; + width: calc((100% - 15px*4) / 5); + } + .row.no-gutter .tablet-20 { + width: 20%; + } + .row .tablet-15 { + width: 15%; + width: calc((100% - 15px*5.666666666666667) / 6.666666666666667); + } + .row.no-gutter .tablet-15 { + width: 15%; + } + .row .tablet-10 { + width: 10%; + width: calc((100% - 15px*9) / 10); + } + .row.no-gutter .tablet-10 { + width: 10%; + } + .row .tablet-5 { + width: 5%; + width: calc((100% - 15px*19) / 20); + } + .row.no-gutter .tablet-5 { + width: 5%; + } + .row .tablet-auto:nth-last-child(1), + .row .tablet-auto:nth-last-child(1) ~ .col-auto { + width: 100%; + width: calc((100% - 15px*0) / 1); + } + .row.no-gutter .tablet-auto:nth-last-child(1), + .row.no-gutter .tablet-auto:nth-last-child(1) ~ .tablet-auto { + width: 100%; + } + .row .tablet-auto:nth-last-child(2), + .row .tablet-auto:nth-last-child(2) ~ .col-auto { + width: 50%; + width: calc((100% - 15px*1) / 2); + } + .row.no-gutter .tablet-auto:nth-last-child(2), + .row.no-gutter .tablet-auto:nth-last-child(2) ~ .tablet-auto { + width: 50%; + } + .row .tablet-auto:nth-last-child(3), + .row .tablet-auto:nth-last-child(3) ~ .col-auto { + width: 33.33333333%; + width: calc((100% - 15px*2) / 3); + } + .row.no-gutter .tablet-auto:nth-last-child(3), + .row.no-gutter .tablet-auto:nth-last-child(3) ~ .tablet-auto { + width: 33.33333333%; + } + .row .tablet-auto:nth-last-child(4), + .row .tablet-auto:nth-last-child(4) ~ .col-auto { + width: 25%; + width: calc((100% - 15px*3) / 4); + } + .row.no-gutter .tablet-auto:nth-last-child(4), + .row.no-gutter .tablet-auto:nth-last-child(4) ~ .tablet-auto { + width: 25%; + } + .row .tablet-auto:nth-last-child(5), + .row .tablet-auto:nth-last-child(5) ~ .col-auto { + width: 20%; + width: calc((100% - 15px*4) / 5); + } + .row.no-gutter .tablet-auto:nth-last-child(5), + .row.no-gutter .tablet-auto:nth-last-child(5) ~ .tablet-auto { + width: 20%; + } + .row .tablet-auto:nth-last-child(6), + .row .tablet-auto:nth-last-child(6) ~ .col-auto { + width: 16.66666667%; + width: calc((100% - 15px*5) / 6); + } + .row.no-gutter .tablet-auto:nth-last-child(6), + .row.no-gutter .tablet-auto:nth-last-child(6) ~ .tablet-auto { + width: 16.66666667%; + } + .row .tablet-auto:nth-last-child(7), + .row .tablet-auto:nth-last-child(7) ~ .col-auto { + width: 14.28571429%; + width: calc((100% - 15px*6) / 7); + } + .row.no-gutter .tablet-auto:nth-last-child(7), + .row.no-gutter .tablet-auto:nth-last-child(7) ~ .tablet-auto { + width: 14.28571429%; + } + .row .tablet-auto:nth-last-child(8), + .row .tablet-auto:nth-last-child(8) ~ .col-auto { + width: 12.5%; + width: calc((100% - 15px*7) / 8); + } + .row.no-gutter .tablet-auto:nth-last-child(8), + .row.no-gutter .tablet-auto:nth-last-child(8) ~ .tablet-auto { + width: 12.5%; + } + .row .tablet-auto:nth-last-child(9), + .row .tablet-auto:nth-last-child(9) ~ .col-auto { + width: 11.11111111%; + width: calc((100% - 15px*8) / 9); + } + .row.no-gutter .tablet-auto:nth-last-child(9), + .row.no-gutter .tablet-auto:nth-last-child(9) ~ .tablet-auto { + width: 11.11111111%; + } + .row .tablet-auto:nth-last-child(10), + .row .tablet-auto:nth-last-child(10) ~ .col-auto { + width: 10%; + width: calc((100% - 15px*9) / 10); + } + .row.no-gutter .tablet-auto:nth-last-child(10), + .row.no-gutter .tablet-auto:nth-last-child(10) ~ .tablet-auto { + width: 10%; + } + .row .tablet-auto:nth-last-child(11), + .row .tablet-auto:nth-last-child(11) ~ .col-auto { + width: 9.09090909%; + width: calc((100% - 15px*10) / 11); + } + .row.no-gutter .tablet-auto:nth-last-child(11), + .row.no-gutter .tablet-auto:nth-last-child(11) ~ .tablet-auto { + width: 9.09090909%; + } + .row .tablet-auto:nth-last-child(12), + .row .tablet-auto:nth-last-child(12) ~ .col-auto { + width: 8.33333333%; + width: calc((100% - 15px*11) / 12); + } + .row.no-gutter .tablet-auto:nth-last-child(12), + .row.no-gutter .tablet-auto:nth-last-child(12) ~ .tablet-auto { + width: 8.33333333%; + } + .row .tablet-auto:nth-last-child(13), + .row .tablet-auto:nth-last-child(13) ~ .col-auto { + width: 7.69230769%; + width: calc((100% - 15px*12) / 13); + } + .row.no-gutter .tablet-auto:nth-last-child(13), + .row.no-gutter .tablet-auto:nth-last-child(13) ~ .tablet-auto { + width: 7.69230769%; + } + .row .tablet-auto:nth-last-child(14), + .row .tablet-auto:nth-last-child(14) ~ .col-auto { + width: 7.14285714%; + width: calc((100% - 15px*13) / 14); + } + .row.no-gutter .tablet-auto:nth-last-child(14), + .row.no-gutter .tablet-auto:nth-last-child(14) ~ .tablet-auto { + width: 7.14285714%; + } + .row .tablet-auto:nth-last-child(15), + .row .tablet-auto:nth-last-child(15) ~ .col-auto { + width: 6.66666667%; + width: calc((100% - 15px*14) / 15); + } + .row.no-gutter .tablet-auto:nth-last-child(15), + .row.no-gutter .tablet-auto:nth-last-child(15) ~ .tablet-auto { + width: 6.66666667%; + } +} +.weui_dialog, +.weui_toast { + -webkit-transition-duration: .2s; + transition-duration: .2s; + opacity: 0; + -webkit-transform: scale(0.9); + transform: scale(0.9); + visibility: hidden; + margin: 0; + left: 7.5%; + top: 30%; + z-index:10000; +} +.weui_dialog .weui_btn_dialog + .weui_btn_dialog, +.weui_toast .weui_btn_dialog + .weui_btn_dialog { + position: relative; +} +.weui_dialog .weui_btn_dialog + .weui_btn_dialog:after, +.weui_toast .weui_btn_dialog + .weui_btn_dialog:after { + content: " "; + position: absolute; + left: 0; + top: 0; + width: 1px; + height: 100%; + border-left: 1px solid #D5D5D6; + color: #D5D5D6; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: scaleX(0.5); + transform: scaleX(0.5); +} +.weui_dialog.weui_dialog_visible, +.weui_toast.weui_dialog_visible, +.weui_dialog.weui_toast_visible, +.weui_toast.weui_toast_visible { + opacity: 1; + visibility: visible; + -webkit-transform: scale(1); + transform: scale(1); +} +.weui_toast { + left: 50%; + top: 35%; + margin-left: -3.8em; +} +.weui_toast_forbidden { + color: #F76260; +} +.weui_toast_cancel .weui_icon_toast:before { + content: "\EA0D"; +} +.weui_toast_forbidden .weui_icon_toast:before { + content: "\EA0B"; + color: #F76260; +} +.weui_mask { + opacity: 0; + -webkit-transition-duration: .3s; + transition-duration: .3s; + visibility: hidden; + z-index: 10; +} +.weui_mask.weui_mask_visible { + opacity: 1; + visibility: visible; +} +.weui-prompt-input { + padding: 4px 6px; + border: 1px solid #ccc; + box-sizing: border-box; + height: 2em; + width: 80%; + margin-top: 10px; +} +.weui-pull-to-refresh { + margin-top: -50px; + -webkit-transition: -webkit-transform .4s; + transition: -webkit-transform .4s; + transition: transform .4s; + transition: transform .4s, -webkit-transform .4s; +} +.weui-pull-to-refresh.refreshing { + -webkit-transform: translate3d(0, 50px, 0); + transform: translate3d(0, 50px, 0); +} +.weui-pull-to-refresh.touching { + -webkit-transition-duration: 0s; + transition-duration: 0s; +} +.weui-pull-to-refresh-layer { + height: 30px; + line-height: 30px; + padding: 10px; + text-align: center; +} +.weui-pull-to-refresh-layer .down { + display: inline-block; +} +.weui-pull-to-refresh-layer .up, +.weui-pull-to-refresh-layer .refresh { + display: none; +} +.weui-pull-to-refresh-layer .pull-to-refresh-arrow { + display: inline-block; + z-index: 10; + width: 20px; + height: 20px; + margin-right: 4px; + vertical-align: -4px; + background: no-repeat center; + background-size: 13px 20px; + -webkit-transition-duration: 300ms; + transition-duration: 300ms; + -webkit-transform: rotate(0deg) translate3d(0, 0, 0); + transform: rotate(0deg) translate3d(0, 0, 0); + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2026%2040'%3E%3Cpolygon%20points%3D'9%2C22%209%2C0%2017%2C0%2017%2C22%2026%2C22%2013.5%2C40%200%2C22'%20fill%3D'%238c8c8c'%2F%3E%3C%2Fsvg%3E"); +} +.weui-pull-to-refresh-layer .pull-to-refresh-preloader { + display: none; + vertical-align: -4px; + margin-right: 4px; + width: 20px; + height: 20px; + -webkit-transform-origin: 50%; + transform-origin: 50%; + -webkit-animation: preloader-spin 1s steps(12, end) infinite; + animation: preloader-spin 1s steps(12, end) infinite; +} +.weui-pull-to-refresh-layer .pull-to-refresh-preloader:after { + display: block; + width: 100%; + height: 100%; + content: ""; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); + background-repeat: no-repeat; + background-position: 50%; + background-size: 100%; +} +.pull-up .weui-pull-to-refresh-layer .down, +.refreshing .weui-pull-to-refresh-layer .down { + display: none; +} +.pull-up .weui-pull-to-refresh-layer .pull-to-refresh-arrow { + display: inline-block; + -webkit-transform: rotate(180deg) translate3d(0, 0, 0); + transform: rotate(180deg) translate3d(0, 0, 0); +} +.pull-up .weui-pull-to-refresh-layer .up { + display: inline-block; +} +.pull-down .weui-pull-to-refresh-layer .pull-to-refresh-arrow { + display: inline-block; +} +.pull-down .weui-pull-to-refresh-layer .down { + display: inline-block; +} +.refreshing .weui-pull-to-refresh-layer .pull-to-refresh-arrow { + display: none; +} +.refreshing .weui-pull-to-refresh-layer .pull-to-refresh-preloader { + display: inline-block; +} +.refreshing .weui-pull-to-refresh-layer .refresh { + display: inline-block; +} +@keyframes preloader-spin { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +.weui_tab_bd_item.weui-pull-to-refresh { + position: absolute; + top: 50px; +} +.weui-infinite-scroll { + height: 24px; + line-height: 24px; + padding: 10px; + text-align: center; +} +.weui-infinite-scroll .infinite-preloader { + display: inline-block; + margin-right: 4px; + vertical-align: -4px; + width: 20px; + height: 20px; + -webkit-transform-origin: 50%; + transform-origin: 50%; + -webkit-animation: preloader-spin 1s steps(12, end) infinite; + animation: preloader-spin 1s steps(12, end) infinite; +} +.weui-infinite-scroll .infinite-preloader:after { + display: block; + width: 100%; + height: 100%; + content: ""; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); + background-repeat: no-repeat; + background-position: 50%; + background-size: 100%; +} +.weui_tab { + overflow: hidden; +} +.weui_navbar_item { + color: #888; +} +.weui_navbar_item.weui_bar_item_on { + color: #666; +} +.weui_tab_bd .weui_tab_bd_item { + display: none; + height: 100%; + overflow: auto; +} +.weui_tab_bd .weui_tab_bd_item.weui_tab_bd_item_active { + display: block; +} +.weui_navbar { + z-index: 100; +} +/* === Columns Picker === */ +.weui-picker-modal { + width: 100%; + position: absolute; + z-index: 100; + bottom: 0; + text-align: center; + border-radius: 0; + opacity: 0.6; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + -webkit-transition-property: opacity, -webkit-transform; + transition-property: opacity, -webkit-transform; + transition-property: transform, opacity; + transition-property: transform, opacity, -webkit-transform; + color: #3d4145; + -webkit-transition-duration: .3s; + transition-duration: .3s; + height: 13rem; + background: #EFEFF4; +} +.weui-picker-modal.weui-picker-modal-visible { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +.weui-picker-modal .picker-modal-inner { + position: relative; + height: calc(100% - 2.2rem); +} +.weui-picker-modal .toolbar { + position: relative; + width: 100%; + font-size: .85rem; + line-height: 1.5; + color: #3d4145; + background: #f7f7f8; +} +.weui-picker-modal .toolbar:before { + content: ''; + position: absolute; + left: 0; + top: 0; + bottom: auto; + right: auto; + height: 1px; + width: 100%; + background-color: #d9d9d9; + display: block; + z-index: 15; + -webkit-transform-origin: 50% 0%; + transform-origin: 50% 0%; +} +@media only screen and (-webkit-min-device-pixel-ratio: 2) { + .weui-picker-modal .toolbar:before { + -webkit-transform: scaleY(0.5); + transform: scaleY(0.5); + } +} +@media only screen and (-webkit-min-device-pixel-ratio: 3) { + .weui-picker-modal .toolbar:before { + -webkit-transform: scaleY(0.33); + transform: scaleY(0.33); + } +} +.weui-picker-modal .picker-columns { + width: 100%; + height: 13rem; + z-index: 11500; +} +.weui-picker-modal .picker-columns.picker-modal-inline, +.popover .weui-picker-modal .picker-columns { + height: 10rem; +} +@media (orientation: landscape) and (max-height: 415px) { + .weui-picker-modal .picker-columns:not(.picker-modal-inline) { + height: 10rem; + } +} +.weui-picker-modal .popover.popover-picker-columns { + width: 14rem; +} +.weui-picker-modal .picker-items { + display: -webkit-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + -webkit-justify-content: center; + justify-content: center; + width: 100%; + padding: 0; + text-align: right; + font-size: 1rem; + font-weight: normal; + -webkit-mask-box-image: -webkit-linear-gradient(bottom, transparent, transparent 5%, white 20%, white 80%, transparent 95%, transparent); + -webkit-mask-box-image: linear-gradient(to top, transparent, transparent 5%, white 20%, white 80%, transparent 95%, transparent); +} +.weui-picker-modal .bar + .picker-items { + height: 10.8rem; +} +.weui-picker-modal .picker-items-col { + overflow: hidden; + position: relative; + max-height: 100%; +} +.weui-picker-modal .picker-items-col.picker-items-col-left { + text-align: left; +} +.weui-picker-modal .picker-items-col.picker-items-col-center { + text-align: center; +} +.weui-picker-modal .picker-items-col.picker-items-col-right { + text-align: right; +} +.weui-picker-modal .picker-items-col.picker-items-col-divider { + color: #3d4145; + display: -webkit-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; +} +.weui-picker-modal .picker-items-col-wrapper { + -webkit-transition: 300ms; + transition: 300ms; + -webkit-transition-timing-function: ease-out; + transition-timing-function: ease-out; +} +.weui-picker-modal .picker-item { + height: 32px; + line-height: 32px; + padding: 0 10px; + white-space: nowrap; + position: relative; + overflow: hidden; + text-overflow: ellipsis; + color: #9b9b9b; + left: 0; + top: 0; + width: 100%; + box-sizing: border-box; + -webkit-transition: 300ms; + transition: 300ms; +} +.picker-items-col-absolute .weui-picker-modal .picker-item { + position: absolute; +} +.weui-picker-modal .picker-item.picker-item-far { + pointer-events: none; +} +.weui-picker-modal .picker-item.picker-selected { + color: #3d4145; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + -webkit-transform: rotateX(0deg); + transform: rotateX(0deg); +} +.weui-picker-modal .picker-center-highlight { + height: 32px; + box-sizing: border-box; + position: absolute; + left: 0; + width: 100%; + top: 50%; + margin-top: -18px; + pointer-events: none; +} +.weui-picker-modal .picker-center-highlight:before { + content: ''; + position: absolute; + left: 0; + top: 0; + bottom: auto; + right: auto; + height: 1px; + width: 100%; + background-color: #D9D9D9; + display: block; + z-index: 15; + -webkit-transform-origin: 50% 0%; + transform-origin: 50% 0%; +} +@media only screen and (-webkit-min-device-pixel-ratio: 2) { + .weui-picker-modal .picker-center-highlight:before { + -webkit-transform: scaleY(0.5); + transform: scaleY(0.5); + } +} +@media only screen and (-webkit-min-device-pixel-ratio: 3) { + .weui-picker-modal .picker-center-highlight:before { + -webkit-transform: scaleY(0.33); + transform: scaleY(0.33); + } +} +.weui-picker-modal .picker-center-highlight:after { + content: ''; + position: absolute; + left: 0; + bottom: 0; + right: auto; + top: auto; + height: 1px; + width: 100%; + background-color: #D9D9D9; + display: block; + z-index: 15; + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; +} +@media only screen and (-webkit-min-device-pixel-ratio: 2) { + .weui-picker-modal .picker-center-highlight:after { + -webkit-transform: scaleY(0.5); + transform: scaleY(0.5); + } +} +@media only screen and (-webkit-min-device-pixel-ratio: 3) { + .weui-picker-modal .picker-center-highlight:after { + -webkit-transform: scaleY(0.33); + transform: scaleY(0.33); + } +} +.weui-picker-modal .picker-3d .picker-items { + overflow: hidden; + -webkit-perspective: 1200px; + perspective: 1200px; +} +.weui-picker-modal .picker-3d .picker-items-col, +.weui-picker-modal .picker-3d .picker-items-col-wrapper, +.weui-picker-modal .picker-3d .picker-item { + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; +} +.weui-picker-modal .picker-3d .picker-items-col { + overflow: visible; +} +.weui-picker-modal .picker-3d .picker-item { + -webkit-transform-origin: center center -110px; + transform-origin: center center -110px; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transition-timing-function: ease-out; + transition-timing-function: ease-out; +} +.weui-picker-modal .title { + position: absolute; + display: block; + width: 100%; + padding: 0; + font-size: .85rem; + font-weight: normal; + line-height: 2.2rem; + color: #3d4145; + text-align: center; + white-space: nowrap; +} +.weui-picker-modal .picker-button { + position: absolute; + right: 0; + box-sizing: border-box; + height: 2.2rem; + line-height: 2.2rem; + color: #04BE02; + z-index: 1; + padding: 0 .5rem; +} +.weui-picker-overlay, +.weui-picker-container { + position: fixed; + bottom: 0; + left: 0; + right: 0; + height: 0; + width: 100%; + height: 15rem; +} +.city-picker .col-province { + width: 5rem; +} +.city-picker .col-city { + width: 6rem; +} +.city-picker .col-district { + width: 5rem; +} +/* === Calendar === */ +.weui-picker-calendar { + background: #fff; + height: 15rem; + width: 100%; + overflow: hidden; +} +@media (orientation: landscape) and (max-height: 415px) { + .weui-picker-calendar:not(.picker-modal-inline) { + height: 11rem; + } +} +.weui-picker-calendar .picker-modal-inner { + overflow: hidden; +} +.picker-calendar-week-days { + height: 18px; + background: #f7f7f8; + display: -webkit-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + font-size: 11px; + box-sizing: border-box; + position: relative; +} +.picker-calendar-week-days:after { + content: ''; + position: absolute; + left: 0; + bottom: 0; + right: auto; + top: auto; + height: 1px; + width: 100%; + background-color: #c4c4c4; + display: block; + z-index: 15; + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; +} +@media only screen and (-webkit-min-device-pixel-ratio: 2) { + .picker-calendar-week-days:after { + -webkit-transform: scaleY(0.5); + transform: scaleY(0.5); + } +} +@media only screen and (-webkit-min-device-pixel-ratio: 3) { + .picker-calendar-week-days:after { + -webkit-transform: scaleY(0.33); + transform: scaleY(0.33); + } +} +.picker-calendar-week-days .picker-calendar-week-day { + -webkit-flex-shrink: 1; + -ms-flex: 0 1 auto; + -webkit-flex-shrink: 1; + -ms-flex-negative: 1; + flex-shrink: 1; + width: 14.28571429%; + width: calc(100% / 7); + line-height: 17px; + text-align: center; +} +.picker-calendar-week-days + .picker-calendar-months { + height: calc(100% - 18px); +} +.picker-calendar-months { + width: 100%; + height: 100%; + overflow: hidden; + position: relative; +} +.picker-calendar-months-wrapper { + position: relative; + width: 100%; + height: 100%; + -webkit-transition: 300ms; + transition: 300ms; +} +.picker-calendar-month { + display: -webkit-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -webkit-box-orient: vertical; + -ms-flex-direction: column; + -webkit-flex-direction: column; + flex-direction: column; + width: 100%; + height: 100%; + position: absolute; + left: 0; + top: 0; +} +.picker-calendar-row { + height: 16.66666667%; + height: calc(100% / 6); + display: -webkit-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -webkit-flex-shrink: 1; + -ms-flex: 0 1 auto; + -webkit-flex-shrink: 1; + -ms-flex-negative: 1; + flex-shrink: 1; + width: 100%; + position: relative; +} +.picker-calendar-row:after { + content: ''; + position: absolute; + left: 0; + bottom: 0; + right: auto; + top: auto; + height: 1px; + width: 100%; + background-color: #ccc; + display: block; + z-index: 15; + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; +} +@media only screen and (-webkit-min-device-pixel-ratio: 2) { + .picker-calendar-row:after { + -webkit-transform: scaleY(0.5); + transform: scaleY(0.5); + } +} +@media only screen and (-webkit-min-device-pixel-ratio: 3) { + .picker-calendar-row:after { + -webkit-transform: scaleY(0.33); + transform: scaleY(0.33); + } +} +.picker-calendar-row:last-child:after { + display: none; +} +.picker-calendar-day { + -webkit-flex-shrink: 1; + -ms-flex: 0 1 auto; + -webkit-flex-shrink: 1; + -ms-flex-negative: 1; + flex-shrink: 1; + display: -webkit-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + -webkit-justify-content: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + box-sizing: border-box; + width: 14.28571429%; + width: calc(100% / 7); + text-align: center; + color: #3d4145; + font-size: 15px; + cursor: pointer; +} +.picker-calendar-day.picker-calendar-day-prev, +.picker-calendar-day.picker-calendar-day-next { + color: #ccc; +} +.picker-calendar-day.picker-calendar-day-disabled { + color: #d4d4d4; + cursor: auto; +} +.picker-calendar-day.picker-calendar-day-today span { + background: #e3e3e3; +} +.picker-calendar-day.picker-calendar-day-selected span { + background: #04BE02; + color: #fff; +} +.picker-calendar-day span { + display: inline-block; + border-radius: 100%; + width: 30px; + height: 30px; + line-height: 30px; +} +.picker-calendar-month-picker, +.picker-calendar-year-picker { + display: -webkit-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + -webkit-justify-content: space-between; + justify-content: space-between; + width: 50%; + max-width: 200px; + -webkit-flex-shrink: 10; + -ms-flex: 0 10 auto; + -webkit-flex-shrink: 10; + -ms-flex-negative: 10; + flex-shrink: 10; +} +.picker-calendar-month-picker a.icon-only, +.picker-calendar-year-picker a.icon-only { + min-width: 36px; +} +.picker-calendar-month-picker span, +.picker-calendar-year-picker span { + -webkit-flex-shrink: 1; + -ms-flex: 0 1 auto; + -webkit-flex-shrink: 1; + -ms-flex-negative: 1; + flex-shrink: 1; + position: relative; + overflow: hidden; + text-overflow: ellipsis; +} +.popover .picker-calendar .picker-calendar-week-days, +.picker-calendar.picker-modal-inline .picker-calendar-week-days { + background: none; +} +.popover .picker-calendar .toolbar:before, +.picker-calendar.picker-modal-inline .toolbar:before, +.popover .picker-calendar .picker-calendar-week-days:before, +.picker-calendar.picker-modal-inline .picker-calendar-week-days:before { + display: none; +} +.popover .picker-calendar .toolbar:after, +.picker-calendar.picker-modal-inline .toolbar:after, +.popover .picker-calendar .picker-calendar-week-days:after, +.picker-calendar.picker-modal-inline .picker-calendar-week-days:after { + display: none; +} +.popover .picker-calendar .toolbar ~ .picker-modal-inner .picker-calendar-months:before, +.picker-calendar.picker-modal-inline .toolbar ~ .picker-modal-inner .picker-calendar-months:before, +.popover .picker-calendar .picker-calendar-week-days ~ .picker-calendar-months:before, +.picker-calendar.picker-modal-inline .picker-calendar-week-days ~ .picker-calendar-months:before { + content: ''; + position: absolute; + left: 0; + top: 0; + bottom: auto; + right: auto; + height: 1px; + width: 100%; + background-color: #c4c4c4; + display: block; + z-index: 15; + -webkit-transform-origin: 50% 0%; + transform-origin: 50% 0%; +} +@media only screen and (-webkit-min-device-pixel-ratio: 2) { + .popover .picker-calendar .toolbar ~ .picker-modal-inner .picker-calendar-months:before, + .picker-calendar.picker-modal-inline .toolbar ~ .picker-modal-inner .picker-calendar-months:before, + .popover .picker-calendar .picker-calendar-week-days ~ .picker-calendar-months:before, + .picker-calendar.picker-modal-inline .picker-calendar-week-days ~ .picker-calendar-months:before { + -webkit-transform: scaleY(0.5); + transform: scaleY(0.5); + } +} +@media only screen and (-webkit-min-device-pixel-ratio: 3) { + .popover .picker-calendar .toolbar ~ .picker-modal-inner .picker-calendar-months:before, + .picker-calendar.picker-modal-inline .toolbar ~ .picker-modal-inner .picker-calendar-months:before, + .popover .picker-calendar .picker-calendar-week-days ~ .picker-calendar-months:before, + .picker-calendar.picker-modal-inline .picker-calendar-week-days ~ .picker-calendar-months:before { + -webkit-transform: scaleY(0.33); + transform: scaleY(0.33); + } +} +.weui-picker-modal .toolbar-inner { + height: 2.2rem; + display: -webkit-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + text-align: center; +} +.picker-calendar-month-picker, +.picker-calendar-year-picker { + display: block; + line-height: 2.2rem; +} +.picker-calendar-month-picker a.icon-only, +.picker-calendar-year-picker a.icon-only { + float: left; + width: 25%; + height: 2.2rem; + line-height: 2rem; +} +.picker-calendar-month-picker .current-month-value, +.picker-calendar-year-picker .current-month-value, +.picker-calendar-month-picker .current-year-value, +.picker-calendar-year-picker .current-year-value { + float: left; + width: 50%; + height: 2.2rem; +} +i.icon { + display: inline-block; + vertical-align: middle; + background-size: 100% auto; + background-position: center; + background-repeat: no-repeat; + font-style: normal; + position: relative; +} +i.icon.icon-next, +i.icon.icon-prev { + width: 0.75rem; + height: 0.75rem; +} +i.icon.icon-next { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2015%2015'%3E%3Cg%3E%3Cpath%20fill%3D'%2304BE02'%20d%3D'M1%2C1.6l11.8%2C5.8L1%2C13.4V1.6%20M0%2C0v15l15-7.6L0%2C0L0%2C0z'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); +} +i.icon.icon-prev { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2015%2015'%3E%3Cg%3E%3Cpath%20fill%3D'%2304BE02'%20d%3D'M14%2C1.6v11.8L2.2%2C7.6L14%2C1.6%20M15%2C0L0%2C7.6L15%2C15V0L15%2C0z'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); +} +/** + * Swiper 3.3.1 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * + * http://www.idangero.us/swiper/ + * + * Copyright 2016, Vladimir Kharlampidi + * The iDangero.us + * http://www.idangero.us/ + * + * Licensed under MIT + * + * Released on: February 7, 2016 + */ +.swiper-container { + margin: 0 auto; + position: relative; + overflow: hidden; + /* Fix of Webkit flickering */ + z-index: 1; +} +.swiper-container-no-flexbox .swiper-slide { + float: left; +} +.swiper-container-vertical > .swiper-wrapper { + -webkit-box-orient: vertical; + -ms-flex-direction: column; + -webkit-flex-direction: column; + flex-direction: column; +} +.swiper-wrapper { + position: relative; + width: 100%; + height: 100%; + z-index: 1; + display: -webkit-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -webkit-transition-property: -webkit-transform; + transition-property: -webkit-transform; + transition-property: transform; + transition-property: transform, -webkit-transform; + box-sizing: content-box; +} +.swiper-container-android .swiper-slide, +.swiper-wrapper { + -webkit-transform: translate3d(0px, 0, 0); + transform: translate3d(0px, 0, 0); +} +.swiper-container-multirow > .swiper-wrapper { + -webkit-box-lines: multiple; + -moz-box-lines: multiple; + -ms-flex-wrap: wrap; + -webkit-flex-wrap: wrap; + flex-wrap: wrap; +} +.swiper-container-free-mode > .swiper-wrapper { + -webkit-transition-timing-function: ease-out; + transition-timing-function: ease-out; + margin: 0 auto; +} +.swiper-slide { + -webkit-flex-shrink: 0; + -ms-flex: 0 0 auto; + -webkit-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; + width: 100%; + height: 100%; + position: relative; +} +/* Auto Height */ +.swiper-container-autoheight, +.swiper-container-autoheight .swiper-slide { + height: auto; +} +.swiper-container-autoheight .swiper-wrapper { + -webkit-box-align: start; + -ms-flex-align: start; + -webkit-align-items: flex-start; + align-items: flex-start; + -webkit-transition-property: -webkit-transform, height; + -webkit-transition-property: height, -webkit-transform; + transition-property: height, -webkit-transform; + transition-property: transform, height; + transition-property: transform, height, -webkit-transform; +} +/* a11y */ +.swiper-container .swiper-notification { + position: absolute; + left: 0; + top: 0; + pointer-events: none; + opacity: 0; + z-index: -1000; +} +/* IE10 Windows Phone 8 Fixes */ +.swiper-wp8-horizontal { + -ms-touch-action: pan-y; + touch-action: pan-y; +} +.swiper-wp8-vertical { + -ms-touch-action: pan-x; + touch-action: pan-x; +} +/* Arrows */ +.swiper-button-prev, +.swiper-button-next { + position: absolute; + top: 50%; + width: 27px; + height: 44px; + margin-top: -22px; + z-index: 10; + cursor: pointer; + background-size: 27px 44px; + background-position: center; + background-repeat: no-repeat; +} +.swiper-button-prev.swiper-button-disabled, +.swiper-button-next.swiper-button-disabled { + opacity: 0.35; + cursor: auto; + pointer-events: none; +} +.swiper-button-prev, +.swiper-container-rtl .swiper-button-next { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E"); + left: 10px; + right: auto; +} +.swiper-button-prev.swiper-button-black, +.swiper-container-rtl .swiper-button-next.swiper-button-black { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E"); +} +.swiper-button-prev.swiper-button-white, +.swiper-container-rtl .swiper-button-next.swiper-button-white { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E"); +} +.swiper-button-next, +.swiper-container-rtl .swiper-button-prev { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E"); + right: 10px; + left: auto; +} +.swiper-button-next.swiper-button-black, +.swiper-container-rtl .swiper-button-prev.swiper-button-black { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E"); +} +.swiper-button-next.swiper-button-white, +.swiper-container-rtl .swiper-button-prev.swiper-button-white { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E"); +} +/* Pagination Styles */ +.swiper-pagination { + position: absolute; + text-align: center; + -webkit-transition: 300ms; + transition: 300ms; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + z-index: 10; +} +.swiper-pagination.swiper-pagination-hidden { + opacity: 0; +} +/* Common Styles */ +.swiper-pagination-fraction, +.swiper-pagination-custom, +.swiper-container-horizontal > .swiper-pagination-bullets { + bottom: 10px; + left: 0; + width: 100%; +} +/* Bullets */ +.swiper-pagination-bullet { + width: 8px; + height: 8px; + display: inline-block; + border-radius: 100%; + background: #000; + opacity: 0.2; +} +button.swiper-pagination-bullet { + border: none; + margin: 0; + padding: 0; + box-shadow: none; + -moz-appearance: none; + -ms-appearance: none; + -webkit-appearance: none; + appearance: none; +} +.swiper-pagination-clickable .swiper-pagination-bullet { + cursor: pointer; +} +.swiper-pagination-white .swiper-pagination-bullet { + background: #fff; +} +.swiper-pagination-bullet-active { + opacity: 1; + background: #04BE02; +} +.swiper-pagination-white .swiper-pagination-bullet-active { + background: #fff; +} +.swiper-pagination-black .swiper-pagination-bullet-active { + background: #000; +} +.swiper-container-vertical > .swiper-pagination-bullets { + right: 10px; + top: 50%; + -webkit-transform: translate3d(0px, -50%, 0); + transform: translate3d(0px, -50%, 0); +} +.swiper-container-vertical > .swiper-pagination-bullets .swiper-pagination-bullet { + margin: 5px 0; + display: block; +} +.swiper-container-horizontal > .swiper-pagination-bullets .swiper-pagination-bullet { + margin: 0 5px; +} +/* Progress */ +.swiper-pagination-progress { + background: rgba(0, 0, 0, 0.25); + position: absolute; +} +.swiper-pagination-progress .swiper-pagination-progressbar { + background: #007aff; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: left top; + transform-origin: left top; +} +.swiper-container-rtl .swiper-pagination-progress .swiper-pagination-progressbar { + -webkit-transform-origin: right top; + transform-origin: right top; +} +.swiper-container-horizontal > .swiper-pagination-progress { + width: 100%; + height: 4px; + left: 0; + top: 0; +} +.swiper-container-vertical > .swiper-pagination-progress { + width: 4px; + height: 100%; + left: 0; + top: 0; +} +.swiper-pagination-progress.swiper-pagination-white { + background: rgba(255, 255, 255, 0.5); +} +.swiper-pagination-progress.swiper-pagination-white .swiper-pagination-progressbar { + background: #fff; +} +.swiper-pagination-progress.swiper-pagination-black .swiper-pagination-progressbar { + background: #000; +} +/* 3D Container */ +.swiper-container-3d { + -webkit-perspective: 1200px; + -o-perspective: 1200px; + perspective: 1200px; +} +.swiper-container-3d .swiper-wrapper, +.swiper-container-3d .swiper-slide, +.swiper-container-3d .swiper-slide-shadow-left, +.swiper-container-3d .swiper-slide-shadow-right, +.swiper-container-3d .swiper-slide-shadow-top, +.swiper-container-3d .swiper-slide-shadow-bottom, +.swiper-container-3d .swiper-cube-shadow { + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; +} +.swiper-container-3d .swiper-slide-shadow-left, +.swiper-container-3d .swiper-slide-shadow-right, +.swiper-container-3d .swiper-slide-shadow-top, +.swiper-container-3d .swiper-slide-shadow-bottom { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: 10; +} +.swiper-container-3d .swiper-slide-shadow-left { + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0))); + /* Safari 4+, Chrome */ + background-image: -webkit-linear-gradient(right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + /* Chrome 10+, Safari 5.1+, iOS 5+ */ + /* Firefox 3.6-15 */ + /* Opera 11.10-12.00 */ + background-image: linear-gradient(to left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + /* Firefox 16+, IE10, Opera 12.50+ */ +} +.swiper-container-3d .swiper-slide-shadow-right { + background-image: -webkit-gradient(linear, right top, left top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0))); + /* Safari 4+, Chrome */ + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + /* Chrome 10+, Safari 5.1+, iOS 5+ */ + /* Firefox 3.6-15 */ + /* Opera 11.10-12.00 */ + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + /* Firefox 16+, IE10, Opera 12.50+ */ +} +.swiper-container-3d .swiper-slide-shadow-top { + background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0))); + /* Safari 4+, Chrome */ + background-image: -webkit-linear-gradient(bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + /* Chrome 10+, Safari 5.1+, iOS 5+ */ + /* Firefox 3.6-15 */ + /* Opera 11.10-12.00 */ + background-image: linear-gradient(to top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + /* Firefox 16+, IE10, Opera 12.50+ */ +} +.swiper-container-3d .swiper-slide-shadow-bottom { + background-image: -webkit-gradient(linear, left bottom, left top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0))); + /* Safari 4+, Chrome */ + background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + /* Chrome 10+, Safari 5.1+, iOS 5+ */ + /* Firefox 3.6-15 */ + /* Opera 11.10-12.00 */ + background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + /* Firefox 16+, IE10, Opera 12.50+ */ +} +/* Coverflow */ +.swiper-container-coverflow .swiper-wrapper, +.swiper-container-flip .swiper-wrapper { + /* Windows 8 IE 10 fix */ + -ms-perspective: 1200px; +} +/* Cube + Flip */ +.swiper-container-cube, +.swiper-container-flip { + overflow: visible; +} +.swiper-container-cube .swiper-slide, +.swiper-container-flip .swiper-slide { + pointer-events: none; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + z-index: 1; +} +.swiper-container-cube .swiper-slide .swiper-slide, +.swiper-container-flip .swiper-slide .swiper-slide { + pointer-events: none; +} +.swiper-container-cube .swiper-slide-active, +.swiper-container-flip .swiper-slide-active, +.swiper-container-cube .swiper-slide-active .swiper-slide-active, +.swiper-container-flip .swiper-slide-active .swiper-slide-active { + pointer-events: auto; +} +.swiper-container-cube .swiper-slide-shadow-top, +.swiper-container-flip .swiper-slide-shadow-top, +.swiper-container-cube .swiper-slide-shadow-bottom, +.swiper-container-flip .swiper-slide-shadow-bottom, +.swiper-container-cube .swiper-slide-shadow-left, +.swiper-container-flip .swiper-slide-shadow-left, +.swiper-container-cube .swiper-slide-shadow-right, +.swiper-container-flip .swiper-slide-shadow-right { + z-index: 0; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; +} +/* Cube */ +.swiper-container-cube .swiper-slide { + visibility: hidden; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + width: 100%; + height: 100%; +} +.swiper-container-cube.swiper-container-rtl .swiper-slide { + -webkit-transform-origin: 100% 0; + transform-origin: 100% 0; +} +.swiper-container-cube .swiper-slide-active, +.swiper-container-cube .swiper-slide-next, +.swiper-container-cube .swiper-slide-prev, +.swiper-container-cube .swiper-slide-next + .swiper-slide { + pointer-events: auto; + visibility: visible; +} +.swiper-container-cube .swiper-cube-shadow { + position: absolute; + left: 0; + bottom: 0px; + width: 100%; + height: 100%; + background: #000; + opacity: 0.6; + -webkit-filter: blur(50px); + filter: blur(50px); + z-index: 0; +} +/* Fade */ +.swiper-container-fade.swiper-container-free-mode .swiper-slide { + -webkit-transition-timing-function: ease-out; + transition-timing-function: ease-out; +} +.swiper-container-fade .swiper-slide { + pointer-events: none; + -webkit-transition-property: opacity; + transition-property: opacity; +} +.swiper-container-fade .swiper-slide .swiper-slide { + pointer-events: none; +} +.swiper-container-fade .swiper-slide-active, +.swiper-container-fade .swiper-slide-active .swiper-slide-active { + pointer-events: auto; +} +/* Scrollbar */ +.swiper-scrollbar { + border-radius: 10px; + position: relative; + -ms-touch-action: none; + background: rgba(0, 0, 0, 0.1); +} +.swiper-container-horizontal > .swiper-scrollbar { + position: absolute; + left: 1%; + bottom: 3px; + z-index: 50; + height: 5px; + width: 98%; +} +.swiper-container-vertical > .swiper-scrollbar { + position: absolute; + right: 3px; + top: 1%; + z-index: 50; + width: 5px; + height: 98%; +} +.swiper-scrollbar-drag { + height: 100%; + width: 100%; + position: relative; + background: rgba(0, 0, 0, 0.5); + border-radius: 10px; + left: 0; + top: 0; +} +.swiper-scrollbar-cursor-drag { + cursor: move; +} +/* Preloader */ +.swiper-lazy-preloader { + width: 42px; + height: 42px; + position: absolute; + left: 50%; + top: 50%; + margin-left: -21px; + margin-top: -21px; + z-index: 10; + -webkit-transform-origin: 50%; + transform-origin: 50%; + -webkit-animation: swiper-preloader-spin 1s steps(12, end) infinite; + animation: swiper-preloader-spin 1s steps(12, end) infinite; +} +.swiper-lazy-preloader:after { + display: block; + content: ""; + width: 100%; + height: 100%; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); + background-position: 50%; + background-size: 100%; + background-repeat: no-repeat; +} +.swiper-lazy-preloader-white:after { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); +} +@-webkit-keyframes swiper-preloader-spin { + 100% { + -webkit-transform: rotate(360deg); + } +} +@keyframes swiper-preloader-spin { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +.weui_actionsheet { + z-index: 100; +} +.notification { + position: fixed; + width: 100%; + min-height: 3.4rem; + top: -2rem; + padding-top: 2rem; + left: 0; + right: 0; + z-index: 9999; + background-color: rgba(0, 0, 0, 0.85); + color: white; + font-size: .65rem; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + -webkit-transition: .4s; + transition: .4s; +} +.notification.notification-in { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +.notification.touching { + -webkit-transition-duration: 0s; + transition-duration: 0s; +} +.notification .notification-inner { + padding: .4rem .6rem 1rem .6rem; + display: -webkit-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -webkit-box-align: start; + -ms-flex-align: start; + -webkit-align-items: flex-start; + align-items: flex-start; +} +.notification .notification-content { + width: 100%; + margin: 0rem .4rem; +} +.notification .notification-title { + font-weight: bold; +} +.notification .notification-text { + line-height: 1; +} +.notification .notification-media { + height: 1rem; + width: 1rem; +} +.notification .notification-media img { + width: 100%; +} +.notification .notification-handle-bar { + position: absolute; + bottom: .2rem; + left: 50%; + -webkit-transform: translate3d(-50%, 0, 0); + transform: translate3d(-50%, 0, 0); + width: 2rem; + height: .3rem; + border-radius: .15rem; + background: white; + opacity: .5; +} diff --git a/src/main/webapp/css/register.css b/src/main/webapp/css/register.css new file mode 100644 index 0000000..ba8b08e --- /dev/null +++ b/src/main/webapp/css/register.css @@ -0,0 +1 @@ +body,html{height:100%;-webkit-tap-highlight-color:transparent}.page,body{background-color:#fbf9fe}.container{overflow:hidden}.container,.page{position:absolute;top:0;right:0;bottom:0;left:0}.page{overflow-y:auto;-webkit-overflow-scrolling:touch}.hd{padding:2em 0}.page_desc{text-align:center;color:#888;font-size:14px}.bd.spacing{padding:0 15px}.page_title{text-align:center;font-size:34px;color:#3cc51f;font-weight:400;margin:0 15%}.global_navs{background-color:transparent}.global_navs:after,.global_navs:before{border-color:#d9dbda}.global_navs .icon_nav{width:28px;height:28px;display:block;margin-right:.7em}.page.button .page_title{color:#225fba}.page.button .bd{padding:0 15px}.page.button .button_sp_area{padding:10px 0;width:60%;margin:0 auto;text-align:justify;text-justify:distribute-all-lines;font-size:0}.page.button .button_sp_area:after{display:inline-block;width:100%;height:0;font-size:0;margin:0;padding:0;overflow:hidden;content:"."}.page.cell .page_title{color:#225fba}.page.cell .bd{padding-bottom:30px}.page.toast{background-color:#fff}.page.toast .bd{padding:120px 15px 0}.page.dialog{background-color:#fff}.page.dialog .bd{padding:120px 15px 0}.page.article,.page.msg{background-color:#fff}.page.article .page_title{color:#de7c23}.page.icons{background-color:#fff;text-align:center}.page.icons .page_title{color:#3e24bd}.page.icons .bd{padding:30px 0;text-align:center}.page.icons .icon_sp_area{padding:10px 20px;text-align:left}.page.icons i{margin:0 5px 10px}@-webkit-keyframes a{0%{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes a{0%{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@-webkit-keyframes b{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes b{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.page.slideIn{-webkit-animation:a .2s forwards;animation:a .2s forwards}.page.slideOut{-webkit-animation:b .2s forwards;animation:b .2s forwards} \ No newline at end of file diff --git a/src/main/webapp/css/style.css b/src/main/webapp/css/style.css new file mode 100644 index 0000000..174860e --- /dev/null +++ b/src/main/webapp/css/style.css @@ -0,0 +1,185 @@ + +body { + font-family: 'Roboto', sans-serif; + font-size: 16px; + font-weight: 300; + color: #888; + line-height: 30px; + text-align: center; +} + +strong { font-weight: 500; } + +a, a:hover, a:focus { + color: #de995e; + text-decoration: none; + -o-transition: all .3s; -moz-transition: all .3s; -webkit-transition: all .3s; -ms-transition: all .3s; transition: all .3s; +} + +h1, h2 { + margin-top: 10px; + font-size: 38px; + font-weight: 100; + color: #555; + line-height: 50px; +} + +h3 { + font-size: 22px; + font-weight: 300; + color: #555; + line-height: 30px; +} + +img { max-width: 100%; } + +::-moz-selection { background: #de995e; color: #fff; text-shadow: none; } +::selection { background: #de995e; color: #fff; text-shadow: none; } + + +.btn-link-1 { + display: inline-block; + height: 50px; + margin: 5px; + padding: 16px 20px 0 20px; + background: #de995e; + font-size: 16px; + font-weight: 300; + line-height: 16px; + color: #fff; + -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; +} +.btn-link-1:hover, .btn-link-1:focus, .btn-link-1:active { outline: 0; opacity: 0.6; color: #fff; } + +.btn-link-1.btn-link-1-facebook { background: #4862a3; } +.btn-link-1.btn-link-1-twitter { background: #55acee; } +.btn-link-1.btn-link-1-google-plus { background: #dd4b39; } + +.btn-link-1 i { + padding-right: 5px; + vertical-align: middle; + font-size: 20px; + line-height: 20px; +} + +.btn-link-2 { + display: inline-block; + height: 50px; + margin: 5px; + padding: 15px 20px 0 20px; + background: rgba(0, 0, 0, 0.3); + border: 1px solid #fff; + font-size: 16px; + font-weight: 300; + line-height: 16px; + color: #fff; + -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; +} +.btn-link-2:hover, .btn-link-2:focus, +.btn-link-2:active, .btn-link-2:active:focus { outline: 0; opacity: 0.6; background: rgba(0, 0, 0, 0.3); color: #fff; } + + +/***** Top content *****/ + +.inner-bg { + padding: 100px 0 170px 0; +} + +.top-content .text { + color: #fff; +} + +.top-content .text h1 { color: #fff; } + +.top-content .description { + margin: 20px 0 10px 0; +} + +.top-content .description p { opacity: 0.8; } + +.top-content .description a { + color: #fff; +} +.top-content .description a:hover, +.top-content .description a:focus { border-bottom: 1px dotted #fff; } + +.form-box { + margin-top: 35px; +} + +.form-top { + overflow: hidden; + padding: 0 25px 15px 25px; + background: #fff; + -moz-border-radius: 4px 4px 0 0; -webkit-border-radius: 4px 4px 0 0; border-radius: 4px 4px 0 0; + text-align: left; +} + +.form-top-left { + float: left; + width: 75%; + padding-top: 25px; +} + +.form-top-left h3 { margin-top: 0; } + +.form-top-right { + float: left; + width: 25%; + padding-top: 5px; + font-size: 66px; + color: #ddd; + line-height: 100px; + text-align: right; +} + +.form-bottom { + padding: 25px 25px 30px 25px; + background: #eee; + -moz-border-radius: 0 0 4px 4px; -webkit-border-radius: 0 0 4px 4px; border-radius: 0 0 4px 4px; + text-align: left; +} + +.form-bottom form textarea { + height: 100px; +} + +.form-bottom form button.btn { + width: 100%; +} + +.form-bottom form .input-error { + border-color: #de995e; +} + +.social-login { + margin-top: 35px; +} + +.social-login h3 { + color: #fff; +} + +.social-login-buttons { + margin-top: 25px; +} + + +/***** Media queries *****/ + +@media (min-width: 992px) and (max-width: 1199px) {} + +@media (min-width: 768px) and (max-width: 991px) {} + +@media (max-width: 767px) { + + .inner-bg { padding: 60px 0 110px 0; } + +} + +@media (max-width: 415px) { + + h1, h2 { font-size: 32px; } + +} + diff --git a/src/main/webapp/demolist.html b/src/main/webapp/demolist.html index b0d5d9a..e7bcbca 100644 --- a/src/main/webapp/demolist.html +++ b/src/main/webapp/demolist.html @@ -15,29 +15,21 @@

demo list show demo!

diff --git a/src/main/webapp/image/b.jpg b/src/main/webapp/image/b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..700e978b1f95b7669b3b2d78048a09462f795688 GIT binary patch literal 706 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3+&79l@kv9V#r`xQ=ZekrT50Wj1^ASpH}(Xu2`mY_l2~`<2hHgG?uiT^=J^( NW3yP)rNR9FCICP5^f3Sc literal 0 HcmV?d00001 diff --git a/src/main/webapp/image/backimg.jpg b/src/main/webapp/image/backimg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6507652ed307a88190f320e77cf4937203d21e31 GIT binary patch literal 170790 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%0DFU!F!H0A)pQgT%8`^pN(na(a# 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

GqLfK}r>KY4@1F!mNvSKv5<9%X{Sdpfz@pT> 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 yE3KEYfoq(3QlvfGA$yrtLsp@9|iw4lR6?CZZcH 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 He~11b=HbDV literal 0 HcmV?d00001 diff --git a/src/main/webapp/image/demo.gif b/src/main/webapp/image/demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..d76a290cba497a1ade19b01d0e487219106250aa GIT binary patch literal 602021 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

Msd9Fjs zta;LtVc%3G!|ACja6c>3&in#OOVu!)vLfGPk`_dD+UHf$dM0x=RJ1qJZX--sr6B@9 z(1IHDpa@NGqc zqkuP*X(FtIl7T6;3<5T_35%OJHPKwYiMK+o@MY-o|0w_j#DInC@= zgzBPkb{0l;NfiqhdAG3y?p{u{mtuj&tDmtdp7S)^Q3-cXc@pe|C3mf~@derBLHU!AtMN@d&{TlXQYa8*pm?}Er zsUvG9PM?l8#*jSiYvnmO#4V1#id`*>9Vc5J?~A)`%WX?5)Hn@qZmX+2uyUtN{_mKC~61#EbU9KNsl-fP>LUPV&YeVTSt9MdG>u*_t8v78mMw{M=eWjSKY-$r|? z8t;gx?A-BeQ@c*^_0YBRohN>k#$QfONW}Xragx4_5z;6i%D=s^rYp?pO?$f2p#HR| zLrv-nXZWzNnj}=qY-VWk(T*pk5M?pw|KByIx~jXIv#t$7-kmzKkm>caXQKludV-R_ zv#l2;B{}B9#a77exuI0^i(3sks+iEpL6ogP*E~@5=JK-~RTdu+{79UgH_4IUeH6nQG`G-}m7zH=4R9PVtnzG>=cVlSS6pRRjNa z++Yv8*vC$GD;wC{W#U>!l8Q8A|1+eeE7eR)Ngq0mX@X1GC^3s$3^rlZe z>i1gEQzx@F&t2`T9NuP?_Wh1GwI-x&ou1kPt5QqyF19uH^S^h~=tL(tu=PfG<+BXo zJG;Ep5iVxP51Gi>V>RX}haz~Jk|rbt$+o}l^|G7){OC`=`a523!m0#d__e3@V?L#Q zJGO0TBM#01?QF?j51;6hAtfe&#bFalef9@n zYcoPw^-s?-eqUFH>vx7|n1*UdTqbySs{|n7$6@Ite^Y21fkZNHgJvg|McxPKu$a}OVRgYFKkMe_7qE)p6 zdZCwTF!+L~c#5i+imXU-+|~dy_)oHkZl836S!h!#MROiAeAskvm?VFX(>u9Sa{(rA z7-ER!a&*zdgrSv)|A=@#cf{_ zizU%?5}7+X*p2xZYZgO=9u__riHkglbM$AB`vGw4C0Yonhz7?pHex;QM1et5Nr1+Q z)x?26rf)Q-dAX;5AL&ma;alc-j^&4j5zq+jIF@9Ye(zX*Xh$_>;%F21PW{4>W229F z^gBI>Sjtve|2}zpB$iFX0+d0?kj{sc&6t3RL{5b{lzn4VOF5Af8BdpJBoml>+jxQT z7l3fN9LIrXH<@j`r4bxwif4&}df)>LzyPGF1}ZsLVVRn&nUb#Ang}M69p{qDbUU1w zi8A?2qg0dkw|PE!ivj3^OOua$Sc{jJd48E32+532$X+l+GY?65zgRxmH#kW3D-)=b z)7T^%sWKf>9OD=@qQP|sReoOgjsZ{t7hq5xPy=CC0IOM+@;RU37MhtxV9k}E6~UAo zm}?h@e;VXFV5n$OsgE>iU4ZmlI+KIR*&NLon2?BGfH|1Rr<4&%osUVG8o6DwwwTdn zp&nu`|2OGUo{Um%d5C}2q0T@6~*-8QdFb9Fqtu)FB5+JVR8Ug0&0I5I$ z0nh;A5DZiBt|%Y@0q_Br;I7%ao`Jfk?~1SP>Hu4?s5)A(IC`+HD4S+D8ZN0sq(N~` z$~Ymqs?92wErq0f`5^*2fRQC1J6VlU+GR zZ%cQ9#}-818IA*)L~!^K+xC^@SEpXJqAf~LK(MF{Fa-rrw0HWVlTc7e>$Fg-v^k)s zVOg~_>Yfh32NF=UTPp!y8xt>Ds5AdzDMuK0|B(`+ zJ4m9x*<#3fe>A&|ARDqnimNc@gu5DShu5n`hj^w%M6?BDk&|#^Dy(JNkHE=uvlom> z24H=;d%Go%RYQuPS&C5m0e#x14B(yx#iyh>sRR`PnZN*fFbM_*yRuuT4REI)Kmr-C zp4X}Zs%v0X8@4nW3}02F2%EeHyS%BVuwUtQu{a=DLXhDIh(|QCB-W}mXSu36w*%QW z+{;XN(WQ;INoz`_N{E<7iKT{FvP4O~w{~REc8R=lNf|1!Y&nSurNMluE5Ypt|?Eo?aKI`TD?HkgvsC0QKqs(l7;Bn*qUVv>5QU|DzEB!Qiej z5ua&$!YEu(Yio)zajHOyWF%yaxpBU6)|=p4u_`uM-q@R#6-S5hXA4?HBl~xNDPu-w zBMxY?!`6tB>vk=-Xt-I4iG?2+%RQ`yTE6#t9a%~{I};$;bqck%2u!DjDh(vuz;6q+ zC=jDwm#s0{04T5ts+$AGAPo~iyan*J#0$c&E0)ar$I2VXpXR)C>aBz2qwm*ZU+66W zDS#Bau@y^~uR5_bJjsANzU~#oKSa26_Mpyr#LmdR2Zx1>MvX5^zqhF`(Kmm!3St{r zZ>T)Pn2BADLmbeG5kFg-<~gT#N~h>L8Y;j5>j}G03!j-v%pq*9{{&S6;{dJ&paSFY zr|C(-;>xdFYhVCtsDt3IK%2te{LL)9!mam)PL_4FXqk|eFj#pqGdW^L+LHk6OvHzO z5zBB-Wf*T^tAE7F2+^F4*i%TXzU#}SIYWKY7{8?ql}y>PPuauQ_;eH~dG^+kOIE#A zLTPKlN=3U+Jc`Yf+LeJynwQ`P6nv-*K&Yb;(zjc?%511Gy3vu^r!1Ps*F3bOnFoyE zp8FcEfqHk?v6pR^nTvzz*43%4+F*^oyy}p>cDO?)7lG@gu_tXw%0uilzkFA#j$7B2 zJGd0xq?vuu+D5?PtV|Iu*wh+U%?;TJ_1DYIIU2s)|Bn6P>xkhI-ooVk!Wk!|6&H7~ zmd;lh&ua6k-wS-N#j?nT7qK0MAlhp7eX;}XG5{^1TMC85HbZKC;7t`@13uti+Hg8o z+L2pkcd4p)eIj>@!@ClPx{MK^*Uid(*kr}s4aL}*hMv2Og43(y_mi z!*toXf%y`+IEhrOER#_EjR&fGBE;9_oXcWDtsGwAYpda3GU7msp4<)D7Y^niKI`Tu z;-$*4CEl4*!_=ud!=8?}zG>x7UDZ3cD^3Y{|2&4;3JAnGUX_ZjzOIe3e#V55Zg4i! zZ0n}b`MW*&#@27<&>w~`0A5WfGom09&tJ^tvi{{6Zq!{a=Fv@lfF0QrwdVHD<}m2y z&#SOWEg`$-!|Gk$dFWDfN!5FMS^rLtNp(J$h{=l^7e&@)vJ80nJ=^$grRDV6%r5Q; z?n7<4bZ|Z6n+|cC&HzO~y1$p3Yn6J=kI#w{x$NP9jq3EC+(OIh(~VGN-r>=mcC^0p zV`u9l>5eXZ5_JxQ3YX}1+u|B4h#iXJS{=FcWMnp8)@t$9qV(*`sqsQSWBZNubklf# z*zrvd#Y=UaQL2GO-=CfC>2q7iB-|eot!p ze&!S3 zq{)>RND!1GQH(q{Zrn)`dUWc~D{lX&T_?|u)UP)rU*7zA^y$^FXW!oad-(C?&!=C% zy!i0>w@VDFV7YREl+sHutgwnrw*RVH^DQ{F&?3&Qw}c~ZxB=xlP%^w6geo$=?(&ee zzD`R`G!E%vZNcDDRB^KrA4AQ>7Da5Vw8d(SQN|f%d=W#fsxpx`sO%~+!5?e8?Z*tc zLJ~;cid*qXC(Dx1xV$FJ>pv`s3d(>6%*(Di@Sgipzx*!hNxGdv>Mp1CaJuPDH{*nJ zPC4tO^G-YSO!K?ydJ_wKb*;9+ ze08kX$2dHZVQ53mU!)Had zEK-K!YBjDbw>6X~1)Teq%rm_dm%E45Jl8rgpRSrs_Vn}`Pq4ohJ8ZJY9y@A2{Zwe7 zKmq=b!cTpycvXvg+ss*_r!D%@!@m3=K| z)HC+%RLdQoj4fwZhc)wCF&}N^lqbGZbJq#9O;(jmYy98R6OgR{KWFT zC?O1PPm$g1f?|lORpdI^DIV~8=Mn7eZcXkg*K|a99Cpm9-B3ro`LoN}!S z7GMnu=+>4Dc}PSiQjv>fWFsAE$U;6+l9QxlB`tYLOlDG(o8)9CJ^4vWt|2))Tv|~k zXrLcvv0#pZRuYTo%1h}*i31d!0Z)0p-OO@B>PsX246`acZc&dZDwP$(xISMdb655I zRk7G8BvcBJNVxpp91*C?9!9fRKT_B*7nHARTLXUl97b$Bs)Q=$fg+} zp6{e*J?(i&CcyqOkL#63PnsWJ}&pQRjDxHUpfSdX$EFGG7BHd|>Qg*i;T zB{VmLt5Q!L`&h_ER2u6{|}1 zDpT#bGGP@pD;i(+R>s7Ya~(A-TQ5Voky=i-a<#28fn}mL21{<*jF?`n7g(?ECUi{1 zqyKMTDOgL<@v+qNEN8v@UGRoiyyGQrdCfaLa~>*u%uQuVOZ%HGCKk1cm0)h3*u>bH z&!)3&;Cgq7#>L$gWgX)!&<=ak;*ylOc3m8fl!-Dbl4!IorETC0ST`j3)w!S*>;FRK zu}&Qrv0AOKb^(bLQl3}ED`s(vUHoDgdv{xFRg!4&8`gt)3ZbxE?e`wK*Y|}}twdBP zh4c%XWiB{>bZusVRcqa^JeZkqEoNN@JXcjYQ*?ll8^lJtVd@moVKlzxk5jr>2z^trM06;hr~e$r zj3$_4X^knA=@(onD;Sx_RI(Z;Oh61<7_4Ew@S$}Xx}9~Iy3K;Jpl8e43F2ASv!->e zZGGz#^N^u6`yrTvDKZ|T7D9VAwCbLG>^~n7)`F=mr>zX&7*X23kn^U4>&h_!%him| zrje}9xKf&y8r)y@+!9@yq#D~XZrFRRh*u}y?Cz9jf5dgY?R{^2=R1&uinA#j%51vH zvB$~2n^xy5Xlb?9HAU9xD~+sHfl4vS*}khWS0-({xjS+b=k^pgjoVBwImt>E^@ovl zAWm&6%v?@+bEnPgRReCi*`qd;^CsBUA_v9fOiI7?{d1rPUFa3;cbtz6!2eI{#>YZq zsH>a4YuJue;}PVlywSa(Dsw#RCG8Bxja==J19zhe&Nh={W?@v`7wt69Cd_RH*q4KP zn>A*x0$E9LJ+8TRY<6>c{SMWk2VU@lC%j~p20y)^8t$ak+f^ZT+8sN+Z_!P&>2RKK z4Jo{=7WKH+J74xJ7nFfhe^rdgNM)E|8rqj`u&2GuL=2~#<%qjW#nOItE>CyEM6&&u zTYcIoU0yGj^?Biqe|+SdS82r$sDy@fX#3)Pdx4Jp9&g?x#}7@%#fErj6TJ12cYC)^ zrji30ckPgRQNWSb_Ol5L`$f?#QMDH{=wKf39uf@cb6fnAf6vE8YyXv5NHTvVfYI?mm;x*;^7^1l;@L{-ydAX$dy97M3BRr=hTtWqG z!ctp)R#JR#bnIvlj68^u0Kt@vWJ z){-U<Isw!rfFdOZOh=PENm^S&%Ob}Pe8UMm!3wNJuA0fXbEt$OD@kz}E%P5l@xwn9 zMuA+!XZ)oCQ?xG1xL$ypxwp7Elbj!9xOSqg%xva~#w9B}>OTEl2=9@OnQxJ(69GL8$ zAe_fnE3`&iEFlxXuHwMAt0kGKJa0%dbWSE%gYMFyu@sP+oEgRvwpNlnzY#tyf;yM9I$9d2 zx4W3cF}q-NL8gSksEo{eJV9kNDQ9fK;Zn+>6#qS2^0l6F3vHSU%}@>9P!8=-5B*RO4N(ytQ4%dt6FpHBO;HtHQ5J1c7kyC} zHPPN=g6-^1vaBBUH|RMBP-mC#qBe*(gdb-s~?Q|$MZwIPU{u@8#0)* zHvLq{hU}$`!ZyrNz0N_dh^!+V1U1P_yDiJVs`SLb;?WU9A}7Kwos%7<@ql?!DmtxG zJH1mp&C@y+rO0YYz`Uk8e3IEDvFv)#?>tlkJEcVdu^am;e*{R83q&f7D>5?1N&}9d z+%}d`#Lm33XtYwo2%H*>qJg3=FKy2N)&EI}gv~&eO{YW893{mfoSiw>`JCH){kV&Wuv@YvJi?iRn(l!V_H8f{YhcuQj7~pZOzY3g|OC(&xyq%!8y$+ z%0$wkuy%Vufn_yNL{>TyE6MU#n2lMPomqYbSa+#cq(IbmRknDXM?Hi!dn8qxQaidi zF53FO)f>di>{bAyR0+e@d$f$u9RE8fWm=Eb(k(5t&F8qS6nS;#yYqk;WPb#`1tL@AxdfF1i zu_&WVq+K!=WW=nM)~38x&W$5gFL&$H%Tx;FW z&V1fFG920KS_KkWAM~$svtW2^wS$ef3K_s(CCk=*Ulm?q7PeE`1-yV!*0$TSM$N-w z4M&jqSypSu{VPhxoI6Q`K+cm?7*WVUbV{uw&B!&f&%9FUg-ZPay`Wq$g5+Q`V^2(k zD3Mpme5zZv1tjW8)N7*3u z>11eanfc^2#?90ebYi?(VgYE{M~h-)7T0R6R`>*2johnoJ5ZDDLGa{X#7RxolrJD8 z%>3nJ?u#88O=qJ(<5q5GcYf!8$+Z)1KpwtgMUlImd7WF1$^If##`N9IgGg4YkW;nd z&{7{KZCqlUT5#Q{=5^k3eL*avTq!nY?WJXv8`E*?+#BTRiAu~1hRnf5MsVDl^VR3T znCJgUVR&w7mu}%#hGD6~+y3q7a5k*L1U~ZAU#iQ+9)_49J2i9lNsyy5BW`4I{X9>t zPnl`rNnXLno&QvZu1t-|%+F2L#C6s|rr**5Xi_z~kp@M7=G`AVosm2Wc7AEKUhCL( z|Db@a|51)a5fZXcvWJT^?v9zrrZ(AYZX z^5JfVHUC~tO=xc0Hc&m_+!}D?US^++SY&eSsLos~8|;S6W*^FExg)n{vTP^{+9PqU z+lKIpE^!mb)6|xokq% z4!@%|nQyHT15Tp=FAcvyNUBY8Zhf%3Dy(qZZ$^Dh@#(}=eJI7tFl{2!{qo9il-~%9 zI&=>2n*-; zFwbR0+q?v)>fVNG`mEfKTjZy$WUOUw=JmYccIwb0S!_nRJfCtFr@71y<-Mkwt@>-qy?I6|`* z&kVBNY5rQYLDy`I99Eqc3xch&ZLQh`7sy3+^xtj_&;z~698E=s&mVVY%57NpRutFt zMxVi8L9XY9C0dF^7O{pmw0*~i;?Dmdb6?+8U+4e@SO$VHg#;jk2KWMk{{lCkg7fJ0 zedkv(e`BL)6hPnT(iCQ3lW*$N@qM($@zpUvJuvzbU5bHpAGfVj@$YBG_6Mfmjg{aA z?>PUC#CX4AI2vhA$MX;i^>DuJXnL*Ol^hUm*RUaP!RXS2<5_<&gOB;q0B{Vg@Q$!&Lhr zOw&P=7DI%`hs)ppT68Ej?2jdEXm+sdWk@Hc=90hmSCSn%V(iVziEe5jEC0RSpj zB2d|qrAq)WU&@RLv!+d$G;Pw{x$>bs#vjX<(?(GF(SykdiQ=z7}B9%kt9jBWn18I zfWwLxGfvDnfq}@9CsVF$`7-9rnm2Rq?D;e3(4MDsP>?`DWzwh#HK^C%i?slqx%R@lpqD9k0me8vpxxr0#ccNsENT zXAg@qY0aonpR#94^r_L72zFAviT-|2`|a}=4Z5EFPygZflUB-<$vnSYMoUO2wak?(LT+fJ^09pHFxS<U^+~KYHg;tLnE}yH{ z>nFQT$NTQQ=4K6Oy7k^}?^PK_TC>55PH1Ialpbi}h7r1r`kG&IK3%lYlS!t)dFx%A z$&qWny=9aXkgEZvS@X+egw&RR;tGJQarWH1ANk7H6W6=Imah#wvxFi1;djzUe>X*{ zMV^@DEKL-l9`n2cuKuWtf$|ZT>!OCWLqUycs$1IATqh{pIZ$`1Yh9pr!kpsaPji#H zkcI$O!ci4WUkU8U^PUGfhJosI*5g}oisiTW@&7P#yx5ol%=Zfxbu4`8+ZD+i(7qlr z5o5wajQkc;Ir|Olg=}&j&VVMp?vw{CgPB{2Dn&f)WMx2Aqng&_1hq4!k!u%3;|7lg zLJjWeX|UtZz077IE53zbYxx(JFlWO($}EB4i6NIrhbFsC&u+*Qz_6ew$>KDzl7LG< z0%`=ADUh#xhBG4J0surylJZyaYmCGuX&m2uaW2fO&><71$OCS1b2IeT0KFp^p@puB zk0Rp&d2+`HQgCV=G~+S72EpB_v5v7rrUz@sy9QZNW@t-Pm5x`!)75O7n$s2{JH*Q` zHBW#gp`St|?`tYK$5O)pORX!SRiD9LiYb_!Rn~)I9jYP{5Mq zyMIEguF!#DO`(@2G(A;-S2fA?a5z+>GPbdf&F2$Uc|C9T^=F&2>J`DrMFJvpk@~}B zIc@e(7Ang?Z3A9htn$G@)sa8vlK6q)V zX@%%!$2HN=-is`*p6x=EI!Q2BYo`zLHl)2pt6a(I!2##Cw*=;(Z;flh(_+cK*xYN; z=Id84rnkB1HJ!5_)<_Ch1eKC~(qgwO;t`XWRTS&zVX9d`F*!9vvMgYi{8v~TYE?_L zG>`FGxV+Tnm$tU^??tVa(F#fptt5q)yOinHvKE+_x6NRne*3meWvRg}t#VBHdZr0e zIF=R$k>#LzW6XB3S_(<(V*h+v;x)6m&AsVvI=gkS&6Y0A(yg$k>fAXQ=XArb3~e@r z`(OwejlWtOW=YYtv^xdZK2CWwkPjSb-9dVG3C=PwO-oJTm3CRwwDH}zEV?iA&vWY? zVD+xJCcOzqhi-l~tYZzD$nGt%ia{MM8%9G>o!6!?ChS5R8DE{|51?qXFTT{qFF1uX zu1wAyGW%=futM3k$@Fif1-#Lc8k#_V92*Idy=f~e`V*^s#o-NTm+VRw@{#(OTOpSwt=>Ov{R z`~Er5ADc?Ob$Pl9-&Uwly}vyFde5VEC@vq~$GtvOff1d03DIUzCvVNpLp zc|DF5{nOUF?d{`WI-A%0YRg+bb4>-tmV@M1vh$i@rU!PMh0QtgD&%1l_cZ8+KfGh% zJappBd8P-~XX#117TQ7v zyX#Rupx#LoqS%yZ+xNvq&ogT+VLMhqD-ZcYvUq4!uir&%txm)%G&> z;s3-r%}XaVI{#l5-c>C#el`7VnyMRY^`-dQ3?x_Cwvp?*Lz+%j$Ntruo#b$IcDe{A z^Q^yVxO+rxg5=&y-Pn|QmH07A&2fsrshWlz*RVknPYH+fO&|sK5K2t+hM2~7j7aaE{Wp#TX8rZ2c8<2d6};@ zof^VW_1syYsTAB)$fr@90IJ`}>0u7CUmrFZ#~BL!-Buo2n*CvvqXmTv4q*VAALis< z?b(bH2B7WTo)<}?U_qUn<Yo%R~g4H*O?Hw#XVp()CngbSdOrlo~45(zXDeE4iZNq2Mgu4}rm! zTK~b;Ksr+~O&iBG+duB44k{T4xnSPWS29);+{vTp^b*+2VIp428%iX?ZB={$)ZIa# zz1hGvb|hA2<25561ru%YqSB}f8_8t` z;bL3WpvVo=>eY@2`H?~X&bK(&`0Wc_#NE0@+|0BhOTw2^dd?KCqeUuLI2M2ntbxyI zrDk$u0<1w-epju5WC0)@R$(4V0+wbSU5i;Hrntq#l_YYNo1AT49r|F^h+OHp6;1|- zN8zS0<|ZALTp$i3pWNPkt=t^GWgv~wBUv3pc9Z#y5rvFI_Jvb=-4f5Rrj|g7aQ`$w zcVb{=hNpOrCwZ2qd7dYFrl)$Y=k-j%9AsdeF_Ki)qiYtXmYw1P>KaZN7CTm4-o2q) z{>%gRU!>h2Rbb6-KAA}QW7zdz>=B|}2IHkkNMNp{jx88svR(baVtpoL_(kW;nIWm= zC+KXTVb)s)f+u^fD2ukJi@qp~#;A;n=X+KrE4ImiO3IF{P$VJ}N;VWb&SwgNUYC)f z^tB~^SsXupR1PX=A6}ftA(=?kU>o^ZMH$LpKBOVKByj1K%CS9HD0kcOp>Az zls>9W!WBRg*#u?kwXI+3J(GeS1v2U%Aq7wJ6eZqKs3MjsVV)};Hdwea)ng88yp3YI zF$xyqs=eMTzUHgGmS?NMCzO;)Y|bNt38syu=FVWJBdO#{LYyU{rp{0&Qo^MLQCm#P z$qn|SZN=qB@npu*&NR6rLh_MOs$hehklqbxV=iI0ES)4~i!C`T0{=lwrugf=)~wCm zEY9XECcY5cne0%`rrhLb31(jPDO9LNW5S9e!J%QmHtMvZ3#L|()0p0r2IABnnElNk zr2^r{E~kg04$INw?*OK0DQkxwn>VGFqipE*z3Yl`V6(o>;z?4!hNjNmE#Bs>-o`1w za?APsAK+qI7I7c(!EMq8D8Mpc_o1P|&70GfUDXz-Ev}WM<|HpxT9Q$&Equ54L?WqZZ# zE;Vey8eFsPkK|>Qd4%27j?2Yy8IO`l>HvLzDc@DR6P3L zl_4R*xvk9=u6BxL@`Wdy)-L?Uulze@W?1{vx$TE#!jKZ?RNzitCrM6oo=!bAAijqAuN; zDf-skaT8B5d*UwRecF2oYnK&zHRpbTf8A|RC(Fb3LNI81QVieE?JiDuOsr<+f7ve{vI%KaVZ)Q`u~E{Of|6P9kOB2Z4A$^BR?`E z=j~#`R|>5q?Tsw6%FwQzqZE#@2Sy_l>RBrxDO0Ut(~jQORPbEBUbl`N9R;Mv3a2bv z@bz-4+@Y{x@-E8xpAf9p#7WvQa`D zt1hnbS>CdWB8)*xsO`lV7sl(daW4wfoGjCjNv;HIZC+L_Uv4mhNf}AHV^R)g=(Q_S zPT2I2S0RHjBBy1}@ETP z)If`-3^TD%LopQ-^-w3YQ71K0FLhBf^-(u9R6n&;D|J)@F~5EoitzFPa;R6~6+Kec zFi+zxrRi3gS&)LWV9}ew_-$=gDfVhG)mrc#W?W7Zr?tVdT~=>PbJnsMaCRb#2sA3vB99lCS`~R8{Ide_svc%ZQphc~=#&PZ(>tkxyHKGJ_ zYlaQ)#x&qEqmeSK*^(vGN+XgMt!cWePa_0!_qTt?ZdJ2dsl*|ml9nMJ<_8z}HJfDs zo2anSoX{@diN4_DUTZCSEG!SAYs=n%MJrv$%YUdVhgqlxBjgFIw|g;ngxNH8^7cW! z?0%~Cbce(;*LYA*wNq0yjt4l8@3@caIFRSKkoS0y6Zw$4uT^7YLx*fGsW^M%@*`>X zQ+AFhvo2YmrDhK{5t47E)L|-o!p685L)Cx(IiMdmod15Q3J;BxB@} zx~}i~oc7ZR0bf2lG_JAg(Ph<)!<(bCFdE;KFOl0MR~(1eq@}X6wOXw7I@{&ib>(Wi zf9-YeA)`xaD6rmgqK|TWWw99jl~@agb*67-;-si>I#s_>mVm%^Nw+-@MM-JkQs>&*!{SC)Lag zH&CZ+3#T8)&vzN0A_=PICL{Kd%D0MlXmg8hN>y*ShB->-BiT*rU1Pn*Z@agGE|fpy zB@ZTMr@HQW7Ekxyn~$2Xs=Qdc?v*F7(WT{2BlNxRJ>T~_XzFhhPN$ZWc3_M0$~*mx zpS#@`AH(`I)!X*|e)QML@z(DL=2kq!Py8OvQO4CV<=;mhrQk0cQqjkF6`SWaWC_=f3XKZ*f3lV3V<`>XejkHiHjp9qj-xSQQ|2F}IfB^ys78F1L;Xwil5jJ#~aG}A15gP)qXb}NM zjQ}!Uyx8$$NRb{nlI#ew9HkBnGX;4Y)BAdM4&()I#f7R zVp63`nGzf*aKON)O{q>?Sk!3Js8FMJ_1cx|SFvNsZZ#_v?OB0Powi;3_Gw(I1?bkb zd-rYtynFfD)l2tpfxv_75(Zot@nOY+6Ej|H*l}dYlN(chTp9Ca&5|>7-fY=(XwaiO zlm1*9^=Z|jQ~yWq`+6~6$gcwzJ=%0?RfAx+vh6)pZrZZL!}>;RoU3o;aNRa1TqsdH!bBtMh+Kq*xuIZvFd@@2C2c zx}LNejzHlGJkYDBJW<2I zCd>;j+nDN&zvRM7usP`vyzw}-bj-2AwSIH%IiIf53PK_A3ouCR#CwT6_S!S=NhaTu z2|W19Q_spMt*jCxp1d4#$cczz2*CXO6Y$J}g3B$(GR^aD$Eyk%h5*%`wOnpI(g)cN95GH6VnITG-y5n zp^I}=`i?|$I)t_yZ%U5dbCTBeUP3@6C!y4iyz*kbDc39GE0ZWlmkJ8mQ`=k?u2HSx z=~(*6G*hAkHNAFDv)J;HTTA0C@;X;-U@ zv5Y%Q-%$C*mQznV#gn;hfs3|OXm{K8*;V2E&(-y+1eVvBaJ5+0^SaYGJ6&sP624$7 zzIE7St20$h>w;nyP5%}=HYsIEbr`z10KU0jZNXB`#%^o$FCqZ^#4uiS;XQga(^yLy z>HnpjRvPN2qh^}wr=`BS>Zz^X%;<6@^cpWO0BG4|w=mstEKm0}@J2cXe!J4-^yHJ& zqmZqZ;f5Uoz*UuHwvT{U#p4d-C3p2z%kNy8`0y-y^>|mtFY-ITzlHRPY?j5m9N#=! z4N&GUT~rq5($n7A#Hg-DAW!K#G=V(?~)vRXUUH057pSE+}g&&^ynQuQi z+~ZZQYSp@_auC%`?eum}wgG+{&+J*J{_~Sh{j}JcQ+)lA z8xL97H@%P9&4eRu6S~?H%KT;a8B=|1cccOR%XB!B8>pPpv(){}Spvjdnk-j53;#Ng zdABj1?k>oi=tS^>5{%vcLRi9leG7#AQ{Ml`ce~l)u1#l43-%1ev$&a#f!P~a19_;e z44RCCaoeEy#s@Ku!7nEtgCCZtgfaH12XcY~+549CE0UB6KS&W^@Ls4tyOFL)_j{cf z2Sld?-ppXwD_9CMw>c9&P-m24qkg_J!ZOAzOs?bN?ymPd=&6uQXu8h?tKvYPSubt8 z`(viArM8~oQGdQ8RvTvqyf#*_gx<0gBIDRB1`Vu{rvs&e)VQ!Q+K+5B8lnMl^SO{D zQGJi2AK~JczAHu1aJXb5lN^^G7qSq4&co!H1_>#dISYs@YgHhNBaG09Y(KLxP$E922vxu2mr2+r8vu8Ci zmgboiMrcW~UV#*fyacID(xbRqRq;H{G#MqYIXp0VF?gx6A20#;MR;};nhD(3LP-fO zZ<=s{kNhO-z{Ssd=C5Tig6bBvc&3KlQ-8jfdn}r`TD@9L~*<)XNPU z_xZ)UiH@dqGm}@X+Eo5{w0btv>Q(ERMturZhZ7B0>l}8#?!Bpy*8eP46PMW1!mSiz zIf11u9Vb7Osx&3S(k$Pa=S8GqlcRX+so%O<%&IansCAl=4dH08wc0Uu9rWCfq-r)( zmQAUnt=2dPsz~81XQ8bfY&-V|yhs(amDLNYLR)KAYo#@xX|(INfSa-v2J|{2j3M0; z``nzZ_BS+w5%mUOa@9U0>ss}U;BuU3%D z@8pa*t+5w-kHOD}Qrhg-mk zJPe|>ZMAdx1vp?O5zJ`rn3iaQ#4;~&zh_=H$!cj4`DnV+T^%4zul&8yBJXu{ei5Jh zJUw3f(1A)#VK&uC))R*s(`^MBPg}f9Z!fx)#de!|^ZzDqB14#&n-=7D_vBg|ulUq@ zZTFIG`y=Az#+Z_vWF{q5u-&50&kZ8$Yqg1DD2GzYa9l465k|xy-YLVA7IwtY^D$=U zYQU1+rLxVd{41oJq+V4M(@;4ovk%le%X=WoPIS|AK{)I(#T7@J0i0pXT93_Obhvv z5?7{Z^%mq|_q@AE&zAN~-6Op+^{#_2_^nBQcK>3|`L?y~?QTJQ=!3Css1>z1oBRzi z%+p#2VXzC*Obqc-h&ZCJyk^MjE+}|3ExS5y1>Me( zf~(+44g7kKyspli=nY)%!?WgUcD(QCib}ZD@4^}`R9=nbN{6D_t=5bR12^jAIB=_W z4LRrw0F{XUNa{(Dt>y%5=BAD2T+WIJNdNh^3bb%)>=ck8h{^QM(4an!0_jhCnq|Fy z&xZ`_QsfB3Kqv?2&7H^zjQlRrf~}vh>q$uwsmH^WdXCNHMwOs z@X~6m@W9UeqGe1rD5|#Sr~>PgoUr-!Q2rP_1&C;#_QD9S*E{tOP*mN2&NYTxvw4>ghctRnKD4Sine zzQ%08j?uCTC+9Rz+04*{8ZZz)5kMr7PXJEr?6HAlEgL0_fjr4)*eU9gOda*HsBDjR znz8gc>K{35Qznq%7IC~bED4A1_?Af$V=M^!@FzDB)D%q@FUlVe%2ck6>@x6oP*0oE zPAxC2x&CVHlq7b#0zdV3ElLge?Ex4Wbmn8uMQXM@t}m34s){lufI+* zicZpfkZ}w-4<|ve4MAt@kdNx_h%ONj8->pfchcN+3=@Y>5ml@Xnad#uZ4yr@bZ}27 z6YmO_F8JQE6=mf1%8myy>i-3u(a)SLA-59Owo$Ak(5}u>6qWL;PAlcWt0If7{rGGZ zRkQt)q^54_&<&_DI^Uu3~lLGTrz|@ z>-Zv(rt(mc2+=7)lRzBlImyvq)^hEhQu;W~7EcSY9BtTIPt?py<7$Z1@beXs(z@nx z%O(>M(W=Iv%adfYD@_UC&TgEFNm^bk13yaKx(*%?Ea`82{=l=tb61(UT!dx>a*C>G21o*;h(v}KF|IGzUwE8eKdfqYNNKS}u zw6AItHaGJ{<*M!?DWJM6gwTc-2Mrb?MbaIH=W5lWs*J-^fFN`L{F4YL@xcZ(LbM$ZeH)k zI?yMJ?>3`URbr?W9h6a*uA&;!rf#uLNl;l&a1}SPL!Zw1DlJfj=|00r5Q*iOGHh1! z6d(Jvn*i-gPY6if%F#YC_Hu14)l~&u(O64SA=%RXwldYS^`j()J(;c9v@l8iZ~xlU z@!k_XnURa`RsYTqFu_J=HOCE0lk2HK)S_mxP&-YPtmu2q8-XeE1@iZqPbaB^pxwf>z{#0M( zPminT~)L|D)W4qK#8IroJt{#@8UG)J z74EbWmU;Gmg=>UZO`YRUr?4$El~R*BdTp9kBFC}m_Daj%j3#NBEKRgzLH915bChs* zk$x|oIM-8O_Q!(v<^1oZhLj7}CvDw!88J(oV@js9>#$gu`{~1QmNs#BqM9m?Vt4eE zOpUjAkiK=9F?E^>bd=rL&@ysTkI9PjXN67F_ImXMqltIXl{7mvbNe&5A{nO}>yP)Z zY)$HfW2OI23RcjJv)$Gs2#7?>`eDKCjo#}i#~L7kFhiyK&+=D8LG^Fl@c*5LiK~^l z`}pwaR=GJ@8=lQj=&H1zEsc`l^mKoWs<)Rx4_Kp@2N$o|ft9ak2dgW+_K2bOn=aO$ z+{&OC4dN&V`HD;@LC!&Avoz7WsnEA`gVQ@pw1UDraHfc0!7#JQ&}_Mx+7{DEOZAWi zGOtgs!Acf>+tlM~+YMbAfY=br$hrr#f-Mrf2+R0rvXe`h zowJo-fa8ockjD5Ct{?f7Zey;2Hp|w~8dsX70lLIhlyJxBUAZh(F0<8Q%&XgY)nwNw z8GK`Hct59jbp?0fs#*80uAp_bgHy_24|7S0_nVber9yjfK%2@9u>ZgiJ0KPL;i`_6 z%hk%>Fsfi%vj3BQb(n!kwtqtW1yxzC(Th!=mA8?MumpU__V*0C+D%;=vZd<8{ql0h zSccsXzDN}QyzZ_!)448{inUb2AGVnFuo~a>@WNEsAP}k>`GRriAoI~ji4aIk+yfcc z93zp5!zar{>Q%uR{{j}5ex;DHqzoTS$cD|mQ1oN7JKWq1J7N2yov_2&%5@1<++tOj z-TNKW3BeV8m_Ix>0m@rnowA?rqW-$jSXaZ7*4+rwlnYh0OYEd;))KR}Xf1dW_xF~W zkCgeDk-z6?4I7JG`=;O6QY(FW9D8*)E~Y;^IiFWeA?c5~-2bG6@l})5vW0iySv5Ts z7SGyH$B_hn^|oR?oNj5D%`w>0-MY_xO&SvwP*u^^jy-~0ag+C`t_9nXS6)`D+oL6v zt5E#GuU2#Y4Za=N-VZUIuhCv_l&D_$bm{hYNa!NRoPQ6{uGuO3Y%;zFJ%X9m)N4Li z`E!=(;P0YACFZEBs&y>(C=(f8;%Sa1?7 zI0V-K!JXjl?rwv-2X}V{cNyH>-GjTk2LgmZ$n50%`_-%3+P7P;>b*a9rmDN|J*T^; zZhcOlGkxXY8gw+Ig>1GP3aKN2Yd;Y!BP({5FQ*Ikj*YR6qg`#?$^!>bqHo#KMT7*} zzCl9r^HNhvw{i{06*cTeen<~pos55Q_VCFO^dgYr26=xkB7!vKCN=*Qy}I2;B04oyE2vuHGin9>Kw+PP>v ziAqkk+8VQTGKER3%#EP2NIsFoW>#K@omMUzp5(WB6x$!aJ8MzrV8E82Z>*rZZ=x1`3E5! z$UOCX15_%rap%b=`XHW1Hk`>X%tzxyf_V>e&POw8I3g65)6RD%ofMREz0de2o3YN1 zhIYhvuKT%M5(z64*e#<=D0+RG(*$l)dqbXvWtXj1WaeO#|k zI!NINA9auokC%hdMV~(f8y1cc1^&T({GjKvAE6Zi`NExJ18!I*QF&_!*YRcUJu~zh z_HPBbjk~*<8k8TmC4VdBq{)vRSw=Gb)?7)KYW}q&y~y?_GBn@X94~T?1A!={x!B@q znOirCV}fc8F|Ay-m^Q$romaIzqXR7#q@0>>0`};8-V&A7-WZRKSejD9*XGGuSfFxhX>qyZnBY^<=Rc#%fm+Q{`X zWz13kon~F`Q}C^e)Yvt*cQTHdYA$ka+@fl~1g4)Q-T>o>;=lYHG4aWp;l0rF9}%Qg zktmlvnhm6g{oG+|`DWeozKft~hbbHVew@atvq9U$0#~DqCS|%ZBv12#7f=ee#Z zs-db<=-eO=CvUy+>J6UzYt|J;8{6JimiyOb|Cn^;scY9Fn{3L`6m-<=)c4M)p|h9& z$NijC_STkAuYG>wL)_*=ICskL{gvs%yvro8Y_&)A&dKuQ%83v}*K_Cm7`e^+J0_~x z+!4`^MQiUx2klStTf+vq>||z1@_1?q)znQCSdORuI*uPMtO%kjyY zt?j$1w?$0MC<-^DC5@M{Zbn^7s%#>mt1TyQESG!y*mytRkN5Rb&eg*yzeq=Yz(ErhV%u^XdbE@P7xsrUeCvS(`x}>RunaSuI`4COl=H0J6%aK~-3%UoPKNsw~V4TMRqD>Ci!o`0{pT*4Hfy zt1Q}9YrZ5ellzVDn!qm)+jg=Mj7#E&Vw6;13>90S1-tmC!RqaEyDC*PFMR67q|tDb zxDXAl*C+B+W(7YUf0Z9d5%u{qm0Al&7BS&cozIxf36OjET%k*ufw|8g@+qruD1?`J zCpp=)9bcC3*SOVc@2W~}ZGq>Xc*Ptgn{z_=Pw87cTDquP1%{Cset7(@vHs$bE{S!j zF@?vKydj}2+^}lCT*<>qW9utLRr3^&teO(eCVAzZtUS>?Yn+TFvo=ixR(}~^lT~f< zlgpeBZWeW2I4x7TAg$*DiMFmg3z)gblQBN5NT>qUAl2pWpT~GxWVzL06bxNaFWPQO z=-lDe@n+g5_~%hP>O&>2fxg2F+iVFrTRyw0Jx9z57m0=Ls!7f13_Y9lRSh*97gO-M ztCu96xw6N4Pj2U}C;r&oZa5aH@lxXU3$|`7%Md0qqUFv&|JEc`+@bhmR2-?~5MgvLwFN&?^$#1|13Ecjst*pxm$9^1thp$#-GJ%K!p>vz2@1cYVYMx^IIL@FWT(UmzuF6&XXl)@`7u=Sj z&y|T|V5@7gq6}_hS}>>&&qppNoQh)qWCT%*ne5;DFoPqRH=J2*oOyjRtSxZ825V(4 zLHU&VBRPpZ&40Iz{Cv~ur*YgbTwTmI@aR$Pl_lz^4I3qTdmhe>e*uyaqt@%}L>L3V zx4`CMYvk zUUIk50S{@bbPXTIXZw6#x04(Foz8noLQN@1fZpYHE^AIRSnN8)L-ABTG@R$6bm3ax4?6uM;bCrFs!8JMwT&BaAt`b1YMM)}$y{M= z4fkz|#{cb?JUCUGm7B{U!YE8a-UdEI?ucA-O||?~K#wc<-je7t$Pcqg2$<&ukCgvyV_+=Tksj)hzMlu8_~)qiot zSntG1k}Y&G{0mMS@M8uqt(o)jsxzUdb3?dSz@wv$m-?-`y4t8)!I_};GxwXBzu|M3 zC6B++y*Ln-%m7~D(A*fQJ&^r4q;Wi^Y1~E+CrC{^NVY`405R@!yERpjLwTF31Dw_P zbAY?0$>OtK9JT$-pg$F4*cKDdP>+XN!zK8DBeshIKL<(uY}DdpI3X<9)psQ>6XuI8 z4qczQ=FWb3YG$7F{^UXuy-T z&V`p&<8w$>34>^)(fNZ_^SGW&GV=#1J!^G~87&=B>G+FC4Y(BwJT9WIcy5fVtn^5x zOEh6PG(jFBiosmr=hC{W+-cEaA)k;UWhw1r%N$*fsO-dIE!8w}X|-gZ5@j=`eaF5b zKbW~bYIRG+%+WEnA$=7XRY_S*!5r6^rAnr(^a02iE05V3on$EK7~`$W{Wx{su~hBD zPnNKW>&XmwIMpYDJf-~@RkKF4(j1Daq6#-WG95xN<8BG4^ax8okDPk&6OhplL#F29 zl+q823W!owo$xuuin}Rxa{m1&x<}gg|;eEfHHLX-%3dgCM~w6%;?g zPtpOJKM^Ok$o_36CZrR4Y%TvoGUexq$SW-CUZ&3^5|9JeI90>33*@I_<`^jhGWK%H zLJTHqu?fNsEas6ZEmk2|_g`F3?J1Ask5r*S0@2#&ewm1f5zEv;&J^hgxf2zWYSb7* z3LRfaowG=HK>oO_!B(a%jk}s2d8DL1khyPDIB*p5M^(-NNw)fT%51X7W~KdLrV~G3 zT7yj_yR}s*WHCABobwJ}d<#w?7dd^qED-C%gDpB<4ra-w$}?C&0)@-5f|enJ;EBTOhfXAC6b zPn%RK?d5p{1O~)XzSkyc!BuY0F&K~Doshe6}eVdE+ zs;EX={A(J?U9*|ns#(H#9`CT9eMt$IyDvv(@(@q)a~oOthBBN);$kbF#7hOOmwPa> z@x4{$AYD9g$p^w^#&G0q#~_8Gn@GGCh4~`WYej)yPXCdr2rHQPJ;>a4T~nIpBl&~5 zDFb*Eq7{%Dk#Js|%c@an=UIsg%sNpkb$K$hc*)Nwu~cD*X2bIrWz(HPs+w%d>T)&P zaTkiWmbW{|b$W3N&eT~%^!dsVsEeEDS?TAs#^ISEfQDK(#4WxdQ#q#-rFCqvsTrP& zU!R&8r7Kg|jgr=Qp2B;kMlMaemG;R>#}-+pXmLdIp*cNwD05ae?=39mHw{PfnEBVnwjPgN(av6PPT88Gi7b*RR@@kB-C8gkjsm6CEbJx?m5LU4I*w5ifkzKVFT z?ndKR0?Rp1;lE&h-xSe~pqQ;pTa9Dt;fFv6b5qo=vH?2(t z+gykEQvG})caRO`Hcd`p^(att$+_brXi_wyW3^=L`e*~XspB*y4Y>&u98#+zxmp=$fqmA5-(bi&Iez^25Rb?S94+d^#Rpvy`Q zx|NYw>-+|Jf9%qDM-(X2;if#QNQc(WiBn?(PJY1$rA5{W!S!T=I3~az6Bh~G5Imqd zcRA-Ydq-o9_(`JtUHMUG=$3n52#`(ArbG>2lgO{pZa(>qEQ#q}$@A`p%HBh-xYV#VF&X}ONM~=}=(q;8 z6NEc!f@d08%Jf@wMGk*OIWeCjC`UTIg6MY}5J_}^DQ<*gqMI=Ej1rnd+JAAf2v@Rc z&^N}ewSxJlt6BJbp=M*qM^o@c{AVTwm+l#cG;GsAIPJiIMt*Fu4*(U`sx0}r+kpiY zXx8iRFm{QJqbNgUF(9OO0q>)Mb)7>Fc;&4O?Ued8Z755BTl858nz$o1wk}nY?CP+% z1RLSo`WGhPvAl|Nl&owFsIxjg{Kj>Ya1b=7V+L+wx}rl@n$xw>mwpbpPwfljbJwi=(kr@BC=@!)7}1!B6$V<7a0Z^ThA zCXr@jep=0Rf*Gc~PDZz#F{XeFWI9sL-*!y-AuJy2ap;<9b%4$!A#G`0Z_c7)?ntY7 z2c@|l-*$3cQ!XlKkTDmiKe}qxsIAs|`lY8}{QH7zP1nJ=xT|u#XLA@y<>cG!S1WPV z$p(tB)@%j!h+}0HjR8)R1@pko4>fkqqgy7~tWHjdu`26bV=3}A0rb-iRH@)UpIO-v z8@veJTWboaBbNqftHf8?NKos&rrLi@&#E?0VKZz5fjAkqu`dxPQR(}hr|5&Z9zV+`z06Y(1mkGClLdr$C8IY$~>WekOz= zYAibH%=VoeT8o{zfScCXNY-_xSDI^1&B3Gg%zop}+eC4WcPiE;s2A>-oc#Doa-oz+ z&82ZQSbjb(c6M5is|PEsnW2i3IL!ey z2WK+R^z@bKz)43i&eWbDYD>C98*zmPSa!zvR2*pO@DTzwWbRlk&brKb*-`OwWMw%2 zSbQC%5wXk*U?Ks$DlXEBASwgU***Z2KfGfNJz^`o{UaprR(}iQgvk8~?wv8FhttBx zFYxgBKi~u8#P$GJf|zbji%c+xgi3ejfID4o8V@w1o66cnoV|>TgnE=^LBBzci{7f|4)l&;>-F@y=MKn~R!5AR zO)cnp{U9v&`mM+mZF}1U4d~WxB!q|!x^1W z!6E<6*zB1zq3XmbUG3IqPXi#)g>1{@78m7>sG(^qe@`r5LK^ik;EQp85sJz?qyp?u z(Eu1&0#Y1fM8uEbVtnm(Iy%DmG(B7YbPm6Nt+*_7)%8+^Y-S6{I1a-?q6Rs$J4%|3W~o{iMVJ>SlYBl# zh^4rm`|(<{-J_=BzKf88zT*vo(B)LIN}Tr^mC!a<#f|3WQv?8(^KWRt4V{hZQ}z*LS_{ zz}8zi92NA`4sew)q}CTGK0G zAfR}{c_tWMQ%Cli_Ce?N#_0>xzUpp@tB&y< z{_4ijoTg|&av1%@FEm;&m@LQ1MYZgI^F$S!u3LZJjE{EuF|s!p4_1$of7Ww^CjDHv z6DR}Per{Wr-?X3Qxjp*K&9gtOpvdD7SHt(P)U7)8MGS}KJCk=ei!$R+tmetf){qSGGm~|t)HcTSOF5ov^p|1+%+h29V#MXk zYV|@!obgYm7qhICeex|eUPDceG7x$aB6q&o@hNwMv%mKjQcU?w%c@~f(;U0)q^|MM z$*o~?GyU(l95v~J#AaGnPI79Lwmwv-wFv!wU_Taw;Hazg-SaUo{bv2^R^REv;radN zLx{#$B;Gs1F0TRpMnM-55@uOw|1-;kpA4slWq>36lBG1HhFJwfHmXruMaW@Sj!eGz zfx7-Pe^hMTUU0o#VtC*nN(pPp7bZ04NsrC<=(-K7C{xj2N}Lf!I|Lp8xl2NH$i3|| zIG^G68OLx#32`z7L+lT)8I`%?lZZl6Fm3ZaRa=G@@&^P-dq+geJg3P zuFswcw_6HxJDzo)TX(e-f15)9U=MGFN(qa5C+*9j7LQ@h_*9QIg)yP7@PR5%8(mJr z9gT=v3pwfO)8g6ASk$WZvDqzj;XPJlEf;8;r$tiWUV3s7M&Iwsg*-{7b$vO~aZ1^g zJsTC~(?)W@@!6|mT}aGBf~O-#))IT?nSW}c;Jqr79JgUnwSxZHBt2!V@anPSIk!?x zu2VJsskCzD&uEBDitdwqThDSK@EesK;aia!weotclp~7am>;5m;O8WB*%ItKq1LYb z26>-zF@4mQv)=EOQqD0`N#0M`lBF|p5$h>v@B1D^*9oLTbsq>JUM0-Hc@{xd0j-ae zV*^BY@|JreM0EU@Z$7&3ff#(Ruq3IM?k`W@3dqaf&C{+7O7jJ2TwBy_ZJ^GDGUB#g3o>lv z8(c*sx1!tFu_T+zrz9acz2H93sfC`7lPiA=HlA{+KSc>r<3nEazyIr{FHY@j5z zu_s!|#bkMVHu@#Rz2eG@W7T_#5F=KBTOKcIO-AyWe988qI+ZXW8eF^o5F_!ZBEO8t zzI#M({wbtL>rlNh4P7ZmgIHnio^CNP92l8&U&PsT!ork}0k%p74uP|j3WeNdk{JuD ztdYJ{j{F2JXP;{%xVHD+INO?UE{SqeCu7u@2g0q9C3C&BPO_N?lGp&G@nMnD?3S?P z&MR=IQzl*p3UPmaP5gTH6~nMFRf4(k13gP{I{J-#LErK^^IXJY)*!XJKK7dMT?cz$ z1E)CmkdE@a4Bx~ZR^AuJGH?NdMy`ue!xS~S2KUKWwWWqYdrHwwe}_V2UQ4#@Lz%XX z*>?@B<{AK`NU0`yQAmT-T_cX2f$_Fej88MenhBmIrNFz&C(0&l+~NoR{GIUVt?Uo0OG)!HwC7Lan7abt#XLyREIXEf#C@mqbJrTn zzw|30VpxMoI_1*j8U!)`x3>ixg5S)HH<7iTpYarsh)}*K!o(}YY_tnfryvi}0+xSOYWtLU+;bH*1vQkKPB(aL68f;CRP>8{-~y~gi`|uOs0}|7Ts~+8oSvNo zw_RstkI^G87LW8@3&6S5)%eHH9YAG(h_S*FxtaXb%VH(W|egm;@R;@m9_~p6v`DV%m~Vs(R>avpJfG^b5jsF1V4;F|9d$ z`LUsTLw{R)s8PXkI?^RG!12wyGAic`$KXWvQvdOo1P!-37ua0ht9qh}05X>4*f!cW2;k!@`DP$Cy z`BZ~rjj~|c**e7><foXZV6Q|3JmS+pjAWd z4{ZWfftxedg>N>yx!J$UMm0qyQPyMkEqk-3yKEgk*ISAp6$IlvMUGz5NOJYcMs@9tSqOJj4(m^ERL79Xja z>hPHox*n=ksjAG~s4XIp(AO{QQ5`|HE9Ej%G{pn)m4JCDs^{ld zn$9$3Ya3%7|F}WVtB&sw+N4lIHjY`=34Y%SH^{Ig@ON;Kg}6$fu!#9#@HY{yq_5z2 zb{=hE&gSm%rn*1uwGK<9-jzel6N4CkMx|`Fo=C@)tu6Aax!RB>TFTwsyI*mkGM@UgEv}rL5SSD z%gS09L0C6=S$2h3U*_6|q0nmPv7u62CXzl_nIUtbrX}I!Cf+LY9I~8&mt^ispONOS zwqcIp(@#ukW`jjI6T3&BzBk9WT;jc`%KRWt=sOe@)?@ia#F6ktAhjXxd9XLRn9skv z34^ca(rh|6TcY2uOj}LiNnW1&_S4Bzja6X5 zga^sWDaHy^a#gYF=TusPYVPqPdBNi8^qh9HEzuX((dJ3jrr6SUzqC7jxuhZCEW(9? zqw%5`<-&;(GM{>%65_im!Q_V_LPCm`CYo`$IkgmAo}-xns(CD+qV^(_Vu;EYc4^<3 zX)Ou`{sV5=P`I&SWV@u0QOM(5E-&R+l6+9`_(`j`&1#&=D9b+UahS?_SF3>2{-dzb z;AM1~iLjw-#!GjFUA^zGFP}&?Zv4=2Ko3V<@iN|3H~dnLi+&lxkrbo4wg`3G$g8|q z7rF`O%HJ)eJ(xw)t?87bq43bgQ)hlH2JMXEDMAZvofb`mYBlU!Efjm!J5xE_EoG-i z#Sghz`I{2Wp=GZ2vYEalDQ{y>LDJlUf@Otjg<&&=g~}zR^!Xc&r~0zRM2gk2!qT`c zrCI%q65uEfZ05;+&mI-3>!pksUY31<%H<(sl4Xc-$pVMV67YUqQM~Tgq$uExaWWPeQs7>@iI;FqZ4Ipt!iZz&_baN@Gj)l@Y0yaa3gXDp!IE%Y zwM5My#-&hcLiuJBx2KZPt?4ktsh5YYIEnGfsg1EkVQ!&HuVOc z?T9oTq-F_@g^_QnZFls;QQMn;c!bfe42TE$q%qf@4%j1pswRxk7`GHH>Pvw-={@u( z`fzZk-F3bt>tEN;&bba~$8nlb2;WnTt7}ZnJFBHgOzS1HJBLF{F~`LXIRZJ^x^!-7N$8PQJVmx=`l7>Kv!vX*=j3E?beiQP!-zZ~9iY{XuN~O6-!TNu*lwW*-Y%VFn`@?am|3&D=a8FO`u38 z_@ogDx6b0%&Jrh+hZAC&V0&2p!t4Xn8l|pmGHmHdcCCVaYIhiV>x{452;_RIhfXURIUee zusiX74Ug@=b{EL4cA!r1`YUvysuVQ|33xR35N!%7nqr1gA~NpyStzX$vpS`((o*#* zhnu)ej`@_1h~p~x&YJxFllhFIlNo#Dx}pD*M2}FYjTE?D{P8r1%OsEp+SZoe2X_CE zR2V`?lRmt(${zx!J%1`BG;7il!38cvSFhKsK&g;8DF%aE#`gfqdFFMmY0) z_jv8`_fW+}2hGjbQcaBRF)Yi2q?L2=Ji9HD^YYI#ke{H$_)-0wgP!BH$<&nTEt&zr z6+HKFD)LR+8?A1MO0wm1yi$%-QQBo9_=jHoV_#+0%_(PJoYG^M9I{hi~k2(V)wP z3hw^tnShZ#Al>8cSx$pDhur?Q!=9W+CqBAB8-O34u%fZ%u^d3?x~SBxvT2mNx6s5V z(LL!9jNG@q7rIlh?bjI*A&hgt80x}b=~yXo!dB9|M(B>e))V$Edi@q>{zvII;kp#{ zAjY!&UkticCUw~NQ(D>A#BKUGbxR9BwWidD3Wj;U=uS~eY(KtpuF>B&Q#>V>9nnXLRLyOB|&r|WGy5&xxelFch z`S~MQ^U{#isasqthU*7S8J6$gWuLz^e-zyxRRz9E{N!iWz?i$2`!)Sz{rlvri+sYS zjPS8)6A!!PgVCHp{d7A7sl<-ui5!V@RoC-!y2_N0YDpF(>;1`Ev* zb_Ubu2qA>q*^gE~>fEmaPRMXRcb-30x-#DuJpDvT*T-Jv2o+M|+rI0fS$)!xtS}r^ z-~v%uwJ+u68ErV`hRIje&hvfNGBmdno_!?!b#XMab?C5caIA0rm>O!|w$ku}PV$6P zk=a%CI$GfJj5C$g$|3DEzA1M3dzgchxuU-o@5acAJN%=t;Yi4fW&AW>3zsVEuVmgl zesRO`%F=Q^@zX5#;m5F2$c$%NEvOL|^y)C`)%zkEqh!1FBRQuk@Mg+~!aFc`Dl*_# z7VfmL(hz@q)yGjINWc0lIo=?l!zDMFaL+fP@dj70Q1w=Gok#E1Qj%C0^{SWSfaln} zogj(C^?}bHw+|kF$n9vei+zztZB_E0sue8u`Cd6rPI^B62^v)dC7e7iyZ9kwIT-N- zwe{J#$f(~Q?U0viY_;F2KilhHKGXMIW3x7m4FtEY52p9B9J)mH#uBpL@(zdI6> z5)efc>o18;a~~DW1V-zhfukN;{V)6o7?xQE#kVz=3!_ z9HmApm-{|~A(p|NVHu1XCHk39oldNlU*`ng)|GZ4Qa&U2TF0YIu1T24<1_fNQn%Cf zc;_*C$#}a((gym5^~=?6t35>YXey0mD->;CsEmOFtU0RO#x)(?;e1$&Bq&^VnRul# z9~}_Ssh>h`)2FBrLo&5-YS`6Gskh^^dOzKhRddi={oVC?zU0v|-qyXt>_m$f+sLlX z<9xrk*5c`7 zjt3kD1V87SMwlhB9%N)J#g;|HI^Qqq&NIj5wMHU0JldIO+ihJVQdd40hKoWOdq+#( zat?EhLKD_BZOfu-W_e33=S@<_Ipw#9fxaUseaW_plUmRH+Z*1#F%_H5<~Oq7^u1`# z6HbEIFRhs*>D(?LlZ*fpPs$)9myE+8D+hXF5VPr+e!4b8d$QMAP)3rsyMy_H_xYWT zivI(rb*gqXNw{fbD**zD;cs#RaubD7p0bjZi_^lia`Y8rI~$euf@HBBO>#@a&(YR# zxp8GC7R5r5S%uVu=PLyf!M~5Kcpa>CYqJOFbu)x+P^?PWijXaeVv{D*tEax{>MDUh zLy%3Hzot*>B~(yUF(mXgRvxD6ihk6sjG0{9FFDmkGyomG&`>+L*mzjft9B5bio2F^ zEO=ivL_iZlg_-A-!JQsmMBdD2IR)lMJu_54BKS~sVlV2QM4wCkcJllFqI-}`%o0m) zYT+D79+$4WS=pM=`cfS=_xHC(H41;#K^Jf*nsQY9+`=}2`xV%bx#ppLTu70Pu<6UT zj%OYax*$(Jf!E~c+P#WQ3mpI>X$4-Tm-PNJVtv8H;hA=ScCyC)?oFr6Hyp1m4^VYl zm-n~m;j}EMqq@WogPrgo_H+5k$7x^gO}!4Bx@-G2k(cL&9e~FRYXydfz z2^AsktmTjp?HQ;r`|f;Pi~70nu&$55&b;6{6Wqc}rtR!7>0iUUAcJbTwp;fXgDt9z zB^J-zG60o&#q^T&X(hWYmaP6ed+m1J$VFNEO6*+T^>-a=#?w5vv0RqzxAX`{UmN@G zFBb)(F@8nAc&C3X)+75k{ZSZV^o1o(uQx9*D7m(`lxE+txAPPxl&G~Vl+(DBPsaz7 zOVa=Rnb2%pntq`%!?R(kb`=@MjyF(c#)Ykm)L`)mMU@qpX0}pb`jai~Q7If|BYjO) zx=SPK+;{UlZ_*S=bcPz$_l#mQI}@L`y42nZp7@}x1i!b%>(q~)AVKQ;X)h$OGC>LQ zy8A9oLYRa!-Z5G%9TC-|=!*-OS%tWuq&Bna!(TeJcu`cHc%)RXM~n!~$*Fs`Rp$F3 zR@=8P>gfJOA~eqOLPwWoD=6ND-X_(d-Q?Tkdg?4y#~7YHqLi3|G}#mb2{QX^l!VSa zBRQCf9(%eei?yY6!qKwct|i4!Os&P+bk2cGhXxkIX_dZ@Q88XsM6ma6d4R9%SqnKd zoK-e6wx;aa8(TEoUFS27!R$E)#I(FqHnXlp?70{EwEUarvz~+OdG|TAf|oXPz6b32 zFI%+2ujg|Cup9-jBy=LE!0#ax9EB(bbYeso-y=jhim-C&Bp8A7F{TiXV!~}YDgKN3 zgkX*m3KDu5Ip9J{5l1P50ll2w#X`m)M;Ti#y@D-pG5dg{oNt?6$@gM0AC|LXovB|T z>P4YA9H(+y9jpx3zf>m530BPo%j4~Z!5MQ_>25PGq7A2yFSc-$?W}~eD#mb-oa=(F<#c=I6nseRml*&yt4>r~XU4lpQFtH(92&aZNF=kgo3 zk7br1RJ*-Ul+0EbMOJOR>Ag)-ox~3qS&_%N$|MFL`fS%gQnNWgz+aNdl{3m zuZ~`sdB-{88^g=xk1>RKr*y+_(q?RrnHf8#?6=uKQ^cE>qMr~wIfLMrrjJ;Rc&GEj z`VntrPmi*A=X{zH5{y#;c=9k z+8TVXT#NO}CT_qbaDXc~Y2A69xVCKa?JVMknAGf7WgMFZR&S_R)?S`#ChfhVedM zMj!GY&KlZw+B&%YnoWaWSh*-&*SF$w^w~SY=p2QR7dRIm zZ{uG|GyDOzuf$av-=9Yv9iE2*n&%eXnvp%`9lvUsT)1ilwKPrIt3`AHEXM|F8Ed^` zJV_rAtzD1!jlArdd`^F8vbP`@c-QZ~9BZ%+A4)*%blW(W^;>#QxyfGU68Ni{PTg`N z9DjQ%<(+yO`Dn!P}`clYxDK*7G&D58kQKr#OU|)dt)HiYVeOX zDSrds8T(wLzn_Oy6ZxaAAT|0nx#6wOLfkX$*u?Va<|Di$ai7m z4W>BBs^9XvYm6Rs_7Iqt9_e@Q-bj8`Zgq7{=8z0%E-EFTUy5M4Bk!hOb?G@&>7k-*C*~1n!5wZF7 zY(auZSb%OwJ|{wUx^H~uY=RL?hG$ATcwVsKo^t`S#r~CXF$=1McRv5e~xvg{Jmw!ydUTpt2OEkDO#WX>%

57nKE;QjU!pvU8!IY!9j_^`jJwZxzfTRo#c@m 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
xRNQq&e#IMFS#KQMp6L2&M(M*AP5xLbYT~I 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%0D=Pv1|XOa0K$R^4K7r8(BVXh5g7`k2+?B3 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

M{J&qV4fWu>i_+Ge|j_SKIYcsXthbe{_ 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/image/sys1.png b/src/main/webapp/image/sys1.png new file mode 100644 index 0000000000000000000000000000000000000000..bb5477da965bf0a4b520a5d60bf42a82b6141156 GIT binary patch literal 150267 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%0D%r;J%oD#DHT7~7PPDOQ|X^W{IO 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 z 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

0nDQ|-`-|{V890M;0dWmvHySfcx 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.maximum=c.limit),this.config=a.extend({},d,c),this.clones=this.$elem.closestChild(this.config.cloneThis),this.init()}var c="cloneya",d={cloneThis:".toclone",cloneButton:".clone",deleteButton:".delete",clonePosition:"after",minimum:1,maximum:999,valueClone:!1,dataClone:!1,deepClone:!1,serializeID:!0,ignore:"label.error",preserveChildCount:!1};b.prototype={init:function(){var b=this;b.$elem.addClass(c+"-wrap"),b.clones.addClass(c),b.clones.data("initialCount",b.clones.length),b.$elem.on("click."+c,b.config.cloneThis+">"+b.config.cloneButton,function(d){d.preventDefault(),d.stopPropagation();var e=a(this).closest(b.config.cloneThis);b.$elem.triggerAll("clone_clone clone."+c,[e])}),b.$elem.on("clone."+c,function(a,c){b._cloneAndAppend(c)}),b.$elem.on("click."+c,b.config.cloneThis+">"+b.config.deleteButton,function(d){d.preventDefault(),d.stopPropagation();var e=a(this).closest(b.config.cloneThis);b.$elem.triggerAll("clone_delete delete."+c,[e])}),b.$elem.on("delete."+c,function(d,e){var f=e.closest(b.elem).closestChild(b.config.cloneThis).length;f>b.config.minimum?(b.$elem.triggerAll("clone_before_delete before_delete."+c,[e,f]),b.$elem.triggerHandler("remove."+c,[e]),b.$elem.triggerAll("clone_after_delete after_delete."+c)):(b.$elem.triggerHandler("minimum."+c,b.config.minimum,[e]),e.find("input, textarea, select").each(function(){b._clearForm(a(this))}))}),b.$elem.on("remove."+c,function(b,c){a(c).remove()})},_clean:function(){var a=this;a.$elem.removeClass(c+"-wrap"),a.clones.removeClass(c),a.$elem.off("click."+c,a.config.cloneThis+">"+a.config.cloneButton),a.$elem.off("click."+c,a.config.cloneThis+">"+a.config.deleteButton),a.$elem.off("clone_clone clone_delete clone_before_delete clone."+c+" delete."+c+" before_delete."+c)},destroy:function(){this._clean(),this.$elem.removeData(c)},getOption:function(){return this.config},setOption:function(b){a.extend(this.config,b||{}),this._clean(),this.init()},_cloneAndAppend:function(a){var b=a.closest(this.elem).closestChild(this.config.cloneThis).length;if(b=1){var j=h;h=[].map.call(j,function(a,b){return isNaN(+a)||"["!==j[b-1]||"]"!==j[b+1]?a:d}).join(""),a(this).attr("name",h)}}}})})}}},a.fn[c]=function(d){var e=arguments;if(void 0===d||"object"==typeof d)return this.each(function(){a.data(this,c)||a.data(this,c,new b(this,d))});if("string"==typeof d&&"_"!==d[0]&&"init"!==d){if(0===Array.prototype.slice.call(e,1).length&&-1!==a.inArray(d,a.fn[c].getters)){var f=a.data(this[0],c);return f[d].apply(f,Array.prototype.slice.call(e,1))}return this.each(function(){var f=a.data(this,c);f instanceof b&&"function"==typeof f[d]&&f[d].apply(f,Array.prototype.slice.call(e,1))})}},a.fn[c].getters=["getOption"],a.fn.closestChild=function(b){var c,d;return c=this.children(),0===c.length?a():(d=c.filter(b),d.length>0?d:c.closestChild(b))},a.fn.extend({triggerAll:function(a,b){var c,d=this,e=a.split(" ");for(c=0;c= 0) { + shiftIndex = j; + slices.push(part); + break; + } + } + if (shiftIndex) i = shiftIndex; + } + } + else { + if (part.indexOf('=') > 0) { + // Hash + var hashParts = part.split('='); + var hashName = hashParts[0]; + var hashContent = hashParts[1]; + if (hashContent.match(/"/g).length !== 2) { + shiftIndex = 0; + for (j = i + 1; j < helperParts.length; j++) { + hashContent += ' ' + helperParts[j]; + if (helperParts[j].indexOf('"') >= 0) { + shiftIndex = j; + break; + } + } + if (shiftIndex) i = shiftIndex; + } + var hash = [hashName, hashContent.replace(/"/g,'')]; + slices.push(hash); + } + else { + // Plain variable + slices.push(part); + } + } + } + } + return slices; + } + function stringToBlocks(string) { + var blocks = [], i, j, k; + if (!string) return []; + var _blocks = string.split(/({{[^{^}]*}})/); + for (i = 0; i < _blocks.length; i++) { + var block = _blocks[i]; + if (block === '') continue; + if (block.indexOf('{{') < 0) { + blocks.push({ + type: 'plain', + content: block + }); + } + else { + if (block.indexOf('{/') >= 0) { + continue; + } + if (block.indexOf('{#') < 0 && block.indexOf(' ') < 0 && block.indexOf('else') < 0) { + // Simple variable + blocks.push({ + type: 'variable', + contextName: block.replace(/[{}]/g, '') + }); + continue; + } + // Helpers + var helperSlices = helperToSlices(block); + var helperName = helperSlices[0]; + var helperContext = []; + var helperHash = {}; + for (j = 1; j < helperSlices.length; j++) { + var slice = helperSlices[j]; + if (isArray(slice)) { + // Hash + helperHash[slice[0]] = slice[1] === 'false' ? false : slice[1]; + } + else { + helperContext.push(slice); + } + } + + if (block.indexOf('{#') >= 0) { + // Condition/Helper + var helperStartIndex = i; + var helperContent = ''; + var elseContent = ''; + var toSkip = 0; + var shiftIndex; + var foundClosed = false, foundElse = false, foundClosedElse = false, depth = 0; + for (j = i + 1; j < _blocks.length; j++) { + if (_blocks[j].indexOf('{{#') >= 0) { + depth ++; + } + if (_blocks[j].indexOf('{{/') >= 0) { + depth --; + } + if (_blocks[j].indexOf('{{#' + helperName) >= 0) { + helperContent += _blocks[j]; + if (foundElse) elseContent += _blocks[j]; + toSkip ++; + } + else if (_blocks[j].indexOf('{{/' + helperName) >= 0) { + if (toSkip > 0) { + toSkip--; + helperContent += _blocks[j]; + if (foundElse) elseContent += _blocks[j]; + } + else { + shiftIndex = j; + foundClosed = true; + break; + } + } + else if (_blocks[j].indexOf('else') >= 0 && depth === 0) { + foundElse = true; + } + else { + if (!foundElse) helperContent += _blocks[j]; + if (foundElse) elseContent += _blocks[j]; + } + + } + if (foundClosed) { + if (shiftIndex) i = shiftIndex; + blocks.push({ + type: 'helper', + helperName: helperName, + contextName: helperContext, + content: helperContent, + inverseContent: elseContent, + hash: helperHash + }); + } + } + else if (block.indexOf(' ') > 0) { + blocks.push({ + type: 'helper', + helperName: helperName, + contextName: helperContext, + hash: helperHash + }); + } + } + } + return blocks; + } + var Template7 = function (template) { + var t = this; + t.template = template; + + function getCompileFn(block, depth) { + if (block.content) return compile(block.content, depth); + else return function () {return ''; }; + } + function getCompileInverse(block, depth) { + if (block.inverseContent) return compile(block.inverseContent, depth); + else return function () {return ''; }; + } + function getCompileVar(name, ctx) { + var variable, parts, levelsUp = 0, initialCtx = ctx; + if (name.indexOf('../') === 0) { + levelsUp = name.split('../').length - 1; + var newDepth = ctx.split('_')[1] - levelsUp; + ctx = 'ctx_' + (newDepth >= 1 ? newDepth : 1); + parts = name.split('../')[levelsUp].split('.'); + } + else if (name.indexOf('@global') === 0) { + ctx = '$.Template7.global'; + parts = name.split('@global.')[1].split('.'); + } + else if (name.indexOf('@root') === 0) { + ctx = 'ctx_1'; + parts = name.split('@root.')[1].split('.'); + } + else { + parts = name.split('.'); + } + variable = ctx; + for (var i = 0; i < parts.length; i++) { + var part = parts[i]; + if (part.indexOf('@') === 0) { + if (i > 0) { + variable += '[(data && data.' + part.replace('@', '') + ')]'; + } + else { + variable = '(data && data.' + name.replace('@', '') + ')'; + } + } + else { + if (isFinite(part)) { + variable += '[' + part + ']'; + } + else { + if (part.indexOf('this') === 0) { + variable = part.replace('this', ctx); + } + else { + variable += '.' + part; + } + } + } + } + + return variable; + } + function getCompiledArguments(contextArray, ctx) { + var arr = []; + for (var i = 0; i < contextArray.length; i++) { + if (contextArray[i].indexOf('"') === 0) arr.push(contextArray[i]); + else { + arr.push(getCompileVar(contextArray[i], ctx)); + } + } + return arr.join(', '); + } + function compile(template, depth) { + depth = depth || 1; + template = template || t.template; + if (typeof template !== 'string') { + throw new Error('Template7: Template must be a string'); + } + var blocks = stringToBlocks(template); + if (blocks.length === 0) { + return function () { return ''; }; + } + var ctx = 'ctx_' + depth; + var resultString = '(function (' + ctx + ', data) {\n'; + if (depth === 1) { + resultString += 'function isArray(arr){return Object.prototype.toString.apply(arr) === \'[object Array]\';}\n'; + resultString += 'function isFunction(func){return (typeof func === \'function\');}\n'; + resultString += 'function c(val, ctx) {if (typeof val !== "undefined") {if (isFunction(val)) {return val.call(ctx);} else return val;} else return "";}\n'; + } + resultString += 'var r = \'\';\n'; + var i, j, context; + for (i = 0; i < blocks.length; i++) { + var block = blocks[i]; + // Plain block + if (block.type === 'plain') { + resultString += 'r +=\'' + (block.content).replace(/\r/g, '\\r').replace(/\n/g, '\\n').replace(/'/g, '\\' + '\'') + '\';'; + continue; + } + var variable, compiledArguments; + // Variable block + if (block.type === 'variable') { + variable = getCompileVar(block.contextName, ctx); + resultString += 'r += c(' + variable + ', ' + ctx + ');'; + } + // Helpers block + if (block.type === 'helper') { + if (block.helperName in t.helpers) { + compiledArguments = getCompiledArguments(block.contextName, ctx); + resultString += 'r += ($.Template7.helpers.' + block.helperName + ').call(' + ctx + ', ' + (compiledArguments && (compiledArguments + ', ')) +'{hash:' + JSON.stringify(block.hash) + ', data: data || {}, fn: ' + getCompileFn(block, depth+1) + ', inverse: ' + getCompileInverse(block, depth+1) + ', root: ctx_1});'; + } + else { + if (block.contextName.length > 0) { + throw new Error('Template7: Missing helper: "' + block.helperName + '"'); + } + else { + variable = getCompileVar(block.helperName, ctx); + resultString += 'if (' + variable + ') {'; + resultString += 'if (isArray(' + variable + ')) {'; + resultString += 'r += ($.Template7.helpers.each).call(' + ctx + ', ' + variable + ', {hash:' + JSON.stringify(block.hash) + ', data: data || {}, fn: ' + getCompileFn(block, depth+1) + ', inverse: ' + getCompileInverse(block, depth+1) + ', root: ctx_1});'; + resultString += '}else {'; + resultString += 'r += ($.Template7.helpers.with).call(' + ctx + ', ' + variable + ', {hash:' + JSON.stringify(block.hash) + ', data: data || {}, fn: ' + getCompileFn(block, depth+1) + ', inverse: ' + getCompileInverse(block, depth+1) + ', root: ctx_1});'; + resultString += '}}'; + } + } + } + } + resultString += '\nreturn r;})'; + return eval.call(window, resultString); + } + t.compile = function (template) { + if (!t.compiled) { + t.compiled = compile(template); + } + return t.compiled; + }; + }; + Template7.prototype = { + options: {}, + helpers: { + 'if': function (context, options) { + if (isFunction(context)) { context = context.call(this); } + if (context) { + return options.fn(this, options.data); + } + else { + return options.inverse(this, options.data); + } + }, + 'unless': function (context, options) { + if (isFunction(context)) { context = context.call(this); } + if (!context) { + return options.fn(this, options.data); + } + else { + return options.inverse(this, options.data); + } + }, + 'each': function (context, options) { + var ret = '', i = 0; + if (isFunction(context)) { context = context.call(this); } + if (isArray(context)) { + if (options.hash.reverse) { + context = context.reverse(); + } + for (i = 0; i < context.length; i++) { + ret += options.fn(context[i], {first: i === 0, last: i === context.length - 1, index: i}); + } + if (options.hash.reverse) { + context = context.reverse(); + } + } + else { + for (var key in context) { + i++; + ret += options.fn(context[key], {key: key}); + } + } + if (i > 0) return ret; + else return options.inverse(this); + }, + 'with': function (context, options) { + if (isFunction(context)) { context = context.call(this); } + return options.fn(context); + }, + 'join': function (context, options) { + if (isFunction(context)) { context = context.call(this); } + return context.join(options.hash.delimiter || options.hash.delimeter); + }, + 'js': function (expression, options) { + var func; + if (expression.indexOf('return')>=0) { + func = '(function(){'+expression+'})'; + } + else { + func = '(function(){return ('+expression+')})'; + } + return eval.call(this, func).call(this); + }, + 'js_compare': function (expression, options) { + var func; + if (expression.indexOf('return')>=0) { + func = '(function(){'+expression+'})'; + } + else { + func = '(function(){return ('+expression+')})'; + } + var condition = eval.call(this, func).call(this); + if (condition) { + return options.fn(this, options.data); + } + else { + return options.inverse(this, options.data); + } + } + } + }; + var t7 = function (template, data) { + if (arguments.length === 2) { + var instance = new Template7(template); + var rendered = instance.compile()(data); + instance = null; + return (rendered); + } + else return new Template7(template); + }; + t7.registerHelper = function (name, fn) { + Template7.prototype.helpers[name] = fn; + }; + t7.unregisterHelper = function (name) { + Template7.prototype.helpers[name] = undefined; + delete Template7.prototype.helpers[name]; + }; + + t7.compile = function (template, options) { + var instance = new Template7(template, options); + return instance.compile(); + }; + + t7.options = Template7.prototype.options; + t7.helpers = Template7.prototype.helpers; + return t7; + })(); +}($); + ++ function($) { + "use strict"; + + var defaults; + + $.modal = function(params) { + params = $.extend({}, defaults, params); + + + var buttons = params.buttons; + + var buttonsHtml = buttons.map(function(d, i) { + return '' + d.text + ''; + }).join(""); + + var tpl = '
' + + '
' + params.title + '
' + + ( params.text ? '
'+params.text+'
' : '')+ + '
' + buttonsHtml + '
' + + '
'; + + var dialog = $.openModal(tpl); + + dialog.find(".weui_btn_dialog").each(function(i, e) { + var el = $(e); + el.click(function() { + //先关闭对话框,再调用回调函数 + + $.closeModal(); + + if(buttons[i].onClick) { + buttons[i].onClick(); + } + }); + }); + }; + + $.openModal = function(tpl) { + var mask = $("
").appendTo(document.body); + mask.show(); + + var dialog = $(tpl).appendTo(document.body); + + dialog.show(); + mask.addClass("weui_mask_visible"); + dialog.addClass("weui_dialog_visible"); + + return dialog; + } + + $.closeModal = function() { + $(".weui_mask_visible").removeClass("weui_mask_visible").transitionEnd(function() { + $(this).remove(); + }); + $(".weui_dialog_visible").removeClass("weui_dialog_visible").transitionEnd(function() { + $(this).remove(); + }); + }; + + $.alert = function(text, title, callback) { + if (typeof title === 'function') { + callback = arguments[1]; + title = undefined; + } + return $.modal({ + text: text, + title: title, + buttons: [{ + text: defaults.buttonOK, + className: "primary", + onClick: callback + }] + }); + } + + $.confirm = function(text, title, callbackOK, callbackCancel) { + if (typeof title === 'function') { + callbackCancel = arguments[2]; + callbackOK = arguments[1]; + title = undefined; + } + return $.modal({ + text: text, + title: title, + buttons: [ + { + text: defaults.buttonCancel, + className: "default", + onClick: callbackCancel + }, + { + text: defaults.buttonOK, + className: "primary", + onClick: callbackOK + }] + }); + }; + + $.prompt = function(text, title, callbackOK, callbackCancel) { + if (typeof title === 'function') { + callbackCancel = arguments[2]; + callbackOK = arguments[1]; + title = undefined; + } + + return $.modal({ + text: "

"+(text || "")+"

", + title: title, + buttons: [ + { + text: defaults.buttonCancel, + className: "default", + onClick: callbackCancel + }, + { + text: defaults.buttonOK, + className: "primary", + onClick: function() { + callbackOK && callbackOK($("#weui-prompt-input").val()); + } + }] + }); + }; + + defaults = $.modal.prototype.defaults = { + title: "提示", + text: undefined, + buttonOK: "确定", + buttonCancel: "取消", + buttons: [{ + text: "确定", + className: "primary" + }] + }; + +}($); + ++ function($) { + "use strict"; + + var defaults; + + var show = function(html, className) { + + className = className || ""; + var mask = $("
").appendTo(document.body); + + var tpl = '
' + html + '
'; + var dialog = $(tpl).appendTo(document.body); + + dialog.show(); + dialog.addClass("weui_toast_visible"); + }; + + var hide = function() { + $(".weui_mask_transparent").hide(); + $(".weui_toast_visible").removeClass("weui_toast_visible").transitionEnd(function() { + $(this).remove(); + }); + } + + $.toast = function(text, style) { + var className; + if(style == "cancel") { + className = "weui_toast_cancel"; + } else if(style == "forbidden") { + className = "weui_toast_forbidden"; + } + show('

' + (text || "已经完成") + '

', className); + + setTimeout(function() { + hide(); + }, toastDefaults.duration); + } + + $.showLoading = function(text) { + var html = '
'; + for(var i=0;i<12;i++) { + html += '
'; + } + html += '
'; + html += '

' + (text || "数据加载中") + '

'; + show(html, 'weui_loading_toast'); + } + + $.hideLoading = function() { + hide(); + } + + var toastDefaults = $.toast.prototype.defaults = { + duration: 2000 + } + +}($); + ++ function($) { + "use strict"; + + var defaults; + + var show = function(params) { + + var mask = $("
").appendTo(document.body); + + var actions = params.actions || []; + + var actionsHtml = actions.map(function(d, i) { + return '
' + d.text + '
'; + }).join(""); + + var tpl = '
'+ + '
'+ + actionsHtml + + '
'+ + '
'+ + '
取消
'+ + '
'+ + '
'; + var dialog = $(tpl).appendTo(document.body); + + dialog.find(".weui_actionsheet_menu .weui_actionsheet_cell, .weui_actionsheet_action .weui_actionsheet_cell").each(function(i, e) { + $(e).click(function() { + $.closeActions(); + if(actions[i] && actions[i].onClick) { + actions[i].onClick(); + } + }) + }); + + mask.show(); + dialog.show(); + mask.addClass("weui_mask_visible"); + dialog.addClass("weui_actionsheet_toggle"); + }; + + var hide = function() { + $(".weui_mask").removeClass("weui_mask_visible").transitionEnd(function() { + $(this).remove(); + }); + $(".weui_actionsheet").removeClass("weui_actionsheet_toggle").transitionEnd(function() { + $(this).remove(); + }); + } + + $.actions = function(params) { + params = $.extend({}, defaults, params); + show(params); + } + + $.closeActions = function() { + hide(); + } + + $(document).on("click", ".weui_actions_mask", function() { + $.closeActions(); + }); + + var defaults = $.actions.prototype.defaults = { + /*actions: [{ + text: "菜单", + className: "danger", + onClick: function() { + console.log(1); + } + },{ + text: "菜单2", + className: "danger", + onClick: function() { + console.log(2); + } + }]*/ + } + +}($); + +/* =============================================================================== +************ Pull to refreh ************ +=============================================================================== */ +/* global $:true */ + ++function ($) { + "use strict"; + + var PTR = function(el) { + this.container = $(el); + this.distance = 50; + this.attachEvents(); + } + + PTR.prototype.touchStart = function(e) { + if(this.container.hasClass("refreshing")) return; + var p = $.getTouchPosition(e); + this.start = p; + this.diffX = this.diffY = 0; + }; + + PTR.prototype.touchMove= function(e) { + if(this.container.hasClass("refreshing")) return; + if(!this.start) return false; + if(this.container.scrollTop() > 0) return; + var p = $.getTouchPosition(e); + this.diffX = p.x - this.start.x; + this.diffY = p.y - this.start.y; + if(this.diffY < 0) return; + this.container.addClass("touching"); + e.preventDefault(); + e.stopPropagation(); + this.diffY = Math.pow(this.diffY, 0.8); + this.container.css("transform", "translate3d(0, "+this.diffY+"px, 0)"); + + if(this.diffY < this.distance) { + this.container.removeClass("pull-up").addClass("pull-down"); + } else { + this.container.removeClass("pull-down").addClass("pull-up"); + } + }; + PTR.prototype.touchEnd = function() { + this.start = false; + if(this.diffY <= 0 || this.container.hasClass("refreshing")) return; + this.container.removeClass("touching"); + this.container.removeClass("pull-down pull-up"); + this.container.css("transform", ""); + if(Math.abs(this.diffY) <= this.distance) { + } else { + this.container.addClass("refreshing"); + this.container.trigger("pull-to-refresh"); + } + }; + + PTR.prototype.attachEvents = function() { + var el = this.container; + el.addClass("weui-pull-to-refresh"); + el.on($.touchEvents.start, $.proxy(this.touchStart, this)); + el.on($.touchEvents.move, $.proxy(this.touchMove, this)); + el.on($.touchEvents.end, $.proxy(this.touchEnd, this)); + }; + + var pullToRefresh = function(el) { + new PTR(el); + }; + + var pullToRefreshDone = function(el) { + $(el).removeClass("refreshing"); + } + + $.fn.pullToRefresh = function() { + return this.each(function() { + pullToRefresh(this); + }); + } + + $.fn.pullToRefreshDone = function() { + return this.each(function() { + pullToRefreshDone(this); + }); + } + +}($); + +/* =============================================================================== +************ Notification ************ +=============================================================================== */ +/* global $:true */ ++function ($) { + "use strict"; + + + var Infinite = function(el, distance) { + this.container = $(el); + this.container.data("infinite", this); + this.distance = distance || 50; + this.attachEvents(); + } + + Infinite.prototype.scroll = function() { + var container = this.container; + var offset = container.scrollHeight() - ($(window).height() + container.scrollTop()); + if(offset <= this.distance) { + container.trigger("infinite"); + } + } + + Infinite.prototype.attachEvents = function(off) { + var el = this.container; + var scrollContainer = (el[0].tagName.toUpperCase() === "BODY" ? $(document) : el); + scrollContainer[off ? "off" : "on"]("scroll", $.proxy(this.scroll, this)); + }; + Infinite.prototype.detachEvents = function(off) { + this.attachEvents(true); + } + + var infinite = function(el) { + attachEvents(el); + } + + $.fn.infinite = function(distance) { + return this.each(function() { + new Infinite(this, distance); + }); + } + $.fn.destroyInfinite = function() { + return this.each(function() { + var infinite = $(this).data("infinite"); + if(infinite && infinite.detachEvents) infinite.detachEvents(); + }); + } + +}($); + +/* global $:true */ ++function ($) { + "use strict"; + + var ITEM_ON = "weui_bar_item_on"; + + var showTab = function(a) { + var $a = $(a); + if($a.hasClass(ITEM_ON)) return; + var href = $a.attr("href"); + + if(!/^#/.test(href)) return ; + + $a.parent().find("."+ITEM_ON).removeClass(ITEM_ON); + $a.addClass(ITEM_ON); + + var bd = $a.parents(".weui_tab").find(".weui_tab_bd"); + + bd.find(".weui_tab_bd_item_active").removeClass("weui_tab_bd_item_active"); + + $(href).addClass("weui_tab_bd_item_active"); + } + + $.showTab = showTab; + + $(document).on("click", ".weui_tabbar_item, .weui_navbar_item", function(e) { + var $a = $(e.currentTarget); + var href = $a.attr("href"); + if($a.hasClass(ITEM_ON)) return; + if(!/^#/.test(href)) return; + + e.preventDefault(); + + showTab($a); + }); + +}($); + + +/* global $:true */ ++ function($) { + "use strict"; + + $(document).on("click", ".weui_search_bar label", function(e) { + $(e.target).parents(".weui_search_bar").addClass("weui_search_focusing"); + }) + .on("blur", ".weui_search_input", function(e) { + $(e.target).parents(".weui_search_bar").removeClass("weui_search_focusing"); + }) + +}($); + +/*=========================== +Device/OS Detection +===========================*/ +/* global $:true */ +;(function ($) { + "use strict"; + var device = {}; + var ua = navigator.userAgent; + + var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); + var ipad = ua.match(/(iPad).*OS\s([\d_]+)/); + var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); + var iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/); + + device.ios = device.android = device.iphone = device.ipad = device.androidChrome = false; + + // Android + if (android) { + device.os = 'android'; + device.osVersion = android[2]; + device.android = true; + device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0; + } + if (ipad || iphone || ipod) { + device.os = 'ios'; + device.ios = true; + } + // iOS + if (iphone && !ipod) { + device.osVersion = iphone[2].replace(/_/g, '.'); + device.iphone = true; + } + if (ipad) { + device.osVersion = ipad[2].replace(/_/g, '.'); + device.ipad = true; + } + if (ipod) { + device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null; + device.iphone = true; + } + // iOS 8+ changed UA + if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) { + if (device.osVersion.split('.')[0] === '10') { + device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0]; + } + } + + // Webview + device.webView = (iphone || ipad || ipod) && ua.match(/.*AppleWebKit(?!.*Safari)/i); + + // Minimal UI + if (device.os && device.os === 'ios') { + var osVersionArr = device.osVersion.split('.'); + device.minimalUi = !device.webView && + (ipod || iphone) && + (osVersionArr[0] * 1 === 7 ? osVersionArr[1] * 1 >= 1 : osVersionArr[0] * 1 > 7) && + $('meta[name="viewport"]').length > 0 && $('meta[name="viewport"]').attr('content').indexOf('minimal-ui') >= 0; + } + + // Check for status bar and fullscreen app mode + var windowWidth = $(window).width(); + var windowHeight = $(window).height(); + device.statusBar = false; + if (device.webView && (windowWidth * windowHeight === screen.width * screen.height)) { + device.statusBar = true; + } + else { + device.statusBar = false; + } + + // Classes + var classNames = []; + + // Pixel Ratio + device.pixelRatio = window.devicePixelRatio || 1; + classNames.push('pixel-ratio-' + Math.floor(device.pixelRatio)); + if (device.pixelRatio >= 2) { + classNames.push('retina'); + } + + // OS classes + if (device.os) { + classNames.push(device.os, device.os + '-' + device.osVersion.split('.')[0], device.os + '-' + device.osVersion.replace(/\./g, '-')); + if (device.os === 'ios') { + var major = parseInt(device.osVersion.split('.')[0], 10); + for (var i = major - 1; i >= 6; i--) { + classNames.push('ios-gt-' + i); + } + } + + } + // Status bar classes + if (device.statusBar) { + classNames.push('with-statusbar-overlay'); + } + else { + $('html').removeClass('with-statusbar-overlay'); + } + + // Add html classes + if (classNames.length > 0) $('html').addClass(classNames.join(' ')); + + $.device = device; +})($); + +/*====================================================== +************ Picker ************ +======================================================*/ +/* global $:true */ +/* jshint unused:false */ +/* jshint multistr:true */ ++ function($) { + "use strict"; + var Picker = function (params) { + var p = this; + var defaults = { + updateValuesOnMomentum: false, + updateValuesOnTouchmove: true, + rotateEffect: false, + momentumRatio: 7, + freeMode: false, + // Common settings + scrollToInput: true, + inputReadOnly: true, + toolbar: true, + toolbarCloseText: '完成', + title: '请选择', + toolbarTemplate: '
\ +
\ + {{closeText}}\ +

{{title}}

\ +
\ +
', + }; + params = params || {}; + for (var def in defaults) { + if (typeof params[def] === 'undefined') { + params[def] = defaults[def]; + } + } + p.params = params; + p.cols = []; + p.initialized = false; + + // Inline flag + p.inline = p.params.container ? true : false; + + // 3D Transforms origin bug, only on safari + var originBug = $.device.ios || (navigator.userAgent.toLowerCase().indexOf('safari') >= 0 && navigator.userAgent.toLowerCase().indexOf('chrome') < 0) && !$.device.android; + + // Should be converted to popover + function isPopover() { + var toPopover = false; + if (!p.params.convertToPopover && !p.params.onlyInPopover) return toPopover; + if (!p.inline && p.params.input) { + if (p.params.onlyInPopover) toPopover = true; + else { + if ($.device.ios) { + toPopover = $.device.ipad ? true : false; + } + else { + if ($(window).width() >= 768) toPopover = true; + } + } + } + return toPopover; + } + function inPopover() { + if (p.opened && p.container && p.container.length > 0 && p.container.parents('.popover').length > 0) return true; + else return false; + } + + // Value + p.setValue = function (arrValues, transition) { + var valueIndex = 0; + for (var i = 0; i < p.cols.length; i++) { + if (p.cols[i] && !p.cols[i].divider) { + p.cols[i].setValue(arrValues[valueIndex], transition); + valueIndex++; + } + } + }; + p.updateValue = function () { + var newValue = []; + var newDisplayValue = []; + for (var i = 0; i < p.cols.length; i++) { + if (!p.cols[i].divider) { + newValue.push(p.cols[i].value); + newDisplayValue.push(p.cols[i].displayValue); + } + } + if (newValue.indexOf(undefined) >= 0) { + return; + } + p.value = newValue; + p.displayValue = newDisplayValue; + if (p.params.onChange) { + p.params.onChange(p, p.value, p.displayValue); + } + if (p.input && p.input.length > 0) { + $(p.input).val(p.params.formatValue ? p.params.formatValue(p, p.value, p.displayValue) : p.value.join(' ')); + $(p.input).trigger('change'); + } + }; + + // Columns Handlers + p.initPickerCol = function (colElement, updateItems) { + var colContainer = $(colElement); + var colIndex = colContainer.index(); + var col = p.cols[colIndex]; + if (col.divider) return; + col.container = colContainer; + col.wrapper = col.container.find('.picker-items-col-wrapper'); + col.items = col.wrapper.find('.picker-item'); + + var i, j; + var wrapperHeight, itemHeight, itemsHeight, minTranslate, maxTranslate; + col.replaceValues = function (values, displayValues) { + col.destroyEvents(); + col.values = values; + col.displayValues = displayValues; + var newItemsHTML = p.columnHTML(col, true); + col.wrapper.html(newItemsHTML); + col.items = col.wrapper.find('.picker-item'); + col.calcSize(); + col.setValue(col.values[0], 0, true); + col.initEvents(); + }; + col.calcSize = function () { + if (p.params.rotateEffect) { + col.container.removeClass('picker-items-col-absolute'); + if (!col.width) col.container.css({width:''}); + } + var colWidth, colHeight; + colWidth = 0; + colHeight = col.container[0].offsetHeight; + wrapperHeight = col.wrapper[0].offsetHeight; + itemHeight = col.items[0].offsetHeight; + itemsHeight = itemHeight * col.items.length; + minTranslate = colHeight / 2 - itemsHeight + itemHeight / 2; + maxTranslate = colHeight / 2 - itemHeight / 2; + if (col.width) { + colWidth = col.width; + if (parseInt(colWidth, 10) === colWidth) colWidth = colWidth + 'px'; + col.container.css({width: colWidth}); + } + if (p.params.rotateEffect) { + if (!col.width) { + col.items.each(function () { + var item = $(this); + item.css({width:'auto'}); + colWidth = Math.max(colWidth, item[0].offsetWidth); + item.css({width:''}); + }); + col.container.css({width: (colWidth + 2) + 'px'}); + } + col.container.addClass('picker-items-col-absolute'); + } + }; + col.calcSize(); + + col.wrapper.transform('translate3d(0,' + maxTranslate + 'px,0)').transition(0); + + + var activeIndex = 0; + var animationFrameId; + + // Set Value Function + col.setValue = function (newValue, transition, valueCallbacks) { + if (typeof transition === 'undefined') transition = ''; + var newActiveIndex = col.wrapper.find('.picker-item[data-picker-value="' + newValue + '"]').index(); + if(typeof newActiveIndex === 'undefined' || newActiveIndex === -1) { + return; + } + var newTranslate = -newActiveIndex * itemHeight + maxTranslate; + // Update wrapper + col.wrapper.transition(transition); + col.wrapper.transform('translate3d(0,' + (newTranslate) + 'px,0)'); + + // Watch items + if (p.params.updateValuesOnMomentum && col.activeIndex && col.activeIndex !== newActiveIndex ) { + $.cancelAnimationFrame(animationFrameId); + col.wrapper.transitionEnd(function(){ + $.cancelAnimationFrame(animationFrameId); + }); + updateDuringScroll(); + } + + // Update items + col.updateItems(newActiveIndex, newTranslate, transition, valueCallbacks); + }; + + col.updateItems = function (activeIndex, translate, transition, valueCallbacks) { + if (typeof translate === 'undefined') { + translate = $.getTranslate(col.wrapper[0], 'y'); + } + if(typeof activeIndex === 'undefined') activeIndex = -Math.round((translate - maxTranslate)/itemHeight); + if (activeIndex < 0) activeIndex = 0; + if (activeIndex >= col.items.length) activeIndex = col.items.length - 1; + var previousActiveIndex = col.activeIndex; + col.activeIndex = activeIndex; + /* + col.wrapper.find('.picker-selected, .picker-after-selected, .picker-before-selected').removeClass('picker-selected picker-after-selected picker-before-selected'); + + col.items.transition(transition); + var selectedItem = col.items.eq(activeIndex).addClass('picker-selected').transform(''); + var prevItems = selectedItem.prevAll().addClass('picker-before-selected'); + var nextItems = selectedItem.nextAll().addClass('picker-after-selected'); + */ + //去掉 .picker-after-selected, .picker-before-selected 以提高性能 + col.wrapper.find('.picker-selected').removeClass('picker-selected'); + if (p.params.rotateEffect) { + col.items.transition(transition); + } + var selectedItem = col.items.eq(activeIndex).addClass('picker-selected').transform(''); + + if (valueCallbacks || typeof valueCallbacks === 'undefined') { + // Update values + col.value = selectedItem.attr('data-picker-value'); + col.displayValue = col.displayValues ? col.displayValues[activeIndex] : col.value; + // On change callback + if (previousActiveIndex !== activeIndex) { + if (col.onChange) { + col.onChange(p, col.value, col.displayValue); + } + p.updateValue(); + } + } + + // Set 3D rotate effect + if (!p.params.rotateEffect) { + return; + } + var percentage = (translate - (Math.floor((translate - maxTranslate)/itemHeight) * itemHeight + maxTranslate)) / itemHeight; + + col.items.each(function () { + var item = $(this); + var itemOffsetTop = item.index() * itemHeight; + var translateOffset = maxTranslate - translate; + var itemOffset = itemOffsetTop - translateOffset; + var percentage = itemOffset / itemHeight; + + var itemsFit = Math.ceil(col.height / itemHeight / 2) + 1; + + var angle = (-18*percentage); + if (angle > 180) angle = 180; + if (angle < -180) angle = -180; + // Far class + if (Math.abs(percentage) > itemsFit) item.addClass('picker-item-far'); + else item.removeClass('picker-item-far'); + // Set transform + item.transform('translate3d(0, ' + (-translate + maxTranslate) + 'px, ' + (originBug ? -110 : 0) + 'px) rotateX(' + angle + 'deg)'); + }); + }; + + function updateDuringScroll() { + animationFrameId = $.requestAnimationFrame(function () { + col.updateItems(undefined, undefined, 0); + updateDuringScroll(); + }); + } + + // Update items on init + if (updateItems) col.updateItems(0, maxTranslate, 0); + + var allowItemClick = true; + var isTouched, isMoved, touchStartY, touchCurrentY, touchStartTime, touchEndTime, startTranslate, returnTo, currentTranslate, prevTranslate, velocityTranslate, velocityTime; + function handleTouchStart (e) { + if (isMoved || isTouched) return; + e.preventDefault(); + isTouched = true; + var position = $.getTouchPosition(e); + touchStartY = touchCurrentY = position.y; + touchStartTime = (new Date()).getTime(); + + allowItemClick = true; + startTranslate = currentTranslate = $.getTranslate(col.wrapper[0], 'y'); + } + function handleTouchMove (e) { + if (!isTouched) return; + e.preventDefault(); + allowItemClick = false; + var position = $.getTouchPosition(e); + touchCurrentY = position.y; + if (!isMoved) { + // First move + $.cancelAnimationFrame(animationFrameId); + isMoved = true; + startTranslate = currentTranslate = $.getTranslate(col.wrapper[0], 'y'); + col.wrapper.transition(0); + } + e.preventDefault(); + + var diff = touchCurrentY - touchStartY; + currentTranslate = startTranslate + diff; + returnTo = undefined; + + // Normalize translate + if (currentTranslate < minTranslate) { + currentTranslate = minTranslate - Math.pow(minTranslate - currentTranslate, 0.8); + returnTo = 'min'; + } + if (currentTranslate > maxTranslate) { + currentTranslate = maxTranslate + Math.pow(currentTranslate - maxTranslate, 0.8); + returnTo = 'max'; + } + // Transform wrapper + col.wrapper.transform('translate3d(0,' + currentTranslate + 'px,0)'); + + // Update items + col.updateItems(undefined, currentTranslate, 0, p.params.updateValuesOnTouchmove); + + // Calc velocity + velocityTranslate = currentTranslate - prevTranslate || currentTranslate; + velocityTime = (new Date()).getTime(); + prevTranslate = currentTranslate; + } + function handleTouchEnd (e) { + if (!isTouched || !isMoved) { + isTouched = isMoved = false; + return; + } + isTouched = isMoved = false; + col.wrapper.transition(''); + if (returnTo) { + if (returnTo === 'min') { + col.wrapper.transform('translate3d(0,' + minTranslate + 'px,0)'); + } + else col.wrapper.transform('translate3d(0,' + maxTranslate + 'px,0)'); + } + touchEndTime = new Date().getTime(); + var velocity, newTranslate; + if (touchEndTime - touchStartTime > 300) { + newTranslate = currentTranslate; + } + else { + velocity = Math.abs(velocityTranslate / (touchEndTime - velocityTime)); + newTranslate = currentTranslate + velocityTranslate * p.params.momentumRatio; + } + + newTranslate = Math.max(Math.min(newTranslate, maxTranslate), minTranslate); + + // Active Index + var activeIndex = -Math.floor((newTranslate - maxTranslate)/itemHeight); + + // Normalize translate + if (!p.params.freeMode) newTranslate = -activeIndex * itemHeight + maxTranslate; + + // Transform wrapper + col.wrapper.transform('translate3d(0,' + (parseInt(newTranslate,10)) + 'px,0)'); + + // Update items + col.updateItems(activeIndex, newTranslate, '', true); + + // Watch items + if (p.params.updateValuesOnMomentum) { + updateDuringScroll(); + col.wrapper.transitionEnd(function(){ + $.cancelAnimationFrame(animationFrameId); + }); + } + + // Allow click + setTimeout(function () { + allowItemClick = true; + }, 100); + } + + function handleClick(e) { + if (!allowItemClick) return; + $.cancelAnimationFrame(animationFrameId); + /*jshint validthis:true */ + var value = $(this).attr('data-picker-value'); + col.setValue(value); + } + + col.initEvents = function (detach) { + var method = detach ? 'off' : 'on'; + col.container[method]($.touchEvents.start, handleTouchStart); + col.container[method]($.touchEvents.move, handleTouchMove); + col.container[method]($.touchEvents.end, handleTouchEnd); + col.items[method]('click', handleClick); + }; + col.destroyEvents = function () { + col.initEvents(true); + }; + + col.container[0].f7DestroyPickerCol = function () { + col.destroyEvents(); + }; + + col.initEvents(); + + }; + p.destroyPickerCol = function (colContainer) { + colContainer = $(colContainer); + if ('f7DestroyPickerCol' in colContainer[0]) colContainer[0].f7DestroyPickerCol(); + }; + // Resize cols + function resizeCols() { + if (!p.opened) return; + for (var i = 0; i < p.cols.length; i++) { + if (!p.cols[i].divider) { + p.cols[i].calcSize(); + p.cols[i].setValue(p.cols[i].value, 0, false); + } + } + } + $(window).on('resize', resizeCols); + + // HTML Layout + p.columnHTML = function (col, onlyItems) { + var columnItemsHTML = ''; + var columnHTML = ''; + if (col.divider) { + columnHTML += '
' + col.content + '
'; + } + else { + for (var j = 0; j < col.values.length; j++) { + columnItemsHTML += '
' + (col.displayValues ? col.displayValues[j] : col.values[j]) + '
'; + } + columnHTML += '
' + columnItemsHTML + '
'; + } + return onlyItems ? columnItemsHTML : columnHTML; + }; + p.layout = function () { + var pickerHTML = ''; + var pickerClass = ''; + var i; + p.cols = []; + var colsHTML = ''; + for (i = 0; i < p.params.cols.length; i++) { + var col = p.params.cols[i]; + colsHTML += p.columnHTML(p.params.cols[i]); + p.cols.push(col); + } + pickerClass = 'weui-picker-modal picker-columns ' + (p.params.cssClass || '') + (p.params.rotateEffect ? ' picker-3d' : ''); + pickerHTML = + '
' + + (p.params.toolbar ? p.params.toolbarTemplate.replace(/{{closeText}}/g, p.params.toolbarCloseText).replace(/{{title}}/g, p.params.title) : '') + + '
' + + colsHTML + + '
' + + '
' + + '
'; + + p.pickerHTML = pickerHTML; + }; + + // Input Events + function openOnInput(e) { + e.preventDefault(); + if (p.opened) return; + p.open(); + if (p.params.scrollToInput && !isPopover()) { + var pageContent = p.input.parents('.content'); + if (pageContent.length === 0) return; + + var paddingTop = parseInt(pageContent.css('padding-top'), 10), + paddingBottom = parseInt(pageContent.css('padding-bottom'), 10), + pageHeight = pageContent[0].offsetHeight - paddingTop - p.container.height(), + pageScrollHeight = pageContent[0].scrollHeight - paddingTop - p.container.height(), + newPaddingBottom; + var inputTop = p.input.offset().top - paddingTop + p.input[0].offsetHeight; + if (inputTop > pageHeight) { + var scrollTop = pageContent.scrollTop() + inputTop - pageHeight; + if (scrollTop + pageHeight > pageScrollHeight) { + newPaddingBottom = scrollTop + pageHeight - pageScrollHeight + paddingBottom; + if (pageHeight === pageScrollHeight) { + newPaddingBottom = p.container.height(); + } + pageContent.css({'padding-bottom': (newPaddingBottom) + 'px'}); + } + pageContent.scrollTop(scrollTop, 300); + } + } + } + function closeOnHTMLClick(e) { + if (inPopover()) return; + if (p.input && p.input.length > 0) { + if (e.target !== p.input[0] && $(e.target).parents('.weui-picker-modal').length === 0) p.close(); + } + else { + if ($(e.target).parents('.weui-picker-modal').length === 0) p.close(); + } + } + + if (p.params.input) { + p.input = $(p.params.input); + if (p.input.length > 0) { + if (p.params.inputReadOnly) p.input.prop('readOnly', true); + if (!p.inline) { + p.input.on('click', openOnInput); + } + if (p.params.inputReadOnly) { + p.input.on('focus mousedown', function (e) { + e.preventDefault(); + }); + } + } + + } + + if (!p.inline) $('html').on('click', closeOnHTMLClick); + + // Open + function onPickerClose() { + p.opened = false; + if (p.input && p.input.length > 0) p.input.parents('.page-content').css({'padding-bottom': ''}); + if (p.params.onClose) p.params.onClose(p); + + // Destroy events + p.container.find('.picker-items-col').each(function () { + p.destroyPickerCol(this); + }); + } + + p.opened = false; + p.open = function () { + var toPopover = isPopover(); + + if (!p.opened) { + + // Layout + p.layout(); + + // Append + if (toPopover) { + p.pickerHTML = '
' + p.pickerHTML + '
'; + p.popover = $.popover(p.pickerHTML, p.params.input, true); + p.container = $(p.popover).find('.weui-picker-modal'); + $(p.popover).on('close', function () { + onPickerClose(); + }); + } + else if (p.inline) { + p.container = $(p.pickerHTML); + p.container.addClass('picker-modal-inline'); + $(p.params.container).append(p.container); + } + else { + p.container = $($.openPicker(p.pickerHTML)); + $(p.container) + .on('close', function () { + onPickerClose(); + }); + } + + // Store picker instance + p.container[0].f7Picker = p; + + // Init Events + p.container.find('.picker-items-col').each(function () { + var updateItems = true; + if ((!p.initialized && p.params.value) || (p.initialized && p.value)) updateItems = false; + p.initPickerCol(this, updateItems); + }); + + // Set value + if (!p.initialized) { + if (p.params.value) { + p.setValue(p.params.value, 0); + } + } + else { + if (p.value) p.setValue(p.value, 0); + } + } + + // Set flag + p.opened = true; + p.initialized = true; + + if (p.params.onOpen) p.params.onOpen(p); + }; + + // Close + p.close = function () { + if (!p.opened || p.inline) return; + if (inPopover()) { + $.closePicker(p.popover); + return; + } + else { + $.closePicker(p.container); + return; + } + }; + + // Destroy + p.destroy = function () { + p.close(); + if (p.params.input && p.input.length > 0) { + p.input.off('click focus', openOnInput); + } + $('html').off('click', closeOnHTMLClick); + $(window).off('resize', resizeCols); + }; + + if (p.inline) { + p.open(); + } + + return p; + }; + + $(document).on("click", ".close-picker", function() { + var pickerToClose = $('.weui-picker-modal.weui-picker-modal-visible'); + if (pickerToClose.length > 0) { + $.closePicker(pickerToClose); + } + }); + + //修复picker会滚动页面的bug + $(document).on($.touchEvents.move, ".picker-modal-inner", function(e) { + e.preventDefault(); + }); + + + $.openPicker = function(tpl) { + + var container = $("
").appendTo(document.body); + container.show(); + + container.addClass("weui-picker-container-visible"); + + //关于布局的问题,如果直接放在body上,则做动画的时候会撑开body高度而导致滚动条变化。 + var dialog = $(tpl).appendTo(container); + + dialog.show(); + + dialog.addClass("weui-picker-modal-visible"); + + return dialog; + } + + + $.closePicker = function(container) { + $(".weui-picker-modal-visible").removeClass("weui-picker-modal-visible").transitionEnd(function() { + $(this).remove(); + $(".weui-picker-container-visible").remove(); + }).trigger("close"); + + }; + $.fn.picker = function(params) { + var args = arguments; + return this.each(function() { + if(!this) return; + var $this = $(this); + + var picker = $this.data("picker"); + if(!picker) { + params = params || {}; + var inputValue = $this.val(); + if(params.value === undefined && inputValue !== "") { + params.value = params.cols.length > 1 ? inputValue.split(" ") : [inputValue]; + } + var p = $.extend({input: this}, params); + picker = new Picker(p); + $this.data("picker", picker); + } + if(typeof params === typeof "a") { + picker[params].apply(picker, Array.prototype.slice.call(args, 1)); + } + }); + }; +}($); + +/*====================================================== +************ Calendar ************ +======================================================*/ +/* global $:true */ +/*jshint unused: false*/ ++function ($) { + "use strict"; + var rtl = false; + var defaults; + var Calendar = function (params) { + var p = this; + params = params || {}; + for (var def in defaults) { + if (typeof params[def] === 'undefined') { + params[def] = defaults[def]; + } + } + p.params = params; + p.initialized = false; + + // Inline flag + p.inline = p.params.container ? true : false; + + // Is horizontal + p.isH = p.params.direction === 'horizontal'; + + // RTL inverter + var inverter = p.isH ? (rtl ? -1 : 1) : 1; + + // Animating flag + p.animating = false; + + // Should be converted to popover + function isPopover() { + var toPopover = false; + if (!p.params.convertToPopover && !p.params.onlyInPopover) return toPopover; + if (!p.inline && p.params.input) { + if (p.params.onlyInPopover) toPopover = true; + else { + if ($.device.ios) { + toPopover = $.device.ipad ? true : false; + } + else { + if ($(window).width() >= 768) toPopover = true; + } + } + } + return toPopover; + } + function inPopover() { + if (p.opened && p.container && p.container.length > 0 && p.container.parents('.popover').length > 0) return true; + else return false; + } + + // Format date + function formatDate(date) { + date = new Date(date); + var year = date.getFullYear(); + var month = date.getMonth(); + var month1 = month + 1; + var day = date.getDate(); + var weekDay = date.getDay(); + return p.params.dateFormat + .replace(/yyyy/g, year) + .replace(/yy/g, (year + '').substring(2)) + .replace(/mm/g, month1 < 10 ? '0' + month1 : month1) + .replace(/m/g, month1) + .replace(/MM/g, p.params.monthNames[month]) + .replace(/M/g, p.params.monthNamesShort[month]) + .replace(/dd/g, day < 10 ? '0' + day : day) + .replace(/d/g, day) + .replace(/DD/g, p.params.dayNames[weekDay]) + .replace(/D/g, p.params.dayNamesShort[weekDay]); + } + + + // Value + p.addValue = function (value) { + if (p.params.multiple) { + if (!p.value) p.value = []; + var inValuesIndex; + for (var i = 0; i < p.value.length; i++) { + if (new Date(value).getTime() === new Date(p.value[i]).getTime()) { + inValuesIndex = i; + } + } + if (typeof inValuesIndex === 'undefined') { + p.value.push(value); + } + else { + p.value.splice(inValuesIndex, 1); + } + p.updateValue(); + } + else { + p.value = [value]; + p.updateValue(); + } + }; + p.setValue = function (arrValues) { + p.value = arrValues; + p.updateValue(); + }; + p.updateValue = function () { + p.wrapper.find('.picker-calendar-day-selected').removeClass('picker-calendar-day-selected'); + var i, inputValue; + for (i = 0; i < p.value.length; i++) { + var valueDate = new Date(p.value[i]); + p.wrapper.find('.picker-calendar-day[data-date="' + valueDate.getFullYear() + '-' + valueDate.getMonth() + '-' + valueDate.getDate() + '"]').addClass('picker-calendar-day-selected'); + } + if (p.params.onChange) { + p.params.onChange(p, p.value, p.value.map(formatDate)); + } + if (p.input && p.input.length > 0) { + if (p.params.formatValue) inputValue = p.params.formatValue(p, p.value); + else { + inputValue = []; + for (i = 0; i < p.value.length; i++) { + inputValue.push(formatDate(p.value[i])); + } + inputValue = inputValue.join(', '); + } + $(p.input).val(inputValue); + $(p.input).trigger('change'); + } + }; + + // Columns Handlers + p.initCalendarEvents = function () { + var col; + var allowItemClick = true; + var isTouched, isMoved, touchStartX, touchStartY, touchCurrentX, touchCurrentY, touchStartTime, touchEndTime, startTranslate, currentTranslate, wrapperWidth, wrapperHeight, percentage, touchesDiff, isScrolling; + function handleTouchStart (e) { + if (isMoved || isTouched) return; + // e.preventDefault(); + isTouched = true; + var position = $.getTouchPosition(e); + touchStartX = touchCurrentY = position.x; + touchStartY = touchCurrentY = position.y; + touchStartTime = (new Date()).getTime(); + percentage = 0; + allowItemClick = true; + isScrolling = undefined; + startTranslate = currentTranslate = p.monthsTranslate; + } + function handleTouchMove (e) { + if (!isTouched) return; + var position = $.getTouchPosition(e); + touchCurrentX = position.x; + touchCurrentY = position.y; + if (typeof isScrolling === 'undefined') { + isScrolling = !!(isScrolling || Math.abs(touchCurrentY - touchStartY) > Math.abs(touchCurrentX - touchStartX)); + } + if (p.isH && isScrolling) { + isTouched = false; + return; + } + e.preventDefault(); + if (p.animating) { + isTouched = false; + return; + } + allowItemClick = false; + if (!isMoved) { + // First move + isMoved = true; + wrapperWidth = p.wrapper[0].offsetWidth; + wrapperHeight = p.wrapper[0].offsetHeight; + p.wrapper.transition(0); + } + e.preventDefault(); + + touchesDiff = p.isH ? touchCurrentX - touchStartX : touchCurrentY - touchStartY; + percentage = touchesDiff/(p.isH ? wrapperWidth : wrapperHeight); + currentTranslate = (p.monthsTranslate * inverter + percentage) * 100; + + // Transform wrapper + p.wrapper.transform('translate3d(' + (p.isH ? currentTranslate : 0) + '%, ' + (p.isH ? 0 : currentTranslate) + '%, 0)'); + + } + function handleTouchEnd (e) { + if (!isTouched || !isMoved) { + isTouched = isMoved = false; + return; + } + isTouched = isMoved = false; + + touchEndTime = new Date().getTime(); + if (touchEndTime - touchStartTime < 300) { + if (Math.abs(touchesDiff) < 10) { + p.resetMonth(); + } + else if (touchesDiff >= 10) { + if (rtl) p.nextMonth(); + else p.prevMonth(); + } + else { + if (rtl) p.prevMonth(); + else p.nextMonth(); + } + } + else { + if (percentage <= -0.5) { + if (rtl) p.prevMonth(); + else p.nextMonth(); + } + else if (percentage >= 0.5) { + if (rtl) p.nextMonth(); + else p.prevMonth(); + } + else { + p.resetMonth(); + } + } + + // Allow click + setTimeout(function () { + allowItemClick = true; + }, 100); + } + + function handleDayClick(e) { + if (!allowItemClick) return; + var day = $(e.target).parents('.picker-calendar-day'); + if (day.length === 0 && $(e.target).hasClass('picker-calendar-day')) { + day = $(e.target); + } + if (day.length === 0) return; + if (day.hasClass('picker-calendar-day-selected') && !p.params.multiple) return; + if (day.hasClass('picker-calendar-day-disabled')) return; + if (day.hasClass('picker-calendar-day-next')) p.nextMonth(); + if (day.hasClass('picker-calendar-day-prev')) p.prevMonth(); + var dateYear = day.attr('data-year'); + var dateMonth = day.attr('data-month'); + var dateDay = day.attr('data-day'); + if (p.params.onDayClick) { + p.params.onDayClick(p, day[0], dateYear, dateMonth, dateDay); + } + p.addValue(new Date(dateYear, dateMonth, dateDay).getTime()); + if (p.params.closeOnSelect) p.close(); + } + + p.container.find('.picker-calendar-prev-month').on('click', p.prevMonth); + p.container.find('.picker-calendar-next-month').on('click', p.nextMonth); + p.container.find('.picker-calendar-prev-year').on('click', p.prevYear); + p.container.find('.picker-calendar-next-year').on('click', p.nextYear); + p.wrapper.on('click', handleDayClick); + if (p.params.touchMove) { + p.wrapper.on($.touchEvents.start, handleTouchStart); + p.wrapper.on($.touchEvents.move, handleTouchMove); + p.wrapper.on($.touchEvents.end, handleTouchEnd); + } + + p.container[0].f7DestroyCalendarEvents = function () { + p.container.find('.picker-calendar-prev-month').off('click', p.prevMonth); + p.container.find('.picker-calendar-next-month').off('click', p.nextMonth); + p.container.find('.picker-calendar-prev-year').off('click', p.prevYear); + p.container.find('.picker-calendar-next-year').off('click', p.nextYear); + p.wrapper.off('click', handleDayClick); + if (p.params.touchMove) { + p.wrapper.off($.touchEvents.start, handleTouchStart); + p.wrapper.off($.touchEvents.move, handleTouchMove); + p.wrapper.off($.touchEvents.end, handleTouchEnd); + } + }; + + + }; + p.destroyCalendarEvents = function (colContainer) { + if ('f7DestroyCalendarEvents' in p.container[0]) p.container[0].f7DestroyCalendarEvents(); + }; + + // Calendar Methods + p.daysInMonth = function (date) { + var d = new Date(date); + return new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate(); + }; + p.monthHTML = function (date, offset) { + date = new Date(date); + var year = date.getFullYear(), + month = date.getMonth(), + day = date.getDate(); + if (offset === 'next') { + if (month === 11) date = new Date(year + 1, 0); + else date = new Date(year, month + 1, 1); + } + if (offset === 'prev') { + if (month === 0) date = new Date(year - 1, 11); + else date = new Date(year, month - 1, 1); + } + if (offset === 'next' || offset === 'prev') { + month = date.getMonth(); + year = date.getFullYear(); + } + var daysInPrevMonth = p.daysInMonth(new Date(date.getFullYear(), date.getMonth()).getTime() - 10 * 24 * 60 * 60 * 1000), + daysInMonth = p.daysInMonth(date), + firstDayOfMonthIndex = new Date(date.getFullYear(), date.getMonth()).getDay(); + if (firstDayOfMonthIndex === 0) firstDayOfMonthIndex = 7; + + var dayDate, currentValues = [], i, j, + rows = 6, cols = 7, + monthHTML = '', + dayIndex = 0 + (p.params.firstDay - 1), + today = new Date().setHours(0,0,0,0), + minDate = p.params.minDate ? new Date(p.params.minDate).getTime() : null, + maxDate = p.params.maxDate ? new Date(p.params.maxDate).getTime() : null; + + if (p.value && p.value.length) { + for (i = 0; i < p.value.length; i++) { + currentValues.push(new Date(p.value[i]).setHours(0,0,0,0)); + } + } + + for (i = 1; i <= rows; i++) { + var rowHTML = ''; + var row = i; + for (j = 1; j <= cols; j++) { + var col = j; + dayIndex ++; + var dayNumber = dayIndex - firstDayOfMonthIndex; + var addClass = ''; + if (dayNumber < 0) { + dayNumber = daysInPrevMonth + dayNumber + 1; + addClass += ' picker-calendar-day-prev'; + dayDate = new Date(month - 1 < 0 ? year - 1 : year, month - 1 < 0 ? 11 : month - 1, dayNumber).getTime(); + } + else { + dayNumber = dayNumber + 1; + if (dayNumber > daysInMonth) { + dayNumber = dayNumber - daysInMonth; + addClass += ' picker-calendar-day-next'; + dayDate = new Date(month + 1 > 11 ? year + 1 : year, month + 1 > 11 ? 0 : month + 1, dayNumber).getTime(); + } + else { + dayDate = new Date(year, month, dayNumber).getTime(); + } + } + // Today + if (dayDate === today) addClass += ' picker-calendar-day-today'; + // Selected + if (currentValues.indexOf(dayDate) >= 0) addClass += ' picker-calendar-day-selected'; + // Weekend + if (p.params.weekendDays.indexOf(col - 1) >= 0) { + addClass += ' picker-calendar-day-weekend'; + } + // Disabled + if ((minDate && dayDate < minDate) || (maxDate && dayDate > maxDate)) { + addClass += ' picker-calendar-day-disabled'; + } + + dayDate = new Date(dayDate); + var dayYear = dayDate.getFullYear(); + var dayMonth = dayDate.getMonth(); + rowHTML += '
'+dayNumber+'
'; + } + monthHTML += '
' + rowHTML + '
'; + } + monthHTML = '
' + monthHTML + '
'; + return monthHTML; + }; + p.animating = false; + p.updateCurrentMonthYear = function (dir) { + if (typeof dir === 'undefined') { + p.currentMonth = parseInt(p.months.eq(1).attr('data-month'), 10); + p.currentYear = parseInt(p.months.eq(1).attr('data-year'), 10); + } + else { + p.currentMonth = parseInt(p.months.eq(dir === 'next' ? (p.months.length - 1) : 0).attr('data-month'), 10); + p.currentYear = parseInt(p.months.eq(dir === 'next' ? (p.months.length - 1) : 0).attr('data-year'), 10); + } + p.container.find('.current-month-value').text(p.params.monthNames[p.currentMonth]); + p.container.find('.current-year-value').text(p.currentYear); + + }; + p.onMonthChangeStart = function (dir) { + p.updateCurrentMonthYear(dir); + p.months.removeClass('picker-calendar-month-current picker-calendar-month-prev picker-calendar-month-next'); + var currentIndex = dir === 'next' ? p.months.length - 1 : 0; + + p.months.eq(currentIndex).addClass('picker-calendar-month-current'); + p.months.eq(dir === 'next' ? currentIndex - 1 : currentIndex + 1).addClass(dir === 'next' ? 'picker-calendar-month-prev' : 'picker-calendar-month-next'); + + if (p.params.onMonthYearChangeStart) { + p.params.onMonthYearChangeStart(p, p.currentYear, p.currentMonth); + } + }; + p.onMonthChangeEnd = function (dir, rebuildBoth) { + p.animating = false; + var nextMonthHTML, prevMonthHTML, newMonthHTML; + p.wrapper.find('.picker-calendar-month:not(.picker-calendar-month-prev):not(.picker-calendar-month-current):not(.picker-calendar-month-next)').remove(); + + if (typeof dir === 'undefined') { + dir = 'next'; + rebuildBoth = true; + } + if (!rebuildBoth) { + newMonthHTML = p.monthHTML(new Date(p.currentYear, p.currentMonth), dir); + } + else { + p.wrapper.find('.picker-calendar-month-next, .picker-calendar-month-prev').remove(); + prevMonthHTML = p.monthHTML(new Date(p.currentYear, p.currentMonth), 'prev'); + nextMonthHTML = p.monthHTML(new Date(p.currentYear, p.currentMonth), 'next'); + } + if (dir === 'next' || rebuildBoth) { + p.wrapper.append(newMonthHTML || nextMonthHTML); + } + if (dir === 'prev' || rebuildBoth) { + p.wrapper.prepend(newMonthHTML || prevMonthHTML); + } + p.months = p.wrapper.find('.picker-calendar-month'); + p.setMonthsTranslate(p.monthsTranslate); + if (p.params.onMonthAdd) { + p.params.onMonthAdd(p, dir === 'next' ? p.months.eq(p.months.length - 1)[0] : p.months.eq(0)[0]); + } + if (p.params.onMonthYearChangeEnd) { + p.params.onMonthYearChangeEnd(p, p.currentYear, p.currentMonth); + } + }; + p.setMonthsTranslate = function (translate) { + translate = translate || p.monthsTranslate || 0; + if (typeof p.monthsTranslate === 'undefined') p.monthsTranslate = translate; + p.months.removeClass('picker-calendar-month-current picker-calendar-month-prev picker-calendar-month-next'); + var prevMonthTranslate = -(translate + 1) * 100 * inverter; + var currentMonthTranslate = -translate * 100 * inverter; + var nextMonthTranslate = -(translate - 1) * 100 * inverter; + p.months.eq(0).transform('translate3d(' + (p.isH ? prevMonthTranslate : 0) + '%, ' + (p.isH ? 0 : prevMonthTranslate) + '%, 0)').addClass('picker-calendar-month-prev'); + p.months.eq(1).transform('translate3d(' + (p.isH ? currentMonthTranslate : 0) + '%, ' + (p.isH ? 0 : currentMonthTranslate) + '%, 0)').addClass('picker-calendar-month-current'); + p.months.eq(2).transform('translate3d(' + (p.isH ? nextMonthTranslate : 0) + '%, ' + (p.isH ? 0 : nextMonthTranslate) + '%, 0)').addClass('picker-calendar-month-next'); + }; + p.nextMonth = function (transition) { + if (typeof transition === 'undefined' || typeof transition === 'object') { + transition = ''; + if (!p.params.animate) transition = 0; + } + var nextMonth = parseInt(p.months.eq(p.months.length - 1).attr('data-month'), 10); + var nextYear = parseInt(p.months.eq(p.months.length - 1).attr('data-year'), 10); + var nextDate = new Date(nextYear, nextMonth); + var nextDateTime = nextDate.getTime(); + var transitionEndCallback = p.animating ? false : true; + if (p.params.maxDate) { + if (nextDateTime > new Date(p.params.maxDate).getTime()) { + return p.resetMonth(); + } + } + p.monthsTranslate --; + if (nextMonth === p.currentMonth) { + var nextMonthTranslate = -(p.monthsTranslate) * 100 * inverter; + var nextMonthHTML = $(p.monthHTML(nextDateTime, 'next')).transform('translate3d(' + (p.isH ? nextMonthTranslate : 0) + '%, ' + (p.isH ? 0 : nextMonthTranslate) + '%, 0)').addClass('picker-calendar-month-next'); + p.wrapper.append(nextMonthHTML[0]); + p.months = p.wrapper.find('.picker-calendar-month'); + if (p.params.onMonthAdd) { + p.params.onMonthAdd(p, p.months.eq(p.months.length - 1)[0]); + } + } + p.animating = true; + p.onMonthChangeStart('next'); + var translate = (p.monthsTranslate * 100) * inverter; + + p.wrapper.transition(transition).transform('translate3d(' + (p.isH ? translate : 0) + '%, ' + (p.isH ? 0 : translate) + '%, 0)'); + if (transitionEndCallback) { + p.wrapper.transitionEnd(function () { + p.onMonthChangeEnd('next'); + }); + } + if (!p.params.animate) { + p.onMonthChangeEnd('next'); + } + }; + p.prevMonth = function (transition) { + if (typeof transition === 'undefined' || typeof transition === 'object') { + transition = ''; + if (!p.params.animate) transition = 0; + } + var prevMonth = parseInt(p.months.eq(0).attr('data-month'), 10); + var prevYear = parseInt(p.months.eq(0).attr('data-year'), 10); + var prevDate = new Date(prevYear, prevMonth + 1, -1); + var prevDateTime = prevDate.getTime(); + var transitionEndCallback = p.animating ? false : true; + if (p.params.minDate) { + if (prevDateTime < new Date(p.params.minDate).getTime()) { + return p.resetMonth(); + } + } + p.monthsTranslate ++; + if (prevMonth === p.currentMonth) { + var prevMonthTranslate = -(p.monthsTranslate) * 100 * inverter; + var prevMonthHTML = $(p.monthHTML(prevDateTime, 'prev')).transform('translate3d(' + (p.isH ? prevMonthTranslate : 0) + '%, ' + (p.isH ? 0 : prevMonthTranslate) + '%, 0)').addClass('picker-calendar-month-prev'); + p.wrapper.prepend(prevMonthHTML[0]); + p.months = p.wrapper.find('.picker-calendar-month'); + if (p.params.onMonthAdd) { + p.params.onMonthAdd(p, p.months.eq(0)[0]); + } + } + p.animating = true; + p.onMonthChangeStart('prev'); + var translate = (p.monthsTranslate * 100) * inverter; + p.wrapper.transition(transition).transform('translate3d(' + (p.isH ? translate : 0) + '%, ' + (p.isH ? 0 : translate) + '%, 0)'); + if (transitionEndCallback) { + p.wrapper.transitionEnd(function () { + p.onMonthChangeEnd('prev'); + }); + } + if (!p.params.animate) { + p.onMonthChangeEnd('prev'); + } + }; + p.resetMonth = function (transition) { + if (typeof transition === 'undefined') transition = ''; + var translate = (p.monthsTranslate * 100) * inverter; + p.wrapper.transition(transition).transform('translate3d(' + (p.isH ? translate : 0) + '%, ' + (p.isH ? 0 : translate) + '%, 0)'); + }; + p.setYearMonth = function (year, month, transition) { + if (typeof year === 'undefined') year = p.currentYear; + if (typeof month === 'undefined') month = p.currentMonth; + if (typeof transition === 'undefined' || typeof transition === 'object') { + transition = ''; + if (!p.params.animate) transition = 0; + } + var targetDate; + if (year < p.currentYear) { + targetDate = new Date(year, month + 1, -1).getTime(); + } + else { + targetDate = new Date(year, month).getTime(); + } + if (p.params.maxDate && targetDate > new Date(p.params.maxDate).getTime()) { + return false; + } + if (p.params.minDate && targetDate < new Date(p.params.minDate).getTime()) { + return false; + } + var currentDate = new Date(p.currentYear, p.currentMonth).getTime(); + var dir = targetDate > currentDate ? 'next' : 'prev'; + var newMonthHTML = p.monthHTML(new Date(year, month)); + p.monthsTranslate = p.monthsTranslate || 0; + var prevTranslate = p.monthsTranslate; + var monthTranslate, wrapperTranslate; + var transitionEndCallback = p.animating ? false : true; + if (targetDate > currentDate) { + // To next + p.monthsTranslate --; + if (!p.animating) p.months.eq(p.months.length - 1).remove(); + p.wrapper.append(newMonthHTML); + p.months = p.wrapper.find('.picker-calendar-month'); + monthTranslate = -(prevTranslate - 1) * 100 * inverter; + p.months.eq(p.months.length - 1).transform('translate3d(' + (p.isH ? monthTranslate : 0) + '%, ' + (p.isH ? 0 : monthTranslate) + '%, 0)').addClass('picker-calendar-month-next'); + } + else { + // To prev + p.monthsTranslate ++; + if (!p.animating) p.months.eq(0).remove(); + p.wrapper.prepend(newMonthHTML); + p.months = p.wrapper.find('.picker-calendar-month'); + monthTranslate = -(prevTranslate + 1) * 100 * inverter; + p.months.eq(0).transform('translate3d(' + (p.isH ? monthTranslate : 0) + '%, ' + (p.isH ? 0 : monthTranslate) + '%, 0)').addClass('picker-calendar-month-prev'); + } + if (p.params.onMonthAdd) { + p.params.onMonthAdd(p, dir === 'next' ? p.months.eq(p.months.length - 1)[0] : p.months.eq(0)[0]); + } + p.animating = true; + p.onMonthChangeStart(dir); + wrapperTranslate = (p.monthsTranslate * 100) * inverter; + p.wrapper.transition(transition).transform('translate3d(' + (p.isH ? wrapperTranslate : 0) + '%, ' + (p.isH ? 0 : wrapperTranslate) + '%, 0)'); + if (transitionEndCallback) { + p.wrapper.transitionEnd(function () { + p.onMonthChangeEnd(dir, true); + }); + } + if (!p.params.animate) { + p.onMonthChangeEnd(dir); + } + }; + p.nextYear = function () { + p.setYearMonth(p.currentYear + 1); + }; + p.prevYear = function () { + p.setYearMonth(p.currentYear - 1); + }; + + + // HTML Layout + p.layout = function () { + var pickerHTML = ''; + var pickerClass = ''; + var i; + + var layoutDate = p.value && p.value.length ? p.value[0] : new Date().setHours(0,0,0,0); + var prevMonthHTML = p.monthHTML(layoutDate, 'prev'); + var currentMonthHTML = p.monthHTML(layoutDate); + var nextMonthHTML = p.monthHTML(layoutDate, 'next'); + var monthsHTML = '
' + (prevMonthHTML + currentMonthHTML + nextMonthHTML) + '
'; + // Week days header + var weekHeaderHTML = ''; + if (p.params.weekHeader) { + for (i = 0; i < 7; i++) { + var weekDayIndex = (i + p.params.firstDay > 6) ? (i - 7 + p.params.firstDay) : (i + p.params.firstDay); + var dayName = p.params.dayNamesShort[weekDayIndex]; + weekHeaderHTML += '
' + dayName + '
'; + + } + weekHeaderHTML = '
' + weekHeaderHTML + '
'; + } + pickerClass = 'weui-picker-modal weui-picker-calendar ' + (p.params.cssClass || ''); + var toolbarHTML = p.params.toolbar ? p.params.toolbarTemplate.replace(/{{closeText}}/g, p.params.toolbarCloseText) : ''; + if (p.params.toolbar) { + toolbarHTML = p.params.toolbarTemplate + .replace(/{{closeText}}/g, p.params.toolbarCloseText) + .replace(/{{monthPicker}}/g, (p.params.monthPicker ? p.params.monthPickerTemplate : '')) + .replace(/{{yearPicker}}/g, (p.params.yearPicker ? p.params.yearPickerTemplate : '')); + } + + pickerHTML = + '
' + + toolbarHTML + + '
' + + weekHeaderHTML + + monthsHTML + + '
' + + '
'; + + + p.pickerHTML = pickerHTML; + }; + + // Input Events + function openOnInput(e) { + e.preventDefault(); + if (p.opened) return; + p.open(); + if (p.params.scrollToInput && !isPopover()) { + var pageContent = p.input.parents('.page-content'); + if (pageContent.length === 0) return; + + var paddingTop = parseInt(pageContent.css('padding-top'), 10), + paddingBottom = parseInt(pageContent.css('padding-bottom'), 10), + pageHeight = pageContent[0].offsetHeight - paddingTop - p.container.height(), + pageScrollHeight = pageContent[0].scrollHeight - paddingTop - p.container.height(), + newPaddingBottom; + + var inputTop = p.input.offset().top - paddingTop + p.input[0].offsetHeight; + if (inputTop > pageHeight) { + var scrollTop = pageContent.scrollTop() + inputTop - pageHeight; + if (scrollTop + pageHeight > pageScrollHeight) { + newPaddingBottom = scrollTop + pageHeight - pageScrollHeight + paddingBottom; + if (pageHeight === pageScrollHeight) { + newPaddingBottom = p.container.height(); + } + pageContent.css({'padding-bottom': (newPaddingBottom) + 'px'}); + } + pageContent.scrollTop(scrollTop, 300); + } + } + } + function closeOnHTMLClick(e) { + if (inPopover()) return; + if (p.input && p.input.length > 0) { + if (e.target !== p.input[0] && $(e.target).parents('.weui-picker-modal').length === 0) p.close(); + } + else { + if ($(e.target).parents('.weui-picker-modal').length === 0) p.close(); + } + } + + if (p.params.input) { + p.input = $(p.params.input); + if (p.input.length > 0) { + if (p.params.inputReadOnly) p.input.prop('readOnly', true); + if (!p.inline) { + p.input.on('click', openOnInput); + } + if (p.params.inputReadOnly) { + p.input.on('focus mousedown', function (e) { + e.preventDefault(); + }); + } + } + + } + + //iphone 上无法正确触发 click,会导致点击外面无法关闭 + if (!p.inline) $(document).on('click touchend', closeOnHTMLClick); + + // Open + function onPickerClose() { + p.opened = false; + if (p.input && p.input.length > 0) p.input.parents('.page-content').css({'padding-bottom': ''}); + if (p.params.onClose) p.params.onClose(p); + + // Destroy events + p.destroyCalendarEvents(); + } + + p.opened = false; + p.open = function () { + var toPopover = isPopover(); + var updateValue = false; + if (!p.opened) { + // Set date value + if (!p.value) { + if (p.params.value) { + p.value = p.params.value; + updateValue = true; + } + } + + // Layout + p.layout(); + + // Append + if (toPopover) { + p.pickerHTML = '
' + p.pickerHTML + '
'; + p.popover = $.popover(p.pickerHTML, p.params.input, true); + p.container = $(p.popover).find('.weui-picker-modal'); + $(p.popover).on('close', function () { + onPickerClose(); + }); + } + else if (p.inline) { + p.container = $(p.pickerHTML); + p.container.addClass('picker-modal-inline'); + $(p.params.container).append(p.container); + } + else { + p.container = $($.openPicker(p.pickerHTML)); + $(p.container) + .on('close', function () { + onPickerClose(); + }); + } + + // Store calendar instance + p.container[0].f7Calendar = p; + p.wrapper = p.container.find('.picker-calendar-months-wrapper'); + + // Months + p.months = p.wrapper.find('.picker-calendar-month'); + + // Update current month and year + p.updateCurrentMonthYear(); + + // Set initial translate + p.monthsTranslate = 0; + p.setMonthsTranslate(); + + // Init events + p.initCalendarEvents(); + + // Update input value + if (updateValue) p.updateValue(); + + } + + // Set flag + p.opened = true; + p.initialized = true; + if (p.params.onMonthAdd) { + p.months.each(function () { + p.params.onMonthAdd(p, this); + }); + } + if (p.params.onOpen) p.params.onOpen(p); + }; + + // Close + p.close = function () { + if (!p.opened || p.inline) return; + if (inPopover()) { + $.closePicker(p.popover); + return; + } + else { + $.closePicker(p.container); + return; + } + }; + + // Destroy + p.destroy = function () { + p.close(); + if (p.params.input && p.input.length > 0) { + p.input.off('click focus', openOnInput); + } + $('html').off('click', closeOnHTMLClick); + }; + + if (p.inline) { + p.open(); + } + + return p; + }; + + + $.fn.calendar = function (params) { + return this.each(function() { + var $this = $(this); + if(!$this[0]) return; + var p = {}; + if($this[0].tagName.toUpperCase() === "INPUT") { + p.input = $this; + } else { + p.container = $this; + } + //默认显示今天 + if(!params.value) { + var today = new Date(); + params.value = [today.getFullYear() + "-" + (today.getMonth() + 1) + "-" + today.getDate()]; + } + new Calendar($.extend(p, params)); + }); + }; + + defaults = $.fn.calendar.prototype.defaults = { + monthNames: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], + monthNamesShort: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], + dayNames: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'], + dayNamesShort: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'], + firstDay: 1, // First day of the week, Monday + weekendDays: [0, 6], // Sunday and Saturday + multiple: false, + dateFormat: 'yyyy-mm-dd', + direction: 'horizontal', // or 'vertical' + minDate: null, + maxDate: null, + touchMove: true, + animate: true, + closeOnSelect: true, + monthPicker: true, + monthPickerTemplate: + '
' + + '' + + '
' + + '' + + '
', + yearPicker: true, + yearPickerTemplate: + '
' + + '' + + '' + + '' + + '
', + weekHeader: true, + // Common settings + scrollToInput: true, + inputReadOnly: true, + convertToPopover: true, + onlyInPopover: false, + toolbar: true, + toolbarCloseText: 'Done', + toolbarTemplate: + '
' + + '
' + + '{{yearPicker}}' + + '{{monthPicker}}' + + // '{{closeText}}' + + '
' + + '
', + /* Callbacks + onMonthAdd + onChange + onOpen + onClose + onDayClick + onMonthYearChangeStart + onMonthYearChangeEnd + */ + }; + +}($); + +/* global $:true */ +/* jshint unused:false*/ + ++ function($) { + "use strict"; + + + $.fn.datetimePicker = function(params) { + return this.each(function() { + + + if(!this) return; + + var today = new Date(); + + var getDays = function(max) { + var days = []; + for(var i=1; i<= (max||31);i++) { + days.push(i < 10 ? "0"+i : i); + } + return days; + }; + + var getDaysByMonthAndYear = function(month, year) { + var int_d = new Date(year, parseInt(month)+1-1, 1); + var d = new Date(int_d - 1); + return getDays(d.getDate()); + }; + + var formatNumber = function (n) { + return n < 10 ? "0" + n : n; + }; + + var initMonthes = ('01 02 03 04 05 06 07 08 09 10 11 12').split(' '); + + var initYears = (function () { + var arr = []; + for (var i = 1950; i <= 2030; i++) { arr.push(i); } + return arr; + })(); + + + var defaults = { + + rotateEffect: false, //为了性能 + + value: [today.getFullYear(), formatNumber(today.getMonth()+1), today.getDate(), formatNumber(today.getHours()), formatNumber(today.getMinutes())], + + onChange: function (picker, values, displayValues) { + var days = getDaysByMonthAndYear(picker.cols[1].value, picker.cols[0].value); + var currentValue = picker.cols[2].value; + if(currentValue > days.length) currentValue = days.length; + picker.cols[2].setValue(currentValue); + }, + + formatValue: function (p, values, displayValues) { + return displayValues[0] + '-' + values[1] + '-' + values[2] + ' ' + values[3] + ':' + values[4]; + }, + + cols: [ + // Years + { + values: initYears + }, + // Months + { + values: initMonthes + }, + // Days + { + values: getDays() + }, + + // Space divider + { + divider: true, + content: ' ' + }, + // Hours + { + values: (function () { + var arr = []; + for (var i = 0; i <= 23; i++) { arr.push(formatNumber(i)); } + return arr; + })(), + }, + // Divider + { + divider: true, + content: ':' + }, + // Minutes + { + values: (function () { + var arr = []; + for (var i = 0; i <= 59; i++) { arr.push(formatNumber(i)); } + return arr; + })(), + } + ] + }; + + + params = params || {}; + var inputValue = $(this).val(); + if(params.value === undefined && inputValue !== "") { + params.value = [].concat(inputValue.split(" ")[0].split("-"), inputValue.split(" ")[1].split(":")); + } + + var p = $.extend(defaults, params); + $(this).picker(p); + }); + }; + + $.fn.datetimePicker.prototype.defaults = { + date: true, + time: true + } + +}($); + +/* =============================================================================== +************ Notification ************ +=============================================================================== */ +/* global $:true */ ++function ($) { + "use strict"; + + var noti, defaults, timeout, start, diffX, diffY; + + var touchStart = function(e) { + var p = $.getTouchPosition(e); + start = p; + diffX = diffY = 0; + noti.addClass("touching"); + }; + var touchMove = function(e) { + if(!start) return false; + e.preventDefault(); + e.stopPropagation(); + var p = $.getTouchPosition(e); + diffX = p.x - start.x; + diffY = p.y - start.y; + if(diffY > 0) { + diffY = Math.sqrt(diffY); + } + + noti.css("transform", "translate3d(0, "+diffY+"px, 0)"); + }; + var touchEnd = function() { + noti.removeClass("touching"); + noti.attr("style", ""); + if(diffY < 0 && (Math.abs(diffY) > noti.height()*0.38)) { + $.closeNotification(); + } + + if(Math.abs(diffX) <= 1 && Math.abs(diffY) <= 1) { + noti.trigger("noti-click"); + } + + start = false; + }; + + var attachEvents = function(el) { + el.on($.touchEvents.start, touchStart); + el.on($.touchEvents.move, touchMove); + el.on($.touchEvents.end, touchEnd); + }; + + $.notification = $.noti = function(params) { + params = $.extend({}, defaults, params); + noti = $(".notification"); + if(!noti[0]) { // create a new notification + noti = $('
').appendTo(document.body); + attachEvents(noti); + } + + noti.off("noti-click"); //the click event is not correct sometime: it will trigger when user is draging. + if(params.onClick) noti.on("noti-click", function() { + params.onClick(params.data); + }); + + noti.html($.t7.compile(params.tpl)(params)); + + noti.show(); + + noti.addClass("notification-in"); + noti.data("params", params); + + var startTimeout = function() { + if(timeout) { + clearTimeout(timeout); + timeout = null; + } + + timeout = setTimeout(function() { + if(noti.hasClass("touching")) { + startTimeout(); + } else { + $.closeNotification(); + } + }, params.time); + }; + + startTimeout(); + + }; + + $.closeNotification = function() { + timeout && clearTimeout(timeout); + timeout = null; + var noti = $(".notification").removeClass("notification-in").transitionEnd(function() { + $(this).remove(); + }); + + if(noti[0]) { + var params = $(".notification").data("params"); + if(params && params.onClose) { + params.onClose(params.data); + } + } + }; + + defaults = $.noti.prototype.defaults = { + title: undefined, + text: undefined, + media: undefined, + time: 4000, + onClick: undefined, + onClose: undefined, + data: undefined, + tpl: '
' + + '{{#if media}}
{{media}}
{{/if}}' + + '
' + + '{{#if title}}
{{title}}
{{/if}}' + + '{{#if text}}
{{text}}
{{/if}}' + + '
' + + '
' + + '
' + }; + +}($); diff --git a/src/main/webapp/js/laytpl.js b/src/main/webapp/js/laytpl.js new file mode 100644 index 0000000..016e5bb --- /dev/null +++ b/src/main/webapp/js/laytpl.js @@ -0,0 +1,9 @@ +/** + + @Name:laytpl-v1.1 精妙的js模板引擎 + @Author:贤心 - 2014-08-16 + @Site:http://sentsin.com/layui/laytpl + @License:MIT license + */ + +;!function(){"use strict";var f,b={open:"{{",close:"}}"},c={exp:function(a){return new RegExp(a,"g")},query:function(a,c,e){var f=["#([\\s\\S])+?","([^{#}])*?"][a||0];return d((c||"")+b.open+f+b.close+(e||""))},escape:function(a){return String(a||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(a,b){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+a+"\n"+(b||"")),c+a}},d=c.exp,e=function(a){this.tpl=a};e.pt=e.prototype,e.pt.parse=function(a,e){var f=this,g=a,h=d("^"+b.open+"#",""),i=d(b.close+"$","");a=a.replace(/[\r\t\n]/g," ").replace(d(b.open+"#"),b.open+"# ").replace(d(b.close+"}"),"} "+b.close).replace(/\\/g,"\\\\").replace(/(?="|')/g,"\\").replace(c.query(),function(a){return a=a.replace(h,"").replace(i,""),'";'+a.replace(/\\/g,"")+'; view+="'}).replace(c.query(1),function(a){var c='"+(';return a.replace(/\s/g,"")===b.open+b.close?"":(a=a.replace(d(b.open+"|"+b.close),""),/^=/.test(a)&&(a=a.replace(/^=/,""),c='"+_escape_('),c+a.replace(/\\/g,"")+')+"')}),a='"use strict";var view = "'+a+'";return view;';try{return f.cache=a=new Function("d, _escape_",a),a(e,c.escape)}catch(j){return delete f.cache,c.error(j,g)}},e.pt.render=function(a,b){var e,d=this;return a?(e=d.cache?d.cache(a,c.escape):d.parse(d.tpl,a),b?(b(e),void 0):e):c.error("no data")},f=function(a){return"string"!=typeof a?c.error("Template not found"):new e(a)},f.config=function(a){a=a||{};for(var c in a)b[c]=a[c]},f.v="1.1","function"==typeof define?define(function(){return f}):"undefined"!=typeof exports?module.exports=f:window.laytpl=f}(); \ No newline at end of file diff --git a/src/main/webapp/js/moment.min.js b/src/main/webapp/js/moment.min.js new file mode 100644 index 0000000..caaf8b3 --- /dev/null +++ b/src/main/webapp/js/moment.min.js @@ -0,0 +1,7 @@ +//! moment.js +//! version : 2.11.2 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com +!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.moment=b()}(this,function(){"use strict";function a(){return Uc.apply(null,arguments)}function b(a){Uc=a}function c(a){return"[object Array]"===Object.prototype.toString.call(a)}function d(a){return a instanceof Date||"[object Date]"===Object.prototype.toString.call(a)}function e(a,b){var c,d=[];for(c=0;c0)for(c in Wc)d=Wc[c],e=b[d],m(e)||(a[d]=e);return a}function o(b){n(this,b),this._d=new Date(null!=b._d?b._d.getTime():NaN),Xc===!1&&(Xc=!0,a.updateOffset(this),Xc=!1)}function p(a){return a instanceof o||null!=a&&null!=a._isAMomentObject}function q(a){return 0>a?Math.ceil(a):Math.floor(a)}function r(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=q(b)),c}function s(a,b,c){var d,e=Math.min(a.length,b.length),f=Math.abs(a.length-b.length),g=0;for(d=0;e>d;d++)(c&&a[d]!==b[d]||!c&&r(a[d])!==r(b[d]))&&g++;return g+f}function t(){}function u(a){return a?a.toLowerCase().replace("_","-"):a}function v(a){for(var b,c,d,e,f=0;f0;){if(d=w(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&s(e,c,!0)>=b-1)break;b--}f++}return null}function w(a){var b=null;if(!Yc[a]&&"undefined"!=typeof module&&module&&module.exports)try{b=Vc._abbr,require("./locale/"+a),x(b)}catch(c){}return Yc[a]}function x(a,b){var c;return a&&(c=m(b)?z(a):y(a,b),c&&(Vc=c)),Vc._abbr}function y(a,b){return null!==b?(b.abbr=a,Yc[a]=Yc[a]||new t,Yc[a].set(b),x(a),Yc[a]):(delete Yc[a],null)}function z(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return Vc;if(!c(a)){if(b=w(a))return b;a=[a]}return v(a)}function A(a,b){var c=a.toLowerCase();Zc[c]=Zc[c+"s"]=Zc[b]=a}function B(a){return"string"==typeof a?Zc[a]||Zc[a.toLowerCase()]:void 0}function C(a){var b,c,d={};for(c in a)f(a,c)&&(b=B(c),b&&(d[b]=a[c]));return d}function D(a){return a instanceof Function||"[object Function]"===Object.prototype.toString.call(a)}function E(b,c){return function(d){return null!=d?(G(this,b,d),a.updateOffset(this,c),this):F(this,b)}}function F(a,b){return a.isValid()?a._d["get"+(a._isUTC?"UTC":"")+b]():NaN}function G(a,b,c){a.isValid()&&a._d["set"+(a._isUTC?"UTC":"")+b](c)}function H(a,b){var c;if("object"==typeof a)for(c in a)this.set(c,a[c]);else if(a=B(a),D(this[a]))return this[a](b);return this}function I(a,b,c){var d=""+Math.abs(a),e=b-d.length,f=a>=0;return(f?c?"+":"":"-")+Math.pow(10,Math.max(0,e)).toString().substr(1)+d}function J(a,b,c,d){var e=d;"string"==typeof d&&(e=function(){return this[d]()}),a&&(bd[a]=e),b&&(bd[b[0]]=function(){return I(e.apply(this,arguments),b[1],b[2])}),c&&(bd[c]=function(){return this.localeData().ordinal(e.apply(this,arguments),a)})}function K(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function L(a){var b,c,d=a.match($c);for(b=0,c=d.length;c>b;b++)bd[d[b]]?d[b]=bd[d[b]]:d[b]=K(d[b]);return function(e){var f="";for(b=0;c>b;b++)f+=d[b]instanceof Function?d[b].call(e,a):d[b];return f}}function M(a,b){return a.isValid()?(b=N(b,a.localeData()),ad[b]=ad[b]||L(b),ad[b](a)):a.localeData().invalidDate()}function N(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(_c.lastIndex=0;d>=0&&_c.test(a);)a=a.replace(_c,c),_c.lastIndex=0,d-=1;return a}function O(a,b,c){td[a]=D(b)?b:function(a,d){return a&&c?c:b}}function P(a,b){return f(td,a)?td[a](b._strict,b._locale):new RegExp(Q(a))}function Q(a){return R(a.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e}))}function R(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function S(a,b){var c,d=b;for("string"==typeof a&&(a=[a]),"number"==typeof b&&(d=function(a,c){c[b]=r(a)}),c=0;cd;d++){if(e=h([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}}function Z(a,b){var c;return a.isValid()?"string"==typeof b&&(b=a.localeData().monthsParse(b),"number"!=typeof b)?a:(c=Math.min(a.date(),V(a.year(),b)),a._d["set"+(a._isUTC?"UTC":"")+"Month"](b,c),a):a}function $(b){return null!=b?(Z(this,b),a.updateOffset(this,!0),this):F(this,"Month")}function _(){return V(this.year(),this.month())}function aa(a){return this._monthsParseExact?(f(this,"_monthsRegex")||ca.call(this),a?this._monthsShortStrictRegex:this._monthsShortRegex):this._monthsShortStrictRegex&&a?this._monthsShortStrictRegex:this._monthsShortRegex}function ba(a){return this._monthsParseExact?(f(this,"_monthsRegex")||ca.call(this),a?this._monthsStrictRegex:this._monthsRegex):this._monthsStrictRegex&&a?this._monthsStrictRegex:this._monthsRegex}function ca(){function a(a,b){return b.length-a.length}var b,c,d=[],e=[],f=[];for(b=0;12>b;b++)c=h([2e3,b]),d.push(this.monthsShort(c,"")),e.push(this.months(c,"")),f.push(this.months(c,"")),f.push(this.monthsShort(c,""));for(d.sort(a),e.sort(a),f.sort(a),b=0;12>b;b++)d[b]=R(d[b]),e[b]=R(e[b]),f[b]=R(f[b]);this._monthsRegex=new RegExp("^("+f.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+e.join("|")+")$","i"),this._monthsShortStrictRegex=new RegExp("^("+d.join("|")+")$","i")}function da(a){var b,c=a._a;return c&&-2===j(a).overflow&&(b=c[wd]<0||c[wd]>11?wd:c[xd]<1||c[xd]>V(c[vd],c[wd])?xd:c[yd]<0||c[yd]>24||24===c[yd]&&(0!==c[zd]||0!==c[Ad]||0!==c[Bd])?yd:c[zd]<0||c[zd]>59?zd:c[Ad]<0||c[Ad]>59?Ad:c[Bd]<0||c[Bd]>999?Bd:-1,j(a)._overflowDayOfYear&&(vd>b||b>xd)&&(b=xd),j(a)._overflowWeeks&&-1===b&&(b=Cd),j(a)._overflowWeekday&&-1===b&&(b=Dd),j(a).overflow=b),a}function ea(b){a.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+b)}function fa(a,b){var c=!0;return g(function(){return c&&(ea(a+"\nArguments: "+Array.prototype.slice.call(arguments).join(", ")+"\n"+(new Error).stack),c=!1),b.apply(this,arguments)},b)}function ga(a,b){Jd[a]||(ea(b),Jd[a]=!0)}function ha(a){var b,c,d,e,f,g,h=a._i,i=Kd.exec(h)||Ld.exec(h);if(i){for(j(a).iso=!0,b=0,c=Nd.length;c>b;b++)if(Nd[b][1].exec(i[1])){e=Nd[b][0],d=Nd[b][2]!==!1;break}if(null==e)return void(a._isValid=!1);if(i[3]){for(b=0,c=Od.length;c>b;b++)if(Od[b][1].exec(i[3])){f=(i[2]||" ")+Od[b][0];break}if(null==f)return void(a._isValid=!1)}if(!d&&null!=f)return void(a._isValid=!1);if(i[4]){if(!Md.exec(i[4]))return void(a._isValid=!1);g="Z"}a._f=e+(f||"")+(g||""),wa(a)}else a._isValid=!1}function ia(b){var c=Pd.exec(b._i);return null!==c?void(b._d=new Date(+c[1])):(ha(b),void(b._isValid===!1&&(delete b._isValid,a.createFromInputFallback(b))))}function ja(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return 100>a&&a>=0&&isFinite(h.getFullYear())&&h.setFullYear(a),h}function ka(a){var b=new Date(Date.UTC.apply(null,arguments));return 100>a&&a>=0&&isFinite(b.getUTCFullYear())&&b.setUTCFullYear(a),b}function la(a){return ma(a)?366:365}function ma(a){return a%4===0&&a%100!==0||a%400===0}function na(){return ma(this.year())}function oa(a,b,c){var d=7+b-c,e=(7+ka(a,0,d).getUTCDay()-b)%7;return-e+d-1}function pa(a,b,c,d,e){var f,g,h=(7+c-d)%7,i=oa(a,d,e),j=1+7*(b-1)+h+i;return 0>=j?(f=a-1,g=la(f)+j):j>la(a)?(f=a+1,g=j-la(a)):(f=a,g=j),{year:f,dayOfYear:g}}function qa(a,b,c){var d,e,f=oa(a.year(),b,c),g=Math.floor((a.dayOfYear()-f-1)/7)+1;return 1>g?(e=a.year()-1,d=g+ra(e,b,c)):g>ra(a.year(),b,c)?(d=g-ra(a.year(),b,c),e=a.year()+1):(e=a.year(),d=g),{week:d,year:e}}function ra(a,b,c){var d=oa(a,b,c),e=oa(a+1,b,c);return(la(a)-d+e)/7}function sa(a,b,c){return null!=a?a:null!=b?b:c}function ta(b){var c=new Date(a.now());return b._useUTC?[c.getUTCFullYear(),c.getUTCMonth(),c.getUTCDate()]:[c.getFullYear(),c.getMonth(),c.getDate()]}function ua(a){var b,c,d,e,f=[];if(!a._d){for(d=ta(a),a._w&&null==a._a[xd]&&null==a._a[wd]&&va(a),a._dayOfYear&&(e=sa(a._a[vd],d[vd]),a._dayOfYear>la(e)&&(j(a)._overflowDayOfYear=!0),c=ka(e,0,a._dayOfYear),a._a[wd]=c.getUTCMonth(),a._a[xd]=c.getUTCDate()),b=0;3>b&&null==a._a[b];++b)a._a[b]=f[b]=d[b];for(;7>b;b++)a._a[b]=f[b]=null==a._a[b]?2===b?1:0:a._a[b];24===a._a[yd]&&0===a._a[zd]&&0===a._a[Ad]&&0===a._a[Bd]&&(a._nextDay=!0,a._a[yd]=0),a._d=(a._useUTC?ka:ja).apply(null,f),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[yd]=24)}}function va(a){var b,c,d,e,f,g,h,i;b=a._w,null!=b.GG||null!=b.W||null!=b.E?(f=1,g=4,c=sa(b.GG,a._a[vd],qa(Ea(),1,4).year),d=sa(b.W,1),e=sa(b.E,1),(1>e||e>7)&&(i=!0)):(f=a._locale._week.dow,g=a._locale._week.doy,c=sa(b.gg,a._a[vd],qa(Ea(),f,g).year),d=sa(b.w,1),null!=b.d?(e=b.d,(0>e||e>6)&&(i=!0)):null!=b.e?(e=b.e+f,(b.e<0||b.e>6)&&(i=!0)):e=f),1>d||d>ra(c,f,g)?j(a)._overflowWeeks=!0:null!=i?j(a)._overflowWeekday=!0:(h=pa(c,d,e,f,g),a._a[vd]=h.year,a._dayOfYear=h.dayOfYear)}function wa(b){if(b._f===a.ISO_8601)return void ha(b);b._a=[],j(b).empty=!0;var c,d,e,f,g,h=""+b._i,i=h.length,k=0;for(e=N(b._f,b._locale).match($c)||[],c=0;c0&&j(b).unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),k+=d.length),bd[f]?(d?j(b).empty=!1:j(b).unusedTokens.push(f),U(f,d,b)):b._strict&&!d&&j(b).unusedTokens.push(f);j(b).charsLeftOver=i-k,h.length>0&&j(b).unusedInput.push(h),j(b).bigHour===!0&&b._a[yd]<=12&&b._a[yd]>0&&(j(b).bigHour=void 0),b._a[yd]=xa(b._locale,b._a[yd],b._meridiem),ua(b),da(b)}function xa(a,b,c){var d;return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&12>b&&(b+=12),d||12!==b||(b=0),b):b}function ya(a){var b,c,d,e,f;if(0===a._f.length)return j(a).invalidFormat=!0,void(a._d=new Date(NaN));for(e=0;ef)&&(d=f,c=b));g(a,c||b)}function za(a){if(!a._d){var b=C(a._i);a._a=e([b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],function(a){return a&&parseInt(a,10)}),ua(a)}}function Aa(a){var b=new o(da(Ba(a)));return b._nextDay&&(b.add(1,"d"),b._nextDay=void 0),b}function Ba(a){var b=a._i,e=a._f;return a._locale=a._locale||z(a._l),null===b||void 0===e&&""===b?l({nullInput:!0}):("string"==typeof b&&(a._i=b=a._locale.preparse(b)),p(b)?new o(da(b)):(c(e)?ya(a):e?wa(a):d(b)?a._d=b:Ca(a),k(a)||(a._d=null),a))}function Ca(b){var f=b._i;void 0===f?b._d=new Date(a.now()):d(f)?b._d=new Date(+f):"string"==typeof f?ia(b):c(f)?(b._a=e(f.slice(0),function(a){return parseInt(a,10)}),ua(b)):"object"==typeof f?za(b):"number"==typeof f?b._d=new Date(f):a.createFromInputFallback(b)}function Da(a,b,c,d,e){var f={};return"boolean"==typeof c&&(d=c,c=void 0),f._isAMomentObject=!0,f._useUTC=f._isUTC=e,f._l=c,f._i=a,f._f=b,f._strict=d,Aa(f)}function Ea(a,b,c,d){return Da(a,b,c,d,!1)}function Fa(a,b){var d,e;if(1===b.length&&c(b[0])&&(b=b[0]),!b.length)return Ea();for(d=b[0],e=1;ea&&(a=-a,c="-"),c+I(~~(a/60),2)+b+I(~~a%60,2)})}function La(a,b){var c=(b||"").match(a)||[],d=c[c.length-1]||[],e=(d+"").match(Ud)||["-",0,0],f=+(60*e[1])+r(e[2]);return"+"===e[0]?f:-f}function Ma(b,c){var e,f;return c._isUTC?(e=c.clone(),f=(p(b)||d(b)?+b:+Ea(b))-+e,e._d.setTime(+e._d+f),a.updateOffset(e,!1),e):Ea(b).local()}function Na(a){return 15*-Math.round(a._d.getTimezoneOffset()/15)}function Oa(b,c){var d,e=this._offset||0;return this.isValid()?null!=b?("string"==typeof b?b=La(qd,b):Math.abs(b)<16&&(b=60*b),!this._isUTC&&c&&(d=Na(this)),this._offset=b,this._isUTC=!0,null!=d&&this.add(d,"m"),e!==b&&(!c||this._changeInProgress?cb(this,Za(b-e,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?e:Na(this):null!=b?this:NaN}function Pa(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}function Qa(a){return this.utcOffset(0,a)}function Ra(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(Na(this),"m")),this}function Sa(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(La(pd,this._i)),this}function Ta(a){return this.isValid()?(a=a?Ea(a).utcOffset():0,(this.utcOffset()-a)%60===0):!1}function Ua(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Va(){if(!m(this._isDSTShifted))return this._isDSTShifted;var a={};if(n(a,this),a=Ba(a),a._a){var b=a._isUTC?h(a._a):Ea(a._a);this._isDSTShifted=this.isValid()&&s(a._a,b.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function Wa(){return this.isValid()?!this._isUTC:!1}function Xa(){return this.isValid()?this._isUTC:!1}function Ya(){return this.isValid()?this._isUTC&&0===this._offset:!1}function Za(a,b){var c,d,e,g=a,h=null;return Ja(a)?g={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(g={},b?g[b]=a:g.milliseconds=a):(h=Vd.exec(a))?(c="-"===h[1]?-1:1,g={y:0,d:r(h[xd])*c,h:r(h[yd])*c,m:r(h[zd])*c,s:r(h[Ad])*c,ms:r(h[Bd])*c}):(h=Wd.exec(a))?(c="-"===h[1]?-1:1,g={y:$a(h[2],c),M:$a(h[3],c),d:$a(h[4],c),h:$a(h[5],c),m:$a(h[6],c),s:$a(h[7],c),w:$a(h[8],c)}):null==g?g={}:"object"==typeof g&&("from"in g||"to"in g)&&(e=ab(Ea(g.from),Ea(g.to)),g={},g.ms=e.milliseconds,g.M=e.months),d=new Ia(g),Ja(a)&&f(a,"_locale")&&(d._locale=a._locale),d}function $a(a,b){var c=a&&parseFloat(a.replace(",","."));return(isNaN(c)?0:c)*b}function _a(a,b){var c={milliseconds:0,months:0};return c.months=b.month()-a.month()+12*(b.year()-a.year()),a.clone().add(c.months,"M").isAfter(b)&&--c.months,c.milliseconds=+b-+a.clone().add(c.months,"M"),c}function ab(a,b){var c;return a.isValid()&&b.isValid()?(b=Ma(b,a),a.isBefore(b)?c=_a(a,b):(c=_a(b,a),c.milliseconds=-c.milliseconds,c.months=-c.months),c):{milliseconds:0,months:0}}function bb(a,b){return function(c,d){var e,f;return null===d||isNaN(+d)||(ga(b,"moment()."+b+"(period, number) is deprecated. Please use moment()."+b+"(number, period)."),f=c,c=d,d=f),c="string"==typeof c?+c:c,e=Za(c,d),cb(this,e,a),this}}function cb(b,c,d,e){var f=c._milliseconds,g=c._days,h=c._months;b.isValid()&&(e=null==e?!0:e,f&&b._d.setTime(+b._d+f*d),g&&G(b,"Date",F(b,"Date")+g*d),h&&Z(b,F(b,"Month")+h*d),e&&a.updateOffset(b,g||h))}function db(a,b){var c=a||Ea(),d=Ma(c,this).startOf("day"),e=this.diff(d,"days",!0),f=-6>e?"sameElse":-1>e?"lastWeek":0>e?"lastDay":1>e?"sameDay":2>e?"nextDay":7>e?"nextWeek":"sameElse",g=b&&(D(b[f])?b[f]():b[f]);return this.format(g||this.localeData().calendar(f,this,Ea(c)))}function eb(){return new o(this)}function fb(a,b){var c=p(a)?a:Ea(a);return this.isValid()&&c.isValid()?(b=B(m(b)?"millisecond":b),"millisecond"===b?+this>+c:+c<+this.clone().startOf(b)):!1}function gb(a,b){var c=p(a)?a:Ea(a);return this.isValid()&&c.isValid()?(b=B(m(b)?"millisecond":b),"millisecond"===b?+c>+this:+this.clone().endOf(b)<+c):!1}function hb(a,b,c){return this.isAfter(a,c)&&this.isBefore(b,c)}function ib(a,b){var c,d=p(a)?a:Ea(a);return this.isValid()&&d.isValid()?(b=B(b||"millisecond"),"millisecond"===b?+this===+d:(c=+d,+this.clone().startOf(b)<=c&&c<=+this.clone().endOf(b))):!1}function jb(a,b){return this.isSame(a,b)||this.isAfter(a,b)}function kb(a,b){return this.isSame(a,b)||this.isBefore(a,b)}function lb(a,b,c){var d,e,f,g;return this.isValid()?(d=Ma(a,this),d.isValid()?(e=6e4*(d.utcOffset()-this.utcOffset()),b=B(b),"year"===b||"month"===b||"quarter"===b?(g=mb(this,d),"quarter"===b?g/=3:"year"===b&&(g/=12)):(f=this-d,g="second"===b?f/1e3:"minute"===b?f/6e4:"hour"===b?f/36e5:"day"===b?(f-e)/864e5:"week"===b?(f-e)/6048e5:f),c?g:q(g)):NaN):NaN}function mb(a,b){var c,d,e=12*(b.year()-a.year())+(b.month()-a.month()),f=a.clone().add(e,"months");return 0>b-f?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)}function nb(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function ob(){var a=this.clone().utc();return 0f&&(b=f),Ob.call(this,a,b,c,d,e))}function Ob(a,b,c,d,e){var f=pa(a,b,c,d,e),g=ka(f.year,0,f.dayOfYear);return this.year(g.getUTCFullYear()),this.month(g.getUTCMonth()),this.date(g.getUTCDate()),this}function Pb(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)}function Qb(a){return qa(a,this._week.dow,this._week.doy).week}function Rb(){return this._week.dow}function Sb(){return this._week.doy}function Tb(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")}function Ub(a){var b=qa(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")}function Vb(a,b){return"string"!=typeof a?a:isNaN(a)?(a=b.weekdaysParse(a),"number"==typeof a?a:null):parseInt(a,10)}function Wb(a,b){return c(this._weekdays)?this._weekdays[a.day()]:this._weekdays[this._weekdays.isFormat.test(b)?"format":"standalone"][a.day()]}function Xb(a){return this._weekdaysShort[a.day()]}function Yb(a){return this._weekdaysMin[a.day()]}function Zb(a,b,c){var d,e,f;for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),d=0;7>d;d++){if(e=Ea([2e3,1]).day(d),c&&!this._fullWeekdaysParse[d]&&(this._fullWeekdaysParse[d]=new RegExp("^"+this.weekdays(e,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[d]=new RegExp("^"+this.weekdaysShort(e,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[d]=new RegExp("^"+this.weekdaysMin(e,"").replace(".",".?")+"$","i")),this._weekdaysParse[d]||(f="^"+this.weekdays(e,"")+"|^"+this.weekdaysShort(e,"")+"|^"+this.weekdaysMin(e,""),this._weekdaysParse[d]=new RegExp(f.replace(".",""),"i")),c&&"dddd"===b&&this._fullWeekdaysParse[d].test(a))return d;if(c&&"ddd"===b&&this._shortWeekdaysParse[d].test(a))return d;if(c&&"dd"===b&&this._minWeekdaysParse[d].test(a))return d;if(!c&&this._weekdaysParse[d].test(a))return d}}function $b(a){if(!this.isValid())return null!=a?this:NaN;var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=Vb(a,this.localeData()),this.add(a-b,"d")):b}function _b(a){if(!this.isValid())return null!=a?this:NaN;var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")}function ac(a){return this.isValid()?null==a?this.day()||7:this.day(this.day()%7?a:a-7):null!=a?this:NaN}function bc(a){var b=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")}function cc(){return this.hours()%12||12}function dc(a,b){J(a,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),b)})}function ec(a,b){return b._meridiemParse}function fc(a){return"p"===(a+"").toLowerCase().charAt(0)}function gc(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"}function hc(a,b){b[Bd]=r(1e3*("0."+a))}function ic(){return this._isUTC?"UTC":""}function jc(){return this._isUTC?"Coordinated Universal Time":""}function kc(a){return Ea(1e3*a)}function lc(){return Ea.apply(null,arguments).parseZone()}function mc(a,b,c){var d=this._calendar[a];return D(d)?d.call(b,c):d}function nc(a){var b=this._longDateFormat[a],c=this._longDateFormat[a.toUpperCase()];return b||!c?b:(this._longDateFormat[a]=c.replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a])}function oc(){return this._invalidDate}function pc(a){return this._ordinal.replace("%d",a)}function qc(a){return a}function rc(a,b,c,d){var e=this._relativeTime[c];return D(e)?e(a,b,c,d):e.replace(/%d/i,a)}function sc(a,b){var c=this._relativeTime[a>0?"future":"past"];return D(c)?c(b):c.replace(/%s/i,b)}function tc(a){var b,c;for(c in a)b=a[c],D(b)?this[c]=b:this["_"+c]=b;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)}function uc(a,b,c,d){var e=z(),f=h().set(d,b);return e[c](f,a)}function vc(a,b,c,d,e){if("number"==typeof a&&(b=a,a=void 0),a=a||"",null!=b)return uc(a,b,c,e);var f,g=[];for(f=0;d>f;f++)g[f]=uc(a,f,c,e);return g}function wc(a,b){return vc(a,b,"months",12,"month")}function xc(a,b){return vc(a,b,"monthsShort",12,"month")}function yc(a,b){return vc(a,b,"weekdays",7,"day")}function zc(a,b){return vc(a,b,"weekdaysShort",7,"day")}function Ac(a,b){return vc(a,b,"weekdaysMin",7,"day")}function Bc(){var a=this._data;return this._milliseconds=se(this._milliseconds),this._days=se(this._days),this._months=se(this._months),a.milliseconds=se(a.milliseconds),a.seconds=se(a.seconds),a.minutes=se(a.minutes),a.hours=se(a.hours),a.months=se(a.months),a.years=se(a.years),this}function Cc(a,b,c,d){var e=Za(b,c);return a._milliseconds+=d*e._milliseconds,a._days+=d*e._days,a._months+=d*e._months,a._bubble()}function Dc(a,b){return Cc(this,a,b,1)}function Ec(a,b){return Cc(this,a,b,-1)}function Fc(a){return 0>a?Math.floor(a):Math.ceil(a)}function Gc(){var a,b,c,d,e,f=this._milliseconds,g=this._days,h=this._months,i=this._data;return f>=0&&g>=0&&h>=0||0>=f&&0>=g&&0>=h||(f+=864e5*Fc(Ic(h)+g),g=0,h=0),i.milliseconds=f%1e3,a=q(f/1e3),i.seconds=a%60,b=q(a/60),i.minutes=b%60,c=q(b/60),i.hours=c%24,g+=q(c/24),e=q(Hc(g)),h+=e,g-=Fc(Ic(e)),d=q(h/12),h%=12,i.days=g,i.months=h,i.years=d,this}function Hc(a){return 4800*a/146097}function Ic(a){return 146097*a/4800}function Jc(a){var b,c,d=this._milliseconds;if(a=B(a),"month"===a||"year"===a)return b=this._days+d/864e5,c=this._months+Hc(b),"month"===a?c:c/12;switch(b=this._days+Math.round(Ic(this._months)),a){case"week":return b/7+d/6048e5;case"day":return b+d/864e5;case"hour":return 24*b+d/36e5;case"minute":return 1440*b+d/6e4;case"second":return 86400*b+d/1e3;case"millisecond":return Math.floor(864e5*b)+d;default:throw new Error("Unknown unit "+a)}}function Kc(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*r(this._months/12)}function Lc(a){return function(){return this.as(a)}}function Mc(a){return a=B(a),this[a+"s"]()}function Nc(a){return function(){return this._data[a]}}function Oc(){return q(this.days()/7)}function Pc(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function Qc(a,b,c){var d=Za(a).abs(),e=Ie(d.as("s")),f=Ie(d.as("m")),g=Ie(d.as("h")),h=Ie(d.as("d")),i=Ie(d.as("M")),j=Ie(d.as("y")),k=e=f&&["m"]||f=g&&["h"]||g=h&&["d"]||h=i&&["M"]||i=j&&["y"]||["yy",j];return k[2]=b,k[3]=+a>0,k[4]=c,Pc.apply(null,k)}function Rc(a,b){return void 0===Je[a]?!1:void 0===b?Je[a]:(Je[a]=b,!0)}function Sc(a){var b=this.localeData(),c=Qc(this,!a,b);return a&&(c=b.pastFuture(+this,c)),b.postformat(c)}function Tc(){var a,b,c,d=Ke(this._milliseconds)/1e3,e=Ke(this._days),f=Ke(this._months);a=q(d/60),b=q(a/60),d%=60,a%=60,c=q(f/12),f%=12;var g=c,h=f,i=e,j=b,k=a,l=d,m=this.asSeconds();return m?(0>m?"-":"")+"P"+(g?g+"Y":"")+(h?h+"M":"")+(i?i+"D":"")+(j||k||l?"T":"")+(j?j+"H":"")+(k?k+"M":"")+(l?l+"S":""):"P0D"}var Uc,Vc,Wc=a.momentProperties=[],Xc=!1,Yc={},Zc={},$c=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,_c=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,ad={},bd={},cd=/\d/,dd=/\d\d/,ed=/\d{3}/,fd=/\d{4}/,gd=/[+-]?\d{6}/,hd=/\d\d?/,id=/\d\d\d\d?/,jd=/\d\d\d\d\d\d?/,kd=/\d{1,3}/,ld=/\d{1,4}/,md=/[+-]?\d{1,6}/,nd=/\d+/,od=/[+-]?\d+/,pd=/Z|[+-]\d\d:?\d\d/gi,qd=/Z|[+-]\d\d(?::?\d\d)?/gi,rd=/[+-]?\d+(\.\d{1,3})?/,sd=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,td={},ud={},vd=0,wd=1,xd=2,yd=3,zd=4,Ad=5,Bd=6,Cd=7,Dd=8;J("M",["MM",2],"Mo",function(){return this.month()+1}),J("MMM",0,0,function(a){return this.localeData().monthsShort(this,a)}),J("MMMM",0,0,function(a){return this.localeData().months(this,a)}),A("month","M"),O("M",hd),O("MM",hd,dd),O("MMM",function(a,b){return b.monthsShortRegex(a)}),O("MMMM",function(a,b){return b.monthsRegex(a)}),S(["M","MM"],function(a,b){b[wd]=r(a)-1}),S(["MMM","MMMM"],function(a,b,c,d){var e=c._locale.monthsParse(a,d,c._strict);null!=e?b[wd]=e:j(c).invalidMonth=a});var Ed=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/,Fd="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),Gd="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),Hd=sd,Id=sd,Jd={};a.suppressDeprecationWarnings=!1;var Kd=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/,Ld=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/,Md=/Z|[+-]\d\d(?::?\d\d)?/,Nd=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Od=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Pd=/^\/?Date\((\-?\d+)/i;a.createFromInputFallback=fa("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),J("Y",0,0,function(){var a=this.year();return 9999>=a?""+a:"+"+a}),J(0,["YY",2],0,function(){return this.year()%100}),J(0,["YYYY",4],0,"year"),J(0,["YYYYY",5],0,"year"),J(0,["YYYYYY",6,!0],0,"year"),A("year","y"),O("Y",od),O("YY",hd,dd),O("YYYY",ld,fd),O("YYYYY",md,gd),O("YYYYYY",md,gd),S(["YYYYY","YYYYYY"],vd),S("YYYY",function(b,c){c[vd]=2===b.length?a.parseTwoDigitYear(b):r(b)}),S("YY",function(b,c){c[vd]=a.parseTwoDigitYear(b)}),S("Y",function(a,b){b[vd]=parseInt(a,10)}),a.parseTwoDigitYear=function(a){return r(a)+(r(a)>68?1900:2e3)};var Qd=E("FullYear",!1);a.ISO_8601=function(){};var Rd=fa("moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(){var a=Ea.apply(null,arguments);return this.isValid()&&a.isValid()?this>a?this:a:l()}),Sd=fa("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(){var a=Ea.apply(null,arguments);return this.isValid()&&a.isValid()?a>this?this:a:l()}),Td=function(){return Date.now?Date.now():+new Date};Ka("Z",":"),Ka("ZZ",""),O("Z",qd),O("ZZ",qd),S(["Z","ZZ"],function(a,b,c){c._useUTC=!0,c._tzm=La(qd,a)});var Ud=/([\+\-]|\d\d)/gi;a.updateOffset=function(){};var Vd=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?\d*)?$/,Wd=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/; +Za.fn=Ia.prototype;var Xd=bb(1,"add"),Yd=bb(-1,"subtract");a.defaultFormat="YYYY-MM-DDTHH:mm:ssZ";var Zd=fa("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(a){return void 0===a?this.localeData():this.locale(a)});J(0,["gg",2],0,function(){return this.weekYear()%100}),J(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Ib("gggg","weekYear"),Ib("ggggg","weekYear"),Ib("GGGG","isoWeekYear"),Ib("GGGGG","isoWeekYear"),A("weekYear","gg"),A("isoWeekYear","GG"),O("G",od),O("g",od),O("GG",hd,dd),O("gg",hd,dd),O("GGGG",ld,fd),O("gggg",ld,fd),O("GGGGG",md,gd),O("ggggg",md,gd),T(["gggg","ggggg","GGGG","GGGGG"],function(a,b,c,d){b[d.substr(0,2)]=r(a)}),T(["gg","GG"],function(b,c,d,e){c[e]=a.parseTwoDigitYear(b)}),J("Q",0,"Qo","quarter"),A("quarter","Q"),O("Q",cd),S("Q",function(a,b){b[wd]=3*(r(a)-1)}),J("w",["ww",2],"wo","week"),J("W",["WW",2],"Wo","isoWeek"),A("week","w"),A("isoWeek","W"),O("w",hd),O("ww",hd,dd),O("W",hd),O("WW",hd,dd),T(["w","ww","W","WW"],function(a,b,c,d){b[d.substr(0,1)]=r(a)});var $d={dow:0,doy:6};J("D",["DD",2],"Do","date"),A("date","D"),O("D",hd),O("DD",hd,dd),O("Do",function(a,b){return a?b._ordinalParse:b._ordinalParseLenient}),S(["D","DD"],xd),S("Do",function(a,b){b[xd]=r(a.match(hd)[0],10)});var _d=E("Date",!0);J("d",0,"do","day"),J("dd",0,0,function(a){return this.localeData().weekdaysMin(this,a)}),J("ddd",0,0,function(a){return this.localeData().weekdaysShort(this,a)}),J("dddd",0,0,function(a){return this.localeData().weekdays(this,a)}),J("e",0,0,"weekday"),J("E",0,0,"isoWeekday"),A("day","d"),A("weekday","e"),A("isoWeekday","E"),O("d",hd),O("e",hd),O("E",hd),O("dd",sd),O("ddd",sd),O("dddd",sd),T(["dd","ddd","dddd"],function(a,b,c,d){var e=c._locale.weekdaysParse(a,d,c._strict);null!=e?b.d=e:j(c).invalidWeekday=a}),T(["d","e","E"],function(a,b,c,d){b[d]=r(a)});var ae="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),be="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),ce="Su_Mo_Tu_We_Th_Fr_Sa".split("_");J("DDD",["DDDD",3],"DDDo","dayOfYear"),A("dayOfYear","DDD"),O("DDD",kd),O("DDDD",ed),S(["DDD","DDDD"],function(a,b,c){c._dayOfYear=r(a)}),J("H",["HH",2],0,"hour"),J("h",["hh",2],0,cc),J("hmm",0,0,function(){return""+cc.apply(this)+I(this.minutes(),2)}),J("hmmss",0,0,function(){return""+cc.apply(this)+I(this.minutes(),2)+I(this.seconds(),2)}),J("Hmm",0,0,function(){return""+this.hours()+I(this.minutes(),2)}),J("Hmmss",0,0,function(){return""+this.hours()+I(this.minutes(),2)+I(this.seconds(),2)}),dc("a",!0),dc("A",!1),A("hour","h"),O("a",ec),O("A",ec),O("H",hd),O("h",hd),O("HH",hd,dd),O("hh",hd,dd),O("hmm",id),O("hmmss",jd),O("Hmm",id),O("Hmmss",jd),S(["H","HH"],yd),S(["a","A"],function(a,b,c){c._isPm=c._locale.isPM(a),c._meridiem=a}),S(["h","hh"],function(a,b,c){b[yd]=r(a),j(c).bigHour=!0}),S("hmm",function(a,b,c){var d=a.length-2;b[yd]=r(a.substr(0,d)),b[zd]=r(a.substr(d)),j(c).bigHour=!0}),S("hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[yd]=r(a.substr(0,d)),b[zd]=r(a.substr(d,2)),b[Ad]=r(a.substr(e)),j(c).bigHour=!0}),S("Hmm",function(a,b,c){var d=a.length-2;b[yd]=r(a.substr(0,d)),b[zd]=r(a.substr(d))}),S("Hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[yd]=r(a.substr(0,d)),b[zd]=r(a.substr(d,2)),b[Ad]=r(a.substr(e))});var de=/[ap]\.?m?\.?/i,ee=E("Hours",!0);J("m",["mm",2],0,"minute"),A("minute","m"),O("m",hd),O("mm",hd,dd),S(["m","mm"],zd);var fe=E("Minutes",!1);J("s",["ss",2],0,"second"),A("second","s"),O("s",hd),O("ss",hd,dd),S(["s","ss"],Ad);var ge=E("Seconds",!1);J("S",0,0,function(){return~~(this.millisecond()/100)}),J(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),J(0,["SSS",3],0,"millisecond"),J(0,["SSSS",4],0,function(){return 10*this.millisecond()}),J(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),J(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),J(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),J(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),J(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),A("millisecond","ms"),O("S",kd,cd),O("SS",kd,dd),O("SSS",kd,ed);var he;for(he="SSSS";he.length<=9;he+="S")O(he,nd);for(he="S";he.length<=9;he+="S")S(he,hc);var ie=E("Milliseconds",!1);J("z",0,0,"zoneAbbr"),J("zz",0,0,"zoneName");var je=o.prototype;je.add=Xd,je.calendar=db,je.clone=eb,je.diff=lb,je.endOf=xb,je.format=pb,je.from=qb,je.fromNow=rb,je.to=sb,je.toNow=tb,je.get=H,je.invalidAt=Gb,je.isAfter=fb,je.isBefore=gb,je.isBetween=hb,je.isSame=ib,je.isSameOrAfter=jb,je.isSameOrBefore=kb,je.isValid=Eb,je.lang=Zd,je.locale=ub,je.localeData=vb,je.max=Sd,je.min=Rd,je.parsingFlags=Fb,je.set=H,je.startOf=wb,je.subtract=Yd,je.toArray=Bb,je.toObject=Cb,je.toDate=Ab,je.toISOString=ob,je.toJSON=Db,je.toString=nb,je.unix=zb,je.valueOf=yb,je.creationData=Hb,je.year=Qd,je.isLeapYear=na,je.weekYear=Jb,je.isoWeekYear=Kb,je.quarter=je.quarters=Pb,je.month=$,je.daysInMonth=_,je.week=je.weeks=Tb,je.isoWeek=je.isoWeeks=Ub,je.weeksInYear=Mb,je.isoWeeksInYear=Lb,je.date=_d,je.day=je.days=$b,je.weekday=_b,je.isoWeekday=ac,je.dayOfYear=bc,je.hour=je.hours=ee,je.minute=je.minutes=fe,je.second=je.seconds=ge,je.millisecond=je.milliseconds=ie,je.utcOffset=Oa,je.utc=Qa,je.local=Ra,je.parseZone=Sa,je.hasAlignedHourOffset=Ta,je.isDST=Ua,je.isDSTShifted=Va,je.isLocal=Wa,je.isUtcOffset=Xa,je.isUtc=Ya,je.isUTC=Ya,je.zoneAbbr=ic,je.zoneName=jc,je.dates=fa("dates accessor is deprecated. Use date instead.",_d),je.months=fa("months accessor is deprecated. Use month instead",$),je.years=fa("years accessor is deprecated. Use year instead",Qd),je.zone=fa("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",Pa);var ke=je,le={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},me={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},ne="Invalid date",oe="%d",pe=/\d{1,2}/,qe={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},re=t.prototype;re._calendar=le,re.calendar=mc,re._longDateFormat=me,re.longDateFormat=nc,re._invalidDate=ne,re.invalidDate=oc,re._ordinal=oe,re.ordinal=pc,re._ordinalParse=pe,re.preparse=qc,re.postformat=qc,re._relativeTime=qe,re.relativeTime=rc,re.pastFuture=sc,re.set=tc,re.months=W,re._months=Fd,re.monthsShort=X,re._monthsShort=Gd,re.monthsParse=Y,re._monthsRegex=Id,re.monthsRegex=ba,re._monthsShortRegex=Hd,re.monthsShortRegex=aa,re.week=Qb,re._week=$d,re.firstDayOfYear=Sb,re.firstDayOfWeek=Rb,re.weekdays=Wb,re._weekdays=ae,re.weekdaysMin=Yb,re._weekdaysMin=ce,re.weekdaysShort=Xb,re._weekdaysShort=be,re.weekdaysParse=Zb,re.isPM=fc,re._meridiemParse=de,re.meridiem=gc,x("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===r(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),a.lang=fa("moment.lang is deprecated. Use moment.locale instead.",x),a.langData=fa("moment.langData is deprecated. Use moment.localeData instead.",z);var se=Math.abs,te=Lc("ms"),ue=Lc("s"),ve=Lc("m"),we=Lc("h"),xe=Lc("d"),ye=Lc("w"),ze=Lc("M"),Ae=Lc("y"),Be=Nc("milliseconds"),Ce=Nc("seconds"),De=Nc("minutes"),Ee=Nc("hours"),Fe=Nc("days"),Ge=Nc("months"),He=Nc("years"),Ie=Math.round,Je={s:45,m:45,h:22,d:26,M:11},Ke=Math.abs,Le=Ia.prototype;Le.abs=Bc,Le.add=Dc,Le.subtract=Ec,Le.as=Jc,Le.asMilliseconds=te,Le.asSeconds=ue,Le.asMinutes=ve,Le.asHours=we,Le.asDays=xe,Le.asWeeks=ye,Le.asMonths=ze,Le.asYears=Ae,Le.valueOf=Kc,Le._bubble=Gc,Le.get=Mc,Le.milliseconds=Be,Le.seconds=Ce,Le.minutes=De,Le.hours=Ee,Le.days=Fe,Le.weeks=Oc,Le.months=Ge,Le.years=He,Le.humanize=Sc,Le.toISOString=Tc,Le.toString=Tc,Le.toJSON=Tc,Le.locale=ub,Le.localeData=vb,Le.toIsoString=fa("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Tc),Le.lang=Zd,J("X",0,0,"unix"),J("x",0,0,"valueOf"),O("x",od),O("X",rd),S("X",function(a,b,c){c._d=new Date(1e3*parseFloat(a,10))}),S("x",function(a,b,c){c._d=new Date(r(a))}),a.version="2.11.2",b(Ea),a.fn=ke,a.min=Ga,a.max=Ha,a.now=Td,a.utc=h,a.unix=kc,a.months=wc,a.isDate=d,a.locale=x,a.invalid=l,a.duration=Za,a.isMoment=p,a.weekdays=yc,a.parseZone=lc,a.localeData=z,a.isDuration=Ja,a.monthsShort=xc,a.weekdaysMin=Ac,a.defineLocale=y,a.weekdaysShort=zc,a.normalizeUnits=B,a.relativeTimeThreshold=Rc,a.prototype=ke;var Me=a;return Me}); \ No newline at end of file diff --git a/src/main/webapp/js/moment.zh-cn.js b/src/main/webapp/js/moment.zh-cn.js new file mode 100644 index 0000000..aec5ede --- /dev/null +++ b/src/main/webapp/js/moment.zh-cn.js @@ -0,0 +1,127 @@ +//! moment.js locale configuration +//! locale : chinese (zh-cn) +//! author : suupic : https://github.com/suupic +//! author : Zeno Zeng : https://github.com/zenozeng + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['moment'], factory) : + factory(global.moment) +}(this, function (moment) { 'use strict'; + + + var zh_cn = moment.defineLocale('zh-cn', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), + weekdaysMin : '日_一_二_三_四_五_六'.split('_'), + longDateFormat : { + LT : 'Ah点mm分', + LTS : 'Ah点m分s秒', + L : 'YYYY-MM-DD', + LL : 'YYYY年MMMD日', + LLL : 'YYYY年MMMD日Ah点mm分', + LLLL : 'YYYY年MMMD日ddddAh点mm分', + l : 'YYYY-MM-DD', + ll : 'YYYY年MMMD日', + lll : 'YYYY年MMMD日Ah点mm分', + llll : 'YYYY年MMMD日ddddAh点mm分' + }, + meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || + meridiem === '上午') { + return hour; + } else if (meridiem === '下午' || meridiem === '晚上') { + return hour + 12; + } else { + // '中午' + return hour >= 11 ? hour : hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上午'; + } else if (hm < 1230) { + return '中午'; + } else if (hm < 1800) { + return '下午'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : function () { + return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT'; + }, + nextDay : function () { + return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT'; + }, + lastDay : function () { + return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT'; + }, + nextWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment().startOf('week'); + prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]'; + return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; + }, + lastWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment().startOf('week'); + prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]'; + return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; + }, + sameElse : 'LL' + }, + ordinalParse: /\d{1,2}(日|月|周)/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '日'; + case 'M': + return number + '月'; + case 'w': + case 'W': + return number + '周'; + default: + return number; + } + }, + relativeTime : { + future : '%s内', + past : '%s前', + s : '几秒', + m : '1 分钟', + mm : '%d 分钟', + h : '1 小时', + hh : '%d 小时', + d : '1 天', + dd : '%d 天', + M : '1 个月', + MM : '%d 个月', + y : '1 年', + yy : '%d 年' + }, + week : { + // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return zh_cn; + +})); \ No newline at end of file diff --git a/src/main/webapp/js/ue/jsp/config.json b/src/main/webapp/js/ue/jsp/config.json new file mode 100644 index 0000000..53b6c97 --- /dev/null +++ b/src/main/webapp/js/ue/jsp/config.json @@ -0,0 +1,94 @@ +/* 前后端通信相关的配置,注释只允许使用多行方式 */ +{ + /* 上传图片配置项 */ + "imageActionName": "uploadimage", /* 执行上传图片的action名称 */ + "imageFieldName": "upfile", /* 提交的图片表单名称 */ + "imageMaxSize": 2048000, /* 上传大小限制,单位B */ + "imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */ + "imageCompressEnable": true, /* 是否压缩图片,默认是true */ + "imageCompressBorder": 1600, /* 图片压缩最长边限制 */ + "imageInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageUrlPrefix": "", /* 图片访问路径前缀 */ + "imagePathFormat": "/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + /* {filename} 会替换成原文件名,配置这项需要注意中文乱码问题 */ + /* {rand:6} 会替换成随机数,后面的数字是随机数的位数 */ + /* {time} 会替换成时间戳 */ + /* {yyyy} 会替换成四位年份 */ + /* {yy} 会替换成两位年份 */ + /* {mm} 会替换成两位月份 */ + /* {dd} 会替换成两位日期 */ + /* {hh} 会替换成两位小时 */ + /* {ii} 会替换成两位分钟 */ + /* {ss} 会替换成两位秒 */ + /* 非法字符 \ : * ? " < > | */ + /* 具请体看线上文档: fex.baidu.com/ueditor/#use-format_upload_filename */ + + /* 涂鸦图片上传配置项 */ + "scrawlActionName": "uploadscrawl", /* 执行上传涂鸦的action名称 */ + "scrawlFieldName": "upfile", /* 提交的图片表单名称 */ + "scrawlPathFormat": "/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "scrawlMaxSize": 2048000, /* 上传大小限制,单位B */ + "scrawlUrlPrefix": "", /* 图片访问路径前缀 */ + "scrawlInsertAlign": "none", + + /* 截图工具上传 */ + "snapscreenActionName": "uploadimage", /* 执行上传截图的action名称 */ + "snapscreenPathFormat": "/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "snapscreenUrlPrefix": "", /* 图片访问路径前缀 */ + "snapscreenInsertAlign": "none", /* 插入的图片浮动方式 */ + + /* 抓取远程图片配置 */ + "catcherLocalDomain": ["127.0.0.1", "localhost", "img.baidu.com"], + "catcherActionName": "catchimage", /* 执行抓取远程图片的action名称 */ + "catcherFieldName": "source", /* 提交的图片列表表单名称 */ + "catcherPathFormat": "/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "catcherUrlPrefix": "", /* 图片访问路径前缀 */ + "catcherMaxSize": 2048000, /* 上传大小限制,单位B */ + "catcherAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 抓取图片格式显示 */ + + /* 上传视频配置 */ + "videoActionName": "uploadvideo", /* 执行上传视频的action名称 */ + "videoFieldName": "upfile", /* 提交的视频表单名称 */ + "videoPathFormat": "/ueditor/jsp/upload/video/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "videoUrlPrefix": "", /* 视频访问路径前缀 */ + "videoMaxSize": 102400000, /* 上传大小限制,单位B,默认100MB */ + "videoAllowFiles": [ + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid"], /* 上传视频格式显示 */ + + /* 上传文件配置 */ + "fileActionName": "uploadfile", /* controller里,执行上传视频的action名称 */ + "fileFieldName": "upfile", /* 提交的文件表单名称 */ + "filePathFormat": "/ueditor/jsp/upload/file/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "fileUrlPrefix": "", /* 文件访问路径前缀 */ + "fileMaxSize": 51200000, /* 上传大小限制,单位B,默认50MB */ + "fileAllowFiles": [ + ".png", ".jpg", ".jpeg", ".gif", ".bmp", + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", + ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", + ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" + ], /* 上传文件格式显示 */ + + /* 列出指定目录下的图片 */ + "imageManagerActionName": "listimage", /* 执行图片管理的action名称 */ + "imageManagerListPath": "/ueditor/jsp/upload/image/", /* 指定要列出图片的目录 */ + "imageManagerListSize": 20, /* 每次列出文件数量 */ + "imageManagerUrlPrefix": "", /* 图片访问路径前缀 */ + "imageManagerInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageManagerAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 列出的文件类型 */ + + /* 列出指定目录下的文件 */ + "fileManagerActionName": "listfile", /* 执行文件管理的action名称 */ + "fileManagerListPath": "/ueditor/jsp/upload/file/", /* 指定要列出文件的目录 */ + "fileManagerUrlPrefix": "", /* 文件访问路径前缀 */ + "fileManagerListSize": 20, /* 每次列出文件数量 */ + "fileManagerAllowFiles": [ + ".png", ".jpg", ".jpeg", ".gif", ".bmp", + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", + ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", + ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" + ] /* 列出的文件类型 */ + +} \ No newline at end of file diff --git a/src/main/webapp/js/ue/jsp/controller.jsp b/src/main/webapp/js/ue/jsp/controller.jsp new file mode 100644 index 0000000..6a3ef2f --- /dev/null +++ b/src/main/webapp/js/ue/jsp/controller.jsp @@ -0,0 +1,14 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + import="com.baidu.ueditor.ActionEnter" + pageEncoding="UTF-8"%> +<%@ page trimDirectiveWhitespaces="true" %> +<% + + request.setCharacterEncoding( "utf-8" ); + response.setHeader("Content-Type" , "text/html"); + + String rootPath = application.getRealPath( "/" ); + + out.write( new ActionEnter( request, rootPath ).exec() ); + +%> \ No newline at end of file diff --git a/src/main/webapp/js/ue/lang/en/en.js b/src/main/webapp/js/ue/lang/en/en.js new file mode 100644 index 0000000..c7e22f5 --- /dev/null +++ b/src/main/webapp/js/ue/lang/en/en.js @@ -0,0 +1,684 @@ +/** + * Created with JetBrains PhpStorm. + * User: taoqili + * Date: 12-6-12 + * Time: 下午6:57 + * To change this template use File | Settings | File Templates. + */ +UE.I18N['en'] = { + 'labelMap':{ + 'anchor':'Anchor', 'undo':'Undo', 'redo':'Redo', 'bold':'Bold', 'indent':'Indent', 'snapscreen':'SnapScreen', + 'italic':'Italic', 'underline':'Underline', 'strikethrough':'Strikethrough', 'subscript':'SubScript','fontborder':'text border', + 'superscript':'SuperScript', 'formatmatch':'Format Match', 'source':'Source', 'blockquote':'BlockQuote', + 'pasteplain':'PastePlain', 'selectall':'SelectAll', 'print':'Print', 'preview':'Preview', + 'horizontal':'Horizontal', 'removeformat':'RemoveFormat', 'time':'Time', 'date':'Date', + 'unlink':'Unlink', 'insertrow':'InsertRow', 'insertcol':'InsertCol', 'mergeright':'MergeRight', 'mergedown':'MergeDown', + 'deleterow':'DeleteRow', 'deletecol':'DeleteCol', 'splittorows':'SplitToRows','insertcode':'insert code', + 'splittocols':'SplitToCols', 'splittocells':'SplitToCells','deletecaption':'DeleteCaption','inserttitle':'InsertTitle', + 'mergecells':'MergeCells', 'deletetable':'DeleteTable', 'cleardoc':'Clear', 'insertparagraphbeforetable':"InsertParagraphBeforeTable", + 'fontfamily':'FontFamily', 'fontsize':'FontSize', 'paragraph':'Paragraph','simpleupload':'Single Image','insertimage':'Multi Image','edittable':'Edit Table', 'edittd':'Edit Td','link':'Link', + 'emotion':'Emotion', 'spechars':'Spechars', 'searchreplace':'SearchReplace', 'map':'BaiduMap', 'gmap':'GoogleMap', + 'insertvideo':'Video', 'help':'Help', 'justifyleft':'JustifyLeft', 'justifyright':'JustifyRight', 'justifycenter':'JustifyCenter', + 'justifyjustify':'Justify', 'forecolor':'FontColor', 'backcolor':'BackColor', 'insertorderedlist':'OL', + 'insertunorderedlist':'UL', 'fullscreen':'FullScreen', 'directionalityltr':'EnterFromLeft', 'directionalityrtl':'EnterFromRight', + 'rowspacingtop':'RowSpacingTop', 'rowspacingbottom':'RowSpacingBottom', 'pagebreak':'PageBreak', 'insertframe':'Iframe', 'imagenone':'Default', + 'imageleft':'ImageLeft', 'imageright':'ImageRight', 'attachment':'Attachment', 'imagecenter':'ImageCenter', 'wordimage':'WordImage', + 'lineheight':'LineHeight','edittip':'EditTip','customstyle':'CustomStyle', 'scrawl':'Scrawl', 'autotypeset':'AutoTypeset', + 'webapp':'WebAPP', 'touppercase':'UpperCase', 'tolowercase':'LowerCase','template':'Template','background':'Background','inserttable':'InsertTable', + 'music':'Music', 'charts': 'charts','drafts': 'Load from Drafts' + }, + 'insertorderedlist':{ + 'num':'1,2,3...', + 'num1':'1),2),3)...', + 'num2':'(1),(2),(3)...', + 'cn':'一,二,三....', + 'cn1':'一),二),三)....', + 'cn2':'(一),(二),(三)....', + 'decimal':'1,2,3...', + 'lower-alpha':'a,b,c...', + 'lower-roman':'i,ii,iii...', + 'upper-alpha':'A,B,C...', + 'upper-roman':'I,II,III...' + }, + 'insertunorderedlist':{ + 'circle':'○ Circle', + 'disc':'● Circle dot', + 'square':'■ Rectangle ', + 'dash' :'- Dash', + 'dot' : '。dot' + }, + 'paragraph':{'p':'Paragraph', 'h1':'Title 1', 'h2':'Title 2', 'h3':'Title 3', 'h4':'Title 4', 'h5':'Title 5', 'h6':'Title 6'}, + 'fontfamily':{ + 'songti':'Sim Sun', + 'kaiti':'Sim Kai', + 'heiti':'Sim Hei', + 'lishu':'Sim Li', + 'yahei': 'Microsoft YaHei', + 'andaleMono':'Andale Mono', + 'arial': 'Arial', + 'arialBlack':'Arial Black', + 'comicSansMs':'Comic Sans MS', + 'impact':'Impact', + 'timesNewRoman':'Times New Roman' + }, + 'customstyle':{ + 'tc':'Title center', + 'tl':'Title left', + 'im':'Important', + 'hi':'Highlight' + }, + 'autoupload': { + 'exceedSizeError': 'File Size Exceed', + 'exceedTypeError': 'File Type Not Allow', + 'jsonEncodeError': 'Server Return Format Error', + 'loading':"loading...", + 'loadError':"load error", + 'errorLoadConfig': 'Server config not loaded, upload can not work.', + }, + 'simpleupload':{ + 'exceedSizeError': 'File Size Exceed', + 'exceedTypeError': 'File Type Not Allow', + 'jsonEncodeError': 'Server Return Format Error', + 'loading':"loading...", + 'loadError':"load error", + 'errorLoadConfig': 'Server config not loaded, upload can not work.', + }, + 'elementPathTip':"Path", + 'wordCountTip':"Word Count", + 'wordCountMsg':'{#count} characters entered,{#leave} left. ', + 'wordOverFlowMsg':'The number of characters has exceeded allowable maximum values, the server may refuse to save!', + 'ok':"OK", + 'cancel':"Cancel", + 'closeDialog':"closeDialog", + 'tableDrag':"You must import the file uiUtils.js before drag! ", + 'autofloatMsg':"The plugin AutoFloat depends on EditorUI!", + 'loadconfigError': 'Get server config error.', + 'loadconfigFormatError': 'Server config format error.', + 'loadconfigHttpError': 'Get server config http error.', + 'snapScreen_plugin':{ + 'browserMsg':"Only IE supported!", + 'callBackErrorMsg':"The callback data is wrong,please check the config!", + 'uploadErrorMsg':"Upload error,please check your server environment! " + }, + 'insertcode':{ + 'as3':'ActionScript 3', + 'bash':'Bash/Shell', + 'cpp':'C/C++', + 'css':'CSS', + 'cf':'ColdFusion', + 'c#':'C#', + 'delphi':'Delphi', + 'diff':'Diff', + 'erlang':'Erlang', + 'groovy':'Groovy', + 'html':'HTML', + 'java':'Java', + 'jfx':'JavaFX', + 'js':'JavaScript', + 'pl':'Perl', + 'php':'PHP', + 'plain':'Plain Text', + 'ps':'PowerShell', + 'python':'Python', + 'ruby':'Ruby', + 'scala':'Scala', + 'sql':'SQL', + 'vb':'Visual Basic', + 'xml':'XML' + }, + 'confirmClear':"Do you confirm to clear the Document?", + 'contextMenu':{ + 'delete':"Delete", + 'selectall':"Select all", + 'deletecode':"Delete Code", + 'cleardoc':"Clear Document", + 'confirmclear':"Do you confirm to clear the Document?", + 'unlink':"Unlink", + 'paragraph':"Paragraph", + 'edittable':"Table property", + 'aligncell':'Align cell', + 'aligntable':'Table alignment', + 'tableleft':'Left float', + 'tablecenter':'Center', + 'tableright':'Right float', + 'aligntd':'Cell alignment', + 'edittd':"Cell property", + 'setbordervisible':'set table edge visible', + 'table':"Table", + 'justifyleft':'Justify Left', + 'justifyright':'Justify Right', + 'justifycenter':'Justify Center', + 'justifyjustify':'Default', + 'deletetable':"Delete table", + 'insertparagraphbefore':"InsertedBeforeLine", + 'insertparagraphafter':'InsertedAfterLine', + 'inserttable':'Insert table', + 'insertcaption':'Insert caption', + 'deletecaption':'Delete Caption', + 'inserttitle':'Insert Title', + 'deletetitle':'Delete Title', + 'inserttitlecol':'Insert Title Col', + 'deletetitlecol':'Delete Title Col', + 'averageDiseRow':'AverageDise Row', + 'averageDisCol':'AverageDis Col', + 'deleterow':"Delete row", + 'deletecol':"Delete col", + 'insertrow':"Insert row", + 'insertcol':"Insert col", + 'insertrownext':'Insert Row Next', + 'insertcolnext':'Insert Col Next', + 'mergeright':"Merge right", + 'mergeleft':"Merge left", + 'mergedown':"Merge down", + 'mergecells':"Merge cells", + 'splittocells':"Split to cells", + 'splittocols':"Split to Cols", + 'splittorows':"Split to Rows", + 'tablesort':'Table sorting', + 'enablesort':'Sorting Enable', + 'disablesort':'Sorting Disable', + 'reversecurrent':'Reverse current', + 'orderbyasc':'Order By ASCII', + 'reversebyasc':'Reverse By ASCII', + 'orderbynum':'Order By Num', + 'reversebynum':'Reverse By Num', + 'borderbk':'Border shading', + 'setcolor':'interlaced color', + 'unsetcolor':'Cancel interlacedcolor', + 'setbackground':'Background interlaced', + 'unsetbackground':'Cancel Bk interlaced', + 'redandblue':'Blue and red', + 'threecolorgradient':'Three-color gradient', + 'copy':"Copy(Ctrl + c)", + 'copymsg':"Browser does not support. Please use 'Ctrl + c' instead!", + 'paste':"Paste(Ctrl + v)", + 'pastemsg':"Browser does not support. Please use 'Ctrl + v' instead!" + }, + 'copymsg': "Browser does not support. Please use 'Ctrl + c' instead!", + 'pastemsg': "Browser does not support. Please use 'Ctrl + v' instead!", + 'anthorMsg':"Link", + 'clearColor':'Clear', + 'standardColor':'Standard color', + 'themeColor':'Theme color', + 'property':'Property', + 'default':'Default', + 'modify':'Modify', + 'justifyleft':'Justify Left', + 'justifyright':'Justify Right', + 'justifycenter':'Justify Center', + 'justify':'Default', + 'clear':'Clear', + 'anchorMsg':'Anchor', + 'delete':'Delete', + 'clickToUpload':"Click to upload", + 'unset':'Language hasn\'t been set!', + 't_row':'row', + 't_col':'col', + 'pasteOpt':'Paste Option', + 'pasteSourceFormat':"Keep Source Formatting", + 'tagFormat':'Keep tag', + 'pasteTextFormat':'Keep Text only', + 'more':'More', + 'autoTypeSet':{ + 'mergeLine':"Merge empty line", + 'delLine':"Del empty line", + 'removeFormat':"Remove format", + 'indent':"Indent", + 'alignment':"Alignment", + 'imageFloat':"Image float", + 'removeFontsize':"Remove font size", + 'removeFontFamily':"Remove fontFamily", + 'removeHtml':"Remove redundant HTML code", + 'pasteFilter':"Paste filter", + 'run':"Done", + 'symbol':'Symbol Conversion', + 'bdc2sb':'Full-width to Half-width', + 'tobdc':'Half-width to Full-width' + }, + + 'background':{ + 'static':{ + 'lang_background_normal':'Normal', + 'lang_background_local':'Online', + 'lang_background_set':'Background Set', + 'lang_background_none':'No Background', + 'lang_background_colored':'Colored Background', + 'lang_background_color':'Color Set', + 'lang_background_netimg':'Net-Image', + 'lang_background_align':'Align Type', + 'lang_background_position':'Position', + 'repeatType':{'options':["Center", "Repeat-x", "Repeat-y", "Tile","Custom"]} + }, + 'noUploadImage':"No pictures has been uploaded!", + 'toggleSelect':'Change the active state by click!\n Image Size: ' + }, + //===============dialog i18N======================= + 'insertimage':{ + 'static':{ + 'lang_tab_remote':"Insert", + 'lang_tab_upload':"Local", + 'lang_tab_online':"Manager", + 'lang_tab_search':"Search", + 'lang_input_url':"Address:", + 'lang_input_size':"Size:", + 'lang_input_width':"Width", + 'lang_input_height':"Height", + 'lang_input_border':"Border:", + 'lang_input_vhspace':"Margins:", + 'lang_input_title':"Title:", + 'lang_input_align':'Image Float Style:', + 'lang_imgLoading':"Loading...", + 'lang_start_upload':"Start Upload", + 'lock':{'title':"Lock rate"}, + 'searchType':{'title':"ImageType", 'options':["News", "Wallpaper", "emotions", "photo"]}, + 'searchTxt':{'value':"Enter the search keyword!"}, + 'searchBtn':{'value':"Search"}, + 'searchReset':{'value':"Clear"}, + 'noneAlign':{'title':'None Float'}, + 'leftAlign':{'title':'Left Float'}, + 'rightAlign':{'title':'Right Float'}, + 'centerAlign':{'title':'Center In A Line'} + }, + 'uploadSelectFile':'Select File', + 'uploadAddFile':'Add File', + 'uploadStart':'Start Upload', + 'uploadPause':'Pause Upload', + 'uploadContinue':'Continue Upload', + 'uploadRetry':'Retry Upload', + 'uploadDelete':'Delete', + 'uploadTurnLeft':'Turn Left', + 'uploadTurnRight':'Turn Right', + 'uploadPreview':'Doing Preview', + 'uploadNoPreview':'Can Not Preview', + 'updateStatusReady': 'Selected _ pictures, total _KB.', + 'updateStatusConfirm': '_ uploaded successfully and _ upload failed', + 'updateStatusFinish': 'Total _ pictures (_KB), _ uploaded successfully', + 'updateStatusError': ' and _ upload failed', + 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player', + 'errorLoadConfig': 'Server config not loaded, upload can not work.', + 'errorExceedSize':'File Size Exceed', + 'errorFileType':'File Type Not Allow', + 'errorInterrupt':'File Upload Interrupted', + 'errorUploadRetry':'Upload Error, Please Retry.', + 'errorHttp':'Http Error', + 'errorServerUpload':'Server Result Error.', + 'remoteLockError':"Cannot Lock the Proportion between width and height", + 'numError':"Please enter the correct Num. e.g 123,400", + 'imageUrlError':"The image format may be wrong!", + 'imageLoadError':"Error,please check the network or URL!", + 'searchRemind':"Enter the search keyword!", + 'searchLoading':"Image is loading,please wait...", + 'searchRetry':" Sorry,can't find the image,please try again!" + }, + 'attachment':{ + 'static':{ + 'lang_tab_upload': 'Upload', + 'lang_tab_online': 'Online', + 'lang_start_upload':"Start upload", + 'lang_drop_remind':"You can drop files here, a single maximum of 300 files" + }, + 'uploadSelectFile':'Select File', + 'uploadAddFile':'Add File', + 'uploadStart':'Start Upload', + 'uploadPause':'Pause Upload', + 'uploadContinue':'Continue Upload', + 'uploadRetry':'Retry Upload', + 'uploadDelete':'Delete', + 'uploadTurnLeft':'Turn Left', + 'uploadTurnRight':'Turn Right', + 'uploadPreview':'Doing Preview', + 'updateStatusReady': 'Selected _ files, total _KB.', + 'updateStatusConfirm': '_ uploaded successfully and _ upload failed', + 'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully', + 'updateStatusError': ' and _ upload failed', + 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player', + 'errorLoadConfig': 'Server config not loaded, upload can not work.', + 'errorExceedSize':'File Size Exceed', + 'errorFileType':'File Type Not Allow', + 'errorInterrupt':'File Upload Interrupted', + 'errorUploadRetry':'Upload Error, Please Retry.', + 'errorHttp':'Http Error', + 'errorServerUpload':'Server Result Error.' + }, + + 'insertvideo':{ + 'static':{ + 'lang_tab_insertV':"Video", + 'lang_tab_searchV':"Search", + 'lang_tab_uploadV':"Upload", + 'lang_video_url':" URL ", + 'lang_video_size':"Video Size", + 'lang_videoW':"Width", + 'lang_videoH':"Height", + 'lang_alignment':"Alignment", + 'videoSearchTxt':{'value':"Enter the search keyword!"}, + 'videoType':{'options':["All", "Hot", "Entertainment", "Funny", "Sports", "Science", "variety"]}, + 'videoSearchBtn':{'value':"Search in Baidu"}, + 'videoSearchReset':{'value':"Clear result"}, + + 'lang_input_fileStatus':' No file uploaded!', + 'startUpload':{'style':"background:url(upload.png) no-repeat;"}, + + 'lang_upload_size':"Video Size", + 'lang_upload_width':"Width", + 'lang_upload_height':"Height", + 'lang_upload_alignment':"Alignment", + 'lang_format_advice':"Recommends mp4 format." + }, + 'numError':"Please enter the correct Num. e.g 123,400", + 'floatLeft':"Float left", + 'floatRight':"Float right", + 'default':"Default", + 'block':"Display in block", + 'urlError':"The video url format may be wrong!", + 'loading':"  The video is loading, please wait…", + 'clickToSelect':"Click to select", + 'goToSource':'Visit source video ', + 'noVideo':"    Sorry,can't find the video,please try again!", + + 'browseFiles':'Open files', + 'uploadSuccess':'Upload Successful!', + 'delSuccessFile':'Remove from the success of the queue', + 'delFailSaveFile':'Remove the save failed file', + 'statusPrompt':' file(s) uploaded! ', + 'flashVersionError':'The current Flash version is too low, please update FlashPlayer,then try again!', + 'flashLoadingError':'The Flash failed loading! Please check the path or network state', + 'fileUploadReady':'Wait for uploading...', + 'delUploadQueue':'Remove from the uploading queue ', + 'limitPrompt1':'Can not choose more than single', + 'limitPrompt2':'file(s)!Please choose again!', + 'delFailFile':'Remove failure file', + 'fileSizeLimit':'File size exceeds the limit!', + 'emptyFile':'Can not upload an empty file!', + 'fileTypeError':'File type error!', + 'unknownError':'Unknown error!', + 'fileUploading':'Uploading,please wait...', + 'cancelUpload':'Cancel upload', + 'netError':'Network error', + 'failUpload':'Upload failed', + 'serverIOError':'Server IO error!', + 'noAuthority':'No Permission!', + 'fileNumLimit':'Upload limit to the number', + 'failCheck':'Authentication fails, the upload is skipped!', + 'fileCanceling':'Cancel, please wait...', + 'stopUploading':'Upload has stopped...', + + 'uploadSelectFile':'Select File', + 'uploadAddFile':'Add File', + 'uploadStart':'Start Upload', + 'uploadPause':'Pause Upload', + 'uploadContinue':'Continue Upload', + 'uploadRetry':'Retry Upload', + 'uploadDelete':'Delete', + 'uploadTurnLeft':'Turn Left', + 'uploadTurnRight':'Turn Right', + 'uploadPreview':'Doing Preview', + 'updateStatusReady': 'Selected _ files, total _KB.', + 'updateStatusConfirm': '_ uploaded successfully and _ upload failed', + 'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully', + 'updateStatusError': ' and _ upload failed', + 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player', + 'errorLoadConfig': 'Server config not loaded, upload can not work.', + 'errorExceedSize':'File Size Exceed', + 'errorFileType':'File Type Not Allow', + 'errorInterrupt':'File Upload Interrupted', + 'errorUploadRetry':'Upload Error, Please Retry.', + 'errorHttp':'Http Error', + 'errorServerUpload':'Server Result Error.' + }, + 'webapp':{ + 'tip1':"This function provided by Baidu APP,please apply for baidu APPKey webmaster first!", + 'tip2':"And then open the file ueditor.config.js to set it! ", + 'applyFor':"APPLY FOR", + 'anthorApi':"Baidu API" + }, + 'template':{ + 'static':{ + 'lang_template_bkcolor':'Background Color', + 'lang_template_clear' : 'Keep Content', + 'lang_template_select':'Select Template' + }, + 'blank':"Blank", + 'blog':"Blog", + 'resume':"Resume", + 'richText':"Rich Text", + 'scrPapers':"Scientific Papers" + }, + scrawl:{ + 'static':{ + 'lang_input_previousStep':"Previous", + 'lang_input_nextsStep':"Next", + 'lang_input_clear':'Clear', + 'lang_input_addPic':'AddImage', + 'lang_input_ScalePic':'ScaleImage', + 'lang_input_removePic':'RemoveImage', + 'J_imgTxt':{title:'Add background image'} + }, + 'noScarwl':"No paint, a white paper...", + 'scrawlUpLoading':"Image is uploading, please wait...", + 'continueBtn':"Try again", + 'imageError':"Image failed to load!", + 'backgroundUploading':'Image is uploading,please wait...' + }, + 'music':{ + 'static':{ + 'lang_input_tips':"Input singer/song/album, search you interested in music!", + 'J_searchBtn':{value:'Search songs'} + }, + 'emptyTxt':'Not search to the relevant music results, please change a keyword try.', + 'chapter':'Songs', + 'singer':'Singer', + 'special':'Album', + 'listenTest':'Audition' + }, + anchor:{ + 'static':{ + 'lang_input_anchorName':'Anchor Name:' + } + }, + 'charts':{ + 'static':{ + 'lang_data_source':'Data source:', + 'lang_chart_format': 'Chart format:', + 'lang_data_align': 'Align', + 'lang_chart_align_same': 'Consistent with the X-axis Y-axis', + 'lang_chart_align_reverse': 'X-axis Y-axis opposite', + 'lang_chart_title': 'Title', + 'lang_chart_main_title': 'main title:', + 'lang_chart_sub_title': 'sub title:', + 'lang_chart_x_title': 'X-axis title:', + 'lang_chart_y_title': 'Y-axis title:', + 'lang_chart_tip': 'Prompt', + 'lang_cahrt_tip_prefix': 'prefix:', + 'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀', + 'lang_chart_data_unit': 'Unit', + 'lang_chart_data_unit_title': 'unit:', + 'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃', + 'lang_chart_type': 'Chart type:', + 'lang_prev_btn': 'Previous', + 'lang_next_btn': 'Next' + } + }, + emotion:{ + 'static':{ + 'lang_input_choice':'Choice', + 'lang_input_Tuzki':'Tuzki', + 'lang_input_lvdouwa':'LvDouWa', + 'lang_input_BOBO':'BOBO', + 'lang_input_babyCat':'BabyCat', + 'lang_input_bubble':'Bubble', + 'lang_input_youa':'YouA' + } + }, + gmap:{ + 'static':{ + 'lang_input_address':'Address:', + 'lang_input_search':'Search', + 'address':{value:"Beijing"} + }, + searchError:'Unable to locate the address!' + }, + help:{ + 'static':{ + 'lang_input_about':'About', + 'lang_input_shortcuts':'Shortcuts', + 'lang_input_introduction':"UEditor is developed by Baidu Co.ltd. It is lightweight, customizable , focusing on user experience and etc. , UEditor is based on open source BSD license , allowing free use and redistribution.", + 'lang_Txt_shortcuts':'Shortcuts', + 'lang_Txt_func':'Function', + 'lang_Txt_bold':'Bold', + 'lang_Txt_copy':'Copy', + 'lang_Txt_cut':'Cut', + 'lang_Txt_Paste':'Paste', + 'lang_Txt_undo':'Undo', + 'lang_Txt_redo':'Redo', + 'lang_Txt_italic':'Italic', + 'lang_Txt_underline':'Underline', + 'lang_Txt_selectAll':'Select All', + 'lang_Txt_visualEnter':'Submit', + 'lang_Txt_fullscreen':'Fullscreen' + } + }, + insertframe:{ + 'static':{ + 'lang_input_address':'Address:', + 'lang_input_width':'Width:', + 'lang_input_height':'height:', + 'lang_input_isScroll':'Enable scrollbars:', + 'lang_input_frameborder':'Show frame border:', + 'lang_input_alignMode':'Alignment:', + 'align':{title:"Alignment", options:["Default", "Left", "Right", "Center"]} + }, + 'enterAddress':'Please enter an address!' + }, + link:{ + 'static':{ + 'lang_input_text':'Text:', + 'lang_input_url':'URL:', + 'lang_input_title':'Title:', + 'lang_input_target':'open in new window:' + }, + 'validLink':'Supports only effective when a link is selected', + 'httpPrompt':'The hyperlink you enter should start with "http|https|ftp://"!' + }, + map:{ + 'static':{ + lang_city:"City", + lang_address:"Address", + city:{value:"Beijing"}, + lang_search:"Search", + lang_dynamicmap:"Dynamic map" + }, + cityMsg:"Please enter the city name!", + errorMsg:"Can't find the place!" + }, + searchreplace:{ + 'static':{ + lang_tab_search:"Search", + lang_tab_replace:"Replace", + lang_search1:"Search", + lang_search2:"Search", + lang_replace:"Replace", + lang_searchReg:'Support regular expression ,which starts and ends with a slash ,for example "/expression/"', + lang_searchReg1:'Support regular expression ,which starts and ends with a slash ,for example "/expression/"', + lang_case_sensitive1:"Case sense", + lang_case_sensitive2:"Case sense", + nextFindBtn:{value:"Next"}, + preFindBtn:{value:"Preview"}, + nextReplaceBtn:{value:"Next"}, + preReplaceBtn:{value:"Preview"}, + repalceBtn:{value:"Replace"}, + repalceAllBtn:{value:"Replace all"} + }, + getEnd:"Has the search to the bottom!", + getStart:"Has the search to the top!", + countMsg:"Altogether replaced {#count} character(s)!" + }, + snapscreen:{ + 'static':{ + lang_showMsg:"You should install the UEditor screenshots program first!", + lang_download:"Download!", + lang_step1:"Step1:Download the program and then run it", + lang_step2:"Step2:After complete install,try to click the button again" + } + }, + spechars:{ + 'static':{}, + tsfh:"Special", + lmsz:"Roman", + szfh:"Numeral", + rwfh:"Japanese", + xlzm:"The Greek", + ewzm:"Russian", + pyzm:"Phonetic", + yyyb:"English", + zyzf:"Others" + }, + 'edittable':{ + 'static':{ + 'lang_tableStyle':'Table style', + 'lang_insertCaption':'Add table header row', + 'lang_insertTitle':'Add table title row', + 'lang_insertTitleCol':'Add table title col', + 'lang_tableSize':'Automatically adjust table size', + 'lang_autoSizeContent':'Adaptive by form text', + 'lang_orderbycontent':"Table of contents sortable", + 'lang_autoSizePage':'Page width adaptive', + 'lang_example':'Example', + 'lang_borderStyle':'Table Border', + 'lang_color':'Color:' + }, + captionName:'Caption', + titleName:'Title', + cellsName:'text', + errorMsg:'There are merged cells, can not sort.' + }, + 'edittip':{ + 'static':{ + lang_delRow:'Delete entire row', + lang_delCol:'Delete entire col' + } + }, + 'edittd':{ + 'static':{ + lang_tdBkColor:'Background Color:' + } + }, + 'formula':{ + 'static':{ + } + }, + wordimage:{ + 'static':{ + lang_resave:"The re-save step", + uploadBtn:{src:"upload.png", alt:"Upload"}, + clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"}, + lang_step:" 1. Click top button to copy the url and then open the dialog to paste it. 2. Open after choose photos uploaded process." + }, + fileType:"Image", + flashError:"Flash initialization failed!", + netError:"Network error! Please try again!", + copySuccess:"URL has been copied!", + + 'flashI18n':{ + lang:encodeURI( '{"UploadingState":"totalNum: ${a},uploadComplete: ${b}", "BeforeUpload":"waitingNum: ${a}", "ExceedSize":"Size exceed${a}", "ErrorInPreview":"Preview failed", "DefaultDescription":"Description", "LoadingImage":"Loading..."}' ), + uploadingTF:encodeURI( '{"font":"Arial", "size":12, "color":"0x000", "bold":"true", "italic":"false", "underline":"false"}' ), + imageTF:encodeURI( '{"font":"Arial", "size":11, "color":"red", "bold":"false", "italic":"false", "underline":"false"}' ), + textEncoding:"utf-8", + addImageSkinURL:"addImage.png", + allDeleteBtnUpSkinURL:"allDeleteBtnUpSkin.png", + allDeleteBtnHoverSkinURL:"allDeleteBtnHoverSkin.png", + rotateLeftBtnEnableSkinURL:"rotateLeftEnable.png", + rotateLeftBtnDisableSkinURL:"rotateLeftDisable.png", + rotateRightBtnEnableSkinURL:"rotateRightEnable.png", + rotateRightBtnDisableSkinURL:"rotateRightDisable.png", + deleteBtnEnableSkinURL:"deleteEnable.png", + deleteBtnDisableSkinURL:"deleteDisable.png", + backgroundURL:'', + listBackgroundURL:'', + buttonURL:'button.png' + } + }, + 'autosave': { + 'success':'Local conservation success' + } +}; diff --git a/src/main/webapp/js/ue/lang/en/images/addimage.png b/src/main/webapp/js/ue/lang/en/images/addimage.png new file mode 100644 index 0000000000000000000000000000000000000000..3a2fd17121b9e0d435b2ca082d696c33b9f27b79 GIT binary patch literal 3373 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 ZzyK$sgmq7P@T33$002ovPDHLkV1jUEUt0hG literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/lang/en/images/alldeletebtnupskin.png b/src/main/webapp/js/ue/lang/en/images/alldeletebtnupskin.png new file mode 100644 index 0000000000000000000000000000000000000000..61658ce6f10164478ce293c05f1f0485a8fa1fc4 GIT binary patch literal 743 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 P9go0R-$Jhf?tK5Bgo^WU literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/lang/en/images/button.png b/src/main/webapp/js/ue/lang/en/images/button.png new file mode 100644 index 0000000000000000000000000000000000000000..098874cb1fa85852d77ba9acbb5850c91c341fb7 GIT binary patch literal 4929 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/lang/en/images/deletedisable.png b/src/main/webapp/js/ue/lang/en/images/deletedisable.png new file mode 100644 index 0000000000000000000000000000000000000000..c8ee75094f59f0c1262806fd294d361f30f64f58 GIT binary patch literal 649 zcmV;40(Sk0P)!u-Pc3GOd!YPO+bG=gGoA_gW7h+<&i6W@>CzIUsorkT}tXKy|I-GoR_nf%RY$+yzqrWn_y0c| zycG_I116IRG@DK0sZ-E55u|Ou1fok>7zp9LsHJgReXhe;7C4$VS;)mE^wOWxM5!>w+j7B4b z!(p<+cswRyO2rY#*XuP527_xko|w>=_a0qmu_(~#bP__L5ZG)saJ${)TYOfjR7kAi zYvg9L`EQ38LQ-=rdwc{0EpJ`Z=~U9|_2kw4eh&tN0eJ55 jcWg?)n1^9d$t00000NkvXXu0mjfULPWN literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/lang/en/images/deleteenable.png b/src/main/webapp/js/ue/lang/en/images/deleteenable.png new file mode 100644 index 0000000000000000000000000000000000000000..26acc883567c5d7fde8de3ba052d7754a5b1c539 GIT binary patch literal 664 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 F`FAsl-Jbve literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/lang/en/images/localimage.png b/src/main/webapp/js/ue/lang/en/images/localimage.png new file mode 100644 index 0000000000000000000000000000000000000000..12c8e6aefa8fd16287ac77bbecd7d5b58c3fc837 GIT binary patch literal 3083 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 Z1^`gxH94g;riuUn002ovPDHLkV1oEm+S&jB literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/lang/en/images/music.png b/src/main/webapp/js/ue/lang/en/images/music.png new file mode 100644 index 0000000000000000000000000000000000000000..2f495fe92ffecdce42b74fd57dca2687414711fb GIT binary patch literal 91561 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 LNkvXXu0mjf3l)h% literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/lang/en/images/rotateleftdisable.png b/src/main/webapp/js/ue/lang/en/images/rotateleftdisable.png new file mode 100644 index 0000000000000000000000000000000000000000..741526e0d5e6eb5c30eb0a62c9b1d6d558ed9cdf GIT binary patch literal 719 zcmV;=0xVLm}k=YQ<2%m+GNILKMZ4Wj)Eo{6dA(i=1OgO`#k70DYI-BmRjYes)SkU2cI0GZBR;y4N3I~Hh!d`9*7LUg-fQ!ZA17DgvC%W<{o)0F! zU*`EmuKGZYN~Kcs0v3uoolcs~W&&`zTnccgjDVT|^mshtI#kAIIINifC7$1T{?yd~ z`f398$nzJ^&xXUj%I~;@1tb~>YHqh%0jWR{cz-&b2!6()Y&M(t%#{JqZzlB@o&~uo zRdFYN7<*g3d>y0SFTSsu}||KmrzxrzXV}0f4+Nl`U`wo^<=3%s|h|0ur}Z0m~6a z)9IA5+3a~Uyo=N{O{`Z26ni!(U6x=a31615Uq6I}2cZ-|0a2}1X+EF7+lbqaCbL*9 zVjpaCBO8zeF31Bljb43c1B|5gdMy+K1i&JZ2&owiAH&aRFjxU~zu$k$sq`Wh)qB?* z7JdW}ya?6MP#9CN2390Mab0C5lljw}edEbwzR6l%S5ujn*P2rK!bg5RKf!pHvr45x zq@5Lg56Rlp|dF?<); zZnrB`Ycv`HPI*-K+S{`L4RzyPXZYcl&002ovPDHLkV1lL= BGwT2V literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/lang/en/images/rotateleftenable.png b/src/main/webapp/js/ue/lang/en/images/rotateleftenable.png new file mode 100644 index 0000000000000000000000000000000000000000..e164ddbd62a232f3a89826158c9795f6c082cc89 GIT binary patch literal 952 zcmV;p14sOcP)B{+A~4pJXZ}t_3ogEQ=EtDt@NW=ovC^1YY3D0f#y*iY)MG5<8F z!|f{@kKz7^5#8k3NZf?c9K_t5iFB?APcn|7{XXn#Ybhtak0o(qW)4fuAr!0vET4{< zSc+h47GQ*Qo%FCG#zDtxKn;d}ii3LDciA+S|Xdhl! zB4Tth6pKaVi#F1YAvCEHTFJM^bUHnP0sSYFPoVrcDQm)w^;g8!)bGBFx|JW?%CGA- z&{PEjJ5@v`9|31h11Z`(8l4W74acX!rYt{M#7D#XGmFrJ8p1{(Q)@sv8@F2OUzvR1 zx9$d0kvWXM{tBEwN0$R4YNDW*#-^%Df&-Q6zoW#Uu@ZDmhS%$@-$mxZRD^B@1aSM_ zhL@++3|_o?ixNDPXhWAA>})fj>w5hzGPAR@B4aE>&p+Mbf*>$imMuk5EW2c0000?hzPCHlRk++nh`E3!rKF3htnTQ@ z$gI|MU8lEVHuFTg-PR|Q2`!gP+H5wYX&N~k4)SU74-bY78_Ii7=yw!+~9z)9EC?-%tI1pNtpOgTWwx zYc~hmYPIxUug9z{77N<%_sk-|f_a_y+;xqv4+oe^KHq!n0!Sli2@LjQ?eJI-PQw!5kz2kP;{i1#vW)J3m7@ilvOQx*+0gD21yWM29TG_#>*)V5x3eEte0rs!7XTfq- zNpDVBe^HqJA^?xgte(JHEEaB201ADoR;^a);o$)-i`fNGNCD$l*jUkV&ZOJ#g6-=H z48;P#aDbi7X5{nvH~?d$9K9Fo01LT5x392A!Cv-)3}9cydREAx^dDF>`_*d2002m8 z7y1N?u~>`?4DAa45ev4jw7ek*Sw2XA4L&zdS z9A4&}t`&psbm3W({))<)8k1Mzq-LMgHh4P0I-QOV5C8-H!ohO6T&8$D&Va$Z(UY0s zOeS;lL%|{kl3A%;S#MlC&Amg&cpiN1r-rvC| zuQ1Fer=aUPn>g6re+%A~4HxgfoyFs_jfT}hvT2|~buTAFG7cgsM5)fELnz*RfYsA+ z%+JjZfW5eCXjGl)8+s)4P|lCQu*F>n-SXLP{rpv`@{BNE{IcsI8B@_npSvh)X*hNpW_TLgr2`Ju@0bJqvCruO={o6E(Z3`5{jw@Hv`M-m z=H><1m4WE;;`c%mkz)x|ObZEnAD_J*B%s8ej2PcmwhgRZado>%)jtid7zm=SE zQ*F%`{_{RP6wdfheSj59}E|h^E{{P*E_)R6H^3NW^13gC8C>dV0CgKv@POF4dxfvY6kSFwxaNHki&!>3-Y^~4kn%F>oC=IgN4BfYTUZZWo z4NgH0Fff*Y6!1`OQEtkV%qBhmGZEnCEqwT{hG--_gp%$=?(C?C;zb^jm66PHQ4|^R zkb*cmi1NcmKm&YfVi#crNDyF;_V&?5G literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/lang/en/images/upload.png b/src/main/webapp/js/ue/lang/en/images/upload.png new file mode 100644 index 0000000000000000000000000000000000000000..7bb15b3d6d6799504cf7093a1600bd7ece0d9ef5 GIT binary patch literal 3941 zcmV-r51R0aP)2T4RhRCwCVT77huWf{Lep6A^=*Z?tO z;u6#GA@d6}KTsgcFQ#>l8sbz^5fVFQb@X7FT6VN!V0kJJ$+S)upOxlGP|_e^h^KTz z7);n^gTY{faKj$8}%V@A_T8>wc97-^;b{`+L&! zUZk}U!sDM%^hZeRy>M216hBfpan$@sDF+T5ICSXHsI#-Pq@*NUASE6O=h;(Ucqb(6 z)%|R6&4m+Ya?S!MhlZ#fK6gYC1D`_3NM|s;(u?%k)7XuC}$nvu>Uv>m9jup zi_0FX3tP$?i8jAiJ*PFVQN;$147 zrjH#!hmj)xi`Smh#O2r1c3`F*ZMpXGtE0bPvn+W*?qM^hDBg ze41YY9LnSAuLD=GZG9$cpP#}ju)##dPDx@EAM6RFEW>JopGz(&m_w|MKU%4XrfPnx zc`y1r3Z8S;V$nzlLu-NDW9OYBez(GCqn+|n23}KK2Dn<`nWA*jDHg-$QUI-(223)C zz%O_U-jh}v3{iqi_ZY|iNxWrpg3Z?A6Uu%YE7&5f>eeE*B2hA9g@x&sC-NqUr1NA& zqJ0J-rH4cvD%DmRMLFSpL^UeJDzeG~0$LI^!_64!sd@=RYg%%P(Hv4Nq#PN70t2IP z3>=A%%|B5+}GvPIDKun~(Vv`-b8e>62-eS;6vNOTM2ocU2I$qX^RQM>BT$|xu zmvQ;@z}QSG5nK&V1lYqWMP9=x5C?b^!FEI_HpUzz3w&;QAivYqCAoCpp20Thy`yc+?I{x*cgdmr$7a*L+G@g5{azEBqH!YHoe$V z0aa4N@KE$Xt zu#AtYo$ZE6$aDkx5@ZZ^pSP&y`IUeCzcMry>d)tMfp=p-ki6jesEE|qpjyI)>B=Zf>s{Wwf|;D_sfy{vxc%IRx1?Y{XNuUz=4;cIGkqV|-J8v4`keRf1i z5fxKl8By`k{Dt*DTSA*6sCV8}e$R|?kl>3nGJdO+BrF%h<6(#hYy`@+G43byY# z^wsaYvZd+o)<;)P8sSi3Bo#+KDaG(`Po~KCU~oy&A!PQCTC;PT;IsnI@`MYSU(l*& zzg^%_8pDr^L1YVGtY7p(^Rg$u(6svI8!F1?RMqZi?OeH_5`nsR=D3BAUA69w*2k*; zI;--uzpcDw_2MrAFLR#SNV~{P=fR%IpZVm5=Wm?)`LP#`8-CF_!x~pjH!>3hlyk9U zKKE2aqev*A7kTGYjDHAP%kHk_^RHgBXiCSyYj@@0gf4I4M_4IpZp0{jm^O9wa@a|pT{SyMT;rTDUF#oD` z8(K-bdDb5?h_#r3>`8tFWO>Fsk%jkP8`j-CK-TaOcTz77;cW z(+CRMfde_vxld`4yJvj5Vdb>al7V3iwn4I8Fs`&=<;^p%I}>3aUQ%?yImdQ%b;B0p zOyu?D6HY2FipHKYh)cbsa%Bz?Mc9P$S43bq6fhW;+C+gxh_s1ZKm}i(dRqCYV^1h4 zyyN;as%!Rau5V8rDnN`(TDI!#Q%4&Qo(w~5`|D-G2x`8%Nwuy>hmLxA3Xl7;j^ZW9X`BBla7nH zcS=#GyAI`k@br2iGMl%(Q{S|QC>0y3<4X+Ipr7>9~}3zvg0zAd0BAu;0K$rf!BQ~2Xy#U zu*4#c#U~`oGAKA+M@U4z*pgs=!>tc99u?ivfh9F>+}M_9DZHJXh}K(JPm6UO9V@jE%rgAdZKGbTSAV|ot9$F z-b2iRnuLA>BrSosctDY+27@MrDh#0`3IqyV#F8xv8jz}|jDb)X{gsFReBa~i$%Ed_ zyMF?!bVWU}aEKJ5K*d3cltcqHH=cQk2#b;tCoQxr1T~il z5`+bS9ympC&*fzrx%m3YqkV;Y@UDx_y>?;shCP=}I1$T41QEGnZS#;p(X;cez@d@6 zx8Apcii1PnN6lz30NM?ttf@D0tm6e&C0@Y$1Ml{5AEFN&Jjl)@gK^re4F^sdHUt2! zYix)AC!AHXcvllCCvVRf`LVjK?Mg8Ygxb8d{g}Z6ii-+fS>5uj8RyQZEXTvwYFb&O z%G1XT!TK0qdi*F%-qN@aX%YKyv!{4#QstU&Mtemmcg5(PSQe7Bx0G-QTj;S^6#Fb| z1vHl!AM6gwD|B`cBBRTWf&Z3O?*drXy}sv_wYw$jFDW2aMAgzwEo}#O zwjZckw7Fs;xUT?a8ES{!rIS9ft*LX~;yOg@)tX(ueW_vU<);iPDi~C(H#Y6X;&qLC zfAI7hkto1x7<~TO$Ito2hL+Zj9eX;K{-Kd%uds|u7k(s<{AX`SB~K8QN^V&QdQ$H{ z_n-uUIO+n?qeK$?p@RIEbR;=@=6Nmc-Phdp65~PKHnqI+$};p7Q?5Mq>7|=r-O%={ z?_aun?T)MOcu7k+x@<`0o&kzyPyf`;w%WHE_Q8su+&^jh z?3I^H`@NB7!r7%QZHFwm1kHv-?@i=@^5O~6a?{4QPCTg;-2=6Pq)}bj%RSs(YSMQ~ z1CJUZ)f!-HxT2W4X5<3pAV5KDh3gtA^P++i%!h|z4EcoU5bT?3>KDlu#0h+BCRx&O zYa5aF(?N3+>Z#_4n5ql`nUhr5bsP51{N~D^KROAemNUbID;LFS?Fd{XGKtOlZb4;5 zhi()J>j;AeW79VPu%;)*!)w|_bN1hX_q(7^ga(4ZkGFf+k0cos*}l%iZzM| zi!eI1&-ie+l)n$7bYYUAYlHCp$KiYGa9^(fB`}Nwh?``l0-gf@mL&q*8!5T}tzM>K&O@G{)9$trT-y?EVWRfI` zRYF=q_pw}|h@wLg{c^1=kKnocz`@7>6u!4sOruuJQ3*m>>XT6Yc&}}Y`KNR^EGUqP zT%|OzrBWZ!wY&O2X9Z>ybf0N8NpNZMYjOB%JoI8NiAet) z4PRLFIlm%IK|DGV;H)GZB)*sZh$)DyTrQW*W}_$*CrMJ6&8YBg1B(NKcqDVNj?72w zruPvLe|Lg5C}z5YZl(fC4(x~Ugsr(dm)$){K|z7+=;&^3-__CCrKNa(d`Nt%qsm!y zVF8Cxk3;B!c`^Dh;bgykB^^M0OmWc(C!7%JOk9{9Acv?(dDZJn$6p>0f12bd`5z8K zs3liJ?Nn$gGzk?*ROF%R*MJok6{8^jLx2GQZRD&^kujjH00000NkvXXu0mjf0_lsp literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/lang/zh-cn/images/copy.png b/src/main/webapp/js/ue/lang/zh-cn/images/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..b2536aac72e763b9a872b507462458ecb96990f0 GIT binary patch literal 4319 zcmV<55Fqb~P)X0ssI2mtLes00009a7bBm000XU z000XU0RWnu7ytkYO=&|zP*7-ZbZ>KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z1`J6=K~#9!?3}%C(@Y%4&u2F;yu>k4Rm2omLWoYp`~^)}5EB%sg%QYr!q#+xwG2tv zV2ZKfC6P!RwHEezy>`1j7z|`t zo}Qi#?_E5)9}9!g>-7?ege=P}aC)A1__1@Jg9fzC^SsliPsii&Z{NQ4dObx^Bq=N` zF$ZF@g)wfmTAt^fIddiwiGW3RUH3?tnbBw@Nz&P~XQR>R&!0bebmuyFbZ@uYsZ>f3 zgyC=)i9`-ItqfzTDhPt-c`)EmN<~qeo}T{r@gtacjyu-@o$>ke=NXQa(%s!%#{Cho zTL{{SXx>#P19e*wr&5VX_`w*OMz;O#iFk3 zkk)mbr4d4vN~KsV2J#1PvN|cHp69_t0<3?ixbx^f`HDm$;AEoFsN*;Yq0wjrY!!<| zLP&s4UDsc|dZlR^LTGt;IhV`nx*njg(P&Ugv)L>{Xk%kT*Y#{RYnrB_C|g@wgpfe~ zz)jn>S)J^YEtqoLxejg>Fvg?NNEAiab=l$xrBv7TN~My^<^1^xA)h~gh76WvH5v`z z9>V$Cw{P#?zrV1s5HKE!qEJfL*Vk>^Rulyu5kjEsxKUw<|6PLP&UKhBd3}AI5R%K~ z2qCMhtIT7RN+o}u$B!RFdSPKfRaJ!0_V)Jd?Cf~ugb?5!>bZ66maglYo0|wB%d#L( zsZ`Q5P1p6CH*Z29X9ni?{QkpnKSrzz!e75CCX>mvwY5^IWSVBBQrWXtK(vPR^71nH z9Qv!SUcCzDq*AFUiUQE9s#+)%m|c1I?wx6xrfFs}nMR{Q2w7ZQ1o{ob$mMd^uV3f5 zbA`e>q_f#9BMid!IPPm}Yk+$`pMUxCrC}I_LgDu9+kQ_{uh+}vGEi>YHn@4XWV(0n zUa3^FZF_Zfl@P+7&d<+ZxpD=@3g+EI-Qd7iW{wf@ev1q@!CTjAHS147++`y`xm*S- zVi*R)dQUxj_RQaH{9fGOJ^T&0eEIUFOP6F>-ZL}Do$J4{KCWaki4aPs)9G}&R;vY` zs;W9aKaUVvSy}Nz9H=vJX<1f2p9kyW&!g))EP4j&*>iTm%?#J!%vQlLSe8|*)#~+n zwOS>FG@H$pm6bxFuxG(?xePPW8#itQ)?2{6yzrfC|6!NARAGLW`y8`3Zc+_`fH1_8E$PAQ$6 zo6BS}FJ8RJWHL{lJV6LS5!<$bZ%XOIhYuGQ7oR_Wju2`#oBq+@&6_uxrlr$q*igXe z4@rCj@Z?iY2$`Fk!x&4FB5-d;cys> z#VDn%Rx6cCaoo8MsNrxZ%QD7zYiq0D?~9@si^ak_`@CPl-nD2n+U<6~e*HQe4$qxC z7vAf*nVE1+O-(_7-`w1E94C=T_|Fjizh*{~Bv>Ze+1Y`v7>~zY*A4HiDxa!OzWV)s zEEa3G+dDfu-EOzj>4>6u6ui6RI8#$oFqcRq5;HS1Cr+FQ^^Z6H7yyoIf2hEeNX7sF N002ovPDHLkV1nv#UQ7T0 literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/lang/zh-cn/images/localimage.png b/src/main/webapp/js/ue/lang/zh-cn/images/localimage.png new file mode 100644 index 0000000000000000000000000000000000000000..7303c364318b6ac27dc4a8ae6717124d8dafaff9 GIT binary patch literal 6979 zcmWkyWl&tr7QBltzPP&v*M#5_0_4L31PQ?o<`!RRw z)>O@$I;Xo&&qSyw$zq|Cp#uPbB`^0u4Lppnz$n1i&yDf+x`z5{|A(K!}?qr_mcYi!PTPzLm$)Xf7EUt`nv4Rq&L0 zrMTY5^X%m0asIJ&KWqPK%wrtK9~X})elOn=c&`>BBD6pqt1Q<$)aH*sD7S$`1KERi znxxzfNP9a9FBwm;GZtVJ_67PA^_4<_@jt43W#~!Qym+n z`t~7>av-1+nmn5N-xMD~WAX%<+vWMj7VTEIb&ZrE@f(O4+74Y-Y9>9t+&-eh7$yLa z-A{JC2#Uw;@9k{vneAJjUH9d`Se@I^iP2uHzqI~9Kms62<7Z3yySsCU_5+}5mkz5^ zU0_KQuvov><6B0{(?Or`ypQq_e3GEb`KdA}LP>#+fpNlU^s|k7J4)=8Z_{og%J&w& z`m*eK4me~;q*rtn1U)+#+PYS%#q2|oqZzi|+Yre7*MqX$|G^)@k z4tO-F#ebk3O5Vad^y9stPI*R4bi)G5LzO#~{-V}Htvh{BK?qUUT2roogzpu{4>F8+ z0AkM1>j49R#E$z|2{sTgnp(IG0IdfkUrUmR75c#d@F6dNwOSGtvx}g-6FaMmvbB>K z!4Tzx1SUhL2t*2H$DacICrOGVsd}f-0#bc7B3T}8#wO%X7mpy;{s!LHfFpZi6a$i+ zZj#neG$hGEFuozJP&lqp%mUpQm^eKKiOx`tKf%9{<}jQGvwSBZzX5^A!@{ye8iXMP+#|CD^INwPmwqW*vL zizoj(aB&8FB4dpGCwZ{Vek>Y({ShW(5TQlJG(cp$t0kZrD_~5i_0E-$yfeq}49tKK z<&S?1{uT`BwhoMolhsntk}hF9rvHQ24E}-^6wK4jOqW=q{D;vK@4naFNT?=G>ti|7 zDJ>Ok4&ygwY<&GhIR@;ZgdHVxTE;kDc?@|gxn((y!q0_bQ;_dj3QR|FHbZMW;9CE3 zn$-A)IGi};gvX(todyD-zVIytw0s7&!X&&;0;b}-NJY84Qt5eRs-vYjGvKmtp<$)uFqkm`1~#zjH8)E($GSVg4v0T@8;iO7F>tU&1kDZR5Ga(sZ&-5sE7N9LDz1W zSfN-!19C(+AbL=XuG~&C_tw>@>7kZ&|$wGSKOMxDxbDcTIt@7YpHjh524m1AmdYOyNgs`>@( z`ph<{UKelaIE|LK%{B|!Y^zc?sfs%t9oXPe^4V%uC#X!0)E zY4cS5^i4r#OXf<&qRq_eh-jbB??*+>O!6VU9?>(&>vNdamcz()c5!BL_f_0J*EiR1 z+TR}AsFdrnm~!U0Z3dTnbvN3eUIs#9qNWdHhlpbRVhFjOxnb?U+UeFs+v$DheA9hV zpK>0BAE3{%cO9D^mqZsz$OfP;&@QMgfGnU6(F&0oDIKW@RRB2}xdnv_Q;bjw6Aeq7 z+A-0tllYSS-k5L2oIPWba2T9Ts6+n1J;J0wHHRA$Iu2fk_}cxtS2!H`3l86qwGMBj z{!W@seD6c>hLyLB^PlRU&(03cF!s6f9qmW+wwR09(jQI2%a(r~UCqlat<|iJk24$n z8_OC4+{5liKF@fpxgB6fNgdPO6)oe=h|Gx)N0GSpL?jVpIo@|%eF4#%K5ZX((O z+Hu~3A!&H2wc@)$G*T*DB+9$Rwu+Sam%*7K$};Ww(fO)14UL~f685q+lWzrAg?*$S zEJBq(y7cp*DXX!0#FHj8(O)TQewbS;A76A>(7 z){e)X%`kal*f4B|{@&?onb0~!VY1+lTBQm$kpfobiwSckPP}x(=BZBKoM$#BQ8CdTPxk?%&U+e4rN4+LULNEiE;TOG}TH z%NVtwsiGojw!km^$)!m{P}|CDohD;K!(!Tyijjt&WToIND6q*B z{n>VQ@S`A`@*AaWd&8^m8PB${%YZ=amz=z87SW6QoxsHHVw2*WY$b8gne-J8n8H)K zm7c0zo4NFOjySRNsX~K3Z0KrjKUVL&)&80eX0*)M@Lz>!rKqg0{qv?=m9E{9DGYk@ zMWoXCTJcDD@@(4g!LoDKY5s1WQ!m$}?X3Tpyup@fm7ZyI{`5)>7&Og6DFEyr}HXC;aod)AQ+Bj#}Xkj@oNw3pkn^UqQva|Fb>7!$_sj11a z$l5MV#u7J+Ym4#6hkZ3)J&v4y@2@{^J^nYY^|Ww~aUV6_QRz{7<#_hHv`T1zet^1l z%tQ3z*HgvVvd>xLS@Zfp8+AI%lf;Y4)#QWmK=Fh!Ol;r#<%tUxeD%mUmCFZrn>5C9 zYKj2h$q09%K>%?73ZD-Fz=azC{uuy(P#ORb+a>7teFOlAz5EABb@!#?uZq^>=AOQL zu`^ovB{e46DTM!#E=OE_?gZ~rH2cSo#!Tqty@`~O|MTX-iEexqfffhjdMl_=!fQdA zn4wxiH_rUh+xAVNm%;jU(fI#4W{qfT77gMbO!2Gt5p)lzkX3?_DH zK3nFtAX1QIuoNvga04UeIkZwYyl*ak=!awqj*?2vf>8dX>?Cd{a zt;J_lbJ2IsWMyJ6l_je)y6$)-ICvr-lSBzF}ctkpkU#KC6hcWO7K) zb0|w6G|yhGI5!8w_w{b~m6)i{`#$OeN*zs!hibHpY0PGvxi~ek5|{#!ynsf9)ah0~an<@g^choScTOKs&&pRU8+neJS z=c2_!qp~y#|M{F2?9Y*odFE9i#{kxAh#Q}$g^JWJ^74-c=Z9Z=i}z6Nz>23CcN{g? zITXd(z$PRpR#sLME|mEA_#~vHKRc`0qj-aLpO6ti3W|zd+?eH+l|~*Oq|?*WU=)~N zoVq3c#a;D&VVNb?qIFX-PfE%dT|5gN8RZ9F(vR$av9*cvSm+2${guq@h7*7^u|ma6|a6Ty*SN{HaEU^dbv6l`OX?&fU{>udT-m|>=t2N5qXLurf2 z#Za9kV~CJu;tOnQ5;*XLPVakR32PNhcCE^&+#;7SI4JKUkc3LsXniPB>w#@AP@qNE)0j-$jmI%*IYbI!JdgP6228Xr;-XHyim%XBl|}x8i?s5 zB-*g$f90{-%uKfYEd>Vp!c~qZ^s?)G4of1YfCgdB8!aB%}qlx zfd%II*xLtE+YOUCQ~1NPv1>VexZZ!Y0pyAMMd(3 z(~SRLX8%E-YbTN7G43QV8q83mk`%znF?rwCii!w+49#i>3`kIBEeUTtDb2@oWPZ=) zv(+zJPuX;%yAm5HAIFXNDnd5mDB#uXZF1Uw_$4ZXiyKuzpIb#wMSWX%;M_bz$hRCY z!;!>ZIISB#5auQ=k%;gn*Nz4bD>%Aka7BGw#PrYdFW~^xs8H>*(~k&_09zys;r=6f z0&>Uaaig)Rgd*RoQyExUVbIglZwSVajn}ekrG#X@v)k&y5$_!v!`8b&0=uHzT~8}t zOv+NLPA=FsOj_2%Bk$hic6D`~u;71q379;f;Z5fuqqNYO=A(v0WB*^35tF#EBcC+C`f} zwTE`rSDGRA%kt;oqINO^b8}QU=ac>}pS)F=4mKpw`u44VZ;wf@%QckdH3e$A(&C0Q zYKC8=h6XRI#oJ7EX>g!KdguqFZ|EuE99+1`y!UYy1*wj1j}EYQ>y)Am=8I>^FTC&f^Y$loB;eHj_m9=g%#6h* z(b<*;(rKRS6B-?j)%tkavLRT>hE4QnB7tk?V-5P|P)>iBN6xgV^m=8^7MLP+<2sb>b_x2jGbHi};hnyoJ zfY9@ZZL(fZ2Kn07F1apcx0+ahz%GMSo}s^@n?1Gc?m4n>Ca`zavLgflNRsy4VWNuG z#3`pACR8c(Wr|l+5BlK;cu<|VlEbsyWdQm0U5Gb0#Z;0&#@fc_rwU7+=I?-Q!6kA7 zZKBYyFo(SnQcNtY$&&6-ba?NC!^2&5fcj;dI&bi{3g_iEHuN0b*U=<5%q8>--lrlw zjr-fFDjM+JRuq^0kCK@4E6~H;=yF7Ky54~kvuz<3 zP#tMV0%rs~7k+Wq^ujcgX3gT0aWUU-B{x2?!Z^AU z&=<~epICLvX}))Has)n3D5oNwlG6v+xPl@gKL%o{d$=*H*)gX1OS?2RHR0yNVRx7i z-tf%oY|9$jAr0hkG7 zdxF?@?e|Oy(}e?Qff9+I5*Xg+18RRJ`4i{n1S;ek>{mfPr){T{ACYwd!ePR7g+OJ@}zA=uraven%^GvPrqvPQ+ptsoLb2&IOA1v4%W z(;Inw2`e4^1b(^wNzs9CR|752A`XbjpOEue)bwqO&%gEPv21xzu|thqTnM+fx4}pV zF?YE;D-oM6tNA#y9yD|DiD$_bNANce)3v(NUNIpF`nG@<%xcw|^OsoLjUd=sXZ?YU zx40W|YH{G*o}J?RTNo`O2v~nU1zgKUSO4WnEH4QyDh9dogAijvalE!ziF9Ro-%lmG zsB09MyH@|E7`YPp_3Kx4Yb$1oDQzSjW{-Vv@a^`An#W%ZoHM+*4|S|{J`Uw!)zAW>Fl z`d#8r11OxzqMbM|yKlwZ&#=6oI^53Ztg2{UM(a@9&BXM>@-b<$*QEG`8kd9dKD^a+ zy%vMZogNk^yf5;Pe&GN2^|??|GeK*7DS{aY7tc*k?+QZ2DS4=xwN%GnNEAN(fCEB2 z1bJT{;7a|3DCLSNMoF5;;Q7s#4$o2$P(~oRvAHO+L@vmz7hW$NmS@`oT~N_G7lM{P z4LF9ny9JrXuHU9n*lvEo;kPJa1N@ggF@BS0n;(U}oETd{9SbX_4>>+9nuz1N6*kRa z`{u`kJLQ{nQ|^5-johmik_<`U#5MHvB*UQ=E9@iR+K;%aGe;Y00kK1+AV_e1QfDO$ z?%Cx0#|)#vk%VL@r8WnX@`UTZEGs@{t8pyLyav0-q2j2%+77EHfd+YFEk}igSads3 z?9uJ?DSC9P+5*pBcf>EcyzC^}=6j=sJG$#(RTIW+Hv+(=7&ZWot%mo8lCJFw2t&lO z3rIlct0Q?1H*I>4sKWw0pZ!x)FA6ht9A61!;BF6YZJ3pF;7vh-K*pXz7TT0zI{6^c zvKnegvaqlKj9-yZQx6Odf@eX`m@Oy^7|PnYDwT`%fve9quDAqI6~+z@-8>OHe4yN1 z9oJYm4f4K1?6>|MH0YP1SMlEfQG1vV#%&2L^Dl!&F(5tLy3zd$>!u zn1fh+RS6va&Afr@T=T!xei&Xt#0T73cIW$tZ_z2fo#%KzYDc6K7ILH}9oobaoagh2 z9XLF3bM-r78aghbePUmq9$b{s@9wsRZ2f9d@oArtZeb{R5p-J@5CPxf2mwF__l*QN zvuUxS$5QGQbAu7nBPWa{@{eR8-06G;1{@$r0qs=%4ips}*L-*pSh76>zIH(TEw>D5 zbwqC4{NE>?UhJe_Ho!x{yjIwKv)AH~3K%)5)U3x}8%~i>s$=2t>r=f=?a9iU}vS^P5;}Dix2gv^{7x zMW-W4zYS5xYf6Yb6}LWF$n}y(np=v`XG!3kc%8g^A|jwNhUt<@f=>0gML2v%9XlEA z7#XR`XFR{$>Rp2FZt--{Duw?Bx<^J#iv48mC)6ozqZ4VDIHzIBHHhl&k^Xkl6+z)oH-D6FW9L++k-g(0> z7FB~c%T!|&MXxm7ipxktw*JTS0!|Bt9k!;3Dm_oge& z^)RLF*?Ir}s{Yf`U+jcu^X|a>eJlAPxNcW}$KgR(JZ}Iy8}jD-nT|@lVeizNj$`+E z1UHtRe+6fMzb7~BB6qKOIXOo4_4v&9@cx;xo2vh1{%rPi_Z_vZs6FJwsSvO)><76| za$`QRBpzNJZ2UaEXzk|#a=Pvk?F6zzeFES=PqUM+v0fC28;gzp`%^vhV(5b6FLqlZ zvPI2T$!m5N=e<0L6mJmju`xOP)xKLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-CPhUwyK~#9!?7exA9M^p&_{vcV@Q5GqIB1jP=js}RM33N9aK%>!Dbyww4XI8%b<5gz8Gc&6Jkf1#k9f?9#R#sMK zR=zL4@B4i}v|Pmq00AHb0DyphAb%Fd007uu1|iA9?Il6^K%q;bV2Y^c)Rtf@*|3oH z^Yc;E0@Qv$isdl?V88$vz{8zC@)Gvni`l)3qqZ>E8%Wsg*#FRAG1VTH?jI!V1o~eb zxkI3feNKM_5{_xCV-)oW_7aYI3-0PA%+JK!6D)ZzW_P>z5Y4S_*%V6ah60v9eqZV?O zI#EX|<}^6pxaT3q6bti%y=2+`tN!oKw%haD-;129!DrdjGGve07RJo-?RDDJ7TTTP zwQWaFQL%ZSSa+Uh3tRC!Ylp>>gK3*b2g$4;}y&8R$Wv;Ijf^Zb0foZjo z6tMWnQjfjlRS&>4I~YxV)kl&sEpl86P>B`b5yZS|1#5Ex5sD&e09EF=U@TwF~NpTjisNb}d*a}n2 zbLXd}K&&DAKiEIE{XnP+DUg~9chg4=ha+gjpC>dj3PC*9p~i>AO-(I{~ycfGmbb@5MCm} zl7k@JHM|Pv1UaGv3&TE+2d^Rz5K>cns!f&dG3CyWfsUp8RQz!mEB+rJh2d_1Rs7Av zQ8)`Jh}{jsD`9J~0$v4+c^Eu3F{e6G8wOe3KD4rFxfn{O5 z+Q1YoILu{HLmildSj2%TO2wltz{uCjf}7Id5!{_>!Z6YPAb*|YzrkWsc!h;AA1T-q z6mL|=QE&h$NCA3RVA*_t4yy%GL|#|w822dj1Ko971Hl4+mip-kz{gmfglao{zQy zG|^$2%=Y*bFi@TM2K*GwAlMzYD;Uk_(L)@;keVH!#|O*g-z#c8;o6@quu7Ia8zZ=n5hU>i=HnqRv_rwQcW%H5u~v& z3gZ)Ll+;m*>ElkZv<`djA@O{J7-tTJC_6p@n>ts?r^s*?e)QO?jj-lz%zzgk_#o6~ zvJiXa#u!?-4YH7MS4^9juwrn~SolVU9SwCZ)tXvCL%@5%L>)?H|A{%CbBF*5>=n)T zVf7$}v2tugXd@7VW6H2%aL0l|8s~#>3<67qtwP`xs5Qzi4n%CCsw<%otN$N~t-6I0 zsxtx0a25(V{UCaWV}+C~0a-H475JyPyN5V(;fIH?I(MW3d&S(z2dIk1Wz@(|o|^=1 z$*z&@u>$dGi-$YdjbJpQBud9L#tUXjI0$BnyBo2?m=06242tsO*a|j**WfnHE7|OL z%Z|WKJWa4$#sn0Y6hhgeu8xH%_@PXxPYTOX6_%|*!ctK@m&h|(?3osa$?BF3M1r@D zcH7YkBNCKi6yPsgg4q#J=Yya)gY1Yq{=0~O3j4ok+G8cx`=XS@hla53+E~0D)qI47 zWR@$}>ku?b1Gh|KYvVPf9E3H*T&fAg!vRpjlGTb(OKOxy@qh-ePaz5EK+CCErqi`Y zDlEY}Qf!6PQW0WTj@8@>3blZv?hQ&PjwXwuAXPYk#Seh5)H-Z@GgQpwrT79ruyIVq zaH$S~_R;nqPin>&(WD`1W3((1^VAWP1<$nN~ZJW!aS@Gy?W1WDIb zs=2im9?2%KnnUTT+)t%;;n;K=Qtz@jC4LZEhK9T3^&SvO;TQ-G$5}s$0UWWMSVU^N zHd1gz3h2kvoig@QbPvz6+d5QC>NxfIhXsq_~IEs41aPN;3S!IcN?HDV3>KLFb#Z$5h!SJaByP07~ ziklxq~3tLBk?_kNO0|mnjnf~OT~9R2B=Dj zu;?p&pbv_Im#VZn9KuLlT_A-*YIhHZp?FOYG1gn8HdsMC6aX><8VVU{X+;(DI;n`Q z)@tsO-CVR9_wB}=Qhmv3)?H8Bk^{p%|K!=tAXwfbfvpl-#Uq1a!cr8)#cV)63t>W~ zWM52~FY^0FuK|Z@b|`!km9SJ*_#p>TGE^Hb2!f(`P)cKA7L?(5^^zYk!U~+<9Ajk* zceZWq&!Jvbt&Yl${JbkPD)$gt)>=ACj~dbI)ox8(v`DQOFg1~-0k z^^#VoCa9`^jOoP}F$%FKeT^8{)R-D>T5yQsuwTp{k0bzkK zzpLbij{spY7|Qnf2(09!MC~9#M^I!}SrnH+XJgrH9XUZ#8iI<=sBhsK7N_4uyQSIc zGgIcxL4vZmT4|oUz53eB`hPfg?~i_Z=QqAL{V!ji`!{Fry>xZu%a;@3&pp%K# z-CxUXB6Y19?Yn8KjVwlnZt@sH_9~8{8}j=~Q1`eg$gsA}R#t$Y2%^fjvSm369G+5n ztfbROzA1W&V>#xW7-w&IUYjXY*IKf>7TQw@YE4tZ>ruaJ>oHUbHKa7xawCU_l}wWg zr;tHgqbiTEFmTXp6k^Ty0k9IOE1=>Qks6n&L^Mv_lK?|@2wJT)?^}%}yRl$3=F9a3 zYvbrC&g0-n_SZkTMd~KT3W2pNXn?yxJ>4R;$P)=d8PAOYIvg{03UB-)x{#Qoc4lPR zM)X!;rGzalki;?q3oDew_U}D*DCmcWu(V5K2hV7t{*FKQyi{s0}eG&NtEYRsq z_e|(9^kD^Fa}2D{70H9Hn0TxhLQ;UR0F-H&v|=KrhBEj|COaZFlwCS%sYXmP@19w| zZ#P!#=AzxWXV&kTb=P~yBa4P$dtZ7-A-%OXxwSX7tv8iT>f|$Cy|MNe*H(ChHJbfr z$G63E_9zF{hk_%}Mxo6{2&{MzD>6F)D_(e{a6w9D#qTE&2V`LdXaY68h1G!#n61zV zJ{@z_9r&?S3ENjw+(Aa2+9DrAAz&)S9f1pTget-co6-rgnsU)?B+-4S#E39%1w}Zm zM2GahKR5rCAJ6^UcNbo|w({1U@?5Fb^f2Bq`Q-l%_9XTXrGIJf;1>?`|KZQ={9it^ z<@ZjFeSUY(r+4*lPPMX0oz9RF-|o6CP^X@%)Ih6y{RqX#cgJdcq{=C?yF@OuA}nVA zN3dYR*&_O+tOuwEjET80>uZmxOT>Z!e^`=2KhyQkjGnlNI{GjpDbj@(AnDXzrgqx2Yg{!=u~mIcLz>Jp}5V_BN7d{BJp z>avKie)IY5-O*1t2DTC`)cAqHNJy|jWH_qS=B}!h6WmaK|Atk`H!AdNR@T9IQKQZNTAh6m93jsI|(}@g2$GNU@UW4qNuKUq959pI;3T}NR3)U1UP8}9U9L3%D$n0bZGF8Key+PPi^_q zi{t;*p4s=b%m)rD)ji&5+bUpGJV|*=@%BK3n8dW{~)w)ptvNKNl0RMWm@Y5S)2n1x9&W` zy0Y|x4^{<$lmCrR?U34w!(yit@=$o!+*hVnU%IlyZ@}jKZ+>dWhDAQC;8T!{^Xdv@ zA+@a>tF+GJcxjLlOn%M*H5`!C zn(u9tHYlKPRxp07(i#xuZV&3q?9lWDh4)=rc_d~?VIjMRs|vJ*q$jycTc|qpu%y$k z89GvtX`|7Q`lM9eA1eeSur+R`wC9}^VF`b(+YHOsHP#aE_QWC&{< zVr)iSn84|&)bsCOU-{ORMQ+){oAX}`HUP;LG8`WQu)$UM0T5P94hz(c@IolH@Mhf) z!abn}&I{eREo(y{OT`ff+8_2iS7DGhA@=}04?G!wVlY&fXVgc7u&{Usi{felAz99< z`Lq@(=OBEgBmOun@j#ob(**Om3s{!7)u>B2EUexJy7tXdvoLgaIL|Th&#_D;bS2AU zMZH*LeWj_)R^1poBlTff@h}UQJQdan{DG&U%N%bAKW^B))m0s$L^q`OmCS<{u)V>n z4t4%_YJ?S8b(l-VdMu|M9~RTS8Fhq%4GtzK!ce11vr;V+GFXXV3S>@qY3JuaF(K1$ zUB3VQDM6&$-2257J0p!|-G)X=U;WZ^6lDl|L=Yox+I?uZN1BSI%~rG^sG;@&@~}LEAxboUToD$BmB{_= z#{8^ea)T8kzk%_u3r=4vPEEPWTg;956t4tAZa2ozsMn>{ekwjll~gJAbF|}RqFR>p z(_3y6WZ2D)w`U|A7LU$s>3-fwpG5U>vEm^z={m!!{8VnH$czdVpM@WiW~%by13<;L z4Go&Lisn~|R&2Y2uxwfWM7%lyrsJnc`QX)cz9_N^__0kK6>U~{L!(FdP#NyYLNenO zsKdoYEs`U@q&kZ<+WcFW7rsBWBtcjwcPptn)voBKPfxJe_pUE}i_`d#zuzyZZ*4v*6s)u^MgXN z!yrZ^uc1NK001aEwOR{$(&?TAcpk2M$cr+1At9%M3&6@JfYes3)Y|t+oX6^M#!#_U zLMl5HA;xLd^|jE6V7oBO@7O}OK}l~Cvz44liL^=3V;Px1hHK1OxBliG^ zRTem`juK>PpVdl*e7mKk#alBo2_19<2_5AUpkvn-YXeMKGMB7=kgT6PUVHTwa=b{* zFYT*>kLOhAnuDmm%^QVRl6zuxDk+i@UMS4v6vBUr??thPK@9NCOAFt>E{Jqn`o8$W z?)bxac-Vl-@l57?_uAs0UlI{k-*3OTTLpZ=@lJT#8x2892LNzgcYbkocyv@wLa7rG zQab1|G_A!$IBu(TW#;aVv2k&~1qkc=ubn>e!YQ)T2rA(oh8FQDH}5PAk8TOEk0o`; z=({}a`NF1065heHqwy{G8fPud{EA4 z?~}jy;pyjJI0aNkf|&5?vE{S)JS?E@bz-!hG4ctcE z!x#We%dS@)I&K08iEvR^%(p#Yd{*cat35jtH)rx?*LG?>`JvldjR6Q)x{d&$CAUMSfvec zSSa2?D2mmRtWDO(P2~m-0a*ZYVJn#Njmi1%U6UZJ-+J*0xhxk$(21GrM3(x_)x|%b zoabJ8dTZZrpL!w^?1-acKJhRIw`>`jFnxqMqq=*i~d+q+OacttPSm+T;{9sZ83)oM+r zTwGtDUsybNXrixBpy61^qh#7M^NTxo?*X5~T3IWdzczjN$T3D${5TU>AW3V$o!UTn z=#|+Hvrc&qgjA`)4CWHksrejH9EPnzyj_h(9b=FC1B|8hYaK<>l(PwOa?OP;!QuwA z(;8$6qnoAWmE~e-&2$JXQ#*IcXF0yelBA!aqN?w<}H| zkmug~>FHoIMm7!Ye{zqJFy6Z`Nsx#{EHjK3K6Tu6-KiVXi_5Fr3QxXxiWdG14SEa! zfJ@h=^hA2c_&EKob<}>f)`F_b!1j2r zAvGLlWl%GjNHkq{`tIWBmTl104hKkR4-?qlzPDKSV0dKIvF(}Z>9%aWZ%?5&S6nZ> zJ9#CW&0&B-Z|?BEJzcGNr3UrZ$6Y1-(0r~KB0Ek)jLdH-&Y~SC;l1;u%9NbLQuAW? zVN{~gm`kb>#z}PI-ASh90UUn%=%-#dHF4zVi5E}p-m@o@Nhb{B;QmkS-M9b53#Xnw za`fbj%=Eo1AoXkJrPc61`GvKP$OXXxbEhbfv$IQ)}cW%$cbjiCO z5FAmdR0FnarC2Pkmx?RP$aCFVC7}VCHft3_1J`G}dhlMR)l_-W)+eQix zJy)sPa51@X_hu4=Me5f3-o8gGn*jn^kxkoo&DGk9dYMwWw6%(#PD!8if1Z!!lL9y^EL@taoLjL*1 zJKwo-PXIXm|NPVYA_r~N#&=~1`pYZ#{_Nr%aRdIx&+JpVmQ+pj=yLpEd9Usi@>u}5 zcYi5c7$n}S0OJ@Mq_plj-!+M~{KRQ3U`Q1Ckm5z^gwwvv2=_LVtm_zv({k z`Cw+QM$t4QdZK+C#A)e#k$2gh>np;on zptaf>Us4Bf>zSUcKd@J7j)`6W)j$m-Kkt>5C-&?*eDJB@Rn)8}HE7f-w8|L>bf#$r zJQV$1+TMj`Q&ik&{x0ZTP4?=}-MbG?O!W8n2dC+-UAqq*p2(y#8$Qveu3dF(+hOxR zuuy5pNt}H>sd}x}tpeEQkLvYZyY~b<-GM_Bo#%%qcJA6u_D?30P9zcmdK&j%4c^rw zuy3ta3;Zcbkuy!J>cVo_aa>p`JE>%ncq87wF>5wpvE&3(yVeM{u<15G_CBmf`am*- z1yPoCPzAIDZ)%tJC4_Kj1dQ4I&o12l%l8G5Zd?Dq_{{!pNxO}uBmL$3^IyMkTe1N^ zw?A@lr_-ha6Vtp-tB%mZ4p~g|1#4S}^FI}IWJ9u~^*si1o7@+AXI}G+x2#dUtiEY3z+5-TvvR1nA!Q4}a zCg`&IHGCX6tVcYx;&5BCagRwNrSnMXBvK?pTQdKYBu&Y8oGCc0 zjptQ%r7*db;o#NU?`aO z4GeABF}{6lJe$w8Ya!HFKIj(m*1PA)lY!nW$7F%Jeto887F#S``Gx79piw&Ky4?{;_~Y9T8TJ- z=trOu-d$L1crZfQ=*1)GV*c0&GN087!Lts}M zpy|1kPE^9(zNL%a<`!0}s2n6D8$7?Tc8afTK;`~%1Rl-`sE!wqgE=Len z({Xi2z;&J8f!a?&!0}K_~$1OF}|})wR<5({oQ9nh>L0M>7BbSEuI|*X_Og z572uxpM>5-7{XFfdw&xVmJ^w%C7>i4H*q|d!!84{GcB>KV;z|z=db{W;Um<+hN`Ub zh$L^e1Byf?ben+XsY#%&RU8-?Jn_P*!%rW5{)JPACXPPuKR-Be^tqF#4on<f zEcMr8K#u|U=jS2J6>=E^GX84G zU%6D0XJesG)-E8>aa-qKT3OBI@-1lJRQF}0nXCZ&N4orHW^c{TOxu=4E~5#*Y(lNOxrW;O~C+fD%mM?)fTp^S+la-}(Bv zTjB9YqQUcNa1pUj=n!O-I7e2R~j2e!)|DFg^0t#>X-5B~VUYo`MijOdj~)H%4- zT5ama^wP@eFaBHy6fCW*F0ZUEudEgdeMb);Bv|a(BNNhCsxPK$%I4jBUg;OYm{WtLET{@4Uz^y(h$7#k0G#vi}+&XH%1bMR{N z>eR7kk0;Y0FzVGHP6__inE*2ZIbR=ubw`B@>EE} z1jN-U!ozR!__!mi!0(QtR6-|So)JQ^^2M!~>D?p`OV+$O0%66;kThj@DoC9tolZ>4 zKQEX+QcGwn)W%43X=sqpAgTCE_?D@%`3ez{=K7023WVKppvq(CmH7})gu2%0~n|k#}KQ3AJnE%_G zx-tFocVD@9`O12!yleNKaq2fYzqs=5g~>PHKKt&4$@i~b59V|Fpx7lK2xXu0CufOW{wQ@6<1dn7FDsH;1gGh#lqlFVW92u-?F{Ek-^anYMV8L2!acAlFL`G z508vCn@y?G9U!dE_oDi-dp=85GVNNU#{Is?dmGIrecwZ)rw+GB^>yE%;{UNmSgOvM;o zn=UUjb=B(+$SZ3ldYMS3Z+z=$PbR&(R=P4hcks}Jxby3^TD@Ll-itejBa<|S3poI| zIXhQ&YEll1-iAVd0c3d$KYac4lY94(Bnk5Bdlx1P14CQ4Z41B=x!k;WVRGA!@ebBV z7=wK|4!+69Z697WUH9~vceam@Z`rbqtS10jS8v|hI<^yJWM7b2i!o%3Hg5Xi=`;KG zALuI-f`$82KqIU`MZJ1sI#(DP9w=m@;1wCc3Q0)%2qE?jx`xfA@40`Wc7G26}XBWJa=$4(2Ny-|Mk95W{>7lEtS15l&3<#k;Tw!hhIPS4KG%yw>#v)L@7@JsNUvDs`X z0I+R4ShJ>S!SB$q!}eIpXO8CX%vUOvk&)3h`mn5~&t#2n9SyiJ4ufzSsOU{2$S%-K z$yw3zE4Z_nbiGzf>6m=?8?$q{Tt1af%d_nZ|w7eGSEy(q=Nop7X>`JxSbTP)j zCW{8>ESJl1y+_G+(NL#8a&RV7EU^cP7 zHwj4%u20X|P2d;}U^xqpB5ZRd>!qtV=K>i^`ng%7t>`(`S`{0HVbGzPH)rP>9_$z! z*H8yQEw7b(@_pi#Bs6&Q%`+I_@WBJbll{ZjJNSs;pm#4!Zr?H9S11rH%OR}5`V`E6 z)n5bGsGR&arML4r341j*K29uS0c(@M%}go*0JFE}2RCmE|G@;>-w#ipIpK#)U<`(@ z9!_4JLW%U)_&5OM6Ie&cv}{0HZ?1oAZ40Ju3ffBn|{k!O!{hiu44Sd%x}=&S=?01)MyMbs(e$>3E;>dD6* zVL5E~!)VM}yl@tTcrr@OTCaJbt`f(QLhyzS@E=^`ifVKv=mC#NAs z=4aq$3e+V47#b*S>g&lTAc^ZacAD_&Spy6*ZPl{|BwF)(6_$2EFPn#2ZKXH&wTQDPbL%m3^=s-?2(DhLxmn+ zWUNpKi_9l~Datx)vw2$`OkJx4-m7yLFJ;o{fq}sePik9$z^t_0;k(AR-Mc*}vRCw3 zL@tGnwjOO^- zA~4$G#}8p~&00{r{6rL|A|DOHWJPWFaF9 zrdskK7W)KUOvHD8=hEEQ-{Uvn$c~{e{le3d9@pw!N%IZ_C~f%Bsacclb{#=)vOV+a zjp}SVQ^52h=~qB<0AxeUGlvPlg}KP2vG?+ zgcVRu2q0s$KX>lV{Pi2thYnBl77Co6hyirZ&87@Oa;=mr*?g~RcM)&e-G#-udy6zI z4Hzrh0iV=6khAH!KYiyMXvW0RV*p?v&=J(V_Ms%cvxEi)l4ll9-<~fywPXAD5S;si zH{LmP8Var~0D+UmHhQF?|`1 z%RM@ewYa+8o)Tn4#$;8UKt6%VnR<6&@#^&( zyLRuPQ}6?Xg?$awHmyV^7tsHsLw%)U5rhnW5E4g$LReEbril(nrnOoC=i4-ywU09dx&sr4i3r+;lA z-^5o+z^hBt)iBbMzA9_yb?c%ri7$9@${gfv7Ztw@Y2OwUw!8WxAJ3SoBrT$ z9Z^}dLD6YOY_7{S=@myX1n{G4cmLg6*93&M=}W(OMC$lgdFbg@fCOPpP0!8VTWnY7 zv&0!$izck_@V-5T-W*X056~rP{+9G6+P@#uvfn;8IWRc%#NK@Y?h7!*joEfBA-(d1 zSL;cq0l;t zMQ6`XdKeBJp5Wpu7={r+8d`>-1Ay&Rnp#rV4Ne(O`qrv9&z{?{V{B;Crr@O>AIg3A zN2f`Ys78TP!fmDVh2fFWc2Tr%b9?!(PM>)GxuIMt0Alx-R#(a+cGhw;W-K9G1f2#q_WVbU@R> z&{lI8fO?A*D#{pz8Kv7Ni0I@HcxYV#f3e#X$FwaC?~>AJ7K`LkpyJv2PRskH6iSfeTK zF;`2ILS@4+G6tBX630RYPIq8?0(EY_e1$Pk12G2MvU~d^^DRoTtyP@hY6SonE?p@W z*Ph(FuUf5gSd8YpEYqqq+rnNh+mrAb72E9GNsul?*dvJ2wCr3@hFJNDvp>M0)k>wW zP^ecO`f3FLPwX7iH7#Jo$X$G;TB}wnS|U}c)u*QCUj50L@4tTLXBRG4To@b~edf6n zyPw>WebY`cTrXXm`RY3#2ncKV%fEaq z4t^AgDw;~ez&GF(AAfc2&c8czML<}?U;4#k^hhW|(Gb3X6!+g*Sgf~T)5s`ryaSR; zje+1rYSswC3YN?z+EAkDx^JJGbgH#u&mJe@AkEqkT`Wjz;4`7TR@MN5Sr%7TQ@H{S zaDuc3+C`O1005jl&#QqMBW!-)bSGOC+zA4}Wml@T(cvKgSXf#y za{Y#3V1WK4XbA2vuU?v(KKktOTCH~d>Xm`Pq5i?49-o;CpkffydTn~{+RWU6LlcEU zAvn;%36s*>OHR$qRbALVHjXIo6;d?o1X;6jIvm0yzbtA|W(R_@wBuvu!@?|MWvQ}H zqxt~TxuYSe@TA@dRM!Oa`9 zb8o+U{>`)Je*EU!J=xsOvF&;PYISdM>Fslqm#^J$TP*}0d7?Ld=$32 zS_I!m7JNsn?rtgN_2>%Ujwa~Hx^1D4ZCXPFNI`&nKZuIGqS={n83GA6-X5zJlC(BN z@l7vXnEsFNOmXXZW^DM&fBRXfeMzOzd4hm~ScK&%nwR|5)!Tpa=KDOt8XNxIUwRgC z921906$Bsl5!Qwut81mpH#>?FsUpm1o~~;buTIS`Ebe>iz~JBz5y*7eK6(4xWVW}! zAuQ;GpjP_xJ*H)!JwG|Vd(YU`QO#GZ2!i|3=`#Vs+E`rrE3cg3A%K$8D#`!c?vD@Ic!{c5`;_?!w|T&peY)>4BN+;NgkBzCx{5TV7hkZSQL? zolb8mycVY3;wW-0up*>ITGc=S-;Do`8pl_X<%;XE($HwWvh9G#0KC*Z2End7j zH9Ru9XYW1$D5$03O11X-nRoU*bzo?4h||!eB@n7cQ&>>F!-`uUQnwz%wyj()|5!{N zE1%0dww2H4ZL2eNEGw7K+rc!Kw=64{Z%=J@n$72J)5`Y>^K*I2vU+lP+qSZ~yklFr zT;8;-zTUiLS=oHvGOcVrPY{;4yUAxcvQLyw9sd(^{y;1g zuOgsZ=ZJOi#61$z*zJ)k+U} z-qTa9RLH9t|JCP@9vm4O^t=|yBMbJxYRSTGqquy3VR?1y)@_4>L*x@{^=3BBUr|iU zp1-&7?Dlcn;*X1ES^0dv(rDFI*4{mLzOT@qN~QoaLfFljTe@y^_T)ew0IuJdURf=s zQmJ~qE}hou^>iwgPNfbX_(X67v-$kunl;?lV>^`#SFV*y<|m(f9xx{RHlNSi!MWEf zKeAc>c?-0=i^aj-p0!f>^3`kmKCxfJEdU(=uHBgSJg-nFkmUyk2I=>@Ui&(7>B{xH zi%Yp&{u56fur15TCC0XAv+QmZ);7plFW)^@=@vXC5cg zbg3QPksAp+76IfFP_Ni)>!mwOs|OEFaNpW-Y{#*OM@ECqNoY`BTP2C0iG%vsSory{aBqHiWYjQ>ln%IAuT-nmYOPo*-CJ1PF*Y7}xJX*&+4GZqgG1S% zZy=UywdtfWQpf?o_k4tfF}U^Wx%1~!sr3G*4x}?_QFWC9XDs`On&V7OUC-unPww4^ z0Q6S9TCJWvKe_*@0|P@tz#fGGo*7~04#2U?H*elFEqmAQJ)5^~qt{<`9H(3yDD?K` zbH%mN2eWgo2c)qe1_>*K>-In{eg6Hah2_;PTet1nvnRMaF%Vd#HOn$PKLdbjwYIdf ziUAHCo@l3rJ;1LY%RE_9#Sk7|Kg184!|Lb}js>VQMN$VA>n0anPJz2e?AH=J_k2yw z6qQXsDS@bX9zac@5}F)ih51kEuv(_?VyCy9W6dn2A9)IW<$R)R^Q_b;q56X}Z5=-MF(jHG4ak&57^A7!Qw((kjw= z*=mAOG@WV-7K>%O?p7PEC-?4q;>o=rbNthvp6~6`4a2gmS_>{+pMHO8`r6HzMhmuV z-L`#fJlHnJg*V9@{yYD+CkPi406 z7=QZcv9>$RqMX@L9esdR&|02%@bJX&@CcdH0R7_o*ZK;DR4T>i{o5Ul+r!$(mTgZw zxo^wXZCqY%CYv=f`T3R7>u1hhxH{Enww~C#&tZ8z|`Rvl}_vQu?o)pV*YSTh|hnI0J(edd$L0b|7FzEV?04YcLGuRHuNbl730LV#wg z@y9t2D;U8r3xqgddmH`;-Xh#hC{MTz1X0}>$&!C@@#fcl#@nEdjgNf!?;ICRPhxUI zFvuWbWTv;|`|scS4{u#@TVBllc64mycYpafhYD%N0jU#Qr3PiuVaGJEp#iU8&O-5u z7B&`XA18RDTq*%THkUJ4#z%UfUDqXuk4T4D_%8JRM2c;QOesLr#~}p7pM_OtDOTF| zu<9ku&k9*ih~W_V@{$M~GTR+C$rpl~%_0Net~3BqnXB)=xZEwQ5zmJa@L} zxoHx zXSCZ1`k;1NMd!!KYCkMRe(A>sVM#mUa0N%5j?IGURyCxAqbelB6x{rPIHR}Z+vjh5 z?Ppg7gf;qypMOp|nA5`=Q(Yza!pN)Ncz5d0&R*|!AD(=2`xifVjC_jb*VFSVBnm6E zWHtkbX*W`}5lK4|MHL=|A0uD^4|)J}h6Rutc}|kur6B>IBBtI@`VmMmCw#+{_=45` zq-aiB)5m>ZBxvjM1BWCZ9et;Q<@YX_3mw7oQ|=*Zh1#RWR$P*f=(OTF^%^ow&#Uw`Ks?*1{FOL2?< z`E-l>UZH7U0dB3>Y>k){dkSbM@Y!=H#$?mSu(}?AN6J1n?BG)wf)1I2m@6(ih9hhn7TB1P_d7uX7TG|eAVs`HTKQxq5~&Ybuip=j5;rLH4x*BCxnZ=Q#b zu%y;1so`5{-Ik8zm?4@`(ON5!>2uo!=RFQ!4 zatL5VyoBNXpC?w@k-=)1jF`qRGAjdo6h>B$Ujoy2fE$ap( z(@8B#r4kiYTZ+qM4427bF~AZ0SFj!rWV|7pNlUXiSYTx2m7$8dQ7g1VlJqQ z3~(1c4IB#Hbdsvr-2D#DVlx;xj0Q4{CfyRm@n}MCP)DdRoig=y%=RUL}t z3zzJQg`8EsMSx)L6LVJOS^P3Uh!l7Py24q4uMmeengl@^ls551pRZGcFVf6?``#vn;Q~c@A zrtkfC|NeVFxHKJ~MIug<08a(zhW8V3IE$V-m2RmkT|>Y5nTf$%CZq!R@mlXQrLyp)JrGsBwH_wILZQl$pbN?Sz4`!tNPY^ zQ(t}Sa#!E$*v`#g{`^T0NFvb-6Y_Xt>dycA>O1j2G@UTM^vlm586OQ7UL&I{RJcT} zO^bsRq~I>*k{HVfCbk8hN}5CzIK(oiH3+2+SQ@E@B*;#+uVU_mFd7R92s6Z=r4Z&+ zHafY9Oh(v6N`6u_7Zd%dc8f= z$o)@$=lGHFQB|D)JtEP2SdwIK@frC6>fv-om5+wwvzW{ytaem!pX)Py5*<0FpN>@_ zgHDbfP#hw)g+MVlh)!{$xtq{^1@ZJsJEXriTXi6H$w6#yJ+RCajZ$fk6~}E!Jyvwy zoS4TT?Y7Ce-X;AR>ApMu`hz@DW~*2%#$~`e?DYh({SzMn!eW7s^m5L5vP7am^tuF> zc~7`iMyv$MjlIEEUA(>cm2bb{bzeR8_ddD*AAahP6fbo3xH7-|m2ba6dS|H~Nkji{ zpWXl8Jo5=d*FscR6yga&JXImuXH-l?7sr~zJ~+ae1uV7#A?sCoE~%ovI&>9Q%Z@U5 z6%IXOT9Ble1;y)EpmLT+=0jlVT4*;J@Z};ZB^@bBUm?mi)fMU_q9OUEkTYHrmiL0# z5}yX;Qsg{gFFg{3MdOh;%R6)`7R3ulv=tfu#f_`B&?nBeEf3>=`{Q#h;;QQM@3}qO z+IQeim~TFEdSKh|AN|)Sf9|QB(oY#1D*VIe_kZ;t|LWg9u*1+bd1}6(s(2JLh}nH8 zSJto`|Elx3(h$_@u*hvWwo-pYig!t-EO%D%`|;>OKOURc zC7sM3cdh^2DeMetdJHmG-^0=f-JD8}LA-6Z)?mdjcrF2I6=9QBN~k>*t@^^=rrW{L`O5c4F7a zr=Hxdw;GX%l|i7PNXO#TSS)0mB5FwiTS1(hSR95lF_l=)cy=hikCf}N6g-Y4rj=UC zjBu{IlA}f|ahWN)V$ozYO)MmZ$P;Ky3EvmTV;JJ0b7(~`UUg?1&mypF3lOsn^g5YT zdsZ<-LVY5VB}q6kq{g_+5OW+W97dyr`nJ$Zchw)p7d;oI3FM{ETfD1jRwXo4GR9>;0H8tZ9}!>oaV zC6Sja3TUyz9txH&`PZj=0OR0GcCqb28s$z;5vQ>9;?_@jUj!Q9JZHuWaokp1&PpZEZjT0ZCN(iCqkIGNXG)IF@xf}@bp)th^^6KpJ z`mg`#_hWvMzMk~&|H{dO+ehG|c%V>jB|b|Cs#cOXg2airZM6D^aTqR^+G?;`*HdX# z2qb20EC32AF^W*EazBh^7AhHp0ksq>UlMKnz64mBOjRey&6I#Fq~PGN65Odk77~cj z5MhyH8)K$cV34%)(H<#p70HIsOowI5yAxV6>BR>`_Jr)^PBwaf!+W6uYLN! zwqe`0FvgZ;ic`+-rqR^{YSd9eJWLRh%_J9ZE{2_mr&sjIkAVRZP(wOe03 zb7`?`iwma{#%K1A|H6UYyEYa4R2iV31Y-b}W&dEsNQ63!9iso+POm};q0W=ebN?-v zeoJRv)M~~5vhrJ`Xe_`hN&Y9xfnhb)pjQhh?Ce7EELU_XqN-{V zb-x=q0#S_jKvB0NVsQuxFKj?cs!OUhV=Qsu<0uXb$*Kb7iK+2~buqgFV+lE^J&JCF zR_w8wQ`|6@>8?-}Ih@5|9}WSvTCH+vz2&;4(%OkVTmRMH{nWqsrQ<)pZ~MV*oA!?m ze0Kl%=MV1u{lE3e|KsmI|Ak{uWL&3QT3@(#x3s=CfA{uUadrOg?c(ano!hromzQqe znq661ygfU!ym#iwpN=rf)1R+?y4rGdJ7Q`wMe3)60wZ=Vqo?mKJZ{ znq6I9x_f7?xVm!p&fNN1asKY@()!xH`8(xuX<=dBw9Lh&`;KF;EH70nPH}amUaPGa zR~z;E`g+lAHcO?omg|;F>#bIcLvz@}mT6)STbAizOxh5rI5MlNBz~dh3xu>L%;F|X z@OfD*!`NY_{8xjFa4v%%vpE^e9HH`#afI6f>JdFwro^)js;&Ymmlo&YQYCYmlx{1{ zZ@^5&qAH=p=|0^gz+$E_CqA|!I9jZ}R3S&s;e~`PM~dt)X{YyxkFfBAtwHP=ODd1V zB-;c?8c}tro`EYqi?5S}jkuSbGf^V}FGK{^B-6L_HjO z(liYa(vXG_(#dm8Lt6Wx>w4$8rqlB^>VY&3`76;hjsA$>^Dwm;Gz9DRF!AtK)~5%s zQrH3^m>((l5nB2b<2qD+G$cyTYWj)SC8g>Z=3#!AYRTe35i?3F6C!F66p9`Sm0YC= zOC?{1-wdgQLaA|2%3g&y>BA8g7C{#KWwj5Pw~83ak$|?41iR6^55otUW$byTRVKK@ zb=`8gh-naYQ0t~7FTQ4YH@X?TCEgUmn#)#b$Q9L?Uj{f+p<=c zmmJ$#U0JeiYjt(maqQKV<%(?=S5_*HQ!K7l9H+RtQgNKM;%c>0Szjww9A|y4NS@Pk zYSro*wS4=%D=Us|6<3!nfBi-OQ*6sxU0HT)dv&Efzgn%3PgyIjlC{&g4!S} zc(wB`O+(PeSp>cT;t4WPkY5jC2jlYWB?GCb+))E2mc_}p1xFNCuP=s(ifw*6kyuft zZIQr|?g0()+8Hl^g52&;OP@%^^{UG$MPIu}dtuB}1t4|MzREQg$?kzd4#sNrIZj%< z%2=59>iN8tci%va!^0Y=n^G*yK5xYMSOaHXu~3R&-sj)+&Z!)a$iGBH3s( zlF5|ox~X)!<+ak8jEB9RY!+jj&E}AXvbj9cw0v)`rt7)hUfs}pd;4_5AkFgf`CcQD z$mM%=!^q`>WsH1puWsnsT#igNU8ASDe4ael4Lz672k#>5A!{a|Le`nj_v(h8>+RKa zJ>T1lG%cIUgNAx~vKZq`Hrv8px~Io&x#@Je*=#10sYaubFcP&|)i8`&t*YyKrQ#q> zt5lr!-k|nRu*c$L@OOo#vCLt|oe$Xe`>2j7*As~2wj`fx$-7L_N}MHQa6BwgA-Rk; z4sF@CkDEjk#vw2ETOct7fkRbPB|ztXB1q|sH=uDd~-1M$|KcwBEoBO;5GM zsuyD-O%$byK1K*j96DmMEt2N)BE2QBPHi9t!2}0*3i}8xSU#8u)Ea{S#Nx05Sy0o+ zOEmXHkWoNL1uyw9sXd3htD_i-7)lsAyMk0mp~pcyhd0JbN0`(Dts-AATgZo__!?;JGjKR*hjMz8}t)qIpusW`f>SF07>Fsikxkx0}V^<*klZ`4!iwA*qsnVwdwmFdZP z7-w^N0O;-Q({;VCuV5q-h5ms=D%n3Un98JwHVvnHGJ~6jGuiB>khdo6C=k zZpr0)hetQ(^1UOQw*=GS(aq%5Y%afPcr0&K28zw%Z8`in&W(5OUNC46jh4$hCc->xh>o3&c_!y z2UJK0x1C&c=7*|FpsEKrU#W__*jEnAreRsXAHF*Q=6mNrZ1+6hbI6pW&c?($(i#I$ zBx*4IirCIZwwN@l;LEzw90SDqxF9UrO7l=U#QyboppODug|7m|gI7|770E_P8`a<# zs2te1dZf-Qm4YlBvuBIK2qxwAkh-}JoeaeV%p+MIuToLOVPYacXrm*Ds1OJbM2Tdz zLZXHv;Z=ySOM4tpmBX?jamKX2Inxg{D+0B-su0ddl2}hwCg2Cxi*XmRt?o7TUe#EteU2|1fa&7)Ez$%U^^x@+#{9s#-WFcrsJ$mDZvgJtW zOA=GJXl*(iQmOJ?G02-{B6Ukm%wa2}_QX^B1887CEP)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z4*f|)K~#9!teSgpT-ABNf8ROx-j!A>$q&Gm@PiO+2q+ZrWGHVa(@6|T{%eS7I@1RU zblOf!(zG+A5GGA&($EfcLWVd^{^;akXWC4YV%(0#BXRRkwbz7wrovzD%sq0`np;D87%?pDZ(g$6LHfS`aA z2*}zP+Rhk1i#-mZRA5=&$TCM5ShS#$W{x1RONMX4G;u7QZiWfK5S$i6n)Hn^Sd-t~ z^mKz0Cyo;&Swa{H>Os}b0?Rk6O$-|6a}9~DMHIT72b~15coUIGfW;wRav(Lp%td+e zs5sPk5CK)hr_0w6D>#?7&Am%c3&&E1wMs&r&{aAJ-13Gsf-xTFa;s79E^*wa1e&FU zR)~|7z#333B-qd5Xl@#sa;^oZJRYkq*AVrnfJ4Z2O^Uw-oPsuG+8I=o)(^`Z&gr7_ zQ^Bz`Qv*n;*s`9s*-{mpbBGAm3UM40c;{#t9j`NVjGHk$3aCTH;1E1u6(9rB9L@xV zc?()7L@2bSiNnsQFy1T1$b$1z!Lc+Z3TQb$^Jz0AXNoa`_lj4C7$FeJ&6P0* z@3NLEs*@Hsq>yee9>t*;eDhG5BB3EmJra5{1$7>4030GSM2$+$6g4P<;+uS5o(&d* zpC#dQ=cj^Wsb(fi6fb(Z77LNWf{3(~LDUfBs^f9aVPr-XMP)|PXG?=H3)qfQ6*_4lq+4- zrYGp?E|d8bR0^%}7zM@Rc@GXZXH;u3{k}fn*9flv0<=xPN)t~JwM8ZfnJ6-ubTJU!q!7MI#y-#<*P^Y!Pp!Tjv`(Rt67=HvxcN075!TcOzeWKKczAXrdLk>E8NQ_$VbRO-+q(1kvOV`lf2TF-+Z{5MRk6ys7AG;uD z##oJOZ{5jv@4tx+gS~BG;_Pu?`W3vF+kEm})KNsx5=9XG`5fb02{#G7hg=IJsv2VNh~46*XiM zVDN-~8si)El=_%d`1$^$$kZg$XLYl-E2eMdGra!zKe6`mZM=QrEhehnbeAu{+A>Zo zp!8KDj82ge7Mkc=5~a+1&y}*H<29b%J4UsZP_4xrICzYsV^xMnPVhIMy^m+R+5Rk7Zy99UN6+sV<;+~9FXV1Ub2zJz zBC|4I>F_Kc8wUD#nsKVNgrUu6(BE6)=va*d2TyQxyw0x2kMPhJZ)m~Y_t~rX`0YPw zN%FiTuOrQw@qKRq;s`^VS98a$A*;OZ;b@yZx? zX@hci7sSKpc!~9EeuFoU9N~-$w~%;`nhZ>e*D@mUoGfuZL!RC{2GEkQZ6CdWuWo;i ztGArp`hRHi8T|3Rj{$JkKkQ+2tVUmNRKT6hSGPaUP1m2xhJl4mN41`C*Wd4H^J7hI zY%)_7@F@>}{{a1!hz$dMfE3^GXzd6?o6l&?n_6A1r}X!BbxaPM#ZB+?+$hK+s2MLm zKLb^|z2aSlmE4HgFyfW}8D{+lE@t$EXS|-UY0U>nU;G*ASv^D+=&5k>#272j4XGWU zM17U9*Q@M&WF(iEqGGDR{)5LkIq_n;5e#j?Y1>o!V+`#(cLU%p>Dqp|n2E6wi zICz|!t~-aJO{=KZ6Rx^!ko5z-MbH4%T0&nXWZjw`y!V}Lx6jS!?VlW)_gi13Gy|u~ z{*kw+)*4*7We`RAqkI3GYAtD9et&Por#`oP7Nhf^<)6Ry;f_9|$q*6A^R{M`G2d}& zp(RS>Jh%)*Q6r?8uyJsJAH6Vwx$u0vRv3HfBo|u2boC%i=H{q7S!v$K z#zD^?e&YSCu9U%7Fj>G4cD=&ww+yu|dvv_U-+k+OwqCoD^#i?p=9Zzh1B{N>0Jvz= zDo#$s3?Dkqm+!oSzDkKb`^M<2gj8z{sa3f;tXo@I)aj#+?>#cY z=WpA>H+LKW;2-b4zP0X#-}zU*{AX7(w0ZTyI2L#|E9`BLgXc0tF{Ii>NfR=g=Am&? z=R+G-u=jtD^7`8uCdnwj{VJD7hp}Nd>bejNCy!hD&%Bg!?-r7H4dNXuyF6sM^E~`! zozd}H8|~TOoeuHn6Gyn|x^qxfhDVOmS1GZ6pqHa#6a2|vKh7s_-rTl+$F31nb>8#Y zPE{9-GTX=Qr$+g`-@b%(XI181>Yjb$Ow{5cgr3OPKlvI%n^tq>WdjQa6?2_?u+YJ0 z+xFa>qy>W%@fm0K2b?#shF_kj6Zn)q5>}f@#74Lz!It|ehaoFBUxxFmNnC_gkEm-E z=k^~u&d{dSE$vv!=&M8wkDOrp&S6H!YizxCW83~eGe_HY>>A;!4i}=QP-Xt`HRq68 z0oU2|U3u9c!y_jEn5ZXg-*JGg*PX-qfy%ry&ZXa+2eYNIlZF6f0TSICUi^Uj2 zuhbbVmx+Q1^Tre=@Q95Fxy&<(09|2TW;FK z*6Yq;$0G;Xv1^2_*KVX*PddUahO1pNm!=^`9Nm5jr#-DGsR?t%rE9t3(zUI%cR%n9 zpT1?NWpWpyKlkirsgmN0III~hPEOP)2k_?MmpOiPgp!-4zqbb!MWX;Q7O^23mZ(im z6?K~?4$px@#~42J4!7LAY1xw6*Ap^2UT+=tcmLw2r__%)wO(K64(IMCUt{~uVfO4B zXZMq@v3{V^=KmI=Kd*GssZ*l*(pX0tSeTd$kXpWS$_X|3W?K_95 z)?>c(rhdVVJL7%{C#4D!r=?zsOu`v7?G3)hl)Aq!Rz zX*^G>K61?lM#t;i^WZZKA3DLG|G{O8GCi+^2YFlAn3l!_kcV6IyI@6>rJjHcM}+fW z)Zo<6D5QOADq(8ML1`uSjEnKIq3E6TQ(4soriTD<+CbFv%aJ$Px%(CFz4H>*oK;2> zT~u=Bj&J?&B}9Y=?z#q5rMD;K!N0n$b(x>ox{1C@)Ux9{A3fBDYv-dQtY2GcwUC<{ z_vzodh&}tp=KF<9*3Ohb&hE#jX>J8NXxh59J$&bHZ{&xM9^(FQ?_HJ#0$ zF)d~^86+ae3opK;8#k`QWf>x~os|I$fzK$rX<}9~9eTV7PRn@{$_io{WLXJY7M!1E zMZFg*5JoVS)rccUBb~-Xmafe4(j%!E9 z>-=!{AwKu}mv+QwttCxU!Z5@+M;L}2IdTMf?)ew>f(yEX!I9DV0hbJa~|x+4;-U_zpxQe|bk0j8{Y)s3XLY zWfKI}VNE~Yd5l=z32KC52-JcEIPdXli3qS+fNIb>OlnfXCFTH&7v}Vo7_wX#1vDyy z)=~7d8Dfl?r=>xuR3eV!1$$trKqC-JNmBHZJ&MPg6o)Wv0Mmt}4Z2APeTm42;5|kZ zXFMVasxg@fP!YU9Bg|h33VhJ&EiWfRn!Ubx5zED~To~^i=tO79J;gJqD%M)!IHs$s zt6)eYrn@U@Ihffd3uDQm0OJiJ#cMojK|E0y5*x*sZmi_>TW3l{8sL+RFcdI~SV2^Y zT!7Et0wN6+^&!?v?#wzIW+59tPo0Z-`~F!pI6xICqMN1CRrLe`IByno)JvtWMU@>9 zj0lsB23@5Ra_r<({Kgw^@XkALcSM-ivwT|>xOj7}_^Ti`KVZ>8kvZKsiZ?7~SKD=N zA!(5s)BM+Q9M;;ld0_3baV!_c7ck4sV03}7*BB|Z1p52?S+{N-|33iQeTU$!k*lr% O0000字数超出最大允许值,服务器可能拒绝保存!', + 'ok':"确认", + 'cancel':"取消", + 'closeDialog':"关闭对话框", + 'tableDrag':"表格拖动必须引入uiUtils.js文件!", + 'autofloatMsg':"工具栏浮动依赖编辑器UI,您首先需要引入UI文件!", + 'loadconfigError': '获取后台配置项请求出错,上传功能将不能正常使用!', + 'loadconfigFormatError': '后台配置项返回格式出错,上传功能将不能正常使用!', + 'loadconfigHttpError': '请求后台配置项http错误,上传功能将不能正常使用!', + 'snapScreen_plugin':{ + 'browserMsg':"仅支持IE浏览器!", + 'callBackErrorMsg':"服务器返回数据有误,请检查配置项之后重试。", + 'uploadErrorMsg':"截图上传失败,请检查服务器端环境! " + }, + 'insertcode':{ + 'as3':'ActionScript 3', + 'bash':'Bash/Shell', + 'cpp':'C/C++', + 'css':'CSS', + 'cf':'ColdFusion', + 'c#':'C#', + 'delphi':'Delphi', + 'diff':'Diff', + 'erlang':'Erlang', + 'groovy':'Groovy', + 'html':'HTML', + 'java':'Java', + 'jfx':'JavaFX', + 'js':'JavaScript', + 'pl':'Perl', + 'php':'PHP', + 'plain':'Plain Text', + 'ps':'PowerShell', + 'python':'Python', + 'ruby':'Ruby', + 'scala':'Scala', + 'sql':'SQL', + 'vb':'Visual Basic', + 'xml':'XML' + }, + 'confirmClear':"确定清空当前文档么?", + 'contextMenu':{ + 'delete':"删除", + 'selectall':"全选", + 'deletecode':"删除代码", + 'cleardoc':"清空文档", + 'confirmclear':"确定清空当前文档么?", + 'unlink':"删除超链接", + 'paragraph':"段落格式", + 'edittable':"表格属性", + 'aligntd':"单元格对齐方式", + 'aligntable':'表格对齐方式', + 'tableleft':'左浮动', + 'tablecenter':'居中显示', + 'tableright':'右浮动', + 'edittd':"单元格属性", + 'setbordervisible':'设置表格边线可见', + 'justifyleft':'左对齐', + 'justifyright':'右对齐', + 'justifycenter':'居中对齐', + 'justifyjustify':'两端对齐', + 'table':"表格", + 'inserttable':'插入表格', + 'deletetable':"删除表格", + 'insertparagraphbefore':"前插入段落", + 'insertparagraphafter':'后插入段落', + 'deleterow':"删除当前行", + 'deletecol':"删除当前列", + 'insertrow':"前插入行", + 'insertcol':"左插入列", + 'insertrownext':'后插入行', + 'insertcolnext':'右插入列', + 'insertcaption':'插入表格名称', + 'deletecaption':'删除表格名称', + 'inserttitle':'插入表格标题行', + 'deletetitle':'删除表格标题行', + 'inserttitlecol':'插入表格标题列', + 'deletetitlecol':'删除表格标题列', + 'averageDiseRow':'平均分布各行', + 'averageDisCol':'平均分布各列', + 'mergeright':"向右合并", + 'mergeleft':"向左合并", + 'mergedown':"向下合并", + 'mergecells':"合并单元格", + 'splittocells':"完全拆分单元格", + 'splittocols':"拆分成列", + 'splittorows':"拆分成行", + 'tablesort':'表格排序', + 'enablesort':'设置表格可排序', + 'disablesort':'取消表格可排序', + 'reversecurrent':'逆序当前', + 'orderbyasc':'按ASCII字符升序', + 'reversebyasc':'按ASCII字符降序', + 'orderbynum':'按数值大小升序', + 'reversebynum':'按数值大小降序', + 'borderbk':'边框底纹', + 'setcolor':'表格隔行变色', + 'unsetcolor':'取消表格隔行变色', + 'setbackground':'选区背景隔行', + 'unsetbackground':'取消选区背景', + 'redandblue':'红蓝相间', + 'threecolorgradient':'三色渐变', + 'copy':"复制(Ctrl + c)", + 'copymsg': "浏览器不支持,请使用 'Ctrl + c'", + 'paste':"粘贴(Ctrl + v)", + 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'" + }, + 'copymsg': "浏览器不支持,请使用 'Ctrl + c'", + 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'", + 'anthorMsg':"链接", + 'clearColor':'清空颜色', + 'standardColor':'标准颜色', + 'themeColor':'主题颜色', + 'property':'属性', + 'default':'默认', + 'modify':'修改', + 'justifyleft':'左对齐', + 'justifyright':'右对齐', + 'justifycenter':'居中', + 'justify':'默认', + 'clear':'清除', + 'anchorMsg':'锚点', + 'delete':'删除', + 'clickToUpload':"点击上传", + 'unset':'尚未设置语言文件', + 't_row':'行', + 't_col':'列', + 'more':'更多', + 'pasteOpt':'粘贴选项', + 'pasteSourceFormat':"保留源格式", + 'tagFormat':'只保留标签', + 'pasteTextFormat':'只保留文本', + 'autoTypeSet':{ + 'mergeLine':"合并空行", + 'delLine':"清除空行", + 'removeFormat':"清除格式", + 'indent':"首行缩进", + 'alignment':"对齐方式", + 'imageFloat':"图片浮动", + 'removeFontsize':"清除字号", + 'removeFontFamily':"清除字体", + 'removeHtml':"清除冗余HTML代码", + 'pasteFilter':"粘贴过滤", + 'run':"执行", + 'symbol':'符号转换', + 'bdc2sb':'全角转半角', + 'tobdc':'半角转全角' + }, + + 'background':{ + 'static':{ + 'lang_background_normal':'背景设置', + 'lang_background_local':'在线图片', + 'lang_background_set':'选项', + 'lang_background_none':'无背景色', + 'lang_background_colored':'有背景色', + 'lang_background_color':'颜色设置', + 'lang_background_netimg':'网络图片', + 'lang_background_align':'对齐方式', + 'lang_background_position':'精确定位', + 'repeatType':{'options':["居中", "横向重复", "纵向重复", "平铺","自定义"]} + + }, + 'noUploadImage':"当前未上传过任何图片!", + 'toggleSelect':"单击可切换选中状态\n原图尺寸: " + }, + //===============dialog i18N======================= + 'insertimage':{ + 'static':{ + 'lang_tab_remote':"插入图片", //节点 + 'lang_tab_upload':"本地上传", + 'lang_tab_online':"在线管理", + 'lang_tab_search':"图片搜索", + 'lang_input_url':"地 址:", + 'lang_input_size':"大 小:", + 'lang_input_width':"宽度", + 'lang_input_height':"高度", + 'lang_input_border':"边 框:", + 'lang_input_vhspace':"边 距:", + 'lang_input_title':"描 述:", + 'lang_input_align':'图片浮动方式:', + 'lang_imgLoading':" 图片加载中……", + 'lang_start_upload':"开始上传", + 'lock':{'title':"锁定宽高比例"}, //属性 + 'searchType':{'title':"图片类型", 'options':["新闻", "壁纸", "表情", "头像"]}, //select的option + 'searchTxt':{'value':"请输入搜索关键词"}, + 'searchBtn':{'value':"百度一下"}, + 'searchReset':{'value':"清空搜索"}, + 'noneAlign':{'title':'无浮动'}, + 'leftAlign':{'title':'左浮动'}, + 'rightAlign':{'title':'右浮动'}, + 'centerAlign':{'title':'居中独占一行'} + }, + 'uploadSelectFile':'点击选择图片', + 'uploadAddFile':'继续添加', + 'uploadStart':'开始上传', + 'uploadPause':'暂停上传', + 'uploadContinue':'继续上传', + 'uploadRetry':'重试上传', + 'uploadDelete':'删除', + 'uploadTurnLeft':'向左旋转', + 'uploadTurnRight':'向右旋转', + 'uploadPreview':'预览中', + 'uploadNoPreview':'不能预览', + 'updateStatusReady': '选中_张图片,共_KB。', + 'updateStatusConfirm': '已成功上传_张照片,_张照片上传失败', + 'updateStatusFinish': '共_张(_KB),_张上传成功', + 'updateStatusError': ',_张上传失败。', + 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。', + 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!', + 'errorExceedSize':'文件大小超出', + 'errorFileType':'文件格式不允许', + 'errorInterrupt':'文件传输中断', + 'errorUploadRetry':'上传失败,请重试', + 'errorHttp':'http请求错误', + 'errorServerUpload':'服务器返回出错', + 'remoteLockError':"宽高不正确,不能所定比例", + 'numError':"请输入正确的长度或者宽度值!例如:123,400", + 'imageUrlError':"不允许的图片格式或者图片域!", + 'imageLoadError':"图片加载失败!请检查链接地址或网络状态!", + 'searchRemind':"请输入搜索关键词", + 'searchLoading':"图片加载中,请稍后……", + 'searchRetry':" :( ,抱歉,没有找到图片!请重试一次!" + }, + 'attachment':{ + 'static':{ + 'lang_tab_upload': '上传附件', + 'lang_tab_online': '在线附件', + 'lang_start_upload':"开始上传", + 'lang_drop_remind':"可以将文件拖到这里,单次最多可选100个文件" + }, + 'uploadSelectFile':'点击选择文件', + 'uploadAddFile':'继续添加', + 'uploadStart':'开始上传', + 'uploadPause':'暂停上传', + 'uploadContinue':'继续上传', + 'uploadRetry':'重试上传', + 'uploadDelete':'删除', + 'uploadTurnLeft':'向左旋转', + 'uploadTurnRight':'向右旋转', + 'uploadPreview':'预览中', + 'updateStatusReady': '选中_个文件,共_KB。', + 'updateStatusConfirm': '已成功上传_个文件,_个文件上传失败', + 'updateStatusFinish': '共_个(_KB),_个上传成功', + 'updateStatusError': ',_张上传失败。', + 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。', + 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!', + 'errorExceedSize':'文件大小超出', + 'errorFileType':'文件格式不允许', + 'errorInterrupt':'文件传输中断', + 'errorUploadRetry':'上传失败,请重试', + 'errorHttp':'http请求错误', + 'errorServerUpload':'服务器返回出错' + }, + 'insertvideo':{ + 'static':{ + 'lang_tab_insertV':"插入视频", + 'lang_tab_searchV':"搜索视频", + 'lang_tab_uploadV':"上传视频", + 'lang_video_url':"视频网址", + 'lang_video_size':"视频尺寸", + 'lang_videoW':"宽度", + 'lang_videoH':"高度", + 'lang_alignment':"对齐方式", + 'videoSearchTxt':{'value':"请输入搜索关键字!"}, + 'videoType':{'options':["全部", "热门", "娱乐", "搞笑", "体育", "科技", "综艺"]}, + 'videoSearchBtn':{'value':"百度一下"}, + 'videoSearchReset':{'value':"清空结果"}, + + 'lang_input_fileStatus':' 当前未上传文件', + 'startUpload':{'style':"background:url(upload.png) no-repeat;"}, + + 'lang_upload_size':"视频尺寸", + 'lang_upload_width':"宽度", + 'lang_upload_height':"高度", + 'lang_upload_alignment':"对齐方式", + 'lang_format_advice':"建议使用mp4格式." + + }, + 'numError':"请输入正确的数值,如123,400", + 'floatLeft':"左浮动", + 'floatRight':"右浮动", + '"default"':"默认", + 'block':"独占一行", + 'urlError':"输入的视频地址有误,请检查后再试!", + 'loading':"  视频加载中,请等待……", + 'clickToSelect':"点击选中", + 'goToSource':'访问源视频', + 'noVideo':"    抱歉,找不到对应的视频,请重试!", + + 'browseFiles':'浏览文件', + 'uploadSuccess':'上传成功!', + 'delSuccessFile':'从成功队列中移除', + 'delFailSaveFile':'移除保存失败文件', + 'statusPrompt':' 个文件已上传! ', + 'flashVersionError':'当前Flash版本过低,请更新FlashPlayer后重试!', + 'flashLoadingError':'Flash加载失败!请检查路径或网络状态', + 'fileUploadReady':'等待上传……', + 'delUploadQueue':'从上传队列中移除', + 'limitPrompt1':'单次不能选择超过', + 'limitPrompt2':'个文件!请重新选择!', + 'delFailFile':'移除失败文件', + 'fileSizeLimit':'文件大小超出限制!', + 'emptyFile':'空文件无法上传!', + 'fileTypeError':'文件类型不允许!', + 'unknownError':'未知错误!', + 'fileUploading':'上传中,请等待……', + 'cancelUpload':'取消上传', + 'netError':'网络错误', + 'failUpload':'上传失败!', + 'serverIOError':'服务器IO错误!', + 'noAuthority':'无权限!', + 'fileNumLimit':'上传个数限制', + 'failCheck':'验证失败,本次上传被跳过!', + 'fileCanceling':'取消中,请等待……', + 'stopUploading':'上传已停止……', + + 'uploadSelectFile':'点击选择文件', + 'uploadAddFile':'继续添加', + 'uploadStart':'开始上传', + 'uploadPause':'暂停上传', + 'uploadContinue':'继续上传', + 'uploadRetry':'重试上传', + 'uploadDelete':'删除', + 'uploadTurnLeft':'向左旋转', + 'uploadTurnRight':'向右旋转', + 'uploadPreview':'预览中', + 'updateStatusReady': '选中_个文件,共_KB。', + 'updateStatusConfirm': '成功上传_个,_个失败', + 'updateStatusFinish': '共_个(_KB),_个成功上传', + 'updateStatusError': ',_张上传失败。', + 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。', + 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!', + 'errorExceedSize':'文件大小超出', + 'errorFileType':'文件格式不允许', + 'errorInterrupt':'文件传输中断', + 'errorUploadRetry':'上传失败,请重试', + 'errorHttp':'http请求错误', + 'errorServerUpload':'服务器返回出错' + }, + 'webapp':{ + 'tip1':"本功能由百度APP提供,如看到此页面,请各位站长首先申请百度APPKey!", + 'tip2':"申请完成之后请至ueditor.config.js中配置获得的appkey! ", + 'applyFor':"点此申请", + 'anthorApi':"百度API" + }, + 'template':{ + 'static':{ + 'lang_template_bkcolor':'背景颜色', + 'lang_template_clear' : '保留原有内容', + 'lang_template_select' : '选择模板' + }, + 'blank':"空白文档", + 'blog':"博客文章", + 'resume':"个人简历", + 'richText':"图文混排", + 'sciPapers':"科技论文" + + + }, + 'scrawl':{ + 'static':{ + 'lang_input_previousStep':"上一步", + 'lang_input_nextsStep':"下一步", + 'lang_input_clear':'清空', + 'lang_input_addPic':'添加背景', + 'lang_input_ScalePic':'缩放背景', + 'lang_input_removePic':'删除背景', + 'J_imgTxt':{title:'添加背景图片'} + }, + 'noScarwl':"尚未作画,白纸一张~", + 'scrawlUpLoading':"涂鸦上传中,别急哦~", + 'continueBtn':"继续", + 'imageError':"糟糕,图片读取失败了!", + 'backgroundUploading':'背景图片上传中,别急哦~' + }, + 'music':{ + 'static':{ + 'lang_input_tips':"输入歌手/歌曲/专辑,搜索您感兴趣的音乐!", + 'J_searchBtn':{value:'搜索歌曲'} + }, + 'emptyTxt':'未搜索到相关音乐结果,请换一个关键词试试。', + 'chapter':'歌曲', + 'singer':'歌手', + 'special':'专辑', + 'listenTest':'试听' + }, + 'anchor':{ + 'static':{ + 'lang_input_anchorName':'锚点名字:' + } + }, + 'charts':{ + 'static':{ + 'lang_data_source':'数据源:', + 'lang_chart_format': '图表格式:', + 'lang_data_align': '数据对齐方式', + 'lang_chart_align_same': '数据源与图表X轴Y轴一致', + 'lang_chart_align_reverse': '数据源与图表X轴Y轴相反', + 'lang_chart_title': '图表标题', + 'lang_chart_main_title': '主标题:', + 'lang_chart_sub_title': '子标题:', + 'lang_chart_x_title': 'X轴标题:', + 'lang_chart_y_title': 'Y轴标题:', + 'lang_chart_tip': '提示文字', + 'lang_cahrt_tip_prefix': '提示文字前缀:', + 'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀', + 'lang_chart_data_unit': '数据单位', + 'lang_chart_data_unit_title': '单位:', + 'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃', + 'lang_chart_type': '图表类型:', + 'lang_prev_btn': '上一个', + 'lang_next_btn': '下一个' + } + }, + 'emotion':{ + 'static':{ + 'lang_input_choice':'精选', + 'lang_input_Tuzki':'兔斯基', + 'lang_input_BOBO':'BOBO', + 'lang_input_lvdouwa':'绿豆蛙', + 'lang_input_babyCat':'baby猫', + 'lang_input_bubble':'泡泡', + 'lang_input_youa':'有啊' + } + }, + 'gmap':{ + 'static':{ + 'lang_input_address':'地址', + 'lang_input_search':'搜索', + 'address':{value:"北京"} + }, + searchError:'无法定位到该地址!' + }, + 'help':{ + 'static':{ + 'lang_input_about':'关于UEditor', + 'lang_input_shortcuts':'快捷键', + 'lang_input_introduction':'UEditor是由百度web前端研发部开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点。开源基于BSD协议,允许自由使用和修改代码。', + 'lang_Txt_shortcuts':'快捷键', + 'lang_Txt_func':'功能', + 'lang_Txt_bold':'给选中字设置为加粗', + 'lang_Txt_copy':'复制选中内容', + 'lang_Txt_cut':'剪切选中内容', + 'lang_Txt_Paste':'粘贴', + 'lang_Txt_undo':'重新执行上次操作', + 'lang_Txt_redo':'撤销上一次操作', + 'lang_Txt_italic':'给选中字设置为斜体', + 'lang_Txt_underline':'给选中字加下划线', + 'lang_Txt_selectAll':'全部选中', + 'lang_Txt_visualEnter':'软回车', + 'lang_Txt_fullscreen':'全屏' + } + }, + 'insertframe':{ + 'static':{ + 'lang_input_address':'地址:', + 'lang_input_width':'宽度:', + 'lang_input_height':'高度:', + 'lang_input_isScroll':'允许滚动条:', + 'lang_input_frameborder':'显示框架边框:', + 'lang_input_alignMode':'对齐方式:', + 'align':{title:"对齐方式", options:["默认", "左对齐", "右对齐", "居中"]} + }, + 'enterAddress':'请输入地址!' + }, + 'link':{ + 'static':{ + 'lang_input_text':'文本内容:', + 'lang_input_url':'链接地址:', + 'lang_input_title':'标题:', + 'lang_input_target':'是否在新窗口打开:' + }, + 'validLink':'只支持选中一个链接时生效', + 'httpPrompt':'您输入的超链接中不包含http等协议名称,默认将为您添加http://前缀' + }, + 'map':{ + 'static':{ + lang_city:"城市", + lang_address:"地址", + city:{value:"北京"}, + lang_search:"搜索", + lang_dynamicmap:"插入动态地图" + }, + cityMsg:"请选择城市", + errorMsg:"抱歉,找不到该位置!" + }, + 'searchreplace':{ + 'static':{ + lang_tab_search:"查找", + lang_tab_replace:"替换", + lang_search1:"查找", + lang_search2:"查找", + lang_replace:"替换", + lang_searchReg:'支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”', + lang_searchReg1:'支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”', + lang_case_sensitive1:"区分大小写", + lang_case_sensitive2:"区分大小写", + nextFindBtn:{value:"下一个"}, + preFindBtn:{value:"上一个"}, + nextReplaceBtn:{value:"下一个"}, + preReplaceBtn:{value:"上一个"}, + repalceBtn:{value:"替换"}, + repalceAllBtn:{value:"全部替换"} + }, + getEnd:"已经搜索到文章末尾!", + getStart:"已经搜索到文章头部", + countMsg:"总共替换了{#count}处!" + }, + 'snapscreen':{ + 'static':{ + lang_showMsg:"截图功能需要首先安装UEditor截图插件! ", + lang_download:"点此下载", + lang_step1:"第一步,下载UEditor截图插件并运行安装。", + lang_step2:"第二步,插件安装完成后即可使用,如不生效,请重启浏览器后再试!" + } + }, + 'spechars':{ + 'static':{}, + tsfh:"特殊字符", + lmsz:"罗马字符", + szfh:"数学字符", + rwfh:"日文字符", + xlzm:"希腊字母", + ewzm:"俄文字符", + pyzm:"拼音字母", + yyyb:"英语音标", + zyzf:"其他" + }, + 'edittable':{ + 'static':{ + 'lang_tableStyle':'表格样式', + 'lang_insertCaption':'添加表格名称行', + 'lang_insertTitle':'添加表格标题行', + 'lang_insertTitleCol':'添加表格标题列', + 'lang_orderbycontent':"使表格内容可排序", + 'lang_tableSize':'自动调整表格尺寸', + 'lang_autoSizeContent':'按表格文字自适应', + 'lang_autoSizePage':'按页面宽度自适应', + 'lang_example':'示例', + 'lang_borderStyle':'表格边框', + 'lang_color':'颜色:' + }, + captionName:'表格名称', + titleName:'标题', + cellsName:'内容', + errorMsg:'有合并单元格,不可排序' + }, + 'edittip':{ + 'static':{ + lang_delRow:'删除整行', + lang_delCol:'删除整列' + } + }, + 'edittd':{ + 'static':{ + lang_tdBkColor:'背景颜色:' + } + }, + 'formula':{ + 'static':{ + } + }, + 'wordimage':{ + 'static':{ + lang_resave:"转存步骤", + uploadBtn:{src:"upload.png",alt:"上传"}, + clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"}, + lang_step:"1、点击顶部复制按钮,将地址复制到剪贴板;2、点击添加照片按钮,在弹出的对话框中使用Ctrl+V粘贴地址;3、点击打开后选择图片上传流程。" + }, + 'fileType':"图片", + 'flashError':"FLASH初始化失败,请检查FLASH插件是否正确安装!", + 'netError':"网络连接错误,请重试!", + 'copySuccess':"图片地址已经复制!", + 'flashI18n':{} //留空默认中文 + }, + 'autosave': { + 'saving':'保存中...', + 'success':'本地保存成功' + } +}; diff --git a/src/main/webapp/js/ue/themes/default/css/ueditor.css b/src/main/webapp/js/ue/themes/default/css/ueditor.css new file mode 100644 index 0000000..44ae805 --- /dev/null +++ b/src/main/webapp/js/ue/themes/default/css/ueditor.css @@ -0,0 +1,1903 @@ +/*基础UI构建 +*/ +/* common layer */ +.edui-default .edui-box { + border: none; + padding: 0; + margin: 0; + overflow: hidden; +} + +.edui-default a.edui-box { + display: block; + text-decoration: none; + color: black; +} + +.edui-default a.edui-box:hover { + text-decoration: none; +} + +.edui-default a.edui-box:active { + text-decoration: none; +} + +.edui-default table.edui-box { + border-collapse: collapse; +} + +.edui-default ul.edui-box { + list-style-type: none; +} + +div.edui-box { + position: relative; + display: -moz-inline-box !important; + display: inline-block !important; + vertical-align: top; +} + +.edui-default .edui-clearfix { + zoom: 1 +} + +.edui-default .edui-clearfix:after { + content: '\20'; + display: block; + clear: both; +} + + * html div.edui-box { + display: inline !important; +} + +*:first-child+html div.edui-box { + display: inline !important; +} + +/* control layout */ +.edui-default .edui-button-body, .edui-splitbutton-body, .edui-menubutton-body, .edui-combox-body { + position: relative; +} + +.edui-default .edui-popup { + position: absolute; + -webkit-user-select: none; + -moz-user-select: none; +} + +.edui-default .edui-popup .edui-shadow { + position: absolute; + z-index: -1; +} + +.edui-default .edui-popup .edui-bordereraser { + position: absolute; + overflow: hidden; +} + +.edui-default .edui-tablepicker .edui-canvas { + position: relative; +} + +.edui-default .edui-tablepicker .edui-canvas .edui-overlay { + position: absolute; +} + +.edui-default .edui-dialog-modalmask, .edui-dialog-dragmask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} + +.edui-default .edui-toolbar { + position: relative; +} + +/* + * default theme + */ +.edui-default .edui-label { + cursor: default; +} + +.edui-default span.edui-clickable { + color: blue; + cursor: pointer; + text-decoration: underline; +} + +.edui-default span.edui-unclickable { + color: gray; + cursor: default; +} +/* 工具栏 */ +.edui-default .edui-toolbar { + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + padding: 1px; + overflow: hidden; /*全屏下单独一行不占位*/ + zoom: 1; + width:auto; + height:auto; +} + +.edui-default .edui-toolbar .edui-button, +.edui-default .edui-toolbar .edui-splitbutton, +.edui-default .edui-toolbar .edui-menubutton, +.edui-default .edui-toolbar .edui-combox { + margin: 1px; +} +/*UI工具栏、编辑区域、底部*/ +.edui-default .edui-editor { + border: 1px solid #d4d4d4; + background-color: white; + position: relative; + overflow: visible; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.edui-editor div{ + width:auto; + height:auto; +} +.edui-default .edui-editor-toolbarbox { + position: relative; + zoom: 1; + -webkit-box-shadow:0 1px 4px rgba(204, 204, 204, 0.6); + -moz-box-shadow:0 1px 4px rgba(204, 204, 204, 0.6); + box-shadow:0 1px 4px rgba(204, 204, 204, 0.6); + border-top-left-radius:2px; + border-top-right-radius:2px; +} + +.edui-default .edui-editor-toolbarboxouter { + border-bottom: 1px solid #d4d4d4; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + /*border: 1px solid #d4d4d4;*/ + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + *zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} + +.edui-default .edui-editor-toolbarboxinner { + padding: 2px; +} + +.edui-default .edui-editor-iframeholder { + position: relative; + /*for fix ie6 toolbarmsg under iframe bug. relative -> static */ + /*_position: static !important;* +} + +.edui-default .edui-editor-iframeholder textarea { + font-family: consolas, "Courier New", "lucida console", monospace; + font-size: 12px; + line-height: 18px; +} + +.edui-default .edui-editor-bottombar { + /*border-top: 1px solid #ccc;*/ + /*height: 20px;*/ + /*width: 40%;*/ + /*float: left;*/ + /*overflow: hidden;*/ +} + +.edui-default .edui-editor-bottomContainer { + overflow: hidden; +} + +.edui-default .edui-editor-bottomContainer table { + width: 100%; + height: 0; + overflow: hidden; + border-spacing: 0; +} + +.edui-default .edui-editor-bottomContainer td { + white-space: nowrap; + border-top: 1px solid #ccc; + line-height: 20px; + font-size: 12px; + font-family: Arial, Helvetica, Tahoma, Verdana, Sans-Serif; +} + +.edui-default .edui-editor-wordcount { + text-align: right; + margin-right: 5px; + color: #aaa; +} +.edui-default .edui-editor-scale { + width: 12px; +} +.edui-default .edui-editor-scale .edui-editor-icon { + float: right; + width: 100%; + height: 12px; + margin-top: 10px; + background: url(../images/scale.png) no-repeat; + cursor: se-resize; +} +.edui-default .edui-editor-breadcrumb { + margin: 2px 0 0 3px; +} + +.edui-default .edui-editor-breadcrumb span { + cursor: pointer; + text-decoration: underline; + color: blue; +} + +.edui-default .edui-toolbar .edui-for-fullscreen { + float: right; +} + +.edui-default .edui-bubble .edui-popup-content { + border: 1px solid #DCAC6C; + background-color: #fff6d9; + padding: 5px; + font-size: 10pt; + font-family: "宋体"; +} + +.edui-default .edui-bubble .edui-shadow { + /*box-shadow: 1px 1px 3px #818181;*/ + /*-webkit-box-shadow: 2px 2px 3px #818181;*/ + /*-moz-box-shadow: 2px 2px 3px #818181;*/ + /*filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius = '2', MakeShadow = 'true', ShadowOpacity = '0.5');*/ +} + +.edui-default .edui-editor-toolbarmsg { + background-color: #FFF6D9; + border-bottom: 1px solid #ccc; + position: absolute; + bottom: -25px; + left: 0; + z-index: 1009; + width: 99.9%; +} + +.edui-default .edui-editor-toolbarmsg-upload { + font-size: 14px; + color: blue; + width: 100px; + height: 16px; + line-height: 16px; + cursor: pointer; + position: absolute; + top: 5px; + left: 350px; +} + +.edui-default .edui-editor-toolbarmsg-label { + font-size: 12px; + line-height: 16px; + padding: 4px; +} + +.edui-default .edui-editor-toolbarmsg-close { + float: right; + width: 20px; + height: 16px; + line-height: 16px; + cursor: pointer; + color: red; +} +/*可选中菜单按钮*/ +.edui-default .edui-list .edui-bordereraser { + display: none; +} + +.edui-default .edui-listitem { + padding: 1px; + white-space: nowrap; +} + +.edui-default .edui-list .edui-state-hover { + position: relative; + background-color: #fff5d4; + border: 1px solid #dcac6c; + padding: 0; +} + +.edui-default .edui-for-fontfamily .edui-listitem-label { + min-width: 130px; + _width: 120px; + font-size: 12px; + height: 22px; + line-height: 22px; + padding-left: 5px; +} +.edui-default .edui-for-insertcode .edui-listitem-label { + min-width: 120px; + _width: 120px; + font-size: 12px; + height: 22px; + line-height: 22px; + padding-left: 5px; +} +.edui-default .edui-for-underline .edui-listitem-label { + min-width: 120px; + _width: 120px; + padding: 3px 5px; + font-size: 12px; +} + +.edui-default .edui-for-fontsize .edui-listitem-label { + min-width: 120px; + _width: 120px; + padding: 3px 5px; + +} + +.edui-default .edui-for-paragraph .edui-listitem-label { + min-width: 200px; + _width: 200px; + padding: 2px 5px; +} + +.edui-default .edui-for-rowspacingtop .edui-listitem-label, +.edui-default .edui-for-rowspacingbottom .edui-listitem-label { + min-width: 53px; + _width: 53px; + padding: 2px 5px; +} + +.edui-default .edui-for-lineheight .edui-listitem-label { + min-width: 53px; + _width: 53px; + padding: 2px 5px; +} + +.edui-default .edui-for-customstyle .edui-listitem-label { + min-width: 200px; + _width: 200px; + width: 200px !important; + padding: 2px 5px; +} +/* 可选中按钮弹出菜单*/ +.edui-default .edui-menu { + z-index: 3000; +} + +.edui-default .edui-menu .edui-popup-content { + padding: 3px; +} + +.edui-default .edui-menu-body { + _width: 150px; + min-width: 170px; + background: url("../images/sparator_v.png") repeat-y 25px; +} + +.edui-default .edui-menuitem-body { +} + +.edui-default .edui-menuitem { + height: 20px; + cursor: default; + vertical-align: top; +} + +.edui-default .edui-menuitem .edui-icon { + width: 20px !important; + height: 20px !important; + background: url(../images/icons.png) 0 -4000px; + background: url(../images/icons.gif) 0 -4000px\9; +} + +.edui-default .edui-menuitem .edui-label { + font-size: 12px; + line-height: 20px; + height: 20px; + padding-left: 10px; +} + +.edui-default .edui-state-checked .edui-menuitem-body { + background: url("../images/icons-all.gif") no-repeat 6px -205px; +} + +.edui-default .edui-state-disabled .edui-menuitem-label { + color: gray; +} + + +/*不可选中菜单按钮 */ +.edui-default .edui-toolbar .edui-combox-body .edui-button-body { + width: 60px; + font-size: 12px; + height: 20px; + line-height: 20px; + padding-left: 5px; + white-space: nowrap; + margin: 0 3px 0 0; +} + +.edui-default .edui-toolbar .edui-combox-body .edui-arrow { + background: url(../images/icons.png) -741px 0; + _background: url(../images/icons.gif) -741px 0; + height: 20px; + width: 9px; +} + +.edui-default .edui-toolbar .edui-combox .edui-combox-body { + border: 1px solid #CCC; + background-color: white; + border-radius: 2px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; +} + +.edui-default .edui-toolbar .edui-combox-body .edui-splitborder { + display: none; +} + +.edui-default .edui-toolbar .edui-combox-body .edui-arrow { + border-left: 1px solid #CCC; +} + +.edui-default .edui-toolbar .edui-state-hover .edui-combox-body { + background-color: #fff5d4; + border: 1px solid #dcac6c; +} + +.edui-default .edui-toolbar .edui-state-hover .edui-combox-body .edui-arrow { + border-left: 1px solid #dcac6c; +} + +.edui-default .edui-toolbar .edui-state-checked .edui-combox-body { + background-color: #FFE69F; + border: 1px solid #DCAC6C; +} + +.edui-toolbar .edui-state-checked .edui-combox-body .edui-arrow { + border-left: 1px solid #DCAC6C; +} + +.edui-toolbar .edui-state-disabled .edui-combox-body { + background-color: #F0F0EE; + opacity: 0.3; + filter: alpha(opacity = 30); +} + +.edui-toolbar .edui-state-opened .edui-combox-body { + background-color: white; + border: 1px solid gray; +} +/*普通按钮样式及状态*/ +.edui-default .edui-toolbar .edui-button .edui-icon, +.edui-default .edui-toolbar .edui-menubutton .edui-icon, +.edui-default .edui-toolbar .edui-splitbutton .edui-icon { + height: 20px !important; + width: 20px !important; + background-image: url(../images/icons.png); + background-image: url(../images/icons.gif) \9; +} + +.edui-default .edui-toolbar .edui-button .edui-button-wrap { + padding: 1px; + position: relative; +} + +.edui-default .edui-toolbar .edui-button .edui-state-hover .edui-button-wrap { + background-color: #fff5d4; + padding: 0; + border: 1px solid #dcac6c; +} + +.edui-default .edui-toolbar .edui-button .edui-state-checked .edui-button-wrap { + background-color: #ffe69f; + padding: 0; + border: 1px solid #dcac6c; + border-radius: 2px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; +} + +.edui-default .edui-toolbar .edui-button .edui-state-active .edui-button-wrap { + background-color: #ffffff; + padding: 0; + border: 1px solid gray; +} +.edui-default .edui-toolbar .edui-state-disabled .edui-label { + color: #ccc; +} +.edui-default .edui-toolbar .edui-state-disabled .edui-icon { + opacity: 0.3; + filter: alpha(opacity = 30); +} + +/* toolbar icons */ +.edui-default .edui-for-undo .edui-icon { + background-position: -160px 0; +} + +.edui-default .edui-for-redo .edui-icon { + background-position: -100px 0; +} + +.edui-default .edui-for-bold .edui-icon { + background-position: 0 0; +} + +.edui-default .edui-for-italic .edui-icon { + background-position: -60px 0; +} + +.edui-default .edui-for-fontborder .edui-icon { + background-position:-160px -40px; +} +.edui-default .edui-for-underline .edui-icon { + background-position: -140px 0; +} + +.edui-default .edui-for-strikethrough .edui-icon { + background-position: -120px 0; +} + +.edui-default .edui-for-subscript .edui-icon { + background-position: -600px 0; +} + +.edui-default .edui-for-superscript .edui-icon { + background-position: -620px 0; +} + +.edui-default .edui-for-blockquote .edui-icon { + background-position: -220px 0; +} + +.edui-default .edui-for-forecolor .edui-icon { + background-position: -720px 0; +} + +.edui-default .edui-for-backcolor .edui-icon { + background-position: -760px 0; +} + +.edui-default .edui-for-inserttable .edui-icon { + background-position: -580px -20px; +} + +.edui-default .edui-for-autotypeset .edui-icon { + background-position: -640px -40px; +} + +.edui-default .edui-for-justifyleft .edui-icon { + background-position: -460px 0; +} + +.edui-default .edui-for-justifycenter .edui-icon { + background-position: -420px 0; +} + +.edui-default .edui-for-justifyright .edui-icon { + background-position: -480px 0; +} + +.edui-default .edui-for-justifyjustify .edui-icon { + background-position: -440px 0; +} + +.edui-default .edui-for-insertorderedlist .edui-icon { + background-position: -80px 0; +} + +.edui-default .edui-for-insertunorderedlist .edui-icon { + background-position: -20px 0; +} + +.edui-default .edui-for-lineheight .edui-icon { + background-position: -725px -40px; +} + +.edui-default .edui-for-rowspacingbottom .edui-icon { + background-position: -745px -40px; +} + +.edui-default .edui-for-rowspacingtop .edui-icon { + background-position: -765px -40px; +} + +.edui-default .edui-for-horizontal .edui-icon { + background-position: -360px 0; +} + +.edui-default .edui-for-link .edui-icon { + background-position: -500px 0; +} + +.edui-default .edui-for-code .edui-icon { + background-position: -440px -40px; +} + +.edui-default .edui-for-insertimage .edui-icon { + background-position: -726px -77px; +} + +.edui-default .edui-for-insertframe .edui-icon { + background-position: -240px -40px; +} + +.edui-default .edui-for-emoticon .edui-icon { + background-position: -60px -20px; +} + +.edui-default .edui-for-spechars .edui-icon { + background-position: -240px 0; +} + +.edui-default .edui-for-help .edui-icon { + background-position: -340px 0; +} + +.edui-default .edui-for-print .edui-icon { + background-position: -440px -20px; +} + +.edui-default .edui-for-preview .edui-icon { + background-position: -420px -20px; +} + +.edui-default .edui-for-selectall .edui-icon { + background-position: -400px -20px; +} + +.edui-default .edui-for-searchreplace .edui-icon { + background-position: -520px -20px; +} + +.edui-default .edui-for-map .edui-icon { + background-position: -40px -40px; +} + +.edui-default .edui-for-gmap .edui-icon { + background-position: -260px -40px; +} + +.edui-default .edui-for-insertvideo .edui-icon { + background-position: -320px -20px; +} + +.edui-default .edui-for-time .edui-icon { + background-position: -160px -20px; +} + +.edui-default .edui-for-date .edui-icon { + background-position: -140px -20px; +} + +.edui-default .edui-for-cut .edui-icon { + background-position: -680px 0; +} + +.edui-default .edui-for-copy .edui-icon { + background-position: -700px 0; +} + +.edui-default .edui-for-paste .edui-icon { + background-position: -560px 0; +} + +.edui-default .edui-for-formatmatch .edui-icon { + background-position: -40px 0; +} + +.edui-default .edui-for-pasteplain .edui-icon { + background-position: -360px -20px; +} + +.edui-default .edui-for-directionalityltr .edui-icon { + background-position: -20px -20px; +} + +.edui-default .edui-for-directionalityrtl .edui-icon { + background-position: -40px -20px; +} + +.edui-default .edui-for-source .edui-icon { + background-position: -261px -0px; +} + +.edui-default .edui-for-removeformat .edui-icon { + background-position: -580px 0; +} + +.edui-default .edui-for-unlink .edui-icon { + background-position: -640px 0; +} + +.edui-default .edui-for-touppercase .edui-icon { + background-position: -786px 0; +} + +.edui-default .edui-for-tolowercase .edui-icon { + background-position: -806px 0; +} + +.edui-default .edui-for-insertrow .edui-icon { + background-position: -478px -76px; +} + +.edui-default .edui-for-insertrownext .edui-icon { + background-position: -498px -76px; +} + +.edui-default .edui-for-insertcol .edui-icon { + background-position: -455px -76px; +} + +.edui-default .edui-for-insertcolnext .edui-icon { + background-position: -429px -76px; +} + +.edui-default .edui-for-mergeright .edui-icon { + background-position: -60px -40px; +} + +.edui-default .edui-for-mergedown .edui-icon { + background-position: -80px -40px; +} + +.edui-default .edui-for-splittorows .edui-icon { + background-position: -100px -40px; +} + +.edui-default .edui-for-splittocols .edui-icon { + background-position: -120px -40px; +} + +.edui-default .edui-for-insertparagraphbeforetable .edui-icon { + background-position: -140px -40px; +} + +.edui-default .edui-for-deleterow .edui-icon { + background-position: -660px -20px; +} + +.edui-default .edui-for-deletecol .edui-icon { + background-position: -640px -20px; +} + +.edui-default .edui-for-splittocells .edui-icon { + background-position: -800px -20px; +} + +.edui-default .edui-for-mergecells .edui-icon { + background-position: -760px -20px; +} + +.edui-default .edui-for-deletetable .edui-icon { + background-position: -620px -20px; +} + +.edui-default .edui-for-cleardoc .edui-icon { + background-position: -520px 0; +} + +.edui-default .edui-for-fullscreen .edui-icon { + background-position: -100px -20px; +} + +.edui-default .edui-for-anchor .edui-icon { + background-position: -200px 0; +} + +.edui-default .edui-for-pagebreak .edui-icon { + background-position: -460px -40px; +} + +.edui-default .edui-for-imagenone .edui-icon { + background-position: -480px -40px; +} + +.edui-default .edui-for-imageleft .edui-icon { + background-position: -500px -40px; +} + +.edui-default .edui-for-wordimage .edui-icon { + background-position: -660px -40px; +} + +.edui-default .edui-for-imageright .edui-icon { + background-position: -520px -40px; +} + +.edui-default .edui-for-imagecenter .edui-icon { + background-position: -540px -40px; +} + +.edui-default .edui-for-indent .edui-icon { + background-position: -400px 0; +} + +.edui-default .edui-for-outdent .edui-icon { + background-position: -540px 0; +} + +.edui-default .edui-for-webapp .edui-icon { + background-position: -601px -40px +} + +.edui-default .edui-for-table .edui-icon { + background-position: -580px -20px; +} + +.edui-default .edui-for-edittable .edui-icon { + background-position: -420px -40px; +} + +.edui-default .edui-for-template .edui-icon { + background-position: -339px -40px; +} + +.edui-default .edui-for-delete .edui-icon { + background-position: -360px -40px; +} + +.edui-default .edui-for-attachment .edui-icon { + background-position: -620px -40px; +} + +.edui-default .edui-for-edittd .edui-icon { + background-position: -700px -40px; +} + +.edui-default .edui-for-snapscreen .edui-icon { + background-position: -581px -40px +} + +.edui-default .edui-for-scrawl .edui-icon { + background-position: -801px -41px +} + +.edui-default .edui-for-background .edui-icon { + background-position: -680px -40px; +} + +.edui-default .edui-for-music .edui-icon { + background-position: -18px -40px +} + +.edui-default .edui-for-formula .edui-icon { + background-position: -200px -40px +} + +.edui-default .edui-for-aligntd .edui-icon { + background-position: -236px -76px; +} + +.edui-default .edui-for-insertparagraphtrue .edui-icon { + background-position: -625px -76px; +} + +.edui-default .edui-for-insertparagraph .edui-icon { + background-position: -602px -76px; +} + +.edui-default .edui-for-insertcaption .edui-icon { + background-position: -336px -76px; +} + +.edui-default .edui-for-deletecaption .edui-icon { + background-position: -362px -76px; +} + +.edui-default .edui-for-inserttitle .edui-icon { + background-position: -286px -76px; +} + +.edui-default .edui-for-deletetitle .edui-icon { + background-position: -311px -76px; +} + +.edui-default .edui-for-aligntable .edui-icon { + background-position: -440px 0; +} + +.edui-default .edui-for-tablealignment-left .edui-icon { + background-position: -460px 0; +} + +.edui-default .edui-for-tablealignment-center .edui-icon { + background-position: -420px 0; +} + +.edui-default .edui-for-tablealignment-right .edui-icon { + background-position: -480px 0; +} + +.edui-default .edui-for-drafts .edui-icon { + background-position: -560px 0; +} + +.edui-default .edui-for-charts .edui-icon { + background: url( ../images/charts.png ) no-repeat 2px 3px!important; +} + +.edui-default .edui-for-inserttitlecol .edui-icon { + background-position: -673px -76px; +} + +.edui-default .edui-for-deletetitlecol .edui-icon { + background-position: -698px -76px; +} + +.edui-default .edui-for-simpleupload .edui-icon { + background-position: -380px 0px; +} +/*splitbutton*/ +.edui-default .edui-toolbar .edui-splitbutton-body .edui-arrow, +.edui-default .edui-toolbar .edui-menubutton-body .edui-arrow { + background: url(../images/icons.png) -741px 0; + _background: url(../images/icons.gif) -741px 0; + height: 20px; + width: 9px; +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-menubutton-body { + padding: 1px; +} + +.edui-default .edui-toolbar .edui-splitborder { + width: 1px; + height: 20px; +} + +.edui-default .edui-toolbar .edui-state-hover .edui-splitborder { + width: 1px; + border-left: 0px solid #dcac6c; +} + +.edui-default .edui-toolbar .edui-state-active .edui-splitborder { + width: 0; + border-left: 1px solid gray; +} + +.edui-default .edui-toolbar .edui-state-opened .edui-splitborder { + width: 1px; + border: 0; +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body { + background-color: #fff5d4; + border: 1px solid #dcac6c; + padding: 0; +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body { + background-color: #FFE69F; + border: 1px solid #DCAC6C; + padding: 0; +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body { + background-color: #ffffff; + border: 1px solid gray; + padding: 0; +} + +.edui-default .edui-state-disabled .edui-arrow { + opacity: 0.3; + _filter: alpha(opacity = 30); +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body { + background-color: white; + border: 1px solid gray; + padding: 0; +} + +.edui-default .edui-for-insertorderedlist .edui-bordereraser, +.edui-default .edui-for-lineheight .edui-bordereraser, +.edui-default .edui-for-rowspacingtop .edui-bordereraser, +.edui-default .edui-for-rowspacingbottom .edui-bordereraser, +.edui-default .edui-for-insertunorderedlist .edui-bordereraser { + background-color: white; +} + +/* 解决嵌套导致的图标问题 */ +.edui-default .edui-for-insertorderedlist .edui-popup-body .edui-icon, +.edui-default .edui-for-lineheight .edui-popup-body .edui-icon, +.edui-default .edui-for-rowspacingtop .edui-popup-body .edui-icon, +.edui-default .edui-for-rowspacingbottom .edui-popup-body .edui-icon, +.edui-default .edui-for-insertunorderedlist .edui-popup-body .edui-icon { + /*background-position: 0 -40px;*/ + background-image: none ; +} + +/* 弹出菜单 */ +.edui-default .edui-popup { + z-index: 3000; + background-color: #ffffff; + width:auto; + height:auto; + +} + +.edui-default .edui-popup .edui-shadow { + left: 0; + top: 0; + width: 100%; + height: 100%; +} + +.edui-default .edui-popup-content { + border:1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); + box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + padding: 5px; + background:#ffffff; +} + +.edui-default .edui-popup .edui-bordereraser { + background-color: white; + height: 3px; +} + +.edui-default .edui-menu .edui-bordereraser { + height: 3px; +} + +.edui-default .edui-anchor-topleft .edui-bordereraser { + left: 1px; + top: -2px; +} + +.edui-default .edui-anchor-topright .edui-bordereraser { + right: 1px; + top: -2px; +} + +.edui-default .edui-anchor-bottomleft .edui-bordereraser { + left: 0; + bottom: -6px; + height: 7px; + border-left: 1px solid gray; + border-right: 1px solid gray; +} + +.edui-default .edui-anchor-bottomright .edui-bordereraser { + right: 0; + bottom: -6px; + height: 7px; + border-left: 1px solid gray; + border-right: 1px solid gray; +} + +.edui-popup div{ + width:auto; + height:auto; +} +.edui-default .edui-editor-messageholder { + display: block; + width: 150px; + height: auto; + border: 0; + margin: 0; + padding: 0; + position: absolute; + top: 28px; + right: 3px; +} + +.edui-default .edui-message{ + min-height: 10px; + text-shadow: 0 1px 0 rgba(255,255,255,0.5); + padding: 0; + margin-bottom: 3px; + position: relative; +} +.edui-default .edui-message-body{ + border-radius: 3px; + padding: 8px 15px 8px 8px; + color: #c09853; + background-color: #fcf8e3; + border: 1px solid #fbeed5; +} +.edui-default .edui-message-type-info{ + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1 +} +.edui-default .edui-message-type-success{ + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6 +} +.edui-default .edui-message-type-danger, +.edui-default .edui-message-type-error{ + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7 +} +.edui-default .edui-message .edui-message-closer { + display: block; + width: 16px; + height: 16px; + line-height: 16px; + position: absolute; + top: 0; + right: 0; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + float: right; + font-size: 20px; + font-weight: bold; + color: #999; + text-shadow: 0 1px 0 #fff; + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; +} +.edui-default .edui-message .edui-message-content { + font-size: 10pt; + word-wrap: break-word; + word-break: normal; +} +/* 弹出对话框按钮和对话框大小 */ +.edui-default .edui-dialog { + z-index: 2000; + position: absolute; + +} + +.edui-dialog div{ + width:auto; +} + +.edui-default .edui-dialog-wrap { + margin-right: 6px; + margin-bottom: 6px; +} + +.edui-default .edui-dialog-fullscreen-flag { + margin-right: 0; + margin-bottom: 0; +} + +.edui-default .edui-dialog-body { + position: relative; + padding:2px 0 0 2px; + _zoom: 1; +} + +.edui-default .edui-dialog-fullscreen-flag .edui-dialog-body { + padding: 0; +} + +.edui-default .edui-dialog-shadow { + position: absolute; + z-index: -1; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.edui-default .edui-dialog-foot { + background-color: white; +} + +.edui-default .edui-dialog-titlebar { + height: 26px; + border-bottom: 1px solid #c6c6c6; + background: url(../images/dialog-title-bg.png) repeat-x bottom; + position: relative; + cursor: move; +} +.edui-default .edui-dialog-caption { + font-weight: bold; + font-size: 12px; + line-height: 26px; + padding-left: 5px; +} + +.edui-default .edui-dialog-draghandle { + height: 26px; +} + +.edui-default .edui-dialog-closebutton { + position: absolute !important; + right: 5px; + top: 3px; +} + +.edui-default .edui-dialog-closebutton .edui-button-body { + height: 20px; + width: 20px; + cursor: pointer; + background: url("../images/icons-all.gif") no-repeat 0 -59px; +} + +.edui-default .edui-dialog-closebutton .edui-state-hover .edui-button-body { + background: url("../images/icons-all.gif") no-repeat 0 -89px; +} + +.edui-default .edui-dialog-foot { + height: 40px; +} + +.edui-default .edui-dialog-buttons { + position: absolute; + right: 0; +} + +.edui-default .edui-dialog-buttons .edui-button { + margin-right: 10px; +} + +.edui-default .edui-dialog-buttons .edui-button .edui-button-body { + background: url("../images/icons-all.gif") no-repeat; + height: 24px; + width: 96px; + font-size: 12px; + line-height: 24px; + text-align: center; + cursor: default; +} + +.edui-default .edui-dialog-buttons .edui-button .edui-state-hover .edui-button-body { + background: url("../images/icons-all.gif") no-repeat 0 -30px; +} + +.edui-default .edui-dialog iframe { + border: 0; + padding: 0; + margin: 0; + vertical-align: top; +} + +.edui-default .edui-dialog-modalmask { + opacity: 0.3; + filter: alpha(opacity = 30); + background-color: #ccc; + position: absolute; + /*z-index: 1999;*/ +} + +.edui-default .edui-dialog-dragmask { + position: absolute; + /*z-index: 2001;*/ + background-color: transparent; + cursor: move; +} + +.edui-default .edui-dialog-content { + position: relative; +} + +.edui-default .dialogcontmask { + cursor: move; + visibility: hidden; + display: block; + position: absolute; + width: 100%; + height: 100%; + opacity: 0; + filter: alpha(opacity = 0); +} + +/*link-dialog*/ +.edui-default .edui-for-link .edui-dialog-content { + width: 420px; + height: 200px; + overflow: hidden; +} +/*background-dialog*/ +.edui-default .edui-for-background .edui-dialog-content { + width: 440px; + height: 280px; + overflow: hidden; +} + +/*template-dialog*/ +.edui-default .edui-for-template .edui-dialog-content { + width: 630px; + height: 390px; + overflow: hidden; +} + +/*scrawl-dialog*/ +.edui-default .edui-for-scrawl .edui-dialog-content { + width: 515px; + *width: 506px; + height: 360px; +} + +/*spechars-dialog*/ +.edui-default .edui-for-spechars .edui-dialog-content { + width: 620px; + height: 500px; + *width: 630px; + *height: 570px; +} + +/*image-dialog*/ +.edui-default .edui-for-insertimage .edui-dialog-content { + width: 650px; + height: 400px; + overflow: hidden; +} +/*webapp-dialog*/ +.edui-default .edui-for-webapp .edui-dialog-content { + width: 560px; + _width: 565px; + height: 450px; + overflow: hidden; +} + +/*image-insertframe*/ +.edui-default .edui-for-insertframe .edui-dialog-content { + width: 350px; + height: 200px; + overflow: hidden; +} + +/*wordImage-dialog*/ +.edui-default .edui-for-wordimage .edui-dialog-content { + width: 620px; + height: 380px; + overflow: hidden; +} + +/*attachment-dialog*/ +.edui-default .edui-for-attachment .edui-dialog-content { + width: 650px; + height: 400px; + overflow: hidden; +} + + +/*map-dialog*/ +.edui-default .edui-for-map .edui-dialog-content { + width: 550px; + height: 400px; +} + +/*gmap-dialog*/ +.edui-default .edui-for-gmap .edui-dialog-content { + width: 550px; + height: 400px; +} + +/*video-dialog*/ +.edui-default .edui-for-insertvideo .edui-dialog-content { + width: 590px; + height: 390px; +} + +/*anchor-dialog*/ +.edui-default .edui-for-anchor .edui-dialog-content { + width: 320px; + height: 60px; + overflow: hidden; +} + +/*searchreplace-dialog*/ +.edui-default .edui-for-searchreplace .edui-dialog-content { + width: 400px; + height: 220px; +} + +/*help-dialog*/ +.edui-default .edui-for-help .edui-dialog-content { + width: 400px; + height: 420px; +} + +/*edittable-dialog*/ +.edui-default .edui-for-edittable .edui-dialog-content { + width: 540px; + _width:590px; + height: 335px; +} + +/*edittip-dialog*/ +.edui-default .edui-for-edittip .edui-dialog-content { + width: 225px; + height: 60px; +} + +/*edittd-dialog*/ +.edui-default .edui-for-edittd .edui-dialog-content { + width: 240px; + height: 50px; +} +/*snapscreen-dialog*/ +.edui-default .edui-for-snapscreen .edui-dialog-content { + width: 400px; + height: 220px; +} + +/*music-dialog*/ +.edui-default .edui-for-music .edui-dialog-content { + width: 515px; + height: 360px; +} + +/*段落弹出菜单*/ +.edui-default .edui-for-paragraph .edui-listitem-label { + font-family: Tahoma, Verdana, Arial, Helvetica; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-p { + font-size: 22px; + line-height: 27px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h1 { + font-weight: bolder; + font-size: 32px; + line-height: 36px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h2 { + font-weight: bolder; + font-size: 27px; + line-height: 29px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h3 { + font-weight: bolder; + font-size: 19px; + line-height: 23px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h4 { + font-weight: bolder; + font-size: 16px; + line-height: 19px +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h5 { + font-weight: bolder; + font-size: 13px; + line-height: 16px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h6 { + font-weight: bolder; + font-size: 12px; + line-height: 14px; +} +/* 表格弹出菜单 */ +.edui-default .edui-for-inserttable .edui-splitborder { + display: none +} +.edui-default .edui-for-inserttable .edui-splitbutton-body .edui-arrow { + width: 0 +} +.edui-default .edui-toolbar .edui-for-inserttable .edui-state-active .edui-splitborder{ + border-left: 1px solid transparent; +} +.edui-default .edui-tablepicker .edui-infoarea { + height: 14px; + line-height: 14px; + font-size: 12px; + width: 220px; + margin-bottom: 3px; + clear: both; +} + +.edui-default .edui-tablepicker .edui-infoarea .edui-label { + float: left; +} + +.edui-default .edui-dialog-buttons .edui-label { + line-height: 24px; +} + +.edui-default .edui-tablepicker .edui-infoarea .edui-clickable { + float: right; +} + +.edui-default .edui-tablepicker .edui-pickarea { + background: url("../images/unhighlighted.gif") repeat; + height: 220px; + width: 220px; +} + +.edui-default .edui-tablepicker .edui-pickarea .edui-overlay { + background: url("../images/highlighted.gif") repeat; +} + +/* 颜色弹出菜单 */ +.edui-default .edui-colorpicker-topbar { + height: 27px; + width: 200px; + /*border-bottom: 1px gray dashed;*/ +} + +.edui-default .edui-colorpicker-preview { + height: 20px; + border: 1px inset black; + margin-left: 1px; + width: 128px; + float: left; +} + +.edui-default .edui-colorpicker-nocolor { + float: right; + margin-right: 1px; + font-size: 12px; + line-height: 14px; + height: 14px; + border: 1px solid #333; + padding: 3px 5px; + cursor: pointer; +} + +.edui-default .edui-colorpicker-tablefirstrow { + height: 30px; +} + +.edui-default .edui-colorpicker-colorcell { + width: 14px; + height: 14px; + display: block; + margin: 0; + cursor: pointer; +} + +.edui-default .edui-colorpicker-colorcell:hover { + width: 14px; + height: 14px; + margin: 0; +} +.edui-default .edui-colorpicker-advbtn{ + display: block; + text-align: center; + cursor: pointer; + height:20px; +} +.arrow_down{ + background: white url('../images/arrow_down.png') no-repeat center; +} +.arrow_up{ + background: white url('../images/arrow_up.png') no-repeat center; +} +/*高级的样式*/ +.edui-colorpicker-adv{ + position: relative; + overflow: hidden; + height: 180px; + display: none; +} +.edui-colorpicker-plant, .edui-colorpicker-hue { + border: solid 1px #666; +} +.edui-colorpicker-pad { + width: 150px; + height: 150px; + left: 14px; + top: 13px; + position: absolute; + background: red; + overflow: hidden; + cursor: crosshair; +} +.edui-colorpicker-cover{ + position: absolute; + top: 0; + left: 0; + width: 150px; + height: 150px; + background: url("../images/tangram-colorpicker.png") -160px -200px; +} +.edui-colorpicker-padDot{ + position: absolute; + top: 0; + left: 0; + width: 11px; + height: 11px; + overflow: hidden; + background: url(../images/tangram-colorpicker.png) 0px -200px repeat-x; + z-index: 1000; + +} +.edui-colorpicker-sliderMain { + position: absolute; + left: 171px; + top: 13px; + width: 19px; + height: 152px; + background: url(../images/tangram-colorpicker.png) -179px -12px no-repeat; + +} +.edui-colorpicker-slider { + width: 100%; + height: 100%; + cursor: pointer; +} +.edui-colorpicker-thumb{ + position: absolute; + top: 0; + cursor: pointer; + height: 3px; + left: -1px; + right: -1px; + border: 1px solid black; + background: white; + opacity: .8; +} +/*自动排版弹出菜单*/ +.edui-default .edui-autotypesetpicker .edui-autotypesetpicker-body { + font-size: 12px; + margin-bottom: 3px; + clear: both; +} + +.edui-default .edui-autotypesetpicker-body table { + border-collapse: separate; + border-spacing: 2px; +} + +.edui-default .edui-autotypesetpicker-body td { + font-size: 12px; + word-wrap:break-word; +} + +.edui-default .edui-autotypesetpicker-body td input { + margin: 3px 3px 3px 4px; + *margin: 1px 0 0 0; +} +/*自动排版弹出菜单*/ +.edui-default .edui-cellalignpicker .edui-cellalignpicker-body { + width: 70px; + font-size: 12px; + cursor: default; +} + +.edui-default .edui-cellalignpicker-body table { + border-collapse: separate; + border-spacing: 0; +} +.edui-default .edui-cellalignpicker-body td{ + padding: 1px; +} +.edui-default .edui-cellalignpicker-body .edui-icon{ + height: 20px; + width: 20px; + padding: 1px; + background-image: url(../images/table-cell-align.png); +} + +.edui-default .edui-cellalignpicker-body .edui-left{ + background-position: 0 0; +} + +.edui-default .edui-cellalignpicker-body .edui-center{ + background-position: -25px 0; +} +.edui-default .edui-cellalignpicker-body .edui-right{ + background-position: -51px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-left{ + background-position: -73px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-center{ + background-position: -98px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-right{ + background-position: -124px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-left { + background-position: -146px 0; + background-color: #f1f4f5; +} + +.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-center { + background-position: -245px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right { + background-position: -271px 0; +} +/*分隔线*/ +.edui-default .edui-toolbar .edui-separator { + width: 2px; + height: 20px; + margin: 2px 4px 2px 3px; + background: url(../images/icons.png) -181px 0; + background: url(../images/icons.gif) -181px 0 \9; +} + +/*颜色按钮 */ +.edui-default .edui-toolbar .edui-colorbutton .edui-colorlump { + position: absolute; + overflow: hidden; + bottom: 1px; + left: 1px; + width: 18px; + height: 4px; +} +/*表情按钮及弹出菜单*/ +/*去除了表情的下拉箭头*/ +.edui-default .edui-for-emotion .edui-icon { + background-position: -60px -20px; +} +.edui-default .edui-for-emotion .edui-popup-content iframe +{ + width: 514px; + height: 380px; + overflow: hidden; +} +.edui-default .edui-for-emotion .edui-popup-content +{ + position: relative; + z-index: 555 +} + +.edui-default .edui-for-emotion .edui-splitborder { + display: none +} + +.edui-default .edui-for-emotion .edui-splitbutton-body .edui-arrow +{ + width: 0 +} +.edui-default .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder +{ + border-left: 1px solid transparent; +} +/*contextmenu*/ +.edui-default .edui-hassubmenu .edui-arrow { + height: 20px; + width: 20px; + float: right; + background: url("../images/icons-all.gif") no-repeat 10px -233px; +} + +.edui-default .edui-menu-body .edui-menuitem { + padding: 1px; +} + +.edui-default .edui-menuseparator { + margin: 2px 0; + height: 1px; + overflow: hidden; +} + +.edui-default .edui-menuseparator-inner { + border-bottom: 1px solid #e2e3e3; + margin-left: 29px; + margin-right: 1px; +} + +.edui-default .edui-menu-body .edui-state-hover { + padding: 0 !important; + background-color: #fff5d4; + border: 1px solid #dcac6c; +} +/*弹出菜单*/ +.edui-default .edui-shortcutmenu { + padding: 2px; + width: 190px; + height: 50px; + background-color: #fff; + border: 1px solid #ccc; + border-radius: 5px; +} + +/*粘贴弹出菜单*/ +.edui-default .edui-wordpastepop .edui-popup-content{ + border: none; + padding: 0; + width: 54px; + height: 21px; +} +.edui-default .edui-pasteicon { + width: 100%; + height: 100%; + background-image: url('../images/wordpaste.png'); + background-position: 0 0; +} + +.edui-default .edui-pasteicon.edui-state-opened { + background-position: 0 -34px; +} + +.edui-default .edui-pastecontainer { + position: relative; + visibility: hidden; + width: 97px; + background: #fff; + border: 1px solid #ccc; +} + +.edui-default .edui-pastecontainer .edui-title { + font-weight: bold; + background: #F8F8FF; + height: 25px; + line-height: 25px; + font-size: 12px; + padding-left: 5px; +} + +.edui-default .edui-pastecontainer .edui-button { + overflow: hidden; + margin: 3px 0; +} + +.edui-default .edui-pastecontainer .edui-button .edui-richtxticon, +.edui-default .edui-pastecontainer .edui-button .edui-tagicon, +.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon{ + float: left; + cursor: pointer; + width: 29px; + height: 29px; + margin-left: 5px; + background-image: url('../images/wordpaste.png'); + background-repeat: no-repeat; +} +.edui-default .edui-pastecontainer .edui-button .edui-richtxticon { + margin-left: 0; + background-position: -109px 0; +} +.edui-default .edui-pastecontainer .edui-button .edui-tagicon { + background-position: -148px 1px; +} + +.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon { + background-position: -72px 0; +} + +.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon { + background-position: -109px -34px; +} +.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon{ + background-position: -148px -34px; +} +.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon{ + background-position: -72px -34px; +} \ No newline at end of file diff --git a/src/main/webapp/js/ue/themes/default/css/ueditor.min.css b/src/main/webapp/js/ue/themes/default/css/ueditor.min.css new file mode 100644 index 0000000..7be9c03 --- /dev/null +++ b/src/main/webapp/js/ue/themes/default/css/ueditor.min.css @@ -0,0 +1,8 @@ +/*! + * UEditor + * version: ueditor + * build: Mon Jul 25 2016 13:58:39 GMT+0800 (中国标准时间) + */ + + +.edui-default .edui-box{border:0;padding:0;margin:0;overflow:hidden}.edui-default a.edui-box{display:block;text-decoration:none;color:#000}.edui-default a.edui-box:hover{text-decoration:none}.edui-default a.edui-box:active{text-decoration:none}.edui-default table.edui-box{border-collapse:collapse}.edui-default ul.edui-box{list-style-type:none}div.edui-box{position:relative;display:-moz-inline-box!important;display:inline-block!important;vertical-align:top}.edui-default .edui-clearfix{zoom:1}.edui-default .edui-clearfix:after{content:'\20';display:block;clear:both}* html div.edui-box{display:inline!important}:first-child+html div.edui-box{display:inline!important}.edui-default .edui-button-body,.edui-splitbutton-body,.edui-menubutton-body,.edui-combox-body{position:relative}.edui-default .edui-popup{position:absolute;-webkit-user-select:none;-moz-user-select:none}.edui-default .edui-popup .edui-shadow{position:absolute;z-index:-1}.edui-default .edui-popup .edui-bordereraser{position:absolute;overflow:hidden}.edui-default .edui-tablepicker .edui-canvas{position:relative}.edui-default .edui-tablepicker .edui-canvas .edui-overlay{position:absolute}.edui-default .edui-dialog-modalmask,.edui-dialog-dragmask{position:absolute;left:0;top:0;width:100%;height:100%}.edui-default .edui-toolbar{position:relative}.edui-default .edui-label{cursor:default}.edui-default span.edui-clickable{color:#00f;cursor:pointer;text-decoration:underline}.edui-default span.edui-unclickable{color:gray;cursor:default}.edui-default .edui-toolbar{cursor:default;-webkit-user-select:none;-moz-user-select:none;padding:1px;overflow:hidden;zoom:1;width:auto;height:auto}.edui-default .edui-toolbar .edui-button,.edui-default .edui-toolbar .edui-splitbutton,.edui-default .edui-toolbar .edui-menubutton,.edui-default .edui-toolbar .edui-combox{margin:1px}.edui-default .edui-editor{border:1px solid #d4d4d4;background-color:#fff;position:relative;overflow:visible;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.edui-editor div{width:auto;height:auto}.edui-default .edui-editor-toolbarbox{position:relative;zoom:1;-webkit-box-shadow:0 1px 4px rgba(204,204,204,.6);-moz-box-shadow:0 1px 4px rgba(204,204,204,.6);box-shadow:0 1px 4px rgba(204,204,204,.6);border-top-left-radius:2px;border-top-right-radius:2px}.edui-default .edui-editor-toolbarboxouter{border-bottom:1px solid #d4d4d4;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,.065);box-shadow:0 1px 4px rgba(0,0,0,.065)}.edui-default .edui-editor-toolbarboxinner{padding:2px}.edui-default .edui-editor-iframeholder{position:relative}.edui-default .edui-editor-bottomContainer{overflow:hidden}.edui-default .edui-editor-bottomContainer table{width:100%;height:0;overflow:hidden;border-spacing:0}.edui-default .edui-editor-bottomContainer td{white-space:nowrap;border-top:1px solid #ccc;line-height:20px;font-size:12px;font-family:Arial,Helvetica,Tahoma,Verdana,Sans-Serif}.edui-default .edui-editor-wordcount{text-align:right;margin-right:5px;color:#aaa}.edui-default .edui-editor-scale{width:12px}.edui-default .edui-editor-scale .edui-editor-icon{float:right;width:100%;height:12px;margin-top:10px;background:url(../images/scale.png) no-repeat;cursor:se-resize}.edui-default .edui-editor-breadcrumb{margin:2px 0 0 3px}.edui-default .edui-editor-breadcrumb span{cursor:pointer;text-decoration:underline;color:#00f}.edui-default .edui-toolbar .edui-for-fullscreen{float:right}.edui-default .edui-bubble .edui-popup-content{border:1px solid #DCAC6C;background-color:#fff6d9;padding:5px;font-size:10pt;font-family:"宋体"}.edui-default .edui-bubble .edui-shadow{}.edui-default .edui-editor-toolbarmsg{background-color:#FFF6D9;border-bottom:1px solid #ccc;position:absolute;bottom:-25px;left:0;z-index:1009;width:99.9%}.edui-default .edui-editor-toolbarmsg-upload{font-size:14px;color:#00f;width:100px;height:16px;line-height:16px;cursor:pointer;position:absolute;top:5px;left:350px}.edui-default .edui-editor-toolbarmsg-label{font-size:12px;line-height:16px;padding:4px}.edui-default .edui-editor-toolbarmsg-close{float:right;width:20px;height:16px;line-height:16px;cursor:pointer;color:red}.edui-default .edui-list .edui-bordereraser{display:none}.edui-default .edui-listitem{padding:1px;white-space:nowrap}.edui-default .edui-list .edui-state-hover{position:relative;background-color:#fff5d4;border:1px solid #dcac6c;padding:0}.edui-default .edui-for-fontfamily .edui-listitem-label{min-width:130px;_width:120px;font-size:12px;height:22px;line-height:22px;padding-left:5px}.edui-default .edui-for-insertcode .edui-listitem-label{min-width:120px;_width:120px;font-size:12px;height:22px;line-height:22px;padding-left:5px}.edui-default .edui-for-underline .edui-listitem-label{min-width:120px;_width:120px;padding:3px 5px;font-size:12px}.edui-default .edui-for-fontsize .edui-listitem-label{min-width:120px;_width:120px;padding:3px 5px}.edui-default .edui-for-paragraph .edui-listitem-label{min-width:200px;_width:200px;padding:2px 5px}.edui-default .edui-for-rowspacingtop .edui-listitem-label,.edui-default .edui-for-rowspacingbottom .edui-listitem-label{min-width:53px;_width:53px;padding:2px 5px}.edui-default .edui-for-lineheight .edui-listitem-label{min-width:53px;_width:53px;padding:2px 5px}.edui-default .edui-for-customstyle .edui-listitem-label{min-width:200px;_width:200px;width:200px!important;padding:2px 5px}.edui-default .edui-menu{z-index:3000}.edui-default .edui-menu .edui-popup-content{padding:3px}.edui-default .edui-menu-body{_width:150px;min-width:170px;background:url(../images/sparator_v.png) repeat-y 25px}.edui-default .edui-menuitem-body{}.edui-default .edui-menuitem{height:20px;cursor:default;vertical-align:top}.edui-default .edui-menuitem .edui-icon{width:20px!important;height:20px!important;background:url(../images/icons.png) 0 -4000px;background:url(../images/icons.gif) 0 -4000px\9}.edui-default .edui-menuitem .edui-label{font-size:12px;line-height:20px;height:20px;padding-left:10px}.edui-default .edui-state-checked .edui-menuitem-body{background:url(../images/icons-all.gif) no-repeat 6px -205px}.edui-default .edui-state-disabled .edui-menuitem-label{color:gray}.edui-default .edui-toolbar .edui-combox-body .edui-button-body{width:60px;font-size:12px;height:20px;line-height:20px;padding-left:5px;white-space:nowrap;margin:0 3px 0 0}.edui-default .edui-toolbar .edui-combox-body .edui-arrow{background:url(../images/icons.png) -741px 0;_background:url(../images/icons.gif) -741px 0;height:20px;width:9px}.edui-default .edui-toolbar .edui-combox .edui-combox-body{border:1px solid #CCC;background-color:#fff;border-radius:2px;-webkit-border-radius:2px;-moz-border-radius:2px}.edui-default .edui-toolbar .edui-combox-body .edui-splitborder{display:none}.edui-default .edui-toolbar .edui-combox-body .edui-arrow{border-left:1px solid #CCC}.edui-default .edui-toolbar .edui-state-hover .edui-combox-body{background-color:#fff5d4;border:1px solid #dcac6c}.edui-default .edui-toolbar .edui-state-hover .edui-combox-body .edui-arrow{border-left:1px solid #dcac6c}.edui-default .edui-toolbar .edui-state-checked .edui-combox-body{background-color:#FFE69F;border:1px solid #DCAC6C}.edui-toolbar .edui-state-checked .edui-combox-body .edui-arrow{border-left:1px solid #DCAC6C}.edui-toolbar .edui-state-disabled .edui-combox-body{background-color:#F0F0EE;opacity:.3;filter:alpha(opacity=30)}.edui-toolbar .edui-state-opened .edui-combox-body{background-color:#fff;border:1px solid gray}.edui-default .edui-toolbar .edui-button .edui-icon,.edui-default .edui-toolbar .edui-menubutton .edui-icon,.edui-default .edui-toolbar .edui-splitbutton .edui-icon{height:20px!important;width:20px!important;background-image:url(../images/icons.png);background-image:url(../images/icons.gif) \9}.edui-default .edui-toolbar .edui-button .edui-button-wrap{padding:1px;position:relative}.edui-default .edui-toolbar .edui-button .edui-state-hover .edui-button-wrap{background-color:#fff5d4;padding:0;border:1px solid #dcac6c}.edui-default .edui-toolbar .edui-button .edui-state-checked .edui-button-wrap{background-color:#ffe69f;padding:0;border:1px solid #dcac6c;border-radius:2px;-webkit-border-radius:2px;-moz-border-radius:2px}.edui-default .edui-toolbar .edui-button .edui-state-active .edui-button-wrap{background-color:#fff;padding:0;border:1px solid gray}.edui-default .edui-toolbar .edui-state-disabled .edui-label{color:#ccc}.edui-default .edui-toolbar .edui-state-disabled .edui-icon{opacity:.3;filter:alpha(opacity=30)}.edui-default .edui-for-undo .edui-icon{background-position:-160px 0}.edui-default .edui-for-redo .edui-icon{background-position:-100px 0}.edui-default .edui-for-bold .edui-icon{background-position:0 0}.edui-default .edui-for-italic .edui-icon{background-position:-60px 0}.edui-default .edui-for-fontborder .edui-icon{background-position:-160px -40px}.edui-default .edui-for-underline .edui-icon{background-position:-140px 0}.edui-default .edui-for-strikethrough .edui-icon{background-position:-120px 0}.edui-default .edui-for-subscript .edui-icon{background-position:-600px 0}.edui-default .edui-for-superscript .edui-icon{background-position:-620px 0}.edui-default .edui-for-blockquote .edui-icon{background-position:-220px 0}.edui-default .edui-for-forecolor .edui-icon{background-position:-720px 0}.edui-default .edui-for-backcolor .edui-icon{background-position:-760px 0}.edui-default .edui-for-inserttable .edui-icon{background-position:-580px -20px}.edui-default .edui-for-autotypeset .edui-icon{background-position:-640px -40px}.edui-default .edui-for-justifyleft .edui-icon{background-position:-460px 0}.edui-default .edui-for-justifycenter .edui-icon{background-position:-420px 0}.edui-default .edui-for-justifyright .edui-icon{background-position:-480px 0}.edui-default .edui-for-justifyjustify .edui-icon{background-position:-440px 0}.edui-default .edui-for-insertorderedlist .edui-icon{background-position:-80px 0}.edui-default .edui-for-insertunorderedlist .edui-icon{background-position:-20px 0}.edui-default .edui-for-lineheight .edui-icon{background-position:-725px -40px}.edui-default .edui-for-rowspacingbottom .edui-icon{background-position:-745px -40px}.edui-default .edui-for-rowspacingtop .edui-icon{background-position:-765px -40px}.edui-default .edui-for-horizontal .edui-icon{background-position:-360px 0}.edui-default .edui-for-link .edui-icon{background-position:-500px 0}.edui-default .edui-for-code .edui-icon{background-position:-440px -40px}.edui-default .edui-for-insertimage .edui-icon{background-position:-726px -77px}.edui-default .edui-for-insertframe .edui-icon{background-position:-240px -40px}.edui-default .edui-for-emoticon .edui-icon{background-position:-60px -20px}.edui-default .edui-for-spechars .edui-icon{background-position:-240px 0}.edui-default .edui-for-help .edui-icon{background-position:-340px 0}.edui-default .edui-for-print .edui-icon{background-position:-440px -20px}.edui-default .edui-for-preview .edui-icon{background-position:-420px -20px}.edui-default .edui-for-selectall .edui-icon{background-position:-400px -20px}.edui-default .edui-for-searchreplace .edui-icon{background-position:-520px -20px}.edui-default .edui-for-map .edui-icon{background-position:-40px -40px}.edui-default .edui-for-gmap .edui-icon{background-position:-260px -40px}.edui-default .edui-for-insertvideo .edui-icon{background-position:-320px -20px}.edui-default .edui-for-time .edui-icon{background-position:-160px -20px}.edui-default .edui-for-date .edui-icon{background-position:-140px -20px}.edui-default .edui-for-cut .edui-icon{background-position:-680px 0}.edui-default .edui-for-copy .edui-icon{background-position:-700px 0}.edui-default .edui-for-paste .edui-icon{background-position:-560px 0}.edui-default .edui-for-formatmatch .edui-icon{background-position:-40px 0}.edui-default .edui-for-pasteplain .edui-icon{background-position:-360px -20px}.edui-default .edui-for-directionalityltr .edui-icon{background-position:-20px -20px}.edui-default .edui-for-directionalityrtl .edui-icon{background-position:-40px -20px}.edui-default .edui-for-source .edui-icon{background-position:-261px -0px}.edui-default .edui-for-removeformat .edui-icon{background-position:-580px 0}.edui-default .edui-for-unlink .edui-icon{background-position:-640px 0}.edui-default .edui-for-touppercase .edui-icon{background-position:-786px 0}.edui-default .edui-for-tolowercase .edui-icon{background-position:-806px 0}.edui-default .edui-for-insertrow .edui-icon{background-position:-478px -76px}.edui-default .edui-for-insertrownext .edui-icon{background-position:-498px -76px}.edui-default .edui-for-insertcol .edui-icon{background-position:-455px -76px}.edui-default .edui-for-insertcolnext .edui-icon{background-position:-429px -76px}.edui-default .edui-for-mergeright .edui-icon{background-position:-60px -40px}.edui-default .edui-for-mergedown .edui-icon{background-position:-80px -40px}.edui-default .edui-for-splittorows .edui-icon{background-position:-100px -40px}.edui-default .edui-for-splittocols .edui-icon{background-position:-120px -40px}.edui-default .edui-for-insertparagraphbeforetable .edui-icon{background-position:-140px -40px}.edui-default .edui-for-deleterow .edui-icon{background-position:-660px -20px}.edui-default .edui-for-deletecol .edui-icon{background-position:-640px -20px}.edui-default .edui-for-splittocells .edui-icon{background-position:-800px -20px}.edui-default .edui-for-mergecells .edui-icon{background-position:-760px -20px}.edui-default .edui-for-deletetable .edui-icon{background-position:-620px -20px}.edui-default .edui-for-cleardoc .edui-icon{background-position:-520px 0}.edui-default .edui-for-fullscreen .edui-icon{background-position:-100px -20px}.edui-default .edui-for-anchor .edui-icon{background-position:-200px 0}.edui-default .edui-for-pagebreak .edui-icon{background-position:-460px -40px}.edui-default .edui-for-imagenone .edui-icon{background-position:-480px -40px}.edui-default .edui-for-imageleft .edui-icon{background-position:-500px -40px}.edui-default .edui-for-wordimage .edui-icon{background-position:-660px -40px}.edui-default .edui-for-imageright .edui-icon{background-position:-520px -40px}.edui-default .edui-for-imagecenter .edui-icon{background-position:-540px -40px}.edui-default .edui-for-indent .edui-icon{background-position:-400px 0}.edui-default .edui-for-outdent .edui-icon{background-position:-540px 0}.edui-default .edui-for-webapp .edui-icon{background-position:-601px -40px}.edui-default .edui-for-table .edui-icon{background-position:-580px -20px}.edui-default .edui-for-edittable .edui-icon{background-position:-420px -40px}.edui-default .edui-for-template .edui-icon{background-position:-339px -40px}.edui-default .edui-for-delete .edui-icon{background-position:-360px -40px}.edui-default .edui-for-attachment .edui-icon{background-position:-620px -40px}.edui-default .edui-for-edittd .edui-icon{background-position:-700px -40px}.edui-default .edui-for-snapscreen .edui-icon{background-position:-581px -40px}.edui-default .edui-for-scrawl .edui-icon{background-position:-801px -41px}.edui-default .edui-for-background .edui-icon{background-position:-680px -40px}.edui-default .edui-for-music .edui-icon{background-position:-18px -40px}.edui-default .edui-for-formula .edui-icon{background-position:-200px -40px}.edui-default .edui-for-aligntd .edui-icon{background-position:-236px -76px}.edui-default .edui-for-insertparagraphtrue .edui-icon{background-position:-625px -76px}.edui-default .edui-for-insertparagraph .edui-icon{background-position:-602px -76px}.edui-default .edui-for-insertcaption .edui-icon{background-position:-336px -76px}.edui-default .edui-for-deletecaption .edui-icon{background-position:-362px -76px}.edui-default .edui-for-inserttitle .edui-icon{background-position:-286px -76px}.edui-default .edui-for-deletetitle .edui-icon{background-position:-311px -76px}.edui-default .edui-for-aligntable .edui-icon{background-position:-440px 0}.edui-default .edui-for-tablealignment-left .edui-icon{background-position:-460px 0}.edui-default .edui-for-tablealignment-center .edui-icon{background-position:-420px 0}.edui-default .edui-for-tablealignment-right .edui-icon{background-position:-480px 0}.edui-default .edui-for-drafts .edui-icon{background-position:-560px 0}.edui-default .edui-for-charts .edui-icon{background:url( ../images/charts.png ) no-repeat 2px 3px!important}.edui-default .edui-for-inserttitlecol .edui-icon{background-position:-673px -76px}.edui-default .edui-for-deletetitlecol .edui-icon{background-position:-698px -76px}.edui-default .edui-for-simpleupload .edui-icon{background-position:-380px 0}.edui-default .edui-toolbar .edui-splitbutton-body .edui-arrow,.edui-default .edui-toolbar .edui-menubutton-body .edui-arrow{background:url(../images/icons.png) -741px 0;_background:url(../images/icons.gif) -741px 0;height:20px;width:9px}.edui-default .edui-toolbar .edui-splitbutton .edui-splitbutton-body,.edui-default .edui-toolbar .edui-menubutton .edui-menubutton-body{padding:1px}.edui-default .edui-toolbar .edui-splitborder{width:1px;height:20px}.edui-default .edui-toolbar .edui-state-hover .edui-splitborder{width:1px;border-left:0 solid #dcac6c}.edui-default .edui-toolbar .edui-state-active .edui-splitborder{width:0;border-left:1px solid gray}.edui-default .edui-toolbar .edui-state-opened .edui-splitborder{width:1px;border:0}.edui-default .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body,.edui-default .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body{background-color:#fff5d4;border:1px solid #dcac6c;padding:0}.edui-default .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body,.edui-default .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body{background-color:#FFE69F;border:1px solid #DCAC6C;padding:0}.edui-default .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body,.edui-default .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body{background-color:#fff;border:1px solid gray;padding:0}.edui-default .edui-state-disabled .edui-arrow{opacity:.3;_filter:alpha(opacity=30)}.edui-default .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body,.edui-default .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body{background-color:#fff;border:1px solid gray;padding:0}.edui-default .edui-for-insertorderedlist .edui-bordereraser,.edui-default .edui-for-lineheight .edui-bordereraser,.edui-default .edui-for-rowspacingtop .edui-bordereraser,.edui-default .edui-for-rowspacingbottom .edui-bordereraser,.edui-default .edui-for-insertunorderedlist .edui-bordereraser{background-color:#fff}.edui-default .edui-for-insertorderedlist .edui-popup-body .edui-icon,.edui-default .edui-for-lineheight .edui-popup-body .edui-icon,.edui-default .edui-for-rowspacingtop .edui-popup-body .edui-icon,.edui-default .edui-for-rowspacingbottom .edui-popup-body .edui-icon,.edui-default .edui-for-insertunorderedlist .edui-popup-body .edui-icon{background-image:none}.edui-default .edui-popup{z-index:3000;background-color:#fff;width:auto;height:auto}.edui-default .edui-popup .edui-shadow{left:0;top:0;width:100%;height:100%}.edui-default .edui-popup-content{border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 4px rgba(0,0,0,.2);-moz-box-shadow:0 3px 4px rgba(0,0,0,.2);box-shadow:0 3px 4px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;padding:5px;background:#fff}.edui-default .edui-popup .edui-bordereraser{background-color:#fff;height:3px}.edui-default .edui-menu .edui-bordereraser{height:3px}.edui-default .edui-anchor-topleft .edui-bordereraser{left:1px;top:-2px}.edui-default .edui-anchor-topright .edui-bordereraser{right:1px;top:-2px}.edui-default .edui-anchor-bottomleft .edui-bordereraser{left:0;bottom:-6px;height:7px;border-left:1px solid gray;border-right:1px solid gray}.edui-default .edui-anchor-bottomright .edui-bordereraser{right:0;bottom:-6px;height:7px;border-left:1px solid gray;border-right:1px solid gray}.edui-popup div{width:auto;height:auto}.edui-default .edui-editor-messageholder{display:block;width:150px;height:auto;border:0;margin:0;padding:0;position:absolute;top:28px;right:3px}.edui-default .edui-message{min-height:10px;text-shadow:0 1px 0 rgba(255,255,255,.5);padding:0;margin-bottom:3px;position:relative}.edui-default .edui-message-body{border-radius:3px;padding:8px 15px 8px 8px;color:#c09853;background-color:#fcf8e3;border:1px solid #fbeed5}.edui-default .edui-message-type-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.edui-default .edui-message-type-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.edui-default .edui-message-type-danger,.edui-default .edui-message-type-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.edui-default .edui-message .edui-message-closer{display:block;width:16px;height:16px;line-height:16px;position:absolute;top:0;right:0;padding:0;cursor:pointer;background:transparent;border:0;float:right;font-size:20px;font-weight:700;color:#999;text-shadow:0 1px 0 #fff;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.edui-default .edui-message .edui-message-content{font-size:10pt;word-wrap:break-word;word-break:normal}.edui-default .edui-dialog{z-index:2000;position:absolute}.edui-dialog div{width:auto}.edui-default .edui-dialog-wrap{margin-right:6px;margin-bottom:6px}.edui-default .edui-dialog-fullscreen-flag{margin-right:0;margin-bottom:0}.edui-default .edui-dialog-body{position:relative;padding:2px 0 0 2px;_zoom:1}.edui-default .edui-dialog-fullscreen-flag .edui-dialog-body{padding:0}.edui-default .edui-dialog-shadow{position:absolute;z-index:-1;left:0;top:0;width:100%;height:100%;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.edui-default .edui-dialog-foot{background-color:#fff}.edui-default .edui-dialog-titlebar{height:26px;border-bottom:1px solid #c6c6c6;background:url(../images/dialog-title-bg.png) repeat-x bottom;position:relative;cursor:move}.edui-default .edui-dialog-caption{font-weight:700;font-size:12px;line-height:26px;padding-left:5px}.edui-default .edui-dialog-draghandle{height:26px}.edui-default .edui-dialog-closebutton{position:absolute!important;right:5px;top:3px}.edui-default .edui-dialog-closebutton .edui-button-body{height:20px;width:20px;cursor:pointer;background:url(../images/icons-all.gif) no-repeat 0 -59px}.edui-default .edui-dialog-closebutton .edui-state-hover .edui-button-body{background:url(../images/icons-all.gif) no-repeat 0 -89px}.edui-default .edui-dialog-foot{height:40px}.edui-default .edui-dialog-buttons{position:absolute;right:0}.edui-default .edui-dialog-buttons .edui-button{margin-right:10px}.edui-default .edui-dialog-buttons .edui-button .edui-button-body{background:url(../images/icons-all.gif) no-repeat;height:24px;width:96px;font-size:12px;line-height:24px;text-align:center;cursor:default}.edui-default .edui-dialog-buttons .edui-button .edui-state-hover .edui-button-body{background:url(../images/icons-all.gif) no-repeat 0 -30px}.edui-default .edui-dialog iframe{border:0;padding:0;margin:0;vertical-align:top}.edui-default .edui-dialog-modalmask{opacity:.3;filter:alpha(opacity=30);background-color:#ccc;position:absolute}.edui-default .edui-dialog-dragmask{position:absolute;background-color:transparent;cursor:move}.edui-default .edui-dialog-content{position:relative}.edui-default .dialogcontmask{cursor:move;visibility:hidden;display:block;position:absolute;width:100%;height:100%;opacity:0;filter:alpha(opacity=0)}.edui-default .edui-for-link .edui-dialog-content{width:420px;height:200px;overflow:hidden}.edui-default .edui-for-background .edui-dialog-content{width:440px;height:280px;overflow:hidden}.edui-default .edui-for-template .edui-dialog-content{width:630px;height:390px;overflow:hidden}.edui-default .edui-for-scrawl .edui-dialog-content{width:515px;*width:506px;height:360px}.edui-default .edui-for-spechars .edui-dialog-content{width:620px;height:500px;*width:630px;*height:570px}.edui-default .edui-for-insertimage .edui-dialog-content{width:650px;height:400px;overflow:hidden}.edui-default .edui-for-webapp .edui-dialog-content{width:560px;_width:565px;height:450px;overflow:hidden}.edui-default .edui-for-insertframe .edui-dialog-content{width:350px;height:200px;overflow:hidden}.edui-default .edui-for-wordimage .edui-dialog-content{width:620px;height:380px;overflow:hidden}.edui-default .edui-for-attachment .edui-dialog-content{width:650px;height:400px;overflow:hidden}.edui-default .edui-for-map .edui-dialog-content{width:550px;height:400px}.edui-default .edui-for-gmap .edui-dialog-content{width:550px;height:400px}.edui-default .edui-for-insertvideo .edui-dialog-content{width:590px;height:390px}.edui-default .edui-for-anchor .edui-dialog-content{width:320px;height:60px;overflow:hidden}.edui-default .edui-for-searchreplace .edui-dialog-content{width:400px;height:220px}.edui-default .edui-for-help .edui-dialog-content{width:400px;height:420px}.edui-default .edui-for-edittable .edui-dialog-content{width:540px;_width:590px;height:335px}.edui-default .edui-for-edittip .edui-dialog-content{width:225px;height:60px}.edui-default .edui-for-edittd .edui-dialog-content{width:240px;height:50px}.edui-default .edui-for-snapscreen .edui-dialog-content{width:400px;height:220px}.edui-default .edui-for-music .edui-dialog-content{width:515px;height:360px}.edui-default .edui-for-paragraph .edui-listitem-label{font-family:Tahoma,Verdana,Arial,Helvetica}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-p{font-size:22px;line-height:27px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h1{font-weight:bolder;font-size:32px;line-height:36px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h2{font-weight:bolder;font-size:27px;line-height:29px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h3{font-weight:bolder;font-size:19px;line-height:23px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h4{font-weight:bolder;font-size:16px;line-height:19px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h5{font-weight:bolder;font-size:13px;line-height:16px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h6{font-weight:bolder;font-size:12px;line-height:14px}.edui-default .edui-for-inserttable .edui-splitborder{display:none}.edui-default .edui-for-inserttable .edui-splitbutton-body .edui-arrow{width:0}.edui-default .edui-toolbar .edui-for-inserttable .edui-state-active .edui-splitborder{border-left:1px solid transparent}.edui-default .edui-tablepicker .edui-infoarea{height:14px;line-height:14px;font-size:12px;width:220px;margin-bottom:3px;clear:both}.edui-default .edui-tablepicker .edui-infoarea .edui-label{float:left}.edui-default .edui-dialog-buttons .edui-label{line-height:24px}.edui-default .edui-tablepicker .edui-infoarea .edui-clickable{float:right}.edui-default .edui-tablepicker .edui-pickarea{background:url(../images/unhighlighted.gif) repeat;height:220px;width:220px}.edui-default .edui-tablepicker .edui-pickarea .edui-overlay{background:url(../images/highlighted.gif) repeat}.edui-default .edui-colorpicker-topbar{height:27px;width:200px}.edui-default .edui-colorpicker-preview{height:20px;border:1px inset #000;margin-left:1px;width:128px;float:left}.edui-default .edui-colorpicker-nocolor{float:right;margin-right:1px;font-size:12px;line-height:14px;height:14px;border:1px solid #333;padding:3px 5px;cursor:pointer}.edui-default .edui-colorpicker-tablefirstrow{height:30px}.edui-default .edui-colorpicker-colorcell{width:14px;height:14px;display:block;margin:0;cursor:pointer}.edui-default .edui-colorpicker-colorcell:hover{width:14px;height:14px;margin:0}.edui-default .edui-colorpicker-advbtn{display:block;text-align:center;cursor:pointer;height:20px}.arrow_down{background:#fff url(../images/arrow_down.png) no-repeat center}.arrow_up{background:#fff url(../images/arrow_up.png) no-repeat center}.edui-colorpicker-adv{position:relative;overflow:hidden;height:180px;display:none}.edui-colorpicker-plant,.edui-colorpicker-hue{border:solid 1px #666}.edui-colorpicker-pad{width:150px;height:150px;left:14px;top:13px;position:absolute;background:red;overflow:hidden;cursor:crosshair}.edui-colorpicker-cover{position:absolute;top:0;left:0;width:150px;height:150px;background:url(../images/tangram-colorpicker.png) -160px -200px}.edui-colorpicker-padDot{position:absolute;top:0;left:0;width:11px;height:11px;overflow:hidden;background:url(../images/tangram-colorpicker.png) 0 -200px repeat-x;z-index:1000}.edui-colorpicker-sliderMain{position:absolute;left:171px;top:13px;width:19px;height:152px;background:url(../images/tangram-colorpicker.png) -179px -12px no-repeat}.edui-colorpicker-slider{width:100%;height:100%;cursor:pointer}.edui-colorpicker-thumb{position:absolute;top:0;cursor:pointer;height:3px;left:-1px;right:-1px;border:1px solid #000;background:#fff;opacity:.8}.edui-default .edui-autotypesetpicker .edui-autotypesetpicker-body{font-size:12px;margin-bottom:3px;clear:both}.edui-default .edui-autotypesetpicker-body table{border-collapse:separate;border-spacing:2px}.edui-default .edui-autotypesetpicker-body td{font-size:12px;word-wrap:break-word}.edui-default .edui-autotypesetpicker-body td input{margin:3px 3px 3px 4px;*margin:1px 0 0}.edui-default .edui-cellalignpicker .edui-cellalignpicker-body{width:70px;font-size:12px;cursor:default}.edui-default .edui-cellalignpicker-body table{border-collapse:separate;border-spacing:0}.edui-default .edui-cellalignpicker-body td{padding:1px}.edui-default .edui-cellalignpicker-body .edui-icon{height:20px;width:20px;padding:1px;background-image:url(../images/table-cell-align.png)}.edui-default .edui-cellalignpicker-body .edui-left{background-position:0 0}.edui-default .edui-cellalignpicker-body .edui-center{background-position:-25px 0}.edui-default .edui-cellalignpicker-body .edui-right{background-position:-51px 0}.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-left{background-position:-73px 0}.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-center{background-position:-98px 0}.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-right{background-position:-124px 0}.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-left{background-position:-146px 0;background-color:#f1f4f5}.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-center{background-position:-245px 0}.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right{background-position:-271px 0}.edui-default .edui-toolbar .edui-separator{width:2px;height:20px;margin:2px 4px 2px 3px;background:url(../images/icons.png) -181px 0;background:url(../images/icons.gif) -181px 0 \9}.edui-default .edui-toolbar .edui-colorbutton .edui-colorlump{position:absolute;overflow:hidden;bottom:1px;left:1px;width:18px;height:4px}.edui-default .edui-for-emotion .edui-icon{background-position:-60px -20px}.edui-default .edui-for-emotion .edui-popup-content iframe{width:514px;height:380px;overflow:hidden}.edui-default .edui-for-emotion .edui-popup-content{position:relative;z-index:555}.edui-default .edui-for-emotion .edui-splitborder{display:none}.edui-default .edui-for-emotion .edui-splitbutton-body .edui-arrow{width:0}.edui-default .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder{border-left:1px solid transparent}.edui-default .edui-hassubmenu .edui-arrow{height:20px;width:20px;float:right;background:url(../images/icons-all.gif) no-repeat 10px -233px}.edui-default .edui-menu-body .edui-menuitem{padding:1px}.edui-default .edui-menuseparator{margin:2px 0;height:1px;overflow:hidden}.edui-default .edui-menuseparator-inner{border-bottom:1px solid #e2e3e3;margin-left:29px;margin-right:1px}.edui-default .edui-menu-body .edui-state-hover{padding:0!important;background-color:#fff5d4;border:1px solid #dcac6c}.edui-default .edui-shortcutmenu{padding:2px;width:190px;height:50px;background-color:#fff;border:1px solid #ccc;border-radius:5px}.edui-default .edui-wordpastepop .edui-popup-content{border:0;padding:0;width:54px;height:21px}.edui-default .edui-pasteicon{width:100%;height:100%;background-image:url(../images/wordpaste.png);background-position:0 0}.edui-default .edui-pasteicon.edui-state-opened{background-position:0 -34px}.edui-default .edui-pastecontainer{position:relative;visibility:hidden;width:97px;background:#fff;border:1px solid #ccc}.edui-default .edui-pastecontainer .edui-title{font-weight:700;background:#F8F8FF;height:25px;line-height:25px;font-size:12px;padding-left:5px}.edui-default .edui-pastecontainer .edui-button{overflow:hidden;margin:3px 0}.edui-default .edui-pastecontainer .edui-button .edui-richtxticon,.edui-default .edui-pastecontainer .edui-button .edui-tagicon,.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon{float:left;cursor:pointer;width:29px;height:29px;margin-left:5px;background-image:url(../images/wordpaste.png);background-repeat:no-repeat}.edui-default .edui-pastecontainer .edui-button .edui-richtxticon{margin-left:0;background-position:-109px 0}.edui-default .edui-pastecontainer .edui-button .edui-tagicon{background-position:-148px 1px}.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon{background-position:-72px 0}.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon{background-position:-109px -34px}.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon{background-position:-148px -34px}.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon{background-position:-72px -34px} \ No newline at end of file diff --git a/src/main/webapp/js/ue/themes/default/dialogbase.css b/src/main/webapp/js/ue/themes/default/dialogbase.css new file mode 100644 index 0000000..cd663d5 --- /dev/null +++ b/src/main/webapp/js/ue/themes/default/dialogbase.css @@ -0,0 +1,100 @@ +/*弹出对话框页面样式组件 +*/ + +/*reset +*/ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + outline: 0; + font-size: 100%; +} + +body { + line-height: 1; +} + +ol, ul { + list-style: none; +} + +blockquote, q { + quotes: none; +} + +ins { + text-decoration: none; +} + +del { + text-decoration: line-through; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +/*module +*/ +body { + background-color: #fff; + font: 12px/1.5 sans-serif, "宋体", "Arial Narrow", HELVETICA; + color: #646464; +} + +/*tab*/ +.tabhead { + position: relative; + z-index: 10; +} + +.tabhead span { + display: inline-block; + padding: 0 5px; + height: 30px; + border: 1px solid #ccc; + background: url("images/dialog-title-bg.png") repeat-x; + text-align: center; + line-height: 30px; + cursor: pointer; + *margin-right: 5px; +} + +.tabhead span.focus { + height: 31px; + border-bottom: none; + background: #fff; +} + +.tabbody { + position: relative; + top: -1px; + margin: 0 auto; + border: 1px solid #ccc; +} + +/*button*/ +a.button { + display: block; + text-align: center; + line-height: 24px; + text-decoration: none; + height: 24px; + width: 95px; + border: 0; + color: #838383; + background: url(../../themes/default/images/icons-all.gif) no-repeat; +} + +a.button:hover { + background-position: 0 -30px; +} \ No newline at end of file diff --git a/src/main/webapp/js/ue/themes/default/images/anchor.gif b/src/main/webapp/js/ue/themes/default/images/anchor.gif new file mode 100644 index 0000000000000000000000000000000000000000..5aa797b2240a432d9f3f1d166ed5542eaf684937 GIT binary patch literal 184 zcmZ?wbhEHb6kygJ|Uu&?oD;%Ae!z@09(NL_hv#6Slx0y!YR{?r|LJZgAju=f-$sQVWNL{+Tsz18#+~Ke%+zTWns()WcPwy8dQcr!JH# U&i)o#ra{o6vp4_np&fqGg-1;GP^BJO_p_?A6nLIYwB=H*Qp>A8nZf?fNnCY(uvZL zYMq5r=M|ASom0_?Sn7~VE3B<^mcq1BrHIr9EGW>Ifm~m?y<>mJPIAsKPjWszPx7z| z^K(;^4e+i)B*?S*guTS?B+Vho2 z`WG1Kuclp>qR!nSa-c>gf6E3&1HPK$>6qGXeOCp%qBL8aEd$S;?m%#@0uH|roliGe zy#i~1E?Ad#U1t}6uwt+qqgIm=xY8r0F*7 zl{ZWo1&^Wcj_roRaNKw0cq|%;M#7eRWh<*7;!rva!w3Wdg+kTSXqlOr3+!(Y+UH1c!M>bUYK1<=lG*1pq%m&P~1QC>Rx($IJPWjnN zpR&G{Rq^JvgludxnIl{D8LgfGe-+MHCcM_UcHp8Td8VLE6B~29!k7r659<2nKp^Fl zj!GszzF7d5gy6DP@ZR1H93XOu{-OI@l6&5C>BJ*|uw%klayELyqgg z(1r2VJa0I-7Tj#n#oR8}RJ&g+`2!5Q8%of3mwZ1ylT{6m^cuZ3bEx<+w~3H6c=s2I zHqmMPM&{IH<=Icl=QPsL@wWkIaQ9;d5!{KiwDTAp6ANhcA|rcd_*y;vPo-D@#WUD8 zxj?H-u8_-Qb;^#oX{dywAOO4sP%-&Maru89peVTaNW45UP{=b_+ByMxH6aCa_?|l> lFG7akQpaiL%L!NFwXt25X8cm0x*UH6P&xU?o7rDC{|kH`9-#mL literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/themes/default/images/arrow_down.png b/src/main/webapp/js/ue/themes/default/images/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..e9257e83b00375259f2f724c7cbac03d0df5ceb2 GIT binary patch literal 1610 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2cW`)d{3jAFJg2T)jk)8oi3#0-$aN1{?c|g2d$P)DnfH z)bz|eTc!8A_bVx6rr0WloBA5~7C5J7WO`H;r3P2|g(O#HCtIc{+1n}DR9FEG$W1Lt zRH(?!$t$+1uvG$^YXxM3g!Ppaz)DK8ZIvL7itr6kaLzAERWQ{v&`mZlGf*%y)H5_T zF*i5YQ7|$vG|)FN(l<2HH8i&}HnK7>P=Ep@plwAdX;wilZcw{`JX@uVl9B=|ef{$C za=mh6z5JqdeM3u2OOP2xM!G;1y2X`wC5aWfdBw^w6I@b@lZ!G7N;32F6hI~>Cgqow z*eU^C3h_d20o>TUVrVb{15Cdnu|VHY&j92lm_lD){7Q3k;i`*Ef>IIg#cFVINM%8) zeo$(0erZuMFyhjbK~@!5ITxiSmgEG&eP`1g19yq1OegIswNQ-xSi<4Z1u2!m4XhFqBbF8wG<_`!+|HhuxMFc&SLMF{7Z@fVvH$#8 ze|mSH#FSX^%>h00S4ci?>YufC3b$>be$N&e)g9;i=5%xkTh1s~5&sk~hpZURp;Qa?iE^5gq z0+?2AoO*aq`+eIDGp&3MoLz0RPBnf@mZEj!Y0cZVUxN2^iyZs(a?eI%oljxTtdUFo z4zJtT6vh6mc<(8@dEybWbJNr%Pc%*VvF}gIi|llP_mw#+z3j zapfmJXkU5iJgMMaq6;%eEr0F`fv2A$yk@Z1O`YMLW4b!$#En-43)(gNwO&tIE1$YR z{=f_5V<-h{r;w^f@VvOcJ`XH-Laf=HZ$7pE8y$b zea|FcbA8_y&V4&;c0EYAF6z7Uq;gWX%!S@_GP~BiYk9@S9hp{rSmuZc`!rX#z78?b z>^=VrHI}o6**U$5wKDVU&pfZEJI56Y zoT$4mvucV;+x1h4)@uJZd{#I=XN5ldnP;uVH#)aA-sLj_f6xsvx)X=xc_v2 z@-mt-`NgS3hTn0)cfZMswpSgNlI1YlD$F(+3=d#Wzp$P!&XKAJY literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/themes/default/images/arrow_up.png b/src/main/webapp/js/ue/themes/default/images/arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..74277af1e6a8ef91f8fe664efde11377a5292dbc GIT binary patch literal 1649 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2c=9J8kh>{3jAFJg2T)jk)8oi3#0-$aN1{?c|g2d$P)DnfH z)bz|eTc!8A_bVx6rr0WloBA5~7C5J7WO`H;r3P2|g(O#HCtIc{+1n}DR9FEG$W1Lt zRH(?!$t$+1uvG$^YXxM3g!Ppaz)DK8ZIvL7itr6kaLzAERWQ{v&`mZlGf*%y)H5_T zF*i5YQ7|$vG|)FN(l<2HH8i&}HnK7>P=Ep@plwAdX;wilZcw{`JX@uVl9B=|ef{$C za=mh6z5JqdeM3u2OOP2xM!G;1y2X`wC5aWfdBw^w6I@b@lZ!G7N;32F6hI~>Cgqow z*eU^C3h_d2fv+#z;JjjJKmmhHzap_f-%!s$KQ|ZTFR<$3lAu(CGq9>I4yi0i)elN7 z&Mz%W2F6F4GE6ft?C@IzQV4X7m48ttFj5k8T=J7kb5rw5JY8&+fHHb1nJHGr&Zcf= zZpLmdj^@s;MuvtK&X$(07A9_{2F`9K1|}9TGqCA(Gj?@#HgIt=cQbG_G;}qxFf=l- zbaON}GPN)@wKR5t>GjMjE=kNwPKDW<3A7ig*AcH?E9aur#FG4?ko^1{SPBTp$S=t+ z&d4uNa1J(A2+zz*$uBPkMGnNTE~!PCWvMA{Mftf3;Lx?o#9}*PUqke!kP~A1K*#8V zk_J*zfe8WAABYK0_&^Rk>!juZ^GgvhW0Y{Wv@$R-E%tPA45_#^WvZ{gh@(K;>Z+== zX-At4KPH3-+4r@v2}X8*AN$Mh@OiHNYs3&%QbHW!0`#zh1`9tBzYV@8G#Wg&l2-#)h$FUdfE_lvm%b2=kt^Ebzn( zr(4oF%+7xg2Te=y(fqh}+AK?Nt8-e6Vo~YWrY1FhH}uX($oOv&HCTs__< zzEdCca~LbgR5%PtJYh=3FjGRGp=cUaJC^c^yU)Zr^k2P zlm5xRG;W0~lefT@)ERLuic?K4bNlUNS|KodrrwHIUNWEc`M1i>U^rI0VS1uR{)PLi zihmWG2&`Lpzrjh}nD@mILlb2Uhtt|CHp`N!r`KF5c$VaRcJZF}LJe(& zwV}p~KZGbP@?1Z4Mc+d4`MOQrYgSe4X#ZDh+%|1dL)h$@nv3?ZH`~Z?rV3X7(F@K> zb+Z2u>#VllaHj5&E!~}`b21Ja)w^fT&+2mzy!OR_pE1^}_1<=w+EA5Nm$Hp%M~^AK zU)Z92;jd=Sl<1n3x7z+*ci#Wo(IT=)J{K*+Q?C!N1MD&Sbd le02W-shBsPKJ+s%GgK)^wA}p_d>&K@c)I$ztaD0e0svXmV!r?Y literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/themes/default/images/button-bg.gif b/src/main/webapp/js/ue/themes/default/images/button-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..ec7fa2eabf0705226fe0c488d65198508bf547e9 GIT binary patch literal 1114 zcmV-g1f}~&Nk%w1VKM+R0OkMy00030|Nr{?`~Uyg|Nq+c_4NPz*Z=(3`t{5D_RRV9 z%lr1t{P@xN^27S{$occg`t-~D_Rjb6(E0Jf`t!&5^V9k7zxnUL`S8H{@x=P_$@uNP z`0c*=@5lM`q&aU|6w)f(-(ZHJcKyq);w!1v|A_vOL(=ELpXz3||{+03)&lq#;^N`q z;o#ul-{0Tf-rm~U+Sk|D(9qET|Nj6000000000000000000000A^8LW004OaEC2ui z05SkF000O7fO%_oc!h?Ch>41ei+5{zWp`--l$Dm3n3+> zsF_HyqQ#3CGiszrN8-khAVaF@xTd7ZlPFWFT*=ZTojPn{%A85Frp=o;W!90Hv!~CW zBj>nb)267=qezn~UCPvr&^vA(N|o9Msu?(T?r7c0wX4^!V8PmfVC>oFmqw6)fdnp04j^zqp|u`Sa-0r=OsK#f}aaILMz*zrOwZ z`0-!pup>tY5FP|5;D7`cXyAbdg3v(@I*72r2M|Um;e-@cXrYB0h@gWGA&@Y_haiS1 z;)o=cSRx4_Z1{o+CA8?`i!jD0v_{FvJiptdPRD zl1w(~KIEzAo_zM{=bwE7aRU-l5Rn8GGXU|#qKr1`=%bKE+9(h+P>}@@TWDd06i{^P z>8GHED(a}AN@0Z-TXdns6;*su#jCK!D(kGY)*7p;S18d%0YNN*1r}fgE9|hu7HjOW g!~VKN5CsU(L=jFzEA6z@R%`9G*G3VB0D%AiJBq`ncK`qY literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/themes/default/images/cancelbutton.gif b/src/main/webapp/js/ue/themes/default/images/cancelbutton.gif new file mode 100644 index 0000000000000000000000000000000000000000..df4bc2c06d485df4403d689c98ee745a4cde8e97 GIT binary patch literal 1227 zcmV;+1T_0cNk%w1VH^Ms0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~EC2ui02}}g000R80N?d8lSPY`ECmaSA@vT~rz=b%E}1xSN+M*v*63=s zj2W|z%bEpKgUQntPOMg`Ql)Ygt58`0p~(cQlP6A|I&tD;)03AgfeIBOG>DKjY^XJ4==@p5kGnYDTB5w7&K^jxZs(hL{cL~lH}dPcdt$q zD_5TQ&|`gZmzMqH0#&%8nU(?9AzvZOs&E($thW17wAnF=2dS zixx%10*e+@Tw%iubG*?-5ob)X#T8L>VFrIHgwcf)I#^*u6G{}}gcVlU-~$+ANa4h3 zU5Eh&8T;8#LljaNAp~tsNC8C^Rb1i1Av~P%1{`$QfyY)`G0{dGGhE??7h#NH1{!Ik pfd&v=WTQt8w{C>_-)j6kG zmZ@`2opZWct<*WE%jHsMvsp;f^!~Ol**?^DO`hifs44&=f~umb34Y07v! zehXl>0V0C67HciWn4KjeEEWr@sxtk4|8?WtNwEFcm{Yc@Vy$H`7@(^3dc70h4xmY} zPa;B+{C!@Q<^CQRW6lMfrwb>zFkriOfWsf}arIZ0*)jKSzW9HD4>|2i1+FOg^6oL0 zuMGL+PHkt#*vvh~NQ@CxMMM#xZ40h-e^cjfe*)md?7iRY1HqRBjSwR0J%@RRXP>@> zkKcbjGFwIi5M!jSYpSZEsw%t>6uuy+C;C8K=M*aB-KzlIq|@mbYi)bIUbpA-`I#n_ zWy#v)_!v+R^=b{kGLNXLO{}#BFq6sTxvIY0l+`3NPhQ=Ac;nXf2W4IstBgcUD^b-d zJ3eY@@JRF1!NCEoR?7f{5J-}wDJcQkB4Re+sH#y!e2lU916r{A&pdHrm;e9(07*qo IM6N<$g2apNRsaA1 literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/themes/default/images/cursor_h.gif b/src/main/webapp/js/ue/themes/default/images/cursor_h.gif new file mode 100644 index 0000000000000000000000000000000000000000..d7c3e7e9eb5755d57ec03c34097c258244abe61a GIT binary patch literal 253 zcmVG|6H_V+Po~-c6$N^_IEGZ*Iy1qOk3oThS@Yxn_+t|0*P6|%n+#L~Iyf|E zrg84hNMwpx9_!-6|BEHhl_}FHLcZHi@xo+A>tN1bvzr~8Z#Ex)a8Qdkef% WRW|>PuXh3sXYh3Ob6Mw<&;$VH);Gui literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/themes/default/images/cursor_v.gif b/src/main/webapp/js/ue/themes/default/images/cursor_v.gif new file mode 100644 index 0000000000000000000000000000000000000000..bb508db552b6ac3f670f9ce1fcb1e55669db0dd6 GIT binary patch literal 370 zcmZ?wbhEHbQBhG}zIty_2L(xqFsZe72A-PqWelao_UPVUE#AKKd5`}glJC@2UB2rw`(IB?*A zqN1XRh{(>JJ55YXczAeJRaJNI-YqUJE-x?t@#Dumd-if8Ejy6@I4`1w~F!Qzky-V-VnInOpfk+|GDYn9AS7wc)Z8bf!!3 zZ2HZ7qm!>fg-@N3u_S6BtfcFRaLzUWGF!q z%AzEfB~`D;I)q^T@hn>GjrE?{UdLiPgP&3w>7tmXsgPC#5>G@))3jVemdgxLP8K0W zSvgGh3k4G=ZtO?YCn3lc(TL2c!850)DFo3*HcZxKVg(a36p4}m^OOpp{&p|bt$J&&x7~}fl`AqcVt%cEU2}27dM96QnwD)g zZI46N>oIHU?{_Z!WDf$^W^<7J82vsuXemZ#a;t%OX9%BFi literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/themes/default/images/filescan.png b/src/main/webapp/js/ue/themes/default/images/filescan.png new file mode 100644 index 0000000000000000000000000000000000000000..1d271588692c1726e3521032f71d8354b66fab0e GIT binary patch literal 4282 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/themes/default/images/highlighted.gif b/src/main/webapp/js/ue/themes/default/images/highlighted.gif new file mode 100644 index 0000000000000000000000000000000000000000..9272b4915ad2b8d4052a19b4c80a41b7c71cf1f1 GIT binary patch literal 111 zcmZ?wbhEHb6k`x$Sjfb1_to#iH~&L`;!hSvE(RtB9R?r($ulrHOzB@K_Ll!X=Ym_^ zj literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/themes/default/images/icons-all.gif b/src/main/webapp/js/ue/themes/default/images/icons-all.gif new file mode 100644 index 0000000000000000000000000000000000000000..21915e59dede0aa22cda8c7097a14f0f1f68906c GIT binary patch literal 3750 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 b4O*493C(v}$CrKE*L~j?e&ctU0s;U#>#h02 literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/themes/default/images/icons.png b/src/main/webapp/js/ue/themes/default/images/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..c015e3aac9a84ebad11b932e84722124772d9641 GIT binary patch literal 19694 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ÏmvOE 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 b`u_(2Nr-(&rSM literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/themes/default/images/loaderror.png b/src/main/webapp/js/ue/themes/default/images/loaderror.png new file mode 100644 index 0000000000000000000000000000000000000000..35ff3336457d48dbecbc11698ef8245441a94f82 GIT binary patch literal 3209 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/themes/default/images/loading.gif b/src/main/webapp/js/ue/themes/default/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..b713e27dfba708a01c380e7c731a13b52a34edfc GIT binary patch literal 734 zcmZ?wbhEHb6krfw*v!jdZ*RYU|9&kkt+4ULFya6I z{|pQa5E95x{Lk&@8WQa67~pE8XTZz|68g!)$-uzNpaWzB4HaNuV6okB(sT7*i`QqX zc^L!>4t!=<(wVp51?zD`Kkg=-D~S>;skcR%7#$omMC>21xN*pcHs0c0tRNsF(;}SM ziPc1Fu!&|20tT$-nJa`fCQUjv@kC+C3!quI1U@ISvoqf2Xk|(i=IUl?N@{e_G3Yq3 z;U-H^uFrB+CTuRW+i+5nfx|fagWLs?!jQY{X6=arU0riqs^&x$2`7X};t z37RYmQ;O#*G6uOVn*=nAm7~Q)&(!ybaj}oz`WtJ?PQSHN#^y?3ICf5PGS1Ha8pE+k zgJmJh5y6y1=@^y-ft=a0ZG|ZdPArq?H(+2`(;|7`F{6Xpbl>GI8B?M_My|#ljzAN4 z3Pb@-+?qdUsm6)xA>j@^Y0K7lSt}-Mopvo#qQ-sCkLXFkyF zSLvgkf4d8-w;?feL$4)lp3HYoMI*E5@=0AueT*09aVgICcu;r3k!5-F!GZ%U3=K0F z9S$(a^)KPCsC4r`z65*B*uc`x?)kvPGDl;Yns{Fj0|R3#FisfHGY4!D^0$zE1ljvXNk%w1VH^N10QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~EC2ui02}}=000R80RIUbNU)&6g9sBUT*$DY!-o(fN}Na$VuFhf5;SOl zQR2k}8962Z;Gkkb01ZqM%&2mp#+Cvv!u%%_X3ds21*#in3e-1?2?(ltc28ctYrP)k z{Pb@UlQicB-E)}JlDi_MMmXbuk803?iR{rRp~2S#dR_^-LU%))h*>DmHq0rnjf;8~ zsJM}rcHp`#D%4?EVW;cduL6J7ThT2kQ{cJka07oF;i3Wu4ZceYpGm&F`Sa-04-5zZJCANLt@XPdKI8X22WQ%mvv4FO#q2N BK}7%n literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/themes/default/images/pagebreak.gif b/src/main/webapp/js/ue/themes/default/images/pagebreak.gif new file mode 100644 index 0000000000000000000000000000000000000000..8d1cffd64af72709b1180b3b0a51bbfe30bcb8c6 GIT binary patch literal 54 zcmZ?wbhEHb{( zJaZG%Q-e|yQz{EjrrH1%u?6^qxTdA0{r~^J*gJ9sP=u)@$S?Rm!_(~sUO=9vr;B4q z#jTK2Cpj4yIG7J^{J*Sr7aP;;!*evU*UP7-zWuuR&zi{Xq6rL2tqds~bx9pSO$?r{ KelF{r5}E*+%QgN0 literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/themes/default/images/sortable.png b/src/main/webapp/js/ue/themes/default/images/sortable.png new file mode 100644 index 0000000000000000000000000000000000000000..1bca649698e187a80e1b1951fde99ddea3d7b038 GIT binary patch literal 2851 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 BXOsW{ literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/themes/default/images/spacer.gif b/src/main/webapp/js/ue/themes/default/images/spacer.gif new file mode 100644 index 0000000000000000000000000000000000000000..5bfd67a2d6f72ac3a55cbfcea5866e841d22f5d9 GIT binary patch literal 43 mcmZ?wbhEHbWMp7uXkdT>#h)yUAf^t80Ld^gF}W}@SOWlZ0R#L1 literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/themes/default/images/sparator_v.png b/src/main/webapp/js/ue/themes/default/images/sparator_v.png new file mode 100644 index 0000000000000000000000000000000000000000..8cf5662da8c36a446e1e08eb71b992c730ab8d15 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-Y0V1m%Ufcz7ii6yp7}lMWc?smOq&xaLGB9lH z=l+w(3gmMZctjR6Fz_7)VaDV6D^h@h{GKk3Arj%q6<>aQ{Qv(yqp%0-vU7cb$AD4{ Mp00i_>zopr0ET%XRR910 literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/themes/default/images/table-cell-align.png b/src/main/webapp/js/ue/themes/default/images/table-cell-align.png new file mode 100644 index 0000000000000000000000000000000000000000..ddf42853ea5c00663e74d9195d1f1264ab684252 GIT binary patch literal 1847 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/themes/default/images/toolbar_bg.png b/src/main/webapp/js/ue/themes/default/images/toolbar_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..7ab685f4236ad543601b0d7dc43e429e041bee98 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI{!2~3a95{LaNJ*BsMwA5Sra_n`~3ut zhqFCqhNk>9eAm}?**d-K>ErgL-9FQkEgB1_|9|!V%ggstduo?ezj^hOMS@|yt(J@G Th3lO_a~V8c{an^LB{Ts5X5&F_ literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/themes/default/images/unhighlighted.gif b/src/main/webapp/js/ue/themes/default/images/unhighlighted.gif new file mode 100644 index 0000000000000000000000000000000000000000..7ad0b67ae634d41e76848ec0b6696e8ac7e06983 GIT binary patch literal 111 zcmZ?wbhEHb6k`x$Sjfci#j9d&%3_1)z0Fq~5a+uP;QtU1Nea;29 zx*cclynVJpP9xwz=Q6F#ReGoPZ4xWkEPX#)_EqLPYsO~h_`vc#s_EX6+DxrJi$d-_ L>N=ao&0q}x{nsuG literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/themes/default/images/upload.png b/src/main/webapp/js/ue/themes/default/images/upload.png new file mode 100644 index 0000000000000000000000000000000000000000..08d4d9268204a20ca343bf75784302cc706d2417 GIT binary patch literal 6608 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 O00001IobTth)ve1{+;xF-z$zX1$@cbk;N#jz zM8mU4YCupmEU?Nii0lQg^bRCan?Ab3%VAH658-8xBFJMB`IuzR@?X?_cxg~njWe8Z z7he1{t~NY@;sD2oqwB>InLWHP3|(&rFL;_%YXisG!f|)t`LI~xqj*wKLbXWp)f$eo z4#asOE4^bXVR1zDClZ^-`L@9YE{GEUM6w@>B$|*3C13A^6xxLq**_!Pdr{&MM+{D{ z56z@TzG*@hw6S^P4v136mt~*C)1y;z@#LIHDjO7zE0$NBVk(?tEAPD`x}r!4rSvo+ zGrN|Z-`M*gk?fXS+qo0;d0 zh<&hBzt>Fxc`eUN=*S8tip(N)4%c-Hsa$abS1kGZZD3dwRL~Y&OiQls$!Zy(aK#~| zjPP=1B(V$A*qhVABln1FxZ*mlSSnXYWQzzgJF1owUC)i7_7-#saE!r1=5SG$fWQ*I z?G_O^BB^|7ZhisN&MW7LKFbwbTU$SV{P_O;`{w56#>U3_`uf`1+Un}+%F2pDp;%g4 zT3lS5pP!e@<#Tg$GMVhlmoKxkvokX@)6>(Flao@ZbYfycB9V-bkB^RyibNuzP$&=x zMn*=4hK2?Q2l;$HkH;Gr80hQk>+S93a=9E1r@OnG&1QFYb~2ev27}Sj(b3-C-qzOE z+}zyQ*hr;PDHIBkNX*O2%g)YDPEJltOhlnjzdrQ8MQa@l0suN-^vmE^6Tt3mAau_$ zXbql@q{N)M&$25b1FG78WjFA2Q`{wpcH+plH-T+lc4H{-V^L{To}?sY^7t- zRp-#0EC|Fh>5nV9*osg354U2y3FFpwXQ!`Na;JKQ;uHrYmb=qU|MBr zTOt(Y=@VUlJq+6mQt^WJ9lIJTz?$6jvB@_0Ijg#xyHYhx6QE$9@Q;P`SNru{MQcx_ z>I9eqMm;}}tfJ*J&?Udq;ijL1AIs^TNj%ED8++(4bqQ3YK5><%~obS)3oEv z2`L9EwBilZbt=4c48b+h%ydj29TQf1;FclAt3p@D@Iv$C>k|Ryx={((b>+iEv*M}T zw2%>2(|!*aqioP7@6#WGj~%z23qkbWx? zq>K{ydFDHsgH&Ab#e8p|DBB+i&e7YjgH&Dp_Cc?zbGzF=vu-e#1^&&3UitP6Qvg=W z;+>M!e1J%3O7HX-hEcUA+~cC@8WAyj^bml>?&AT`HEEBQ}9Z=3X$i*Zty)I zU*Zj5^tvjIuB=l9Z9~T)&b;Eg=FK&TO>3g*yVOqt8d@&{JXvVbxz7~cYII$TQHvSS zgJ#LpO3a#6>HScB5@i5vKw}cnyiI*AUkCSPz7s6};*mIoCN(8C-gssBWz<}Twr?3} zMG(-KVyeCT&UjVicgg-NE@GN=DKAW@1zjD3zqggT>WPOqXK6a*HA(U%`Q-^?%QNdz M>|NJq=D?r-0Tclc1poj5 literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/themes/default/images/word.gif b/src/main/webapp/js/ue/themes/default/images/word.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ef5d09b7b30c4f3225f77788462e429cc494b9b GIT binary patch literal 1019 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 bp?H9uNI6(~=EJQ&zcn<}bW|&qZNmQtXU+rA literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/ue/themes/iframe.css b/src/main/webapp/js/ue/themes/iframe.css new file mode 100644 index 0000000..774013a --- /dev/null +++ b/src/main/webapp/js/ue/themes/iframe.css @@ -0,0 +1 @@ +/*可以在这里添加你自己的css*/ diff --git a/src/main/webapp/js/ue/third-party/SyntaxHighlighter/shCore.js b/src/main/webapp/js/ue/third-party/SyntaxHighlighter/shCore.js new file mode 100644 index 0000000..3249184 --- /dev/null +++ b/src/main/webapp/js/ue/third-party/SyntaxHighlighter/shCore.js @@ -0,0 +1,3655 @@ +// XRegExp 1.5.1 +// (c) 2007-2012 Steven Levithan +// MIT License +// +// Provides an augmented, extensible, cross-browser implementation of regular expressions, +// including support for additional syntax, flags, and methods + +var XRegExp; + +if (XRegExp) { + // Avoid running twice, since that would break references to native globals + throw Error("can't load XRegExp twice in the same frame"); +} + +// Run within an anonymous function to protect variables and avoid new globals +(function (undefined) { + + //--------------------------------- + // Constructor + //--------------------------------- + + // Accepts a pattern and flags; returns a new, extended `RegExp` object. Differs from a native + // regular expression in that additional syntax and flags are supported and cross-browser + // syntax inconsistencies are ameliorated. `XRegExp(/regex/)` clones an existing regex and + // converts to type XRegExp + XRegExp = function (pattern, flags) { + var output = [], + currScope = XRegExp.OUTSIDE_CLASS, + pos = 0, + context, tokenResult, match, chr, regex; + + if (XRegExp.isRegExp(pattern)) { + if (flags !== undefined) + throw TypeError("can't supply flags when constructing one RegExp from another"); + return clone(pattern); + } + // Tokens become part of the regex construction process, so protect against infinite + // recursion when an XRegExp is constructed within a token handler or trigger + if (isInsideConstructor) + throw Error("can't call the XRegExp constructor within token definition functions"); + + flags = flags || ""; + context = { // `this` object for custom tokens + hasNamedCapture: false, + captureNames: [], + hasFlag: function (flag) {return flags.indexOf(flag) > -1;}, + setFlag: function (flag) {flags += flag;} + }; + + while (pos < pattern.length) { + // Check for custom tokens at the current position + tokenResult = runTokens(pattern, pos, currScope, context); + + if (tokenResult) { + output.push(tokenResult.output); + pos += (tokenResult.match[0].length || 1); + } else { + // Check for native multicharacter metasequences (excluding character classes) at + // the current position + if (match = nativ.exec.call(nativeTokens[currScope], pattern.slice(pos))) { + output.push(match[0]); + pos += match[0].length; + } else { + chr = pattern.charAt(pos); + if (chr === "[") + currScope = XRegExp.INSIDE_CLASS; + else if (chr === "]") + currScope = XRegExp.OUTSIDE_CLASS; + // Advance position one character + output.push(chr); + pos++; + } + } + } + + regex = RegExp(output.join(""), nativ.replace.call(flags, flagClip, "")); + regex._xregexp = { + source: pattern, + captureNames: context.hasNamedCapture ? context.captureNames : null + }; + return regex; + }; + + + //--------------------------------- + // Public properties + //--------------------------------- + + XRegExp.version = "1.5.1"; + + // Token scope bitflags + XRegExp.INSIDE_CLASS = 1; + XRegExp.OUTSIDE_CLASS = 2; + + + //--------------------------------- + // Private variables + //--------------------------------- + + var replacementToken = /\$(?:(\d\d?|[$&`'])|{([$\w]+)})/g, + flagClip = /[^gimy]+|([\s\S])(?=[\s\S]*\1)/g, // Nonnative and duplicate flags + quantifier = /^(?:[?*+]|{\d+(?:,\d*)?})\??/, + isInsideConstructor = false, + tokens = [], + // Copy native globals for reference ("native" is an ES3 reserved keyword) + nativ = { + exec: RegExp.prototype.exec, + test: RegExp.prototype.test, + match: String.prototype.match, + replace: String.prototype.replace, + split: String.prototype.split + }, + compliantExecNpcg = nativ.exec.call(/()??/, "")[1] === undefined, // check `exec` handling of nonparticipating capturing groups + compliantLastIndexIncrement = function () { + var x = /^/g; + nativ.test.call(x, ""); + return !x.lastIndex; + }(), + hasNativeY = RegExp.prototype.sticky !== undefined, + nativeTokens = {}; + + // `nativeTokens` match native multicharacter metasequences only (including deprecated octals, + // excluding character classes) + nativeTokens[XRegExp.INSIDE_CLASS] = /^(?:\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S]))/; + nativeTokens[XRegExp.OUTSIDE_CLASS] = /^(?:\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S])|\(\?[:=!]|[?*+]\?|{\d+(?:,\d*)?}\??)/; + + + //--------------------------------- + // Public methods + //--------------------------------- + + // Lets you extend or change XRegExp syntax and create custom flags. This is used internally by + // the XRegExp library and can be used to create XRegExp plugins. This function is intended for + // users with advanced knowledge of JavaScript's regular expression syntax and behavior. It can + // be disabled by `XRegExp.freezeTokens` + XRegExp.addToken = function (regex, handler, scope, trigger) { + tokens.push({ + pattern: clone(regex, "g" + (hasNativeY ? "y" : "")), + handler: handler, + scope: scope || XRegExp.OUTSIDE_CLASS, + trigger: trigger || null + }); + }; + + // Accepts a pattern and flags; returns an extended `RegExp` object. If the pattern and flag + // combination has previously been cached, the cached copy is returned; otherwise the newly + // created regex is cached + XRegExp.cache = function (pattern, flags) { + var key = pattern + "/" + (flags || ""); + return XRegExp.cache[key] || (XRegExp.cache[key] = XRegExp(pattern, flags)); + }; + + // Accepts a `RegExp` instance; returns a copy with the `/g` flag set. The copy has a fresh + // `lastIndex` (set to zero). If you want to copy a regex without forcing the `global` + // property, use `XRegExp(regex)`. Do not use `RegExp(regex)` because it will not preserve + // special properties required for named capture + XRegExp.copyAsGlobal = function (regex) { + return clone(regex, "g"); + }; + + // Accepts a string; returns the string with regex metacharacters escaped. The returned string + // can safely be used at any point within a regex to match the provided literal string. Escaped + // characters are [ ] { } ( ) * + ? - . , \ ^ $ | # and whitespace + XRegExp.escape = function (str) { + return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + }; + + // Accepts a string to search, regex to search with, position to start the search within the + // string (default: 0), and an optional Boolean indicating whether matches must start at-or- + // after the position or at the specified position only. This function ignores the `lastIndex` + // of the provided regex in its own handling, but updates the property for compatibility + XRegExp.execAt = function (str, regex, pos, anchored) { + var r2 = clone(regex, "g" + ((anchored && hasNativeY) ? "y" : "")), + match; + r2.lastIndex = pos = pos || 0; + match = r2.exec(str); // Run the altered `exec` (required for `lastIndex` fix, etc.) + if (anchored && match && match.index !== pos) + match = null; + if (regex.global) + regex.lastIndex = match ? r2.lastIndex : 0; + return match; + }; + + // Breaks the unrestorable link to XRegExp's private list of tokens, thereby preventing + // syntax and flag changes. Should be run after XRegExp and any plugins are loaded + XRegExp.freezeTokens = function () { + XRegExp.addToken = function () { + throw Error("can't run addToken after freezeTokens"); + }; + }; + + // Accepts any value; returns a Boolean indicating whether the argument is a `RegExp` object. + // Note that this is also `true` for regex literals and regexes created by the `XRegExp` + // constructor. This works correctly for variables created in another frame, when `instanceof` + // and `constructor` checks would fail to work as intended + XRegExp.isRegExp = function (o) { + return Object.prototype.toString.call(o) === "[object RegExp]"; + }; + + // Executes `callback` once per match within `str`. Provides a simpler and cleaner way to + // iterate over regex matches compared to the traditional approaches of subverting + // `String.prototype.replace` or repeatedly calling `exec` within a `while` loop + XRegExp.iterate = function (str, regex, callback, context) { + var r2 = clone(regex, "g"), + i = -1, match; + while (match = r2.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.) + if (regex.global) + regex.lastIndex = r2.lastIndex; // Doing this to follow expectations if `lastIndex` is checked within `callback` + callback.call(context, match, ++i, str, regex); + if (r2.lastIndex === match.index) + r2.lastIndex++; + } + if (regex.global) + regex.lastIndex = 0; + }; + + // Accepts a string and an array of regexes; returns the result of using each successive regex + // to search within the matches of the previous regex. The array of regexes can also contain + // objects with `regex` and `backref` properties, in which case the named or numbered back- + // references specified are passed forward to the next regex or returned. E.g.: + // var xregexpImgFileNames = XRegExp.matchChain(html, [ + // {regex: /]+)>/i, backref: 1}, // tag attributes + // {regex: XRegExp('(?ix) \\s src=" (? [^"]+ )'), backref: "src"}, // src attribute values + // {regex: XRegExp("^http://xregexp\\.com(/[^#?]+)", "i"), backref: 1}, // xregexp.com paths + // /[^\/]+$/ // filenames (strip directory paths) + // ]); + XRegExp.matchChain = function (str, chain) { + return function recurseChain (values, level) { + var item = chain[level].regex ? chain[level] : {regex: chain[level]}, + regex = clone(item.regex, "g"), + matches = [], i; + for (i = 0; i < values.length; i++) { + XRegExp.iterate(values[i], regex, function (match) { + matches.push(item.backref ? (match[item.backref] || "") : match[0]); + }); + } + return ((level === chain.length - 1) || !matches.length) ? + matches : recurseChain(matches, level + 1); + }([str], 0); + }; + + + //--------------------------------- + // New RegExp prototype methods + //--------------------------------- + + // Accepts a context object and arguments array; returns the result of calling `exec` with the + // first value in the arguments array. the context is ignored but is accepted for congruity + // with `Function.prototype.apply` + RegExp.prototype.apply = function (context, args) { + return this.exec(args[0]); + }; + + // Accepts a context object and string; returns the result of calling `exec` with the provided + // string. the context is ignored but is accepted for congruity with `Function.prototype.call` + RegExp.prototype.call = function (context, str) { + return this.exec(str); + }; + + + //--------------------------------- + // Overriden native methods + //--------------------------------- + + // Adds named capture support (with backreferences returned as `result.name`), and fixes two + // cross-browser issues per ES3: + // - Captured values for nonparticipating capturing groups should be returned as `undefined`, + // rather than the empty string. + // - `lastIndex` should not be incremented after zero-length matches. + RegExp.prototype.exec = function (str) { + var match, name, r2, origLastIndex; + if (!this.global) + origLastIndex = this.lastIndex; + match = nativ.exec.apply(this, arguments); + if (match) { + // Fix browsers whose `exec` methods don't consistently return `undefined` for + // nonparticipating capturing groups + if (!compliantExecNpcg && match.length > 1 && indexOf(match, "") > -1) { + r2 = RegExp(this.source, nativ.replace.call(getNativeFlags(this), "g", "")); + // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed + // matching due to characters outside the match + nativ.replace.call((str + "").slice(match.index), r2, function () { + for (var i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === undefined) + match[i] = undefined; + } + }); + } + // Attach named capture properties + if (this._xregexp && this._xregexp.captureNames) { + for (var i = 1; i < match.length; i++) { + name = this._xregexp.captureNames[i - 1]; + if (name) + match[name] = match[i]; + } + } + // Fix browsers that increment `lastIndex` after zero-length matches + if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) + this.lastIndex--; + } + if (!this.global) + this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) + return match; + }; + + // Fix browser bugs in native method + RegExp.prototype.test = function (str) { + // Use the native `exec` to skip some processing overhead, even though the altered + // `exec` would take care of the `lastIndex` fixes + var match, origLastIndex; + if (!this.global) + origLastIndex = this.lastIndex; + match = nativ.exec.call(this, str); + // Fix browsers that increment `lastIndex` after zero-length matches + if (match && !compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) + this.lastIndex--; + if (!this.global) + this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) + return !!match; + }; + + // Adds named capture support and fixes browser bugs in native method + String.prototype.match = function (regex) { + if (!XRegExp.isRegExp(regex)) + regex = RegExp(regex); // Native `RegExp` + if (regex.global) { + var result = nativ.match.apply(this, arguments); + regex.lastIndex = 0; // Fix IE bug + return result; + } + return regex.exec(this); // Run the altered `exec` + }; + + // Adds support for `${n}` tokens for named and numbered backreferences in replacement text, + // and provides named backreferences to replacement functions as `arguments[0].name`. Also + // fixes cross-browser differences in replacement text syntax when performing a replacement + // using a nonregex search value, and the value of replacement regexes' `lastIndex` property + // during replacement iterations. Note that this doesn't support SpiderMonkey's proprietary + // third (`flags`) parameter + String.prototype.replace = function (search, replacement) { + var isRegex = XRegExp.isRegExp(search), + captureNames, result, str, origLastIndex; + + // There are too many combinations of search/replacement types/values and browser bugs that + // preclude passing to native `replace`, so don't try + //if (...) + // return nativ.replace.apply(this, arguments); + + if (isRegex) { + if (search._xregexp) + captureNames = search._xregexp.captureNames; // Array or `null` + if (!search.global) + origLastIndex = search.lastIndex; + } else { + search = search + ""; // Type conversion + } + + if (Object.prototype.toString.call(replacement) === "[object Function]") { + result = nativ.replace.call(this + "", search, function () { + if (captureNames) { + // Change the `arguments[0]` string primitive to a String object which can store properties + arguments[0] = new String(arguments[0]); + // Store named backreferences on `arguments[0]` + for (var i = 0; i < captureNames.length; i++) { + if (captureNames[i]) + arguments[0][captureNames[i]] = arguments[i + 1]; + } + } + // Update `lastIndex` before calling `replacement` (fix browsers) + if (isRegex && search.global) + search.lastIndex = arguments[arguments.length - 2] + arguments[0].length; + return replacement.apply(null, arguments); + }); + } else { + str = this + ""; // Type conversion, so `args[args.length - 1]` will be a string (given nonstring `this`) + result = nativ.replace.call(str, search, function () { + var args = arguments; // Keep this function's `arguments` available through closure + return nativ.replace.call(replacement + "", replacementToken, function ($0, $1, $2) { + // Numbered backreference (without delimiters) or special variable + if ($1) { + switch ($1) { + case "$": return "$"; + case "&": return args[0]; + case "`": return args[args.length - 1].slice(0, args[args.length - 2]); + case "'": return args[args.length - 1].slice(args[args.length - 2] + args[0].length); + // Numbered backreference + default: + // What does "$10" mean? + // - Backreference 10, if 10 or more capturing groups exist + // - Backreference 1 followed by "0", if 1-9 capturing groups exist + // - Otherwise, it's the string "$10" + // Also note: + // - Backreferences cannot be more than two digits (enforced by `replacementToken`) + // - "$01" is equivalent to "$1" if a capturing group exists, otherwise it's the string "$01" + // - There is no "$0" token ("$&" is the entire match) + var literalNumbers = ""; + $1 = +$1; // Type conversion; drop leading zero + if (!$1) // `$1` was "0" or "00" + return $0; + while ($1 > args.length - 3) { + literalNumbers = String.prototype.slice.call($1, -1) + literalNumbers; + $1 = Math.floor($1 / 10); // Drop the last digit + } + return ($1 ? args[$1] || "" : "$") + literalNumbers; + } + // Named backreference or delimited numbered backreference + } else { + // What does "${n}" mean? + // - Backreference to numbered capture n. Two differences from "$n": + // - n can be more than two digits + // - Backreference 0 is allowed, and is the entire match + // - Backreference to named capture n, if it exists and is not a number overridden by numbered capture + // - Otherwise, it's the string "${n}" + var n = +$2; // Type conversion; drop leading zeros + if (n <= args.length - 3) + return args[n]; + n = captureNames ? indexOf(captureNames, $2) : -1; + return n > -1 ? args[n + 1] : $0; + } + }); + }); + } + + if (isRegex) { + if (search.global) + search.lastIndex = 0; // Fix IE, Safari bug (last tested IE 9.0.5, Safari 5.1.2 on Windows) + else + search.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) + } + + return result; + }; + + // A consistent cross-browser, ES3 compliant `split` + String.prototype.split = function (s /* separator */, limit) { + // If separator `s` is not a regex, use the native `split` + if (!XRegExp.isRegExp(s)) + return nativ.split.apply(this, arguments); + + var str = this + "", // Type conversion + output = [], + lastLastIndex = 0, + match, lastLength; + + // Behavior for `limit`: if it's... + // - `undefined`: No limit + // - `NaN` or zero: Return an empty array + // - A positive number: Use `Math.floor(limit)` + // - A negative number: No limit + // - Other: Type-convert, then use the above rules + if (limit === undefined || +limit < 0) { + limit = Infinity; + } else { + limit = Math.floor(+limit); + if (!limit) + return []; + } + + // This is required if not `s.global`, and it avoids needing to set `s.lastIndex` to zero + // and restore it to its original value when we're done using the regex + s = XRegExp.copyAsGlobal(s); + + while (match = s.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.) + if (s.lastIndex > lastLastIndex) { + output.push(str.slice(lastLastIndex, match.index)); + + if (match.length > 1 && match.index < str.length) + Array.prototype.push.apply(output, match.slice(1)); + + lastLength = match[0].length; + lastLastIndex = s.lastIndex; + + if (output.length >= limit) + break; + } + + if (s.lastIndex === match.index) + s.lastIndex++; + } + + if (lastLastIndex === str.length) { + if (!nativ.test.call(s, "") || lastLength) + output.push(""); + } else { + output.push(str.slice(lastLastIndex)); + } + + return output.length > limit ? output.slice(0, limit) : output; + }; + + + //--------------------------------- + // Private helper functions + //--------------------------------- + + // Supporting function for `XRegExp`, `XRegExp.copyAsGlobal`, etc. Returns a copy of a `RegExp` + // instance with a fresh `lastIndex` (set to zero), preserving properties required for named + // capture. Also allows adding new flags in the process of copying the regex + function clone (regex, additionalFlags) { + if (!XRegExp.isRegExp(regex)) + throw TypeError("type RegExp expected"); + var x = regex._xregexp; + regex = XRegExp(regex.source, getNativeFlags(regex) + (additionalFlags || "")); + if (x) { + regex._xregexp = { + source: x.source, + captureNames: x.captureNames ? x.captureNames.slice(0) : null + }; + } + return regex; + } + + function getNativeFlags (regex) { + return (regex.global ? "g" : "") + + (regex.ignoreCase ? "i" : "") + + (regex.multiline ? "m" : "") + + (regex.extended ? "x" : "") + // Proposed for ES4; included in AS3 + (regex.sticky ? "y" : ""); + } + + function runTokens (pattern, index, scope, context) { + var i = tokens.length, + result, match, t; + // Protect against constructing XRegExps within token handler and trigger functions + isInsideConstructor = true; + // Must reset `isInsideConstructor`, even if a `trigger` or `handler` throws + try { + while (i--) { // Run in reverse order + t = tokens[i]; + if ((scope & t.scope) && (!t.trigger || t.trigger.call(context))) { + t.pattern.lastIndex = index; + match = t.pattern.exec(pattern); // Running the altered `exec` here allows use of named backreferences, etc. + if (match && match.index === index) { + result = { + output: t.handler.call(context, match, scope), + match: match + }; + break; + } + } + } + } catch (err) { + throw err; + } finally { + isInsideConstructor = false; + } + return result; + } + + function indexOf (array, item, from) { + if (Array.prototype.indexOf) // Use the native array method if available + return array.indexOf(item, from); + for (var i = from || 0; i < array.length; i++) { + if (array[i] === item) + return i; + } + return -1; + } + + + //--------------------------------- + // Built-in tokens + //--------------------------------- + + // Augment XRegExp's regular expression syntax and flags. Note that when adding tokens, the + // third (`scope`) argument defaults to `XRegExp.OUTSIDE_CLASS` + + // Comment pattern: (?# ) + XRegExp.addToken( + /\(\?#[^)]*\)/, + function (match) { + // Keep tokens separated unless the following token is a quantifier + return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? "" : "(?:)"; + } + ); + + // Capturing group (match the opening parenthesis only). + // Required for support of named capturing groups + XRegExp.addToken( + /\((?!\?)/, + function () { + this.captureNames.push(null); + return "("; + } + ); + + // Named capturing group (match the opening delimiter only): (? + XRegExp.addToken( + /\(\?<([$\w]+)>/, + function (match) { + this.captureNames.push(match[1]); + this.hasNamedCapture = true; + return "("; + } + ); + + // Named backreference: \k + XRegExp.addToken( + /\\k<([\w$]+)>/, + function (match) { + var index = indexOf(this.captureNames, match[1]); + // Keep backreferences separate from subsequent literal numbers. Preserve back- + // references to named groups that are undefined at this point as literal strings + return index > -1 ? + "\\" + (index + 1) + (isNaN(match.input.charAt(match.index + match[0].length)) ? "" : "(?:)") : + match[0]; + } + ); + + // Empty character class: [] or [^] + XRegExp.addToken( + /\[\^?]/, + function (match) { + // For cross-browser compatibility with ES3, convert [] to \b\B and [^] to [\s\S]. + // (?!) should work like \b\B, but is unreliable in Firefox + return match[0] === "[]" ? "\\b\\B" : "[\\s\\S]"; + } + ); + + // Mode modifier at the start of the pattern only, with any combination of flags imsx: (?imsx) + // Does not support x(?i), (?-i), (?i-m), (?i: ), (?i)(?m), etc. + XRegExp.addToken( + /^\(\?([imsx]+)\)/, + function (match) { + this.setFlag(match[1]); + return ""; + } + ); + + // Whitespace and comments, in free-spacing (aka extended) mode only + XRegExp.addToken( + /(?:\s+|#.*)+/, + function (match) { + // Keep tokens separated unless the following token is a quantifier + return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? "" : "(?:)"; + }, + XRegExp.OUTSIDE_CLASS, + function () {return this.hasFlag("x");} + ); + + // Dot, in dotall (aka singleline) mode only + XRegExp.addToken( + /\./, + function () {return "[\\s\\S]";}, + XRegExp.OUTSIDE_CLASS, + function () {return this.hasFlag("s");} + ); + + + //--------------------------------- + // Backward compatibility + //--------------------------------- + + // Uncomment the following block for compatibility with XRegExp 1.0-1.2: + /* + XRegExp.matchWithinChain = XRegExp.matchChain; + RegExp.prototype.addFlags = function (s) {return clone(this, s);}; + RegExp.prototype.execAll = function (s) {var r = []; XRegExp.iterate(s, this, function (m) {r.push(m);}); return r;}; + RegExp.prototype.forEachExec = function (s, f, c) {return XRegExp.iterate(s, this, f, c);}; + RegExp.prototype.validate = function (s) {var r = RegExp("^(?:" + this.source + ")$(?!\\s)", getNativeFlags(this)); if (this.global) this.lastIndex = 0; return s.search(r) === 0;}; + */ + +})(); + +// +// Begin anonymous function. This is used to contain local scope variables without polutting global scope. +// +if (typeof(SyntaxHighlighter) == 'undefined') var SyntaxHighlighter = function() { + +// CommonJS + if (typeof(require) != 'undefined' && typeof(XRegExp) == 'undefined') + { + XRegExp = require('XRegExp').XRegExp; + } + +// Shortcut object which will be assigned to the SyntaxHighlighter variable. +// This is a shorthand for local reference in order to avoid long namespace +// references to SyntaxHighlighter.whatever... + var sh = { + defaults : { + /** Additional CSS class names to be added to highlighter elements. */ + 'class-name' : '', + + /** First line number. */ + 'first-line' : 1, + + /** + * Pads line numbers. Possible values are: + * + * false - don't pad line numbers. + * true - automaticaly pad numbers with minimum required number of leading zeroes. + * [int] - length up to which pad line numbers. + */ + 'pad-line-numbers' : false, + + /** Lines to highlight. */ + 'highlight' : false, + + /** Title to be displayed above the code block. */ + 'title' : null, + + /** Enables or disables smart tabs. */ + 'smart-tabs' : true, + + /** Gets or sets tab size. */ + 'tab-size' : 4, + + /** Enables or disables gutter. */ + 'gutter' : true, + + /** Enables or disables toolbar. */ + 'toolbar' : true, + + /** Enables quick code copy and paste from double click. */ + 'quick-code' : true, + + /** Forces code view to be collapsed. */ + 'collapse' : false, + + /** Enables or disables automatic links. */ + 'auto-links' : false, + + /** Gets or sets light mode. Equavalent to turning off gutter and toolbar. */ + 'light' : false, + + 'unindent' : true, + + 'html-script' : false + }, + + config : { + space : ' ', + + /** Enables use of + * + * ``` + */ + findParent:function (node, filterFn, includeSelf) { + if (node && !domUtils.isBody(node)) { + node = includeSelf ? node : node.parentNode; + while (node) { + if (!filterFn || filterFn(node) || domUtils.isBody(node)) { + return filterFn && !filterFn(node) && domUtils.isBody(node) ? null : node; + } + node = node.parentNode; + } + } + return null; + }, + /** + * 查找node的节点名为tagName的第一个祖先节点, 查找的起点是node节点的父节点。 + * @method findParentByTagName + * @param { Node } node 需要查找的节点对象 + * @param { Array } tagNames 需要查找的父节点的名称数组 + * @warning 查找的终点是到body节点为止 + * @return { Node | NULL } 如果找到符合条件的节点, 则返回该节点, 否则返回NULL + * @example + * ```javascript + * var node = UE.dom.domUtils.findParentByTagName( document.getElementsByTagName("div")[0], [ "BODY" ] ); + * //output: BODY + * console.log( node.tagName ); + * ``` + */ + + /** + * 查找node的节点名为tagName的祖先节点, 如果includeSelf的值为true,则查找的起点是给定的节点node, + * 否则, 起点是node的父节点。 + * @method findParentByTagName + * @param { Node } node 需要查找的节点对象 + * @param { Array } tagNames 需要查找的父节点的名称数组 + * @param { Boolean } includeSelf 查找过程是否包含node节点自身 + * @warning 查找的终点是到body节点为止 + * @return { Node | NULL } 如果找到符合条件的节点, 则返回该节点, 否则返回NULL + * @example + * ```javascript + * var queryTarget = document.getElementsByTagName("div")[0]; + * var node = UE.dom.domUtils.findParentByTagName( queryTarget, [ "DIV" ], true ); + * //output: true + * console.log( queryTarget === node ); + * ``` + */ + findParentByTagName:function (node, tagNames, includeSelf, excludeFn) { + tagNames = utils.listToMap(utils.isArray(tagNames) ? tagNames : [tagNames]); + return domUtils.findParent(node, function (node) { + return tagNames[node.tagName] && !(excludeFn && excludeFn(node)); + }, includeSelf); + }, + /** + * 查找节点node的祖先节点集合, 查找的起点是给定节点的父节点,结果集中不包含给定的节点。 + * @method findParents + * @param { Node } node 需要查找的节点对象 + * @return { Array } 给定节点的祖先节点数组 + * @grammar UE.dom.domUtils.findParents(node) => Array //返回一个祖先节点数组集合,不包含自身 + * @grammar UE.dom.domUtils.findParents(node,includeSelf) => Array //返回一个祖先节点数组集合,includeSelf指定是否包含自身 + * @grammar UE.dom.domUtils.findParents(node,includeSelf,filterFn) => Array //返回一个祖先节点数组集合,filterFn指定过滤条件,返回true的node将被选取 + * @grammar UE.dom.domUtils.findParents(node,includeSelf,filterFn,closerFirst) => Array //返回一个祖先节点数组集合,closerFirst为true的话,node的直接父亲节点是数组的第0个 + */ + + /** + * 查找节点node的祖先节点集合, 如果includeSelf的值为true, + * 则返回的结果集中允许出现当前给定的节点, 否则, 该节点不会出现在其结果集中。 + * @method findParents + * @param { Node } node 需要查找的节点对象 + * @param { Boolean } includeSelf 查找的结果中是否允许包含当前查找的节点对象 + * @return { Array } 给定节点的祖先节点数组 + */ + findParents:function (node, includeSelf, filterFn, closerFirst) { + var parents = includeSelf && ( filterFn && filterFn(node) || !filterFn ) ? [node] : []; + while (node = domUtils.findParent(node, filterFn)) { + parents.push(node); + } + return closerFirst ? parents : parents.reverse(); + }, + + /** + * 在节点node后面插入新节点newNode + * @method insertAfter + * @param { Node } node 目标节点 + * @param { Node } newNode 新插入的节点, 该节点将置于目标节点之后 + * @return { Node } 新插入的节点 + */ + insertAfter:function (node, newNode) { + return node.nextSibling ? node.parentNode.insertBefore(newNode, node.nextSibling): + node.parentNode.appendChild(newNode); + }, + + /** + * 删除节点node及其下属的所有节点 + * @method remove + * @param { Node } node 需要删除的节点对象 + * @return { Node } 返回刚删除的节点对象 + * @example + * ```html + *

+ *
你好
+ *
+ * + * ``` + */ + + /** + * 删除节点node,并根据keepChildren的值决定是否保留子节点 + * @method remove + * @param { Node } node 需要删除的节点对象 + * @param { Boolean } keepChildren 是否需要保留子节点 + * @return { Node } 返回刚删除的节点对象 + * @example + * ```html + *
+ *
你好
+ *
+ * + * ``` + */ + remove:function (node, keepChildren) { + var parent = node.parentNode, + child; + if (parent) { + if (keepChildren && node.hasChildNodes()) { + while (child = node.firstChild) { + parent.insertBefore(child, node); + } + } + parent.removeChild(node); + } + return node; + }, + + /** + * 取得node节点的下一个兄弟节点, 如果该节点其后没有兄弟节点, 则递归查找其父节点之后的第一个兄弟节点, + * 直到找到满足条件的节点或者递归到BODY节点之后才会结束。 + * @method getNextDomNode + * @param { Node } node 需要获取其后的兄弟节点的节点对象 + * @return { Node | NULL } 如果找满足条件的节点, 则返回该节点, 否则返回NULL + * @example + * ```html + * + *
+ * + *
+ * xxx + * + * + * ``` + * @example + * ```html + * + *
+ * + * xxx + *
+ * xxx + * + * + * ``` + */ + + /** + * 取得node节点的下一个兄弟节点, 如果startFromChild的值为ture,则先获取其子节点, + * 如果有子节点则直接返回第一个子节点;如果没有子节点或者startFromChild的值为false, + * 则执行getNextDomNode(Node node)的查找过程。 + * @method getNextDomNode + * @param { Node } node 需要获取其后的兄弟节点的节点对象 + * @param { Boolean } startFromChild 查找过程是否从其子节点开始 + * @return { Node | NULL } 如果找满足条件的节点, 则返回该节点, 否则返回NULL + * @see UE.dom.domUtils.getNextDomNode(Node) + */ + getNextDomNode:function (node, startFromChild, filterFn, guard) { + return getDomNode(node, 'firstChild', 'nextSibling', startFromChild, filterFn, guard); + }, + getPreDomNode:function (node, startFromChild, filterFn, guard) { + return getDomNode(node, 'lastChild', 'previousSibling', startFromChild, filterFn, guard); + }, + /** + * 检测节点node是否属是UEditor定义的bookmark节点 + * @method isBookmarkNode + * @private + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 是否是bookmark节点 + * @example + * ```html + * + * + * ``` + */ + isBookmarkNode:function (node) { + return node.nodeType == 1 && node.id && /^_baidu_bookmark_/i.test(node.id); + }, + /** + * 获取节点node所属的window对象 + * @method getWindow + * @param { Node } node 节点对象 + * @return { Window } 当前节点所属的window对象 + * @example + * ```javascript + * //output: true + * console.log( UE.dom.domUtils.getWindow( document.body ) === window ); + * ``` + */ + getWindow:function (node) { + var doc = node.ownerDocument || node; + return doc.defaultView || doc.parentWindow; + }, + /** + * 获取离nodeA与nodeB最近的公共的祖先节点 + * @method getCommonAncestor + * @param { Node } nodeA 第一个节点 + * @param { Node } nodeB 第二个节点 + * @remind 如果给定的两个节点是同一个节点, 将直接返回该节点。 + * @return { Node | NULL } 如果未找到公共节点, 返回NULL, 否则返回最近的公共祖先节点。 + * @example + * ```javascript + * var commonAncestor = UE.dom.domUtils.getCommonAncestor( document.body, document.body.firstChild ); + * //output: true + * console.log( commonAncestor.tagName.toLowerCase() === 'body' ); + * ``` + */ + getCommonAncestor:function (nodeA, nodeB) { + if (nodeA === nodeB) + return nodeA; + var parentsA = [nodeA] , parentsB = [nodeB], parent = nodeA, i = -1; + while (parent = parent.parentNode) { + if (parent === nodeB) { + return parent; + } + parentsA.push(parent); + } + parent = nodeB; + while (parent = parent.parentNode) { + if (parent === nodeA) + return parent; + parentsB.push(parent); + } + parentsA.reverse(); + parentsB.reverse(); + while (i++, parentsA[i] === parentsB[i]) { + } + return i == 0 ? null : parentsA[i - 1]; + + }, + /** + * 清除node节点左右连续为空的兄弟inline节点 + * @method clearEmptySibling + * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, + * 则这些兄弟节点将被删除 + * @grammar UE.dom.domUtils.clearEmptySibling(node,ignoreNext) //ignoreNext指定是否忽略右边空节点 + * @grammar UE.dom.domUtils.clearEmptySibling(node,ignoreNext,ignorePre) //ignorePre指定是否忽略左边空节点 + * @example + * ```html + * + *
+ * + * + * + * xxx + * + * + * + * ``` + */ + + /** + * 清除node节点左右连续为空的兄弟inline节点, 如果ignoreNext的值为true, + * 则忽略对右边兄弟节点的操作。 + * @method clearEmptySibling + * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, + * @param { Boolean } ignoreNext 是否忽略忽略对右边的兄弟节点的操作 + * 则这些兄弟节点将被删除 + * @see UE.dom.domUtils.clearEmptySibling(Node) + */ + + /** + * 清除node节点左右连续为空的兄弟inline节点, 如果ignoreNext的值为true, + * 则忽略对右边兄弟节点的操作, 如果ignorePre的值为true,则忽略对左边兄弟节点的操作。 + * @method clearEmptySibling + * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, + * @param { Boolean } ignoreNext 是否忽略忽略对右边的兄弟节点的操作 + * @param { Boolean } ignorePre 是否忽略忽略对左边的兄弟节点的操作 + * 则这些兄弟节点将被删除 + * @see UE.dom.domUtils.clearEmptySibling(Node) + */ + clearEmptySibling:function (node, ignoreNext, ignorePre) { + function clear(next, dir) { + var tmpNode; + while (next && !domUtils.isBookmarkNode(next) && (domUtils.isEmptyInlineElement(next) + //这里不能把空格算进来会吧空格干掉,出现文字间的空格丢掉了 + || !new RegExp('[^\t\n\r' + domUtils.fillChar + ']').test(next.nodeValue) )) { + tmpNode = next[dir]; + domUtils.remove(next); + next = tmpNode; + } + } + !ignoreNext && clear(node.nextSibling, 'nextSibling'); + !ignorePre && clear(node.previousSibling, 'previousSibling'); + }, + /** + * 将一个文本节点textNode拆分成两个文本节点,offset指定拆分位置 + * @method split + * @param { Node } textNode 需要拆分的文本节点对象 + * @param { int } offset 需要拆分的位置, 位置计算从0开始 + * @return { Node } 拆分后形成的新节点 + * @example + * ```html + *
abcdef
+ * + * ``` + */ + split:function (node, offset) { + var doc = node.ownerDocument; + if (browser.ie && offset == node.nodeValue.length) { + var next = doc.createTextNode(''); + return domUtils.insertAfter(node, next); + } + var retval = node.splitText(offset); + //ie8下splitText不会跟新childNodes,我们手动触发他的更新 + if (browser.ie8) { + var tmpNode = doc.createTextNode(''); + domUtils.insertAfter(retval, tmpNode); + domUtils.remove(tmpNode); + } + return retval; + }, + + /** + * 检测文本节点textNode是否为空节点(包括空格、换行、占位符等字符) + * @method isWhitespace + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 检测的节点是否为空 + * @example + * ```html + *
+ * + *
+ * + * ``` + */ + isWhitespace:function (node) { + return !new RegExp('[^ \t\n\r' + domUtils.fillChar + ']').test(node.nodeValue); + }, + /** + * 获取元素element相对于viewport的位置坐标 + * @method getXY + * @param { Node } element 需要计算位置的节点对象 + * @return { Object } 返回形如{x:left,y:top}的一个key-value映射对象, 其中键x代表水平偏移距离, + * y代表垂直偏移距离。 + * + * @example + * ```javascript + * var location = UE.dom.domUtils.getXY( document.getElementById("test") ); + * //output: test的坐标为: 12, 24 + * console.log( 'test的坐标为: ', location.x, ',', location.y ); + * ``` + */ + getXY:function (element) { + var x = 0, y = 0; + while (element.offsetParent) { + y += element.offsetTop; + x += element.offsetLeft; + element = element.offsetParent; + } + return { 'x':x, 'y':y}; + }, + /** + * 为元素element绑定原生DOM事件,type为事件类型,handler为处理函数 + * @method on + * @param { Node } element 需要绑定事件的节点对象 + * @param { String } type 绑定的事件类型 + * @param { Function } handler 事件处理器 + * @example + * ```javascript + * UE.dom.domUtils.on(document.body,"click",function(e){ + * //e为事件对象,this为被点击元素对戏那个 + * }); + * ``` + */ + + /** + * 为元素element绑定原生DOM事件,type为事件类型,handler为处理函数 + * @method on + * @param { Node } element 需要绑定事件的节点对象 + * @param { Array } type 绑定的事件类型数组 + * @param { Function } handler 事件处理器 + * @example + * ```javascript + * UE.dom.domUtils.on(document.body,["click","mousedown"],function(evt){ + * //evt为事件对象,this为被点击元素对象 + * }); + * ``` + */ + on:function (element, type, handler) { + + var types = utils.isArray(type) ? type : utils.trim(type).split(/\s+/), + k = types.length; + if (k) while (k--) { + type = types[k]; + if (element.addEventListener) { + element.addEventListener(type, handler, false); + } else { + if (!handler._d) { + handler._d = { + els : [] + }; + } + var key = type + handler.toString(),index = utils.indexOf(handler._d.els,element); + if (!handler._d[key] || index == -1) { + if(index == -1){ + handler._d.els.push(element); + } + if(!handler._d[key]){ + handler._d[key] = function (evt) { + return handler.call(evt.srcElement, evt || window.event); + }; + } + + + element.attachEvent('on' + type, handler._d[key]); + } + } + } + element = null; + }, + /** + * 解除DOM事件绑定 + * @method un + * @param { Node } element 需要解除事件绑定的节点对象 + * @param { String } type 需要接触绑定的事件类型 + * @param { Function } handler 对应的事件处理器 + * @example + * ```javascript + * UE.dom.domUtils.un(document.body,"click",function(evt){ + * //evt为事件对象,this为被点击元素对象 + * }); + * ``` + */ + + /** + * 解除DOM事件绑定 + * @method un + * @param { Node } element 需要解除事件绑定的节点对象 + * @param { Array } type 需要接触绑定的事件类型数组 + * @param { Function } handler 对应的事件处理器 + * @example + * ```javascript + * UE.dom.domUtils.un(document.body, ["click","mousedown"],function(evt){ + * //evt为事件对象,this为被点击元素对象 + * }); + * ``` + */ + un:function (element, type, handler) { + var types = utils.isArray(type) ? type : utils.trim(type).split(/\s+/), + k = types.length; + if (k) while (k--) { + type = types[k]; + if (element.removeEventListener) { + element.removeEventListener(type, handler, false); + } else { + var key = type + handler.toString(); + try{ + element.detachEvent('on' + type, handler._d ? handler._d[key] : handler); + }catch(e){} + if (handler._d && handler._d[key]) { + var index = utils.indexOf(handler._d.els,element); + if(index!=-1){ + handler._d.els.splice(index,1); + } + handler._d.els.length == 0 && delete handler._d[key]; + } + } + } + }, + + /** + * 比较节点nodeA与节点nodeB是否具有相同的标签名、属性名以及属性值 + * @method isSameElement + * @param { Node } nodeA 需要比较的节点 + * @param { Node } nodeB 需要比较的节点 + * @return { Boolean } 两个节点是否具有相同的标签名、属性名以及属性值 + * @example + * ```html + * ssss + * bbbbb + * ssss + * bbbbb + * + * + * ``` + */ + isSameElement:function (nodeA, nodeB) { + if (nodeA.tagName != nodeB.tagName) { + return false; + } + var thisAttrs = nodeA.attributes, + otherAttrs = nodeB.attributes; + if (!ie && thisAttrs.length != otherAttrs.length) { + return false; + } + var attrA, attrB, al = 0, bl = 0; + for (var i = 0; attrA = thisAttrs[i++];) { + if (attrA.nodeName == 'style') { + if (attrA.specified) { + al++; + } + if (domUtils.isSameStyle(nodeA, nodeB)) { + continue; + } else { + return false; + } + } + if (ie) { + if (attrA.specified) { + al++; + attrB = otherAttrs.getNamedItem(attrA.nodeName); + } else { + continue; + } + } else { + attrB = nodeB.attributes[attrA.nodeName]; + } + if (!attrB.specified || attrA.nodeValue != attrB.nodeValue) { + return false; + } + } + // 有可能attrB的属性包含了attrA的属性之外还有自己的属性 + if (ie) { + for (i = 0; attrB = otherAttrs[i++];) { + if (attrB.specified) { + bl++; + } + } + if (al != bl) { + return false; + } + } + return true; + }, + + /** + * 判断节点nodeA与节点nodeB的元素的style属性是否一致 + * @method isSameStyle + * @param { Node } nodeA 需要比较的节点 + * @param { Node } nodeB 需要比较的节点 + * @return { Boolean } 两个节点是否具有相同的style属性值 + * @example + * ```html + * ssss + * bbbbb + * ssss + * bbbbb + * + * + * ``` + */ + isSameStyle:function (nodeA, nodeB) { + var styleA = nodeA.style.cssText.replace(/( ?; ?)/g, ';').replace(/( ?: ?)/g, ':'), + styleB = nodeB.style.cssText.replace(/( ?; ?)/g, ';').replace(/( ?: ?)/g, ':'); + if (browser.opera) { + styleA = nodeA.style; + styleB = nodeB.style; + if (styleA.length != styleB.length) + return false; + for (var p in styleA) { + if (/^(\d+|csstext)$/i.test(p)) { + continue; + } + if (styleA[p] != styleB[p]) { + return false; + } + } + return true; + } + if (!styleA || !styleB) { + return styleA == styleB; + } + styleA = styleA.split(';'); + styleB = styleB.split(';'); + if (styleA.length != styleB.length) { + return false; + } + for (var i = 0, ci; ci = styleA[i++];) { + if (utils.indexOf(styleB, ci) == -1) { + return false; + } + } + return true; + }, + /** + * 检查节点node是否为block元素 + * @method isBlockElm + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 是否是block元素节点 + * @warning 该方法的判断规则如下: 如果该元素原本是block元素, 则不论该元素当前的css样式是什么都会返回true; + * 否则,检测该元素的css样式, 如果该元素当前是block元素, 则返回true。 其余情况下都返回false。 + * @example + * ```html + * + * + *
+ * + * + * ``` + */ + isBlockElm:function (node) { + return node.nodeType == 1 && (dtd.$block[node.tagName] || styleBlock[domUtils.getComputedStyle(node, 'display')]) && !dtd.$nonChild[node.tagName]; + }, + /** + * 检测node节点是否为body节点 + * @method isBody + * @param { Element } node 需要检测的dom元素 + * @return { Boolean } 给定的元素是否是body元素 + * @example + * ```javascript + * //output: true + * console.log( UE.dom.domUtils.isBody( document.body ) ); + * ``` + */ + isBody:function (node) { + return node && node.nodeType == 1 && node.tagName.toLowerCase() == 'body'; + }, + /** + * 以node节点为分界,将该节点的指定祖先节点parent拆分成两个独立的节点, + * 拆分形成的两个节点之间是node节点 + * @method breakParent + * @param { Node } node 作为分界的节点对象 + * @param { Node } parent 该节点必须是node节点的祖先节点, 且是block节点。 + * @return { Node } 给定的node分界节点 + * @example + * ```javascript + * + * var node = document.createElement("span"), + * wrapNode = document.createElement( "div" ), + * parent = document.createElement("p"); + * + * parent.appendChild( node ); + * wrapNode.appendChild( parent ); + * + * //拆分前 + * //output:

+ * console.log( wrapNode.innerHTML ); + * + * + * UE.dom.domUtils.breakParent( node, parent ); + * //拆分后 + * //output:

+ * console.log( wrapNode.innerHTML ); + * + * ``` + */ + breakParent:function (node, parent) { + var tmpNode, + parentClone = node, + clone = node, + leftNodes, + rightNodes; + do { + parentClone = parentClone.parentNode; + if (leftNodes) { + tmpNode = parentClone.cloneNode(false); + tmpNode.appendChild(leftNodes); + leftNodes = tmpNode; + tmpNode = parentClone.cloneNode(false); + tmpNode.appendChild(rightNodes); + rightNodes = tmpNode; + } else { + leftNodes = parentClone.cloneNode(false); + rightNodes = leftNodes.cloneNode(false); + } + while (tmpNode = clone.previousSibling) { + leftNodes.insertBefore(tmpNode, leftNodes.firstChild); + } + while (tmpNode = clone.nextSibling) { + rightNodes.appendChild(tmpNode); + } + clone = parentClone; + } while (parent !== parentClone); + tmpNode = parent.parentNode; + tmpNode.insertBefore(leftNodes, parent); + tmpNode.insertBefore(rightNodes, parent); + tmpNode.insertBefore(node, rightNodes); + domUtils.remove(parent); + return node; + }, + /** + * 检查节点node是否是空inline节点 + * @method isEmptyInlineElement + * @param { Node } node 需要检测的节点对象 + * @return { Number } 如果给定的节点是空的inline节点, 则返回1, 否则返回0。 + * @example + * ```html + * => 1 + * => 1 + * => 1 + * xx => 0 + * ``` + */ + isEmptyInlineElement:function (node) { + if (node.nodeType != 1 || !dtd.$removeEmpty[ node.tagName ]) { + return 0; + } + node = node.firstChild; + while (node) { + //如果是创建的bookmark就跳过 + if (domUtils.isBookmarkNode(node)) { + return 0; + } + if (node.nodeType == 1 && !domUtils.isEmptyInlineElement(node) || + node.nodeType == 3 && !domUtils.isWhitespace(node) + ) { + return 0; + } + node = node.nextSibling; + } + return 1; + + }, + + /** + * 删除node节点下首尾两端的空白文本子节点 + * @method trimWhiteTextNode + * @param { Element } node 需要执行删除操作的元素对象 + * @example + * ```javascript + * var node = document.createElement("div"); + * + * node.appendChild( document.createTextNode( "" ) ); + * + * node.appendChild( document.createElement("div") ); + * + * node.appendChild( document.createTextNode( "" ) ); + * + * //3 + * console.log( node.childNodes.length ); + * + * UE.dom.domUtils.trimWhiteTextNode( node ); + * + * //1 + * console.log( node.childNodes.length ); + * ``` + */ + trimWhiteTextNode:function (node) { + function remove(dir) { + var child; + while ((child = node[dir]) && child.nodeType == 3 && domUtils.isWhitespace(child)) { + node.removeChild(child); + } + } + remove('firstChild'); + remove('lastChild'); + }, + + /** + * 合并node节点下相同的子节点 + * @name mergeChild + * @desc + * UE.dom.domUtils.mergeChild(node,tagName) //tagName要合并的子节点的标签 + * @example + *

xxaaxx

+ * ==> UE.dom.domUtils.mergeChild(node,'span') + *

xxaaxx

+ */ + mergeChild:function (node, tagName, attrs) { + var list = domUtils.getElementsByTagName(node, node.tagName.toLowerCase()); + for (var i = 0, ci; ci = list[i++];) { + if (!ci.parentNode || domUtils.isBookmarkNode(ci)) { + continue; + } + //span单独处理 + if (ci.tagName.toLowerCase() == 'span') { + if (node === ci.parentNode) { + domUtils.trimWhiteTextNode(node); + if (node.childNodes.length == 1) { + node.style.cssText = ci.style.cssText + ";" + node.style.cssText; + domUtils.remove(ci, true); + continue; + } + } + ci.style.cssText = node.style.cssText + ';' + ci.style.cssText; + if (attrs) { + var style = attrs.style; + if (style) { + style = style.split(';'); + for (var j = 0, s; s = style[j++];) { + ci.style[utils.cssStyleToDomStyle(s.split(':')[0])] = s.split(':')[1]; + } + } + } + if (domUtils.isSameStyle(ci, node)) { + domUtils.remove(ci, true); + } + continue; + } + if (domUtils.isSameElement(node, ci)) { + domUtils.remove(ci, true); + } + } + }, + + /** + * 原生方法getElementsByTagName的封装 + * @method getElementsByTagName + * @param { Node } node 目标节点对象 + * @param { String } tagName 需要查找的节点的tagName, 多个tagName以空格分割 + * @return { Array } 符合条件的节点集合 + */ + getElementsByTagName:function (node, name,filter) { + if(filter && utils.isString(filter)){ + var className = filter; + filter = function(node){return domUtils.hasClass(node,className)} + } + name = utils.trim(name).replace(/[ ]{2,}/g,' ').split(' '); + var arr = []; + for(var n = 0,ni;ni=name[n++];){ + var list = node.getElementsByTagName(ni); + for (var i = 0, ci; ci = list[i++];) { + if(!filter || filter(ci)) + arr.push(ci); + } + } + + return arr; + }, + /** + * 将节点node提取到父节点上 + * @method mergeToParent + * @param { Element } node 需要提取的元素对象 + * @example + * ```html + *
+ *
+ * + *
+ *
+ * + * + * ``` + */ + mergeToParent:function (node) { + var parent = node.parentNode; + while (parent && dtd.$removeEmpty[parent.tagName]) { + if (parent.tagName == node.tagName || parent.tagName == 'A') {//针对a标签单独处理 + domUtils.trimWhiteTextNode(parent); + //span需要特殊处理 不处理这样的情况 xxxxxxxxx + if (parent.tagName == 'SPAN' && !domUtils.isSameStyle(parent, node) + || (parent.tagName == 'A' && node.tagName == 'SPAN')) { + if (parent.childNodes.length > 1 || parent !== node.parentNode) { + node.style.cssText = parent.style.cssText + ";" + node.style.cssText; + parent = parent.parentNode; + continue; + } else { + parent.style.cssText += ";" + node.style.cssText; + //trace:952 a标签要保持下划线 + if (parent.tagName == 'A') { + parent.style.textDecoration = 'underline'; + } + } + } + if (parent.tagName != 'A') { + parent === node.parentNode && domUtils.remove(node, true); + break; + } + } + parent = parent.parentNode; + } + }, + /** + * 合并节点node的左右兄弟节点 + * @method mergeSibling + * @param { Element } node 需要合并的目标节点 + * @example + * ```html + * xxxxoooxxxx + * + * + * ``` + */ + + /** + * 合并节点node的左右兄弟节点, 可以根据给定的条件选择是否忽略合并左节点。 + * @method mergeSibling + * @param { Element } node 需要合并的目标节点 + * @param { Boolean } ignorePre 是否忽略合并左节点 + * @example + * ```html + * xxxxoooxxxx + * + * + * ``` + */ + + /** + * 合并节点node的左右兄弟节点,可以根据给定的条件选择是否忽略合并左右节点。 + * @method mergeSibling + * @param { Element } node 需要合并的目标节点 + * @param { Boolean } ignorePre 是否忽略合并左节点 + * @param { Boolean } ignoreNext 是否忽略合并右节点 + * @remind 如果同时忽略左右节点, 则该操作什么也不会做 + * @example + * ```html + * xxxxoooxxxx + * + * + * ``` + */ + mergeSibling:function (node, ignorePre, ignoreNext) { + function merge(rtl, start, node) { + var next; + if ((next = node[rtl]) && !domUtils.isBookmarkNode(next) && next.nodeType == 1 && domUtils.isSameElement(node, next)) { + while (next.firstChild) { + if (start == 'firstChild') { + node.insertBefore(next.lastChild, node.firstChild); + } else { + node.appendChild(next.firstChild); + } + } + domUtils.remove(next); + } + } + !ignorePre && merge('previousSibling', 'firstChild', node); + !ignoreNext && merge('nextSibling', 'lastChild', node); + }, + + /** + * 设置节点node及其子节点不会被选中 + * @method unSelectable + * @param { Element } node 需要执行操作的dom元素 + * @remind 执行该操作后的节点, 将不能被鼠标选中 + * @example + * ```javascript + * UE.dom.domUtils.unSelectable( document.body ); + * ``` + */ + unSelectable:ie && browser.ie9below || browser.opera ? function (node) { + //for ie9 + node.onselectstart = function () { + return false; + }; + node.onclick = node.onkeyup = node.onkeydown = function () { + return false; + }; + node.unselectable = 'on'; + node.setAttribute("unselectable", "on"); + for (var i = 0, ci; ci = node.all[i++];) { + switch (ci.tagName.toLowerCase()) { + case 'iframe' : + case 'textarea' : + case 'input' : + case 'select' : + break; + default : + ci.unselectable = 'on'; + node.setAttribute("unselectable", "on"); + } + } + } : function (node) { + node.style.MozUserSelect = + node.style.webkitUserSelect = + node.style.msUserSelect = + node.style.KhtmlUserSelect = 'none'; + }, + /** + * 删除节点node上的指定属性名称的属性 + * @method removeAttributes + * @param { Node } node 需要删除属性的节点对象 + * @param { String } attrNames 可以是空格隔开的多个属性名称,该操作将会依次删除相应的属性 + * @example + * ```html + *
+ * xxxxx + *
+ * + * + * ``` + */ + + /** + * 删除节点node上的指定属性名称的属性 + * @method removeAttributes + * @param { Node } node 需要删除属性的节点对象 + * @param { Array } attrNames 需要删除的属性名数组 + * @example + * ```html + *
+ * xxxxx + *
+ * + * + * ``` + */ + removeAttributes:function (node, attrNames) { + attrNames = utils.isArray(attrNames) ? attrNames : utils.trim(attrNames).replace(/[ ]{2,}/g,' ').split(' '); + for (var i = 0, ci; ci = attrNames[i++];) { + ci = attrFix[ci] || ci; + switch (ci) { + case 'className': + node[ci] = ''; + break; + case 'style': + node.style.cssText = ''; + var val = node.getAttributeNode('style'); + !browser.ie && val && node.removeAttributeNode(val); + } + node.removeAttribute(ci); + } + }, + /** + * 在doc下创建一个标签名为tag,属性为attrs的元素 + * @method createElement + * @param { DomDocument } doc 新创建的元素属于该document节点创建 + * @param { String } tagName 需要创建的元素的标签名 + * @param { Object } attrs 新创建的元素的属性key-value集合 + * @return { Element } 新创建的元素对象 + * @example + * ```javascript + * var ele = UE.dom.domUtils.createElement( document, 'div', { + * id: 'test' + * } ); + * + * //output: DIV + * console.log( ele.tagName ); + * + * //output: test + * console.log( ele.id ); + * + * ``` + */ + createElement:function (doc, tag, attrs) { + return domUtils.setAttributes(doc.createElement(tag), attrs) + }, + /** + * 为节点node添加属性attrs,attrs为属性键值对 + * @method setAttributes + * @param { Element } node 需要设置属性的元素对象 + * @param { Object } attrs 需要设置的属性名-值对 + * @return { Element } 设置属性的元素对象 + * @example + * ```html + * + * + * + * + */ + setAttributes:function (node, attrs) { + for (var attr in attrs) { + if(attrs.hasOwnProperty(attr)){ + var value = attrs[attr]; + switch (attr) { + case 'class': + //ie下要这样赋值,setAttribute不起作用 + node.className = value; + break; + case 'style' : + node.style.cssText = node.style.cssText + ";" + value; + break; + case 'innerHTML': + node[attr] = value; + break; + case 'value': + node.value = value; + break; + default: + node.setAttribute(attrFix[attr] || attr, value); + } + } + } + return node; + }, + + /** + * 获取元素element经过计算后的样式值 + * @method getComputedStyle + * @param { Element } element 需要获取样式的元素对象 + * @param { String } styleName 需要获取的样式名 + * @return { String } 获取到的样式值 + * @example + * ```html + * + * + * + * + * + * ``` + */ + getComputedStyle:function (element, styleName) { + //一下的属性单独处理 + var pros = 'width height top left'; + + if(pros.indexOf(styleName) > -1){ + return element['offset' + styleName.replace(/^\w/,function(s){return s.toUpperCase()})] + 'px'; + } + //忽略文本节点 + if (element.nodeType == 3) { + element = element.parentNode; + } + //ie下font-size若body下定义了font-size,则从currentStyle里会取到这个font-size. 取不到实际值,故此修改. + if (browser.ie && browser.version < 9 && styleName == 'font-size' && !element.style.fontSize && + !dtd.$empty[element.tagName] && !dtd.$nonChild[element.tagName]) { + var span = element.ownerDocument.createElement('span'); + span.style.cssText = 'padding:0;border:0;font-family:simsun;'; + span.innerHTML = '.'; + element.appendChild(span); + var result = span.offsetHeight; + element.removeChild(span); + span = null; + return result + 'px'; + } + try { + var value = domUtils.getStyle(element, styleName) || + (window.getComputedStyle ? domUtils.getWindow(element).getComputedStyle(element, '').getPropertyValue(styleName) : + ( element.currentStyle || element.style )[utils.cssStyleToDomStyle(styleName)]); + + } catch (e) { + return ""; + } + return utils.transUnitToPx(utils.fixColor(styleName, value)); + }, + /** + * 删除元素element指定的className + * @method removeClasses + * @param { Element } ele 需要删除class的元素节点 + * @param { String } classNames 需要删除的className, 多个className之间以空格分开 + * @example + * ```html + * xxx + * + * + * ``` + */ + + /** + * 删除元素element指定的className + * @method removeClasses + * @param { Element } ele 需要删除class的元素节点 + * @param { Array } classNames 需要删除的className数组 + * @example + * ```html + * xxx + * + * + * ``` + */ + removeClasses:function (elm, classNames) { + classNames = utils.isArray(classNames) ? classNames : + utils.trim(classNames).replace(/[ ]{2,}/g,' ').split(' '); + for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){ + cls = cls.replace(new RegExp('\\b' + ci + '\\b'),'') + } + cls = utils.trim(cls).replace(/[ ]{2,}/g,' '); + if(cls){ + elm.className = cls; + }else{ + domUtils.removeAttributes(elm,['class']); + } + }, + /** + * 给元素element添加className + * @method addClass + * @param { Node } ele 需要增加className的元素 + * @param { String } classNames 需要添加的className, 多个className之间以空格分割 + * @remind 相同的类名不会被重复添加 + * @example + * ```html + * + * + * + * ``` + */ + + /** + * 判断元素element是否包含给定的样式类名className + * @method hasClass + * @param { Node } ele 需要检测的元素 + * @param { Array } classNames 需要检测的className数组 + * @return { Boolean } 元素是否包含所有给定的className + * @example + * ```html + * + * + * + * ``` + */ + hasClass:function (element, className) { + if(utils.isRegExp(className)){ + return className.test(element.className) + } + className = utils.trim(className).replace(/[ ]{2,}/g,' ').split(' '); + for(var i = 0,ci,cls = element.className;ci=className[i++];){ + if(!new RegExp('\\b' + ci + '\\b','i').test(cls)){ + return false; + } + } + return i - 1 == className.length; + }, + + /** + * 阻止事件默认行为 + * @method preventDefault + * @param { Event } evt 需要阻止默认行为的事件对象 + * @example + * ```javascript + * UE.dom.domUtils.preventDefault( evt ); + * ``` + */ + preventDefault:function (evt) { + evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); + }, + /** + * 删除元素element指定的样式 + * @method removeStyle + * @param { Element } element 需要删除样式的元素 + * @param { String } styleName 需要删除的样式名 + * @example + * ```html + * + * + * + * ``` + */ + removeStyle:function (element, name) { + if(browser.ie ){ + //针对color先单独处理一下 + if(name == 'color'){ + name = '(^|;)' + name; + } + element.style.cssText = element.style.cssText.replace(new RegExp(name + '[^:]*:[^;]+;?','ig'),'') + }else{ + if (element.style.removeProperty) { + element.style.removeProperty (name); + }else { + element.style.removeAttribute (utils.cssStyleToDomStyle(name)); + } + } + + + if (!element.style.cssText) { + domUtils.removeAttributes(element, ['style']); + } + }, + /** + * 获取元素element的style属性的指定值 + * @method getStyle + * @param { Element } element 需要获取属性值的元素 + * @param { String } styleName 需要获取的style的名称 + * @warning 该方法仅获取元素style属性中所标明的值 + * @return { String } 该元素包含指定的style属性值 + * @example + * ```html + *
+ * + * + * ``` + */ + getStyle:function (element, name) { + var value = element.style[ utils.cssStyleToDomStyle(name) ]; + return utils.fixColor(name, value); + }, + /** + * 为元素element设置样式属性值 + * @method setStyle + * @param { Element } element 需要设置样式的元素 + * @param { String } styleName 样式名 + * @param { String } styleValue 样式值 + * @example + * ```html + *
+ * + * + * ``` + */ + setStyle:function (element, name, value) { + element.style[utils.cssStyleToDomStyle(name)] = value; + if(!utils.trim(element.style.cssText)){ + this.removeAttributes(element,'style') + } + }, + /** + * 为元素element设置多个样式属性值 + * @method setStyles + * @param { Element } element 需要设置样式的元素 + * @param { Object } styles 样式名值对 + * @example + * ```html + *
+ * + * + * ``` + */ + setStyles:function (element, styles) { + for (var name in styles) { + if (styles.hasOwnProperty(name)) { + domUtils.setStyle(element, name, styles[name]); + } + } + }, + /** + * 删除_moz_dirty属性 + * @private + * @method removeDirtyAttr + */ + removeDirtyAttr:function (node) { + for (var i = 0, ci, nodes = node.getElementsByTagName('*'); ci = nodes[i++];) { + ci.removeAttribute('_moz_dirty'); + } + node.removeAttribute('_moz_dirty'); + }, + /** + * 获取子节点的数量 + * @method getChildCount + * @param { Element } node 需要检测的元素 + * @return { Number } 给定的node元素的子节点数量 + * @example + * ```html + *
+ * + *
+ * + * + * ``` + */ + + /** + * 根据给定的过滤规则, 获取符合条件的子节点的数量 + * @method getChildCount + * @param { Element } node 需要检测的元素 + * @param { Function } fn 过滤器, 要求对符合条件的子节点返回true, 反之则要求返回false + * @return { Number } 符合过滤条件的node元素的子节点数量 + * @example + * ```html + *
+ * + *
+ * + * + * ``` + */ + getChildCount:function (node, fn) { + var count = 0, first = node.firstChild; + fn = fn || function () { + return 1; + }; + while (first) { + if (fn(first)) { + count++; + } + first = first.nextSibling; + } + return count; + }, + + /** + * 判断给定节点是否为空节点 + * @method isEmptyNode + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 节点是否为空 + * @example + * ```javascript + * UE.dom.domUtils.isEmptyNode( document.body ); + * ``` + */ + isEmptyNode:function (node) { + return !node.firstChild || domUtils.getChildCount(node, function (node) { + return !domUtils.isBr(node) && !domUtils.isBookmarkNode(node) && !domUtils.isWhitespace(node) + }) == 0 + }, + clearSelectedArr:function (nodes) { + var node; + while (node = nodes.pop()) { + domUtils.removeAttributes(node, ['class']); + } + }, + /** + * 将显示区域滚动到指定节点的位置 + * @method scrollToView + * @param {Node} node 节点 + * @param {window} win window对象 + * @param {Number} offsetTop 距离上方的偏移量 + */ + scrollToView:function (node, win, offsetTop) { + var getViewPaneSize = function () { + var doc = win.document, + mode = doc.compatMode == 'CSS1Compat'; + return { + width:( mode ? doc.documentElement.clientWidth : doc.body.clientWidth ) || 0, + height:( mode ? doc.documentElement.clientHeight : doc.body.clientHeight ) || 0 + }; + }, + getScrollPosition = function (win) { + if ('pageXOffset' in win) { + return { + x:win.pageXOffset || 0, + y:win.pageYOffset || 0 + }; + } + else { + var doc = win.document; + return { + x:doc.documentElement.scrollLeft || doc.body.scrollLeft || 0, + y:doc.documentElement.scrollTop || doc.body.scrollTop || 0 + }; + } + }; + var winHeight = getViewPaneSize().height, offset = winHeight * -1 + offsetTop; + offset += (node.offsetHeight || 0); + var elementPosition = domUtils.getXY(node); + offset += elementPosition.y; + var currentScroll = getScrollPosition(win).y; + // offset += 50; + if (offset > currentScroll || offset < currentScroll - winHeight) { + win.scrollTo(0, offset + (offset < 0 ? -20 : 20)); + } + }, + /** + * 判断给定节点是否为br + * @method isBr + * @param { Node } node 需要判断的节点对象 + * @return { Boolean } 给定的节点是否是br节点 + */ + isBr:function (node) { + return node.nodeType == 1 && node.tagName == 'BR'; + }, + /** + * 判断给定的节点是否是一个“填充”节点 + * @private + * @method isFillChar + * @param { Node } node 需要判断的节点 + * @param { Boolean } isInStart 是否从节点内容的开始位置匹配 + * @returns { Boolean } 节点是否是填充节点 + */ + isFillChar:function (node,isInStart) { + if(node.nodeType != 3) + return false; + var text = node.nodeValue; + if(isInStart){ + return new RegExp('^' + domUtils.fillChar).test(text) + } + return !text.replace(new RegExp(domUtils.fillChar,'g'), '').length + }, + isStartInblock:function (range) { + var tmpRange = range.cloneRange(), + flag = 0, + start = tmpRange.startContainer, + tmp; + if(start.nodeType == 1 && start.childNodes[tmpRange.startOffset]){ + start = start.childNodes[tmpRange.startOffset]; + var pre = start.previousSibling; + while(pre && domUtils.isFillChar(pre)){ + start = pre; + pre = pre.previousSibling; + } + } + if(this.isFillChar(start,true) && tmpRange.startOffset == 1){ + tmpRange.setStartBefore(start); + start = tmpRange.startContainer; + } + + while (start && domUtils.isFillChar(start)) { + tmp = start; + start = start.previousSibling + } + if (tmp) { + tmpRange.setStartBefore(tmp); + start = tmpRange.startContainer; + } + if (start.nodeType == 1 && domUtils.isEmptyNode(start) && tmpRange.startOffset == 1) { + tmpRange.setStart(start, 0).collapse(true); + } + while (!tmpRange.startOffset) { + start = tmpRange.startContainer; + if (domUtils.isBlockElm(start) || domUtils.isBody(start)) { + flag = 1; + break; + } + var pre = tmpRange.startContainer.previousSibling, + tmpNode; + if (!pre) { + tmpRange.setStartBefore(tmpRange.startContainer); + } else { + while (pre && domUtils.isFillChar(pre)) { + tmpNode = pre; + pre = pre.previousSibling; + } + if (tmpNode) { + tmpRange.setStartBefore(tmpNode); + } else { + tmpRange.setStartBefore(tmpRange.startContainer); + } + } + } + return flag && !domUtils.isBody(tmpRange.startContainer) ? 1 : 0; + }, + + /** + * 判断给定的元素是否是一个空元素 + * @method isEmptyBlock + * @param { Element } node 需要判断的元素 + * @return { Boolean } 是否是空元素 + * @example + * ```html + *
+ * + * + * ``` + */ + + /** + * 根据指定的判断规则判断给定的元素是否是一个空元素 + * @method isEmptyBlock + * @param { Element } node 需要判断的元素 + * @param { RegExp } reg 对内容执行判断的正则表达式对象 + * @return { Boolean } 是否是空元素 + */ + isEmptyBlock:function (node,reg) { + if(node.nodeType != 1) + return 0; + reg = reg || new RegExp('[ \xa0\t\r\n' + domUtils.fillChar + ']', 'g'); + + if (node[browser.ie ? 'innerText' : 'textContent'].replace(reg, '').length > 0) { + return 0; + } + for (var n in dtd.$isNotEmpty) { + if (node.getElementsByTagName(n).length) { + return 0; + } + } + return 1; + }, + + /** + * 移动元素使得该元素的位置移动指定的偏移量的距离 + * @method setViewportOffset + * @param { Element } element 需要设置偏移量的元素 + * @param { Object } offset 偏移量, 形如{ left: 100, top: 50 }的一个键值对, 表示该元素将在 + * 现有的位置上向水平方向偏移offset.left的距离, 在竖直方向上偏移 + * offset.top的距离 + * @example + * ```html + *
+ * + * + * ``` + */ + setViewportOffset:function (element, offset) { + var left = parseInt(element.style.left) | 0; + var top = parseInt(element.style.top) | 0; + var rect = element.getBoundingClientRect(); + var offsetLeft = offset.left - rect.left; + var offsetTop = offset.top - rect.top; + if (offsetLeft) { + element.style.left = left + offsetLeft + 'px'; + } + if (offsetTop) { + element.style.top = top + offsetTop + 'px'; + } + }, + + /** + * 用“填充字符”填充节点 + * @method fillNode + * @private + * @param { DomDocument } doc 填充的节点所在的docment对象 + * @param { Node } node 需要填充的节点对象 + * @example + * ```html + *
+ * + * + * ``` + */ + fillNode:function (doc, node) { + var tmpNode = browser.ie ? doc.createTextNode(domUtils.fillChar) : doc.createElement('br'); + node.innerHTML = ''; + node.appendChild(tmpNode); + }, + + /** + * 把节点src的所有子节点追加到另一个节点tag上去 + * @method moveChild + * @param { Node } src 源节点, 该节点下的所有子节点将被移除 + * @param { Node } tag 目标节点, 从源节点移除的子节点将被追加到该节点下 + * @example + * ```html + *
+ * + *
+ *
+ *
+ *
+ * + * + * ``` + */ + + /** + * 把节点src的所有子节点移动到另一个节点tag上去, 可以通过dir参数控制附加的行为是“追加”还是“插入顶部” + * @method moveChild + * @param { Node } src 源节点, 该节点下的所有子节点将被移除 + * @param { Node } tag 目标节点, 从源节点移除的子节点将被附加到该节点下 + * @param { Boolean } dir 附加方式, 如果为true, 则附加进去的节点将被放到目标节点的顶部, 反之,则放到末尾 + * @example + * ```html + *
+ * + *
+ *
+ *
+ *
+ * + * + * ``` + */ + moveChild:function (src, tag, dir) { + while (src.firstChild) { + if (dir && tag.firstChild) { + tag.insertBefore(src.lastChild, tag.firstChild); + } else { + tag.appendChild(src.firstChild); + } + } + }, + + /** + * 判断节点的标签上是否不存在任何属性 + * @method hasNoAttributes + * @private + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 节点是否不包含任何属性 + * @example + * ```html + *
xxxx
+ * + * + * ``` + */ + hasNoAttributes:function (node) { + return browser.ie ? /^<\w+\s*?>/.test(node.outerHTML) : node.attributes.length == 0; + }, + + /** + * 检测节点是否是UEditor所使用的辅助节点 + * @method isCustomeNode + * @private + * @param { Node } node 需要检测的节点 + * @remind 辅助节点是指编辑器要完成工作临时添加的节点, 在输出的时候将会从编辑器内移除, 不会影响最终的结果。 + * @return { Boolean } 给定的节点是否是一个辅助节点 + */ + isCustomeNode:function (node) { + return node.nodeType == 1 && node.getAttribute('_ue_custom_node_'); + }, + + /** + * 检测节点的标签是否是给定的标签 + * @method isTagNode + * @param { Node } node 需要检测的节点对象 + * @param { String } tagName 标签 + * @return { Boolean } 节点的标签是否是给定的标签 + * @example + * ```html + *
+ * + * + * ``` + */ + isTagNode:function (node, tagNames) { + return node.nodeType == 1 && new RegExp('\\b' + node.tagName + '\\b','i').test(tagNames) + }, + + /** + * 给定一个节点数组,在通过指定的过滤器过滤后, 获取其中满足过滤条件的第一个节点 + * @method filterNodeList + * @param { Array } nodeList 需要过滤的节点数组 + * @param { Function } fn 过滤器, 对符合条件的节点, 执行结果返回true, 反之则返回false + * @return { Node | NULL } 如果找到符合过滤条件的节点, 则返回该节点, 否则返回NULL + * @example + * ```javascript + * var divNodes = document.getElementsByTagName("div"); + * divNodes = [].slice.call( divNodes, 0 ); + * + * //output: null + * console.log( UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { + * return node.tagName.toLowerCase() !== 'div'; + * } ) ); + * ``` + */ + + /** + * 给定一个节点数组nodeList和一组标签名tagNames, 获取其中能够匹配标签名的节点集合中的第一个节点 + * @method filterNodeList + * @param { Array } nodeList 需要过滤的节点数组 + * @param { String } tagNames 需要匹配的标签名, 多个标签名之间用空格分割 + * @return { Node | NULL } 如果找到标签名匹配的节点, 则返回该节点, 否则返回NULL + * @example + * ```javascript + * var divNodes = document.getElementsByTagName("div"); + * divNodes = [].slice.call( divNodes, 0 ); + * + * //output: null + * console.log( UE.dom.domUtils.filterNodeList( divNodes, 'a span' ) ); + * ``` + */ + + /** + * 给定一个节点数组,在通过指定的过滤器过滤后, 如果参数forAll为true, 则会返回所有满足过滤 + * 条件的节点集合, 否则, 返回满足条件的节点集合中的第一个节点 + * @method filterNodeList + * @param { Array } nodeList 需要过滤的节点数组 + * @param { Function } fn 过滤器, 对符合条件的节点, 执行结果返回true, 反之则返回false + * @param { Boolean } forAll 是否返回整个节点数组, 如果该参数为false, 则返回节点集合中的第一个节点 + * @return { Array | Node | NULL } 如果找到符合过滤条件的节点, 则根据参数forAll的值决定返回满足 + * 过滤条件的节点数组或第一个节点, 否则返回NULL + * @example + * ```javascript + * var divNodes = document.getElementsByTagName("div"); + * divNodes = [].slice.call( divNodes, 0 ); + * + * //output: 3(假定有3个div) + * console.log( divNodes.length ); + * + * var nodes = UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { + * return node.tagName.toLowerCase() === 'div'; + * }, true ); + * + * //output: 3 + * console.log( nodes.length ); + * + * var node = UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { + * return node.tagName.toLowerCase() === 'div'; + * }, false ); + * + * //output: div + * console.log( node.nodeName ); + * ``` + */ + filterNodeList : function(nodelist,filter,forAll){ + var results = []; + if(!utils .isFunction(filter)){ + var str = filter; + filter = function(n){ + return utils.indexOf(utils.isArray(str) ? str:str.split(' '), n.tagName.toLowerCase()) != -1 + }; + } + utils.each(nodelist,function(n){ + filter(n) && results.push(n) + }); + return results.length == 0 ? null : results.length == 1 || !forAll ? results[0] : results + }, + + /** + * 查询给定的range选区是否在给定的node节点内,且在该节点的最末尾 + * @method isInNodeEndBoundary + * @param { UE.dom.Range } rng 需要判断的range对象, 该对象的startContainer不能为NULL + * @param node 需要检测的节点对象 + * @return { Number } 如果给定的选取range对象是在node内部的最末端, 则返回1, 否则返回0 + */ + isInNodeEndBoundary : function (rng,node){ + var start = rng.startContainer; + if(start.nodeType == 3 && rng.startOffset != start.nodeValue.length){ + return 0; + } + if(start.nodeType == 1 && rng.startOffset != start.childNodes.length){ + return 0; + } + while(start !== node){ + if(start.nextSibling){ + return 0 + }; + start = start.parentNode; + } + return 1; + }, + isBoundaryNode : function (node,dir){ + var tmp; + while(!domUtils.isBody(node)){ + tmp = node; + node = node.parentNode; + if(tmp !== node[dir]){ + return false; + } + } + return true; + }, + fillHtml : browser.ie11below ? ' ' : '
' +}; +var fillCharReg = new RegExp(domUtils.fillChar, 'g'); + +// core/Range.js +/** + * Range封装 + * @file + * @module UE.dom + * @class Range + * @since 1.2.6.1 + */ + +/** + * dom操作封装 + * @unfile + * @module UE.dom + */ + +/** + * Range实现类,本类是UEditor底层核心类,封装不同浏览器之间的Range操作。 + * @unfile + * @module UE.dom + * @class Range + */ + + +(function () { + var guid = 0, + fillChar = domUtils.fillChar, + fillData; + + /** + * 更新range的collapse状态 + * @param {Range} range range对象 + */ + function updateCollapse(range) { + range.collapsed = + range.startContainer && range.endContainer && + range.startContainer === range.endContainer && + range.startOffset == range.endOffset; + } + + function selectOneNode(rng){ + return !rng.collapsed && rng.startContainer.nodeType == 1 && rng.startContainer === rng.endContainer && rng.endOffset - rng.startOffset == 1 + } + function setEndPoint(toStart, node, offset, range) { + //如果node是自闭合标签要处理 + if (node.nodeType == 1 && (dtd.$empty[node.tagName] || dtd.$nonChild[node.tagName])) { + offset = domUtils.getNodeIndex(node) + (toStart ? 0 : 1); + node = node.parentNode; + } + if (toStart) { + range.startContainer = node; + range.startOffset = offset; + if (!range.endContainer) { + range.collapse(true); + } + } else { + range.endContainer = node; + range.endOffset = offset; + if (!range.startContainer) { + range.collapse(false); + } + } + updateCollapse(range); + return range; + } + + function execContentsAction(range, action) { + //调整边界 + //range.includeBookmark(); + var start = range.startContainer, + end = range.endContainer, + startOffset = range.startOffset, + endOffset = range.endOffset, + doc = range.document, + frag = doc.createDocumentFragment(), + tmpStart, tmpEnd; + if (start.nodeType == 1) { + start = start.childNodes[startOffset] || (tmpStart = start.appendChild(doc.createTextNode(''))); + } + if (end.nodeType == 1) { + end = end.childNodes[endOffset] || (tmpEnd = end.appendChild(doc.createTextNode(''))); + } + if (start === end && start.nodeType == 3) { + frag.appendChild(doc.createTextNode(start.substringData(startOffset, endOffset - startOffset))); + //is not clone + if (action) { + start.deleteData(startOffset, endOffset - startOffset); + range.collapse(true); + } + return frag; + } + var current, currentLevel, clone = frag, + startParents = domUtils.findParents(start, true), endParents = domUtils.findParents(end, true); + for (var i = 0; startParents[i] == endParents[i];) { + i++; + } + for (var j = i, si; si = startParents[j]; j++) { + current = si.nextSibling; + if (si == start) { + if (!tmpStart) { + if (range.startContainer.nodeType == 3) { + clone.appendChild(doc.createTextNode(start.nodeValue.slice(startOffset))); + //is not clone + if (action) { + start.deleteData(startOffset, start.nodeValue.length - startOffset); + } + } else { + clone.appendChild(!action ? start.cloneNode(true) : start); + } + } + } else { + currentLevel = si.cloneNode(false); + clone.appendChild(currentLevel); + } + while (current) { + if (current === end || current === endParents[j]) { + break; + } + si = current.nextSibling; + clone.appendChild(!action ? current.cloneNode(true) : current); + current = si; + } + clone = currentLevel; + } + clone = frag; + if (!startParents[i]) { + clone.appendChild(startParents[i - 1].cloneNode(false)); + clone = clone.firstChild; + } + for (var j = i, ei; ei = endParents[j]; j++) { + current = ei.previousSibling; + if (ei == end) { + if (!tmpEnd && range.endContainer.nodeType == 3) { + clone.appendChild(doc.createTextNode(end.substringData(0, endOffset))); + //is not clone + if (action) { + end.deleteData(0, endOffset); + } + } + } else { + currentLevel = ei.cloneNode(false); + clone.appendChild(currentLevel); + } + //如果两端同级,右边第一次已经被开始做了 + if (j != i || !startParents[i]) { + while (current) { + if (current === start) { + break; + } + ei = current.previousSibling; + clone.insertBefore(!action ? current.cloneNode(true) : current, clone.firstChild); + current = ei; + } + } + clone = currentLevel; + } + if (action) { + range.setStartBefore(!endParents[i] ? endParents[i - 1] : !startParents[i] ? startParents[i - 1] : endParents[i]).collapse(true); + } + tmpStart && domUtils.remove(tmpStart); + tmpEnd && domUtils.remove(tmpEnd); + return frag; + } + + /** + * 创建一个跟document绑定的空的Range实例 + * @constructor + * @param { Document } document 新建的选区所属的文档对象 + */ + + /** + * @property { Node } startContainer 当前Range的开始边界的容器节点, 可以是一个元素节点或者是文本节点 + */ + + /** + * @property { Node } startOffset 当前Range的开始边界容器节点的偏移量, 如果是元素节点, + * 该值就是childNodes中的第几个节点, 如果是文本节点就是文本内容的第几个字符 + */ + + /** + * @property { Node } endContainer 当前Range的结束边界的容器节点, 可以是一个元素节点或者是文本节点 + */ + + /** + * @property { Node } endOffset 当前Range的结束边界容器节点的偏移量, 如果是元素节点, + * 该值就是childNodes中的第几个节点, 如果是文本节点就是文本内容的第几个字符 + */ + + /** + * @property { Boolean } collapsed 当前Range是否闭合 + * @default true + * @remind Range是闭合的时候, startContainer === endContainer && startOffset === endOffset + */ + + /** + * @property { Document } document 当前Range所属的Document对象 + * @remind 不同range的的document属性可以是不同的 + */ + var Range = dom.Range = function (document) { + var me = this; + me.startContainer = + me.startOffset = + me.endContainer = + me.endOffset = null; + me.document = document; + me.collapsed = true; + }; + + /** + * 删除fillData + * @param doc + * @param excludeNode + */ + function removeFillData(doc, excludeNode) { + try { + if (fillData && domUtils.inDoc(fillData, doc)) { + if (!fillData.nodeValue.replace(fillCharReg, '').length) { + var tmpNode = fillData.parentNode; + domUtils.remove(fillData); + while (tmpNode && domUtils.isEmptyInlineElement(tmpNode) && + //safari的contains有bug + (browser.safari ? !(domUtils.getPosition(tmpNode,excludeNode) & domUtils.POSITION_CONTAINS) : !tmpNode.contains(excludeNode)) + ) { + fillData = tmpNode.parentNode; + domUtils.remove(tmpNode); + tmpNode = fillData; + } + } else { + fillData.nodeValue = fillData.nodeValue.replace(fillCharReg, ''); + } + } + } catch (e) { + } + } + + /** + * @param node + * @param dir + */ + function mergeSibling(node, dir) { + var tmpNode; + node = node[dir]; + while (node && domUtils.isFillChar(node)) { + tmpNode = node[dir]; + domUtils.remove(node); + node = tmpNode; + } + } + + Range.prototype = { + + /** + * 克隆选区的内容到一个DocumentFragment里 + * @method cloneContents + * @return { DocumentFragment | NULL } 如果选区是闭合的将返回null, 否则, 返回包含所clone内容的DocumentFragment元素 + * @example + * ```html + * + * + * xx[xxx]x + * + * + * + * ``` + */ + cloneContents:function () { + return this.collapsed ? null : execContentsAction(this, 0); + }, + + /** + * 删除当前选区范围中的所有内容 + * @method deleteContents + * @remind 执行完该操作后, 当前Range对象变成了闭合状态 + * @return { UE.dom.Range } 当前操作的Range对象 + * @example + * ```html + * + * + * xx[xxx]x + * + * + * + * ``` + */ + deleteContents:function () { + var txt; + if (!this.collapsed) { + execContentsAction(this, 1); + } + if (browser.webkit) { + txt = this.startContainer; + if (txt.nodeType == 3 && !txt.nodeValue.length) { + this.setStartBefore(txt).collapse(true); + domUtils.remove(txt); + } + } + return this; + }, + + /** + * 将当前选区的内容提取到一个DocumentFragment里 + * @method extractContents + * @remind 执行该操作后, 选区将变成闭合状态 + * @warning 执行该操作后, 原来选区所选中的内容将从dom树上剥离出来 + * @return { DocumentFragment } 返回包含所提取内容的DocumentFragment对象 + * @example + * ```html + * + * + * xx[xxx]x + * + * + * + */ + extractContents:function () { + return this.collapsed ? null : execContentsAction(this, 2); + }, + + /** + * 设置Range的开始容器节点和偏移量 + * @method setStart + * @remind 如果给定的节点是元素节点,那么offset指的是其子元素中索引为offset的元素, + * 如果是文本节点,那么offset指的是其文本内容的第offset个字符 + * @remind 如果提供的容器节点是一个不能包含子元素的节点, 则该选区的开始容器将被设置 + * 为该节点的父节点, 此时, 其距离开始容器的偏移量也变成了该节点在其父节点 + * 中的索引 + * @param { Node } node 将被设为当前选区开始边界容器的节点对象 + * @param { int } offset 选区的开始位置偏移量 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxxxxxxxxxx[xxx] + * + * + * ``` + * @example + * ```html + * + * xxx[xx]x + * + * + * ``` + */ + setStart:function (node, offset) { + return setEndPoint(true, node, offset, this); + }, + + /** + * 设置Range的结束容器和偏移量 + * @method setEnd + * @param { Node } node 作为当前选区结束边界容器的节点对象 + * @param { int } offset 结束边界的偏移量 + * @see UE.dom.Range:setStart(Node,int) + * @return { UE.dom.Range } 当前range对象 + */ + setEnd:function (node, offset) { + return setEndPoint(false, node, offset, this); + }, + + /** + * 将Range开始位置设置到node节点之后 + * @method setStartAfter + * @remind 该操作将会把给定节点的父节点作为range的开始容器, 且偏移量是该节点在其父节点中的位置索引+1 + * @param { Node } node 选区的开始边界将紧接着该节点之后 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxxxx[xxxx] + * + * + * ``` + */ + setStartAfter:function (node) { + return this.setStart(node.parentNode, domUtils.getNodeIndex(node) + 1); + }, + + /** + * 将Range开始位置设置到node节点之前 + * @method setStartBefore + * @remind 该操作将会把给定节点的父节点作为range的开始容器, 且偏移量是该节点在其父节点中的位置索引 + * @param { Node } node 新的选区开始位置在该节点之前 + * @see UE.dom.Range:setStartAfter(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setStartBefore:function (node) { + return this.setStart(node.parentNode, domUtils.getNodeIndex(node)); + }, + + /** + * 将Range结束位置设置到node节点之后 + * @method setEndAfter + * @remind 该操作将会把给定节点的父节点作为range的结束容器, 且偏移量是该节点在其父节点中的位置索引+1 + * @param { Node } node 目标节点 + * @see UE.dom.Range:setStartAfter(Node) + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * [xxxxxxx]xxxx + * + * + * ``` + */ + setEndAfter:function (node) { + return this.setEnd(node.parentNode, domUtils.getNodeIndex(node) + 1); + }, + + /** + * 将Range结束位置设置到node节点之前 + * @method setEndBefore + * @remind 该操作将会把给定节点的父节点作为range的结束容器, 且偏移量是该节点在其父节点中的位置索引 + * @param { Node } node 目标节点 + * @see UE.dom.Range:setEndAfter(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setEndBefore:function (node) { + return this.setEnd(node.parentNode, domUtils.getNodeIndex(node)); + }, + + /** + * 设置Range的开始位置到node节点内的第一个子节点之前 + * @method setStartAtFirst + * @remind 选区的开始容器将变成给定的节点, 且偏移量为0 + * @remind 如果给定的节点是元素节点, 则该节点必须是允许包含子节点的元素。 + * @param { Node } node 目标节点 + * @see UE.dom.Range:setStartBefore(Node) + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + setStartAtFirst:function (node) { + return this.setStart(node, 0); + }, + + /** + * 设置Range的开始位置到node节点内的最后一个节点之后 + * @method setStartAtLast + * @remind 选区的开始容器将变成给定的节点, 且偏移量为该节点的子节点数 + * @remind 如果给定的节点是元素节点, 则该节点必须是允许包含子节点的元素。 + * @param { Node } node 目标节点 + * @see UE.dom.Range:setStartAtFirst(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setStartAtLast:function (node) { + return this.setStart(node, node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length); + }, + + /** + * 设置Range的结束位置到node节点内的第一个节点之前 + * @method setEndAtFirst + * @param { Node } node 目标节点 + * @remind 选区的结束容器将变成给定的节点, 且偏移量为0 + * @remind node必须是一个元素节点, 且必须是允许包含子节点的元素。 + * @see UE.dom.Range:setStartAtFirst(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setEndAtFirst:function (node) { + return this.setEnd(node, 0); + }, + + /** + * 设置Range的结束位置到node节点内的最后一个节点之后 + * @method setEndAtLast + * @param { Node } node 目标节点 + * @remind 选区的结束容器将变成给定的节点, 且偏移量为该节点的子节点数量 + * @remind node必须是一个元素节点, 且必须是允许包含子节点的元素。 + * @see UE.dom.Range:setStartAtFirst(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setEndAtLast:function (node) { + return this.setEnd(node, node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length); + }, + + /** + * 选中给定节点 + * @method selectNode + * @remind 此时, 选区的开始容器和结束容器都是该节点的父节点, 其startOffset是该节点在父节点中的位置索引, + * 而endOffset为startOffset+1 + * @param { Node } node 需要选中的节点 + * @return { UE.dom.Range } 当前range对象,此时的range仅包含当前给定的节点对象 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + selectNode:function (node) { + return this.setStartBefore(node).setEndAfter(node); + }, + + /** + * 选中给定节点内部的所有节点 + * @method selectNodeContents + * @remind 此时, 选区的开始容器和结束容器都是该节点, 其startOffset为0, + * 而endOffset是该节点的子节点数。 + * @param { Node } node 目标节点, 当前range将包含该节点内的所有节点 + * @return { UE.dom.Range } 当前range对象, 此时range仅包含给定节点的所有子节点 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + selectNodeContents:function (node) { + return this.setStart(node, 0).setEndAtLast(node); + }, + + /** + * clone当前Range对象 + * @method cloneRange + * @remind 返回的range是一个全新的range对象, 其内部所有属性与当前被clone的range相同。 + * @return { UE.dom.Range } 当前range对象的一个副本 + */ + cloneRange:function () { + var me = this; + return new Range(me.document).setStart(me.startContainer, me.startOffset).setEnd(me.endContainer, me.endOffset); + + }, + + /** + * 向当前选区的结束处闭合选区 + * @method collapse + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + + /** + * 闭合当前选区,根据给定的toStart参数项决定是向当前选区开始处闭合还是向结束处闭合, + * 如果toStart的值为true,则向开始位置闭合, 反之,向结束位置闭合。 + * @method collapse + * @param { Boolean } toStart 是否向选区开始处闭合 + * @return { UE.dom.Range } 当前range对象,此时range对象处于闭合状态 + * @see UE.dom.Range:collapse() + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + collapse:function (toStart) { + var me = this; + if (toStart) { + me.endContainer = me.startContainer; + me.endOffset = me.startOffset; + } else { + me.startContainer = me.endContainer; + me.startOffset = me.endOffset; + } + me.collapsed = true; + return me; + }, + + /** + * 调整range的开始位置和结束位置,使其"收缩"到最小的位置 + * @method shrinkBoundary + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * xxxx[xxxxx] => xxxx[xxxxx] + * ``` + * + * @example + * ```html + * + * x[xx]xxx + * + * + * ``` + * + * @example + * ```html + * [xxxxxxxxxxx] => [xxxxxxxxxxx] + * ``` + */ + + /** + * 调整range的开始位置和结束位置,使其"收缩"到最小的位置, + * 如果ignoreEnd的值为true,则忽略对结束位置的调整 + * @method shrinkBoundary + * @param { Boolean } ignoreEnd 是否忽略对结束位置的调整 + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.domUtils.Range:shrinkBoundary() + */ + shrinkBoundary:function (ignoreEnd) { + var me = this, child, + collapsed = me.collapsed; + function check(node){ + return node.nodeType == 1 && !domUtils.isBookmarkNode(node) && !dtd.$empty[node.tagName] && !dtd.$nonChild[node.tagName] + } + while (me.startContainer.nodeType == 1 //是element + && (child = me.startContainer.childNodes[me.startOffset]) //子节点也是element + && check(child)) { + me.setStart(child, 0); + } + if (collapsed) { + return me.collapse(true); + } + if (!ignoreEnd) { + while (me.endContainer.nodeType == 1//是element + && me.endOffset > 0 //如果是空元素就退出 endOffset=0那么endOffst-1为负值,childNodes[endOffset]报错 + && (child = me.endContainer.childNodes[me.endOffset - 1]) //子节点也是element + && check(child)) { + me.setEnd(child, child.childNodes.length); + } + } + return me; + }, + + /** + * 获取离当前选区内包含的所有节点最近的公共祖先节点, + * @method getCommonAncestor + * @remind 返回的公共祖先节点一定不是range自身的容器节点, 但有可能是一个文本节点 + * @return { Node } 当前range对象内所有节点的公共祖先节点 + * @example + * ```html + * //选区示例 + * xxxx[xxx]xxxxxx + * + * ``` + */ + + /** + * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到 + * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf + * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点 + * @method getCommonAncestor + * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点 + * @return { Node } 当前range对象内所有节点的公共祖先节点 + * @see UE.dom.Range:getCommonAncestor() + * @example + * ```html + * + * + * + * xxxxxxxxx[xxx]xxxxxxxx + * + * + * + * + * ``` + */ + + /** + * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到 + * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf + * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点; 同时可以根据 + * ignoreTextNode 参数的取值决定是否忽略类型为文本节点的祖先节点。 + * @method getCommonAncestor + * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点 + * @param { Boolean } ignoreTextNode 获取祖先节点的过程中是否忽略类型为文本节点的祖先节点 + * @return { Node } 当前range对象内所有节点的公共祖先节点 + * @see UE.dom.Range:getCommonAncestor() + * @see UE.dom.Range:getCommonAncestor(Boolean) + * @example + * ```html + * + * + * + * xxxxxxxx[x]xxxxxxxxxxx + * + * + * + * + * ``` + */ + getCommonAncestor:function (includeSelf, ignoreTextNode) { + var me = this, + start = me.startContainer, + end = me.endContainer; + if (start === end) { + if (includeSelf && selectOneNode(this)) { + start = start.childNodes[me.startOffset]; + if(start.nodeType == 1) + return start; + } + //只有在上来就相等的情况下才会出现是文本的情况 + return ignoreTextNode && start.nodeType == 3 ? start.parentNode : start; + } + return domUtils.getCommonAncestor(start, end); + }, + + /** + * 调整当前Range的开始和结束边界容器,如果是容器节点是文本节点,就调整到包含该文本节点的父节点上 + * @method trimBoundary + * @remind 该操作有可能会引起文本节点被切开 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * //选区示例 + * xxx[xxxxx]xxx + * + * + * ``` + */ + + /** + * 调整当前Range的开始和结束边界容器,如果是容器节点是文本节点,就调整到包含该文本节点的父节点上, + * 可以根据 ignoreEnd 参数的值决定是否调整对结束边界的调整 + * @method trimBoundary + * @param { Boolean } ignoreEnd 是否忽略对结束边界的调整 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * //选区示例 + * xxx[xxxxx]xxx + * + * + * ``` + */ + trimBoundary:function (ignoreEnd) { + this.txtToElmBoundary(); + var start = this.startContainer, + offset = this.startOffset, + collapsed = this.collapsed, + end = this.endContainer; + if (start.nodeType == 3) { + if (offset == 0) { + this.setStartBefore(start); + } else { + if (offset >= start.nodeValue.length) { + this.setStartAfter(start); + } else { + var textNode = domUtils.split(start, offset); + //跟新结束边界 + if (start === end) { + this.setEnd(textNode, this.endOffset - offset); + } else if (start.parentNode === end) { + this.endOffset += 1; + } + this.setStartBefore(textNode); + } + } + if (collapsed) { + return this.collapse(true); + } + } + if (!ignoreEnd) { + offset = this.endOffset; + end = this.endContainer; + if (end.nodeType == 3) { + if (offset == 0) { + this.setEndBefore(end); + } else { + offset < end.nodeValue.length && domUtils.split(end, offset); + this.setEndAfter(end); + } + } + } + return this; + }, + + /** + * 如果选区在文本的边界上,就扩展选区到文本的父节点上, 如果当前选区是闭合的, 则什么也不做 + * @method txtToElmBoundary + * @remind 该操作不会修改dom节点 + * @return { UE.dom.Range } 当前range对象 + */ + + /** + * 如果选区在文本的边界上,就扩展选区到文本的父节点上, 如果当前选区是闭合的, 则根据参数项 + * ignoreCollapsed 的值决定是否执行该调整 + * @method txtToElmBoundary + * @param { Boolean } ignoreCollapsed 是否忽略选区的闭合状态, 如果该参数取值为true, 则 + * 不论选区是否闭合, 都会执行该操作, 反之, 则不会对闭合的选区执行该操作 + * @return { UE.dom.Range } 当前range对象 + */ + txtToElmBoundary:function (ignoreCollapsed) { + function adjust(r, c) { + var container = r[c + 'Container'], + offset = r[c + 'Offset']; + if (container.nodeType == 3) { + if (!offset) { + r['set' + c.replace(/(\w)/, function (a) { + return a.toUpperCase(); + }) + 'Before'](container); + } else if (offset >= container.nodeValue.length) { + r['set' + c.replace(/(\w)/, function (a) { + return a.toUpperCase(); + }) + 'After' ](container); + } + } + } + + if (ignoreCollapsed || !this.collapsed) { + adjust(this, 'start'); + adjust(this, 'end'); + } + return this; + }, + + /** + * 在当前选区的开始位置前插入节点,新插入的节点会被该range包含 + * @method insertNode + * @param { Node } node 需要插入的节点 + * @remind 插入的节点可以是一个DocumentFragment依次插入多个节点 + * @return { UE.dom.Range } 当前range对象 + */ + insertNode:function (node) { + var first = node, length = 1; + if (node.nodeType == 11) { + first = node.firstChild; + length = node.childNodes.length; + } + this.trimBoundary(true); + var start = this.startContainer, + offset = this.startOffset; + var nextNode = start.childNodes[ offset ]; + if (nextNode) { + start.insertBefore(node, nextNode); + } else { + start.appendChild(node); + } + if (first.parentNode === this.endContainer) { + this.endOffset = this.endOffset + length; + } + return this.setStartBefore(first); + }, + + /** + * 闭合选区到当前选区的开始位置, 并且定位光标到闭合后的位置 + * @method setCursor + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:collapse() + */ + + /** + * 闭合选区,可以根据参数toEnd的值控制选区是向前闭合还是向后闭合, 并且定位光标到闭合后的位置。 + * @method setCursor + * @param { Boolean } toEnd 是否向后闭合, 如果为true, 则闭合选区时, 将向结束容器方向闭合, + * 反之,则向开始容器方向闭合 + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:collapse(Boolean) + */ + setCursor:function (toEnd, noFillData) { + return this.collapse(!toEnd).select(noFillData); + }, + + /** + * 创建当前range的一个书签,记录下当前range的位置,方便当dom树改变时,还能找回原来的选区位置 + * @method createBookmark + * @param { Boolean } serialize 控制返回的标记位置是对当前位置的引用还是ID,如果该值为true,则 + * 返回标记位置的ID, 反之则返回标记位置节点的引用 + * @return { Object } 返回一个书签记录键值对, 其包含的key有: start => 开始标记的ID或者引用, + * end => 结束标记的ID或引用, id => 当前标记的类型, 如果为true,则表示 + * 返回的记录的类型为ID, 反之则为引用 + */ + createBookmark:function (serialize, same) { + var endNode, + startNode = this.document.createElement('span'); + startNode.style.cssText = 'display:none;line-height:0px;'; + startNode.appendChild(this.document.createTextNode('\u200D')); + startNode.id = '_baidu_bookmark_start_' + (same ? '' : guid++); + + if (!this.collapsed) { + endNode = startNode.cloneNode(true); + endNode.id = '_baidu_bookmark_end_' + (same ? '' : guid++); + } + this.insertNode(startNode); + if (endNode) { + this.collapse().insertNode(endNode).setEndBefore(endNode); + } + this.setStartAfter(startNode); + return { + start:serialize ? startNode.id : startNode, + end:endNode ? serialize ? endNode.id : endNode : null, + id:serialize + } + }, + + /** + * 调整当前range的边界到书签位置,并删除该书签对象所标记的位置内的节点 + * @method moveToBookmark + * @param { BookMark } bookmark createBookmark所创建的标签对象 + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:createBookmark(Boolean) + */ + moveToBookmark:function (bookmark) { + var start = bookmark.id ? this.document.getElementById(bookmark.start) : bookmark.start, + end = bookmark.end && bookmark.id ? this.document.getElementById(bookmark.end) : bookmark.end; + this.setStartBefore(start); + domUtils.remove(start); + if (end) { + this.setEndBefore(end); + domUtils.remove(end); + } else { + this.collapse(true); + } + return this; + }, + + /** + * 调整range的边界,使其"放大"到最近的父节点 + * @method enlarge + * @remind 会引起选区的变化 + * @return { UE.dom.Range } 当前range对象 + */ + + /** + * 调整range的边界,使其"放大"到最近的父节点,根据参数 toBlock 的取值, 可以 + * 要求扩大之后的父节点是block节点 + * @method enlarge + * @param { Boolean } toBlock 是否要求扩大之后的父节点必须是block节点 + * @return { UE.dom.Range } 当前range对象 + */ + enlarge:function (toBlock, stopFn) { + var isBody = domUtils.isBody, + pre, node, tmp = this.document.createTextNode(''); + if (toBlock) { + node = this.startContainer; + if (node.nodeType == 1) { + if (node.childNodes[this.startOffset]) { + pre = node = node.childNodes[this.startOffset] + } else { + node.appendChild(tmp); + pre = node = tmp; + } + } else { + pre = node; + } + while (1) { + if (domUtils.isBlockElm(node)) { + node = pre; + while ((pre = node.previousSibling) && !domUtils.isBlockElm(pre)) { + node = pre; + } + this.setStartBefore(node); + break; + } + pre = node; + node = node.parentNode; + } + node = this.endContainer; + if (node.nodeType == 1) { + if (pre = node.childNodes[this.endOffset]) { + node.insertBefore(tmp, pre); + } else { + node.appendChild(tmp); + } + pre = node = tmp; + } else { + pre = node; + } + while (1) { + if (domUtils.isBlockElm(node)) { + node = pre; + while ((pre = node.nextSibling) && !domUtils.isBlockElm(pre)) { + node = pre; + } + this.setEndAfter(node); + break; + } + pre = node; + node = node.parentNode; + } + if (tmp.parentNode === this.endContainer) { + this.endOffset--; + } + domUtils.remove(tmp); + } + + // 扩展边界到最大 + if (!this.collapsed) { + while (this.startOffset == 0) { + if (stopFn && stopFn(this.startContainer)) { + break; + } + if (isBody(this.startContainer)) { + break; + } + this.setStartBefore(this.startContainer); + } + while (this.endOffset == (this.endContainer.nodeType == 1 ? this.endContainer.childNodes.length : this.endContainer.nodeValue.length)) { + if (stopFn && stopFn(this.endContainer)) { + break; + } + if (isBody(this.endContainer)) { + break; + } + this.setEndAfter(this.endContainer); + } + } + return this; + }, + enlargeToBlockElm:function(ignoreEnd){ + while(!domUtils.isBlockElm(this.startContainer)){ + this.setStartBefore(this.startContainer); + } + if(!ignoreEnd){ + while(!domUtils.isBlockElm(this.endContainer)){ + this.setEndAfter(this.endContainer); + } + } + return this; + }, + /** + * 调整Range的边界,使其"缩小"到最合适的位置 + * @method adjustmentBoundary + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:shrinkBoundary() + */ + adjustmentBoundary:function () { + if (!this.collapsed) { + while (!domUtils.isBody(this.startContainer) && + this.startOffset == this.startContainer[this.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length && + this.startContainer[this.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length + ) { + + this.setStartAfter(this.startContainer); + } + while (!domUtils.isBody(this.endContainer) && !this.endOffset && + this.endContainer[this.endContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length + ) { + this.setEndBefore(this.endContainer); + } + } + return this; + }, + + /** + * 给range选区中的内容添加给定的inline标签 + * @method applyInlineStyle + * @param { String } tagName 需要添加的标签名 + * @example + * ```html + *

xxxx[xxxx]x

==> range.applyInlineStyle("strong") ==>

xxxx[xxxx]x

+ * ``` + */ + + /** + * 给range选区中的内容添加给定的inline标签, 并且为标签附加上一些初始化属性。 + * @method applyInlineStyle + * @param { String } tagName 需要添加的标签名 + * @param { Object } attrs 跟随新添加的标签的属性 + * @return { UE.dom.Range } 当前选区 + * @example + * ```html + *

xxxx[xxxx]x

+ * + * ==> + * + * + * range.applyInlineStyle("strong",{"style":"font-size:12px"}) + * + * ==> + * + *

xxxx[xxxx]x

+ * ``` + */ + applyInlineStyle:function (tagName, attrs, list) { + if (this.collapsed)return this; + this.trimBoundary().enlarge(false, + function (node) { + return node.nodeType == 1 && domUtils.isBlockElm(node) + }).adjustmentBoundary(); + var bookmark = this.createBookmark(), + end = bookmark.end, + filterFn = function (node) { + return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' : !domUtils.isWhitespace(node); + }, + current = domUtils.getNextDomNode(bookmark.start, false, filterFn), + node, + pre, + range = this.cloneRange(); + while (current && (domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING)) { + if (current.nodeType == 3 || dtd[tagName][current.tagName]) { + range.setStartBefore(current); + node = current; + while (node && (node.nodeType == 3 || dtd[tagName][node.tagName]) && node !== end) { + pre = node; + node = domUtils.getNextDomNode(node, node.nodeType == 1, null, function (parent) { + return dtd[tagName][parent.tagName]; + }); + } + var frag = range.setEndAfter(pre).extractContents(), elm; + if (list && list.length > 0) { + var level, top; + top = level = list[0].cloneNode(false); + for (var i = 1, ci; ci = list[i++];) { + level.appendChild(ci.cloneNode(false)); + level = level.firstChild; + } + elm = level; + } else { + elm = range.document.createElement(tagName); + } + if (attrs) { + domUtils.setAttributes(elm, attrs); + } + elm.appendChild(frag); + range.insertNode(list ? top : elm); + //处理下滑线在a上的情况 + var aNode; + if (tagName == 'span' && attrs.style && /text\-decoration/.test(attrs.style) && (aNode = domUtils.findParentByTagName(elm, 'a', true))) { + domUtils.setAttributes(aNode, attrs); + domUtils.remove(elm, true); + elm = aNode; + } else { + domUtils.mergeSibling(elm); + domUtils.clearEmptySibling(elm); + } + //去除子节点相同的 + domUtils.mergeChild(elm, attrs); + current = domUtils.getNextDomNode(elm, false, filterFn); + domUtils.mergeToParent(elm); + if (node === end) { + break; + } + } else { + current = domUtils.getNextDomNode(current, true, filterFn); + } + } + return this.moveToBookmark(bookmark); + }, + + /** + * 移除当前选区内指定的inline标签,但保留其中的内容 + * @method removeInlineStyle + * @param { String } tagName 需要移除的标签名 + * @return { UE.dom.Range } 当前的range对象 + * @example + * ```html + * xx[xxxxyyyzz]z => range.removeInlineStyle(["em"]) => xx[xxxxyyyzz]z + * ``` + */ + + /** + * 移除当前选区内指定的一组inline标签,但保留其中的内容 + * @method removeInlineStyle + * @param { Array } tagNameArr 需要移除的标签名的数组 + * @return { UE.dom.Range } 当前的range对象 + * @see UE.dom.Range:removeInlineStyle(String) + */ + removeInlineStyle:function (tagNames) { + if (this.collapsed)return this; + tagNames = utils.isArray(tagNames) ? tagNames : [tagNames]; + this.shrinkBoundary().adjustmentBoundary(); + var start = this.startContainer, end = this.endContainer; + while (1) { + if (start.nodeType == 1) { + if (utils.indexOf(tagNames, start.tagName.toLowerCase()) > -1) { + break; + } + if (start.tagName.toLowerCase() == 'body') { + start = null; + break; + } + } + start = start.parentNode; + } + while (1) { + if (end.nodeType == 1) { + if (utils.indexOf(tagNames, end.tagName.toLowerCase()) > -1) { + break; + } + if (end.tagName.toLowerCase() == 'body') { + end = null; + break; + } + } + end = end.parentNode; + } + var bookmark = this.createBookmark(), + frag, + tmpRange; + if (start) { + tmpRange = this.cloneRange().setEndBefore(bookmark.start).setStartBefore(start); + frag = tmpRange.extractContents(); + tmpRange.insertNode(frag); + domUtils.clearEmptySibling(start, true); + start.parentNode.insertBefore(bookmark.start, start); + } + if (end) { + tmpRange = this.cloneRange().setStartAfter(bookmark.end).setEndAfter(end); + frag = tmpRange.extractContents(); + tmpRange.insertNode(frag); + domUtils.clearEmptySibling(end, false, true); + end.parentNode.insertBefore(bookmark.end, end.nextSibling); + } + var current = domUtils.getNextDomNode(bookmark.start, false, function (node) { + return node.nodeType == 1; + }), next; + while (current && current !== bookmark.end) { + next = domUtils.getNextDomNode(current, true, function (node) { + return node.nodeType == 1; + }); + if (utils.indexOf(tagNames, current.tagName.toLowerCase()) > -1) { + domUtils.remove(current, true); + } + current = next; + } + return this.moveToBookmark(bookmark); + }, + + /** + * 获取当前选中的自闭合的节点 + * @method getClosedNode + * @return { Node | NULL } 如果当前选中的是自闭合节点, 则返回该节点, 否则返回NULL + */ + getClosedNode:function () { + var node; + if (!this.collapsed) { + var range = this.cloneRange().adjustmentBoundary().shrinkBoundary(); + if (selectOneNode(range)) { + var child = range.startContainer.childNodes[range.startOffset]; + if (child && child.nodeType == 1 && (dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName])) { + node = child; + } + } + } + return node; + }, + + /** + * 在页面上高亮range所表示的选区 + * @method select + * @return { UE.dom.Range } 返回当前Range对象 + */ + //这里不区分ie9以上,trace:3824 + select:browser.ie ? function (noFillData, textRange) { + var nativeRange; + if (!this.collapsed) + this.shrinkBoundary(); + var node = this.getClosedNode(); + if (node && !textRange) { + try { + nativeRange = this.document.body.createControlRange(); + nativeRange.addElement(node); + nativeRange.select(); + } catch (e) {} + return this; + } + var bookmark = this.createBookmark(), + start = bookmark.start, + end; + nativeRange = this.document.body.createTextRange(); + nativeRange.moveToElementText(start); + nativeRange.moveStart('character', 1); + if (!this.collapsed) { + var nativeRangeEnd = this.document.body.createTextRange(); + end = bookmark.end; + nativeRangeEnd.moveToElementText(end); + nativeRange.setEndPoint('EndToEnd', nativeRangeEnd); + } else { + if (!noFillData && this.startContainer.nodeType != 3) { + //使用|x固定住光标 + var tmpText = this.document.createTextNode(fillChar), + tmp = this.document.createElement('span'); + tmp.appendChild(this.document.createTextNode(fillChar)); + start.parentNode.insertBefore(tmp, start); + start.parentNode.insertBefore(tmpText, start); + //当点b,i,u时,不能清除i上边的b + removeFillData(this.document, tmpText); + fillData = tmpText; + mergeSibling(tmp, 'previousSibling'); + mergeSibling(start, 'nextSibling'); + nativeRange.moveStart('character', -1); + nativeRange.collapse(true); + } + } + this.moveToBookmark(bookmark); + tmp && domUtils.remove(tmp); + //IE在隐藏状态下不支持range操作,catch一下 + try { + nativeRange.select(); + } catch (e) { + } + return this; + } : function (notInsertFillData) { + function checkOffset(rng){ + + function check(node,offset,dir){ + if(node.nodeType == 3 && node.nodeValue.length < offset){ + rng[dir + 'Offset'] = node.nodeValue.length + } + } + check(rng.startContainer,rng.startOffset,'start'); + check(rng.endContainer,rng.endOffset,'end'); + } + var win = domUtils.getWindow(this.document), + sel = win.getSelection(), + txtNode; + //FF下关闭自动长高时滚动条在关闭dialog时会跳 + //ff下如果不body.focus将不能定位闭合光标到编辑器内 + browser.gecko ? this.document.body.focus() : win.focus(); + if (sel) { + sel.removeAllRanges(); + // trace:870 chrome/safari后边是br对于闭合得range不能定位 所以去掉了判断 + // this.startContainer.nodeType != 3 &&! ((child = this.startContainer.childNodes[this.startOffset]) && child.nodeType == 1 && child.tagName == 'BR' + if (this.collapsed && !notInsertFillData) { +// //opear如果没有节点接着,原生的不能够定位,不能在body的第一级插入空白节点 +// if (notInsertFillData && browser.opera && !domUtils.isBody(this.startContainer) && this.startContainer.nodeType == 1) { +// var tmp = this.document.createTextNode(''); +// this.insertNode(tmp).setStart(tmp, 0).collapse(true); +// } +// + //处理光标落在文本节点的情况 + //处理以下的情况 + //|xxxx + //xxxx|xxxx + //xxxx| + var start = this.startContainer,child = start; + if(start.nodeType == 1){ + child = start.childNodes[this.startOffset]; + + } + if( !(start.nodeType == 3 && this.startOffset) && + (child ? + (!child.previousSibling || child.previousSibling.nodeType != 3) + : + (!start.lastChild || start.lastChild.nodeType != 3) + ) + ){ + txtNode = this.document.createTextNode(fillChar); + //跟着前边走 + this.insertNode(txtNode); + removeFillData(this.document, txtNode); + mergeSibling(txtNode, 'previousSibling'); + mergeSibling(txtNode, 'nextSibling'); + fillData = txtNode; + this.setStart(txtNode, browser.webkit ? 1 : 0).collapse(true); + } + } + var nativeRange = this.document.createRange(); + if(this.collapsed && browser.opera && this.startContainer.nodeType == 1){ + var child = this.startContainer.childNodes[this.startOffset]; + if(!child){ + //往前靠拢 + child = this.startContainer.lastChild; + if( child && domUtils.isBr(child)){ + this.setStartBefore(child).collapse(true); + } + }else{ + //向后靠拢 + while(child && domUtils.isBlockElm(child)){ + if(child.nodeType == 1 && child.childNodes[0]){ + child = child.childNodes[0] + }else{ + break; + } + } + child && this.setStartBefore(child).collapse(true) + } + + } + //是createAddress最后一位算的不准,现在这里进行微调 + checkOffset(this); + nativeRange.setStart(this.startContainer, this.startOffset); + nativeRange.setEnd(this.endContainer, this.endOffset); + sel.addRange(nativeRange); + } + return this; + }, + + /** + * 滚动到当前range开始的位置 + * @method scrollToView + * @param { Window } win 当前range对象所属的window对象 + * @return { UE.dom.Range } 当前Range对象 + */ + + /** + * 滚动到距离当前range开始位置 offset 的位置处 + * @method scrollToView + * @param { Window } win 当前range对象所属的window对象 + * @param { Number } offset 距离range开始位置处的偏移量, 如果为正数, 则向下偏移, 反之, 则向上偏移 + * @return { UE.dom.Range } 当前Range对象 + */ + scrollToView:function (win, offset) { + win = win ? window : domUtils.getWindow(this.document); + var me = this, + span = me.document.createElement('span'); + //trace:717 + span.innerHTML = ' '; + me.cloneRange().insertNode(span); + domUtils.scrollToView(span, win, offset); + domUtils.remove(span); + return me; + }, + + /** + * 判断当前选区内容是否占位符 + * @private + * @method inFillChar + * @return { Boolean } 如果是占位符返回true,否则返回false + */ + inFillChar : function(){ + var start = this.startContainer; + if(this.collapsed && start.nodeType == 3 + && start.nodeValue.replace(new RegExp('^' + domUtils.fillChar),'').length + 1 == start.nodeValue.length + ){ + return true; + } + return false; + }, + + /** + * 保存 + * @method createAddress + * @private + * @return { Boolean } 返回开始和结束的位置 + * @example + * ```html + * + *

+ * aaaa + * + * + * bbbb + * + * + *

+ * + * + * + * ``` + */ + createAddress : function(ignoreEnd,ignoreTxt){ + var addr = {},me = this; + + function getAddress(isStart){ + var node = isStart ? me.startContainer : me.endContainer; + var parents = domUtils.findParents(node,true,function(node){return !domUtils.isBody(node)}), + addrs = []; + for(var i = 0,ci;ci = parents[i++];){ + addrs.push(domUtils.getNodeIndex(ci,ignoreTxt)); + } + var firstIndex = 0; + + if(ignoreTxt){ + if(node.nodeType == 3){ + var tmpNode = node.previousSibling; + while(tmpNode && tmpNode.nodeType == 3){ + firstIndex += tmpNode.nodeValue.replace(fillCharReg,'').length; + tmpNode = tmpNode.previousSibling; + } + firstIndex += (isStart ? me.startOffset : me.endOffset)// - (fillCharReg.test(node.nodeValue) ? 1 : 0 ) + }else{ + node = node.childNodes[ isStart ? me.startOffset : me.endOffset]; + if(node){ + firstIndex = domUtils.getNodeIndex(node,ignoreTxt); + }else{ + node = isStart ? me.startContainer : me.endContainer; + var first = node.firstChild; + while(first){ + if(domUtils.isFillChar(first)){ + first = first.nextSibling; + continue; + } + firstIndex++; + if(first.nodeType == 3){ + while( first && first.nodeType == 3){ + first = first.nextSibling; + } + }else{ + first = first.nextSibling; + } + } + } + } + + }else{ + firstIndex = isStart ? domUtils.isFillChar(node) ? 0 : me.startOffset : me.endOffset + } + if(firstIndex < 0){ + firstIndex = 0; + } + addrs.push(firstIndex); + return addrs; + } + addr.startAddress = getAddress(true); + if(!ignoreEnd){ + addr.endAddress = me.collapsed ? [].concat(addr.startAddress) : getAddress(); + } + return addr; + }, + + /** + * 保存 + * @method createAddress + * @private + * @return { Boolean } 返回开始和结束的位置 + * @example + * ```html + * + *

+ * aaaa + * + * + * bbbb + * + * + *

+ * + * + * + * ``` + */ + moveToAddress : function(addr,ignoreEnd){ + var me = this; + function getNode(address,isStart){ + var tmpNode = me.document.body, + parentNode,offset; + for(var i= 0,ci,l=address.length;i + * + * + * + * + * + * + * + * + * ``` + */ + + /** + * 遍历range内的节点。 + * 每当遍历一个节点时, 都会执行参数项 doFn 指定的函数, 该函数的接受当前遍历的节点 + * 作为其参数。 + * 可以通过参数项 filterFn 来指定一个过滤器, 只有符合该过滤器过滤规则的节点才会触 + * 发doFn函数的执行 + * @method traversal + * @param { Function } doFn 对每个遍历的节点要执行的方法, 该方法接受当前遍历的节点作为其参数 + * @param { Function } filterFn 过滤器, 该函数接受当前遍历的节点作为参数, 如果该节点满足过滤 + * 规则, 请返回true, 该节点会触发doFn, 否则, 请返回false, 则该节点不 + * 会触发doFn。 + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:traversal(Function) + * @example + * ```html + * + * + * + * + * + * + * + * + * + * + * ``` + */ + traversal:function(doFn,filterFn){ + if (this.collapsed) + return this; + var bookmark = this.createBookmark(), + end = bookmark.end, + current = domUtils.getNextDomNode(bookmark.start, false, filterFn); + while (current && current !== end && (domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING)) { + var tmpNode = domUtils.getNextDomNode(current,false,filterFn); + doFn(current); + current = tmpNode; + } + return this.moveToBookmark(bookmark); + } + }; +})(); + +// core/Selection.js +/** + * 选集 + * @file + * @module UE.dom + * @class Selection + * @since 1.2.6.1 + */ + +/** + * 选区集合 + * @unfile + * @module UE.dom + * @class Selection + */ +(function () { + + function getBoundaryInformation( range, start ) { + var getIndex = domUtils.getNodeIndex; + range = range.duplicate(); + range.collapse( start ); + var parent = range.parentElement(); + //如果节点里没有子节点,直接退出 + if ( !parent.hasChildNodes() ) { + return {container:parent, offset:0}; + } + var siblings = parent.children, + child, + testRange = range.duplicate(), + startIndex = 0, endIndex = siblings.length - 1, index = -1, + distance; + while ( startIndex <= endIndex ) { + index = Math.floor( (startIndex + endIndex) / 2 ); + child = siblings[index]; + testRange.moveToElementText( child ); + var position = testRange.compareEndPoints( 'StartToStart', range ); + if ( position > 0 ) { + endIndex = index - 1; + } else if ( position < 0 ) { + startIndex = index + 1; + } else { + //trace:1043 + return {container:parent, offset:getIndex( child )}; + } + } + if ( index == -1 ) { + testRange.moveToElementText( parent ); + testRange.setEndPoint( 'StartToStart', range ); + distance = testRange.text.replace( /(\r\n|\r)/g, '\n' ).length; + siblings = parent.childNodes; + if ( !distance ) { + child = siblings[siblings.length - 1]; + return {container:child, offset:child.nodeValue.length}; + } + + var i = siblings.length; + while ( distance > 0 ){ + distance -= siblings[ --i ].nodeValue.length; + } + return {container:siblings[i], offset:-distance}; + } + testRange.collapse( position > 0 ); + testRange.setEndPoint( position > 0 ? 'StartToStart' : 'EndToStart', range ); + distance = testRange.text.replace( /(\r\n|\r)/g, '\n' ).length; + if ( !distance ) { + return dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName] ? + {container:parent, offset:getIndex( child ) + (position > 0 ? 0 : 1)} : + {container:child, offset:position > 0 ? 0 : child.childNodes.length} + } + while ( distance > 0 ) { + try { + var pre = child; + child = child[position > 0 ? 'previousSibling' : 'nextSibling']; + distance -= child.nodeValue.length; + } catch ( e ) { + return {container:parent, offset:getIndex( pre )}; + } + } + return {container:child, offset:position > 0 ? -distance : child.nodeValue.length + distance} + } + + /** + * 将ieRange转换为Range对象 + * @param {Range} ieRange ieRange对象 + * @param {Range} range Range对象 + * @return {Range} range 返回转换后的Range对象 + */ + function transformIERangeToRange( ieRange, range ) { + if ( ieRange.item ) { + range.selectNode( ieRange.item( 0 ) ); + } else { + var bi = getBoundaryInformation( ieRange, true ); + range.setStart( bi.container, bi.offset ); + if ( ieRange.compareEndPoints( 'StartToEnd', ieRange ) != 0 ) { + bi = getBoundaryInformation( ieRange, false ); + range.setEnd( bi.container, bi.offset ); + } + } + return range; + } + + /** + * 获得ieRange + * @param {Selection} sel Selection对象 + * @return {ieRange} 得到ieRange + */ + function _getIERange( sel ) { + var ieRange; + //ie下有可能报错 + try { + ieRange = sel.getNative().createRange(); + } catch ( e ) { + return null; + } + var el = ieRange.item ? ieRange.item( 0 ) : ieRange.parentElement(); + if ( ( el.ownerDocument || el ) === sel.document ) { + return ieRange; + } + return null; + } + + var Selection = dom.Selection = function ( doc ) { + var me = this, iframe; + me.document = doc; + if ( browser.ie9below ) { + iframe = domUtils.getWindow( doc ).frameElement; + domUtils.on( iframe, 'beforedeactivate', function () { + me._bakIERange = me.getIERange(); + } ); + domUtils.on( iframe, 'activate', function () { + try { + if ( !_getIERange( me ) && me._bakIERange ) { + me._bakIERange.select(); + } + } catch ( ex ) { + } + me._bakIERange = null; + } ); + } + iframe = doc = null; + }; + + Selection.prototype = { + + rangeInBody : function(rng,txtRange){ + var node = browser.ie9below || txtRange ? rng.item ? rng.item() : rng.parentElement() : rng.startContainer; + + return node === this.document.body || domUtils.inDoc(node,this.document); + }, + + /** + * 获取原生seleciton对象 + * @method getNative + * @return { Object } 获得selection对象 + * @example + * ```javascript + * editor.selection.getNative(); + * ``` + */ + getNative:function () { + var doc = this.document; + try { + return !doc ? null : browser.ie9below ? doc.selection : domUtils.getWindow( doc ).getSelection(); + } catch ( e ) { + return null; + } + }, + + /** + * 获得ieRange + * @method getIERange + * @return { Object } 返回ie原生的Range + * @example + * ```javascript + * editor.selection.getIERange(); + * ``` + */ + getIERange:function () { + var ieRange = _getIERange( this ); + if ( !ieRange ) { + if ( this._bakIERange ) { + return this._bakIERange; + } + } + return ieRange; + }, + + /** + * 缓存当前选区的range和选区的开始节点 + * @method cache + */ + cache:function () { + this.clear(); + this._cachedRange = this.getRange(); + this._cachedStartElement = this.getStart(); + this._cachedStartElementPath = this.getStartElementPath(); + }, + + /** + * 获取选区开始位置的父节点到body + * @method getStartElementPath + * @return { Array } 返回父节点集合 + * @example + * ```javascript + * editor.selection.getStartElementPath(); + * ``` + */ + getStartElementPath:function () { + if ( this._cachedStartElementPath ) { + return this._cachedStartElementPath; + } + var start = this.getStart(); + if ( start ) { + return domUtils.findParents( start, true, null, true ) + } + return []; + }, + + /** + * 清空缓存 + * @method clear + */ + clear:function () { + this._cachedStartElementPath = this._cachedRange = this._cachedStartElement = null; + }, + + /** + * 编辑器是否得到了选区 + * @method isFocus + */ + isFocus:function () { + try { + if(browser.ie9below){ + + var nativeRange = _getIERange(this); + return !!(nativeRange && this.rangeInBody(nativeRange)); + }else{ + return !!this.getNative().rangeCount; + } + } catch ( e ) { + return false; + } + + }, + + /** + * 获取选区对应的Range + * @method getRange + * @return { Object } 得到Range对象 + * @example + * ```javascript + * editor.selection.getRange(); + * ``` + */ + getRange:function () { + var me = this; + function optimze( range ) { + var child = me.document.body.firstChild, + collapsed = range.collapsed; + while ( child && child.firstChild ) { + range.setStart( child, 0 ); + child = child.firstChild; + } + if ( !range.startContainer ) { + range.setStart( me.document.body, 0 ) + } + if ( collapsed ) { + range.collapse( true ); + } + } + + if ( me._cachedRange != null ) { + return this._cachedRange; + } + var range = new baidu.editor.dom.Range( me.document ); + + if ( browser.ie9below ) { + var nativeRange = me.getIERange(); + if ( nativeRange ) { + //备份的_bakIERange可能已经实效了,dom树发生了变化比如从源码模式切回来,所以try一下,实效就放到body开始位置 + try{ + transformIERangeToRange( nativeRange, range ); + }catch(e){ + optimze( range ); + } + + } else { + optimze( range ); + } + } else { + var sel = me.getNative(); + if ( sel && sel.rangeCount ) { + var firstRange = sel.getRangeAt( 0 ); + var lastRange = sel.getRangeAt( sel.rangeCount - 1 ); + range.setStart( firstRange.startContainer, firstRange.startOffset ).setEnd( lastRange.endContainer, lastRange.endOffset ); + if ( range.collapsed && domUtils.isBody( range.startContainer ) && !range.startOffset ) { + optimze( range ); + } + } else { + //trace:1734 有可能已经不在dom树上了,标识的节点 + if ( this._bakRange && domUtils.inDoc( this._bakRange.startContainer, this.document ) ){ + return this._bakRange; + } + optimze( range ); + } + } + return this._bakRange = range; + }, + + /** + * 获取开始元素,用于状态反射 + * @method getStart + * @return { Element } 获得开始元素 + * @example + * ```javascript + * editor.selection.getStart(); + * ``` + */ + getStart:function () { + if ( this._cachedStartElement ) { + return this._cachedStartElement; + } + var range = browser.ie9below ? this.getIERange() : this.getRange(), + tmpRange, + start, tmp, parent; + if ( browser.ie9below ) { + if ( !range ) { + //todo 给第一个值可能会有问题 + return this.document.body.firstChild; + } + //control元素 + if ( range.item ){ + return range.item( 0 ); + } + tmpRange = range.duplicate(); + //修正ie下x[xx] 闭合后 x|xx + tmpRange.text.length > 0 && tmpRange.moveStart( 'character', 1 ); + tmpRange.collapse( 1 ); + start = tmpRange.parentElement(); + parent = tmp = range.parentElement(); + while ( tmp = tmp.parentNode ) { + if ( tmp == start ) { + start = parent; + break; + } + } + } else { + range.shrinkBoundary(); + start = range.startContainer; + if ( start.nodeType == 1 && start.hasChildNodes() ){ + start = start.childNodes[Math.min( start.childNodes.length - 1, range.startOffset )]; + } + if ( start.nodeType == 3 ){ + return start.parentNode; + } + } + return start; + }, + + /** + * 得到选区中的文本 + * @method getText + * @return { String } 选区中包含的文本 + * @example + * ```javascript + * editor.selection.getText(); + * ``` + */ + getText:function () { + var nativeSel, nativeRange; + if ( this.isFocus() && (nativeSel = this.getNative()) ) { + nativeRange = browser.ie9below ? nativeSel.createRange() : nativeSel.getRangeAt( 0 ); + return browser.ie9below ? nativeRange.text : nativeRange.toString(); + } + return ''; + }, + + /** + * 清除选区 + * @method clearRange + * @example + * ```javascript + * editor.selection.clearRange(); + * ``` + */ + clearRange : function(){ + this.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges'](); + } + }; +})(); + +// core/Editor.js +/** + * 编辑器主类,包含编辑器提供的大部分公用接口 + * @file + * @module UE + * @class Editor + * @since 1.2.6.1 + */ + +/** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @unfile + * @module UE + */ + +/** + * UEditor的核心类,为用户提供与编辑器交互的接口。 + * @unfile + * @module UE + * @class Editor + */ + +(function () { + var uid = 0, _selectionChangeTimer; + + /** + * 获取编辑器的html内容,赋值到编辑器所在表单的textarea文本域里面 + * @private + * @method setValue + * @param { UE.Editor } editor 编辑器事例 + */ + function setValue(form, editor) { + var textarea; + if (editor.textarea) { + if (utils.isString(editor.textarea)) { + for (var i = 0, ti, tis = domUtils.getElementsByTagName(form, 'textarea'); ti = tis[i++];) { + if (ti.id == 'ueditor_textarea_' + editor.options.textarea) { + textarea = ti; + break; + } + } + } else { + textarea = editor.textarea; + } + } + if (!textarea) { + form.appendChild(textarea = domUtils.createElement(document, 'textarea', { + 'name': editor.options.textarea, + 'id': 'ueditor_textarea_' + editor.options.textarea, + 'style': "display:none" + })); + //不要产生多个textarea + editor.textarea = textarea; + } + !textarea.getAttribute('name') && textarea.setAttribute('name', editor.options.textarea ); + textarea.value = editor.hasContents() ? + (editor.options.allHtmlEnabled ? editor.getAllHtml() : editor.getContent(null, null, true)) : + '' + } + function loadPlugins(me){ + //初始化插件 + for (var pi in UE.plugins) { + UE.plugins[pi].call(me); + } + + } + function checkCurLang(I18N){ + for(var lang in I18N){ + return lang + } + } + + function langReadied(me){ + me.langIsReady = true; + + me.fireEvent("langReady"); + } + + /** + * 编辑器准备就绪后会触发该事件 + * @module UE + * @class Editor + * @event ready + * @remind render方法执行完成之后,会触发该事件 + * @remind + * @example + * ```javascript + * editor.addListener( 'ready', function( editor ) { + * editor.execCommand( 'focus' ); //编辑器家在完成后,让编辑器拿到焦点 + * } ); + * ``` + */ + /** + * 执行destroy方法,会触发该事件 + * @module UE + * @class Editor + * @event destroy + * @see UE.Editor:destroy() + */ + /** + * 执行reset方法,会触发该事件 + * @module UE + * @class Editor + * @event reset + * @see UE.Editor:reset() + */ + /** + * 执行focus方法,会触发该事件 + * @module UE + * @class Editor + * @event focus + * @see UE.Editor:focus(Boolean) + */ + /** + * 语言加载完成会触发该事件 + * @module UE + * @class Editor + * @event langReady + */ + /** + * 运行命令之后会触发该命令 + * @module UE + * @class Editor + * @event beforeExecCommand + */ + /** + * 运行命令之后会触发该命令 + * @module UE + * @class Editor + * @event afterExecCommand + */ + /** + * 运行命令之前会触发该命令 + * @module UE + * @class Editor + * @event firstBeforeExecCommand + */ + /** + * 在getContent方法执行之前会触发该事件 + * @module UE + * @class Editor + * @event beforeGetContent + * @see UE.Editor:getContent() + */ + /** + * 在getContent方法执行之后会触发该事件 + * @module UE + * @class Editor + * @event afterGetContent + * @see UE.Editor:getContent() + */ + /** + * 在getAllHtml方法执行时会触发该事件 + * @module UE + * @class Editor + * @event getAllHtml + * @see UE.Editor:getAllHtml() + */ + /** + * 在setContent方法执行之前会触发该事件 + * @module UE + * @class Editor + * @event beforeSetContent + * @see UE.Editor:setContent(String) + */ + /** + * 在setContent方法执行之后会触发该事件 + * @module UE + * @class Editor + * @event afterSetContent + * @see UE.Editor:setContent(String) + */ + /** + * 每当编辑器内部选区发生改变时,将触发该事件 + * @event selectionchange + * @warning 该事件的触发非常频繁,不建议在该事件的处理过程中做重量级的处理 + * @example + * ```javascript + * editor.addListener( 'selectionchange', function( editor ) { + * console.log('选区发生改变'); + * } + */ + /** + * 在所有selectionchange的监听函数执行之前,会触发该事件 + * @module UE + * @class Editor + * @event beforeSelectionChange + * @see UE.Editor:selectionchange + */ + /** + * 在所有selectionchange的监听函数执行完之后,会触发该事件 + * @module UE + * @class Editor + * @event afterSelectionChange + * @see UE.Editor:selectionchange + */ + /** + * 编辑器内容发生改变时会触发该事件 + * @module UE + * @class Editor + * @event contentChange + */ + + + /** + * 以默认参数构建一个编辑器实例 + * @constructor + * @remind 通过 改构造方法实例化的编辑器,不带ui层.需要render到一个容器,编辑器实例才能正常渲染到页面 + * @example + * ```javascript + * var editor = new UE.Editor(); + * editor.execCommand('blod'); + * ``` + * @see UE.Config + */ + + /** + * 以给定的参数集合创建一个编辑器实例,对于未指定的参数,将应用默认参数。 + * @constructor + * @remind 通过 改构造方法实例化的编辑器,不带ui层.需要render到一个容器,编辑器实例才能正常渲染到页面 + * @param { Object } setting 创建编辑器的参数 + * @example + * ```javascript + * var editor = new UE.Editor(); + * editor.execCommand('blod'); + * ``` + * @see UE.Config + */ + var Editor = UE.Editor = function (options) { + var me = this; + me.uid = uid++; + EventBase.call(me); + me.commands = {}; + me.options = utils.extend(utils.clone(options || {}), UEDITOR_CONFIG, true); + me.shortcutkeys = {}; + me.inputRules = []; + me.outputRules = []; + //设置默认的常用属性 + me.setOpt(Editor.defaultOptions(me)); + + /* 尝试异步加载后台配置 */ + me.loadServerConfig(); + + if(!utils.isEmptyObject(UE.I18N)){ + //修改默认的语言类型 + me.options.lang = checkCurLang(UE.I18N); + UE.plugin.load(me); + langReadied(me); + + }else{ + utils.loadFile(document, { + src: me.options.langPath + me.options.lang + "/" + me.options.lang + ".js", + tag: "script", + type: "text/javascript", + defer: "defer" + }, function () { + UE.plugin.load(me); + langReadied(me); + }); + } + + UE.instants['ueditorInstant' + me.uid] = me; + }; + Editor.prototype = { + registerCommand : function(name,obj){ + this.commands[name] = obj; + }, + /** + * 编辑器对外提供的监听ready事件的接口, 通过调用该方法,达到的效果与监听ready事件是一致的 + * @method ready + * @param { Function } fn 编辑器ready之后所执行的回调, 如果在注册事件之前编辑器已经ready,将会 + * 立即触发该回调。 + * @remind 需要等待编辑器加载完成后才能执行的代码,可以使用该方法传入 + * @example + * ```javascript + * editor.ready( function( editor ) { + * editor.setContent('初始化完毕'); + * } ); + * ``` + * @see UE.Editor.event:ready + */ + ready: function (fn) { + var me = this; + if (fn) { + me.isReady ? fn.apply(me) : me.addListener('ready', fn); + } + }, + + /** + * 该方法是提供给插件里面使用,设置配置项默认值 + * @method setOpt + * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置 + * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用,其他地方不能调用。 + * @param { String } key 编辑器的可接受的选项名称 + * @param { * } val 该选项可接受的值 + * @example + * ```javascript + * editor.setOpt( 'initContent', '欢迎使用编辑器' ); + * ``` + */ + + /** + * 该方法是提供给插件里面使用,以{key:value}集合的方式设置插件内用到的配置项默认值 + * @method setOpt + * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置 + * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用,其他地方不能调用。 + * @param { Object } options 将要设置的选项的键值对对象 + * @example + * ```javascript + * editor.setOpt( { + * 'initContent': '欢迎使用编辑器' + * } ); + * ``` + */ + setOpt: function (key, val) { + var obj = {}; + if (utils.isString(key)) { + obj[key] = val + } else { + obj = key; + } + utils.extend(this.options, obj, true); + }, + getOpt:function(key){ + return this.options[key] + }, + /** + * 销毁编辑器实例,使用textarea代替 + * @method destroy + * @example + * ```javascript + * editor.destroy(); + * ``` + */ + destroy: function () { + + var me = this; + me.fireEvent('destroy'); + var container = me.container.parentNode; + var textarea = me.textarea; + if (!textarea) { + textarea = document.createElement('textarea'); + container.parentNode.insertBefore(textarea, container); + } else { + textarea.style.display = '' + } + + textarea.style.width = me.iframe.offsetWidth + 'px'; + textarea.style.height = me.iframe.offsetHeight + 'px'; + textarea.value = me.getContent(); + textarea.id = me.key; + container.innerHTML = ''; + domUtils.remove(container); + var key = me.key; + //trace:2004 + for (var p in me) { + if (me.hasOwnProperty(p)) { + delete this[p]; + } + } + UE.delEditor(key); + }, + + /** + * 渲染编辑器的DOM到指定容器 + * @method render + * @param { String } containerId 指定一个容器ID + * @remind 执行该方法,会触发ready事件 + * @warning 必须且只能调用一次 + */ + + /** + * 渲染编辑器的DOM到指定容器 + * @method render + * @param { Element } containerDom 直接指定容器对象 + * @remind 执行该方法,会触发ready事件 + * @warning 必须且只能调用一次 + */ + render: function (container) { + var me = this, + options = me.options, + getStyleValue=function(attr){ + return parseInt(domUtils.getComputedStyle(container,attr)); + }; + if (utils.isString(container)) { + container = document.getElementById(container); + } + if (container) { + if(options.initialFrameWidth){ + options.minFrameWidth = options.initialFrameWidth + }else{ + options.minFrameWidth = options.initialFrameWidth = container.offsetWidth; + } + if(options.initialFrameHeight){ + options.minFrameHeight = options.initialFrameHeight + }else{ + options.initialFrameHeight = options.minFrameHeight = container.offsetHeight; + } + + container.style.width = /%$/.test(options.initialFrameWidth) ? '100%' : options.initialFrameWidth- + getStyleValue("padding-left")- getStyleValue("padding-right") +'px'; + container.style.height = /%$/.test(options.initialFrameHeight) ? '100%' : options.initialFrameHeight - + getStyleValue("padding-top")- getStyleValue("padding-bottom") +'px'; + + container.style.zIndex = options.zIndex; + + var html = ( ie && browser.version < 9 ? '' : '') + + '' + + '' + + ( options.iframeCssUrl ? '' : '' ) + + (options.initialStyle ? '' : '') + + '' + + ''; + container.appendChild(domUtils.createElement(document, 'iframe', { + id: 'ueditor_' + me.uid, + width: "100%", + height: "100%", + frameborder: "0", + //先注释掉了,加的原因忘记了,但开启会直接导致全屏模式下内容多时不会出现滚动条 +// scrolling :'no', + src: 'javascript:void(function(){document.open();' + (options.customDomain && document.domain != location.hostname ? 'document.domain="' + document.domain + '";' : '') + + 'document.write("' + html + '");document.close();}())' + })); + container.style.overflow = 'hidden'; + //解决如果是给定的百分比,会导致高度算不对的问题 + setTimeout(function(){ + if( /%$/.test(options.initialFrameWidth)){ + options.minFrameWidth = options.initialFrameWidth = container.offsetWidth; + //如果这里给定宽度,会导致ie在拖动窗口大小时,编辑区域不随着变化 +// container.style.width = options.initialFrameWidth + 'px'; + } + if(/%$/.test(options.initialFrameHeight)){ + options.minFrameHeight = options.initialFrameHeight = container.offsetHeight; + container.style.height = options.initialFrameHeight + 'px'; + } + }) + } + }, + + /** + * 编辑器初始化 + * @method _setup + * @private + * @param { Element } doc 编辑器Iframe中的文档对象 + */ + _setup: function (doc) { + + var me = this, + options = me.options; + if (ie) { + doc.body.disabled = true; + doc.body.contentEditable = true; + doc.body.disabled = false; + } else { + doc.body.contentEditable = true; + } + doc.body.spellcheck = false; + me.document = doc; + me.window = doc.defaultView || doc.parentWindow; + me.iframe = me.window.frameElement; + me.body = doc.body; + me.selection = new dom.Selection(doc); + //gecko初始化就能得到range,无法判断isFocus了 + var geckoSel; + if (browser.gecko && (geckoSel = this.selection.getNative())) { + geckoSel.removeAllRanges(); + } + this._initEvents(); + //为form提交提供一个隐藏的textarea + for (var form = this.iframe.parentNode; !domUtils.isBody(form); form = form.parentNode) { + if (form.tagName == 'FORM') { + me.form = form; + if(me.options.autoSyncData){ + domUtils.on(me.window,'blur',function(){ + setValue(form,me); + }); + }else{ + domUtils.on(form, 'submit', function () { + setValue(this, me); + }); + } + break; + } + } + if (options.initialContent) { + if (options.autoClearinitialContent) { + var oldExecCommand = me.execCommand; + me.execCommand = function () { + me.fireEvent('firstBeforeExecCommand'); + return oldExecCommand.apply(me, arguments); + }; + this._setDefaultContent(options.initialContent); + } else + this.setContent(options.initialContent, false, true); + } + + //编辑器不能为空内容 + + if (domUtils.isEmptyNode(me.body)) { + me.body.innerHTML = '

' + (browser.ie ? '' : '
') + '

'; + } + //如果要求focus, 就把光标定位到内容开始 + if (options.focus) { + setTimeout(function () { + me.focus(me.options.focusInEnd); + //如果自动清除开着,就不需要做selectionchange; + !me.options.autoClearinitialContent && me._selectionChange(); + }, 0); + } + if (!me.container) { + me.container = this.iframe.parentNode; + } + if (options.fullscreen && me.ui) { + me.ui.setFullScreen(true); + } + + try { + me.document.execCommand('2D-position', false, false); + } catch (e) { + } + try { + me.document.execCommand('enableInlineTableEditing', false, false); + } catch (e) { + } + try { + me.document.execCommand('enableObjectResizing', false, false); + } catch (e) { + } + + //挂接快捷键 + me._bindshortcutKeys(); + me.isReady = 1; + me.fireEvent('ready'); + options.onready && options.onready.call(me); + if (!browser.ie9below) { + domUtils.on(me.window, ['blur', 'focus'], function (e) { + //chrome下会出现alt+tab切换时,导致选区位置不对 + if (e.type == 'blur') { + me._bakRange = me.selection.getRange(); + try { + me._bakNativeRange = me.selection.getNative().getRangeAt(0); + me.selection.getNative().removeAllRanges(); + } catch (e) { + me._bakNativeRange = null; + } + + } else { + try { + me._bakRange && me._bakRange.select(); + } catch (e) { + } + } + }); + } + //trace:1518 ff3.6body不够寛,会导致点击空白处无法获得焦点 + if (browser.gecko && browser.version <= 10902) { + //修复ff3.6初始化进来,不能点击获得焦点 + me.body.contentEditable = false; + setTimeout(function () { + me.body.contentEditable = true; + }, 100); + setInterval(function () { + me.body.style.height = me.iframe.offsetHeight - 20 + 'px' + }, 100) + } + + !options.isShow && me.setHide(); + options.readonly && me.setDisabled(); + }, + + /** + * 同步数据到编辑器所在的form + * 从编辑器的容器节点向上查找form元素,若找到,就同步编辑内容到找到的form里,为提交数据做准备,主要用于是手动提交的情况 + * 后台取得数据的键值,使用你容器上的name属性,如果没有就使用参数里的textarea项 + * @method sync + * @example + * ```javascript + * editor.sync(); + * form.sumbit(); //form变量已经指向了form元素 + * ``` + */ + + /** + * 根据传入的formId,在页面上查找要同步数据的表单,若找到,就同步编辑内容到找到的form里,为提交数据做准备 + * 后台取得数据的键值,该键值默认使用给定的编辑器容器的name属性,如果没有name属性则使用参数项里给定的“textarea”项 + * @method sync + * @param { String } formID 指定一个要同步数据的form的id,编辑器的数据会同步到你指定form下 + */ + sync: function (formId) { + var me = this, + form = formId ? document.getElementById(formId) : + domUtils.findParent(me.iframe.parentNode, function (node) { + return node.tagName == 'FORM' + }, true); + form && setValue(form, me); + }, + + /** + * 设置编辑器高度 + * @method setHeight + * @remind 当配置项autoHeightEnabled为真时,该方法无效 + * @param { Number } number 设置的高度值,纯数值,不带单位 + * @example + * ```javascript + * editor.setHeight(number); + * ``` + */ + setHeight: function (height,notSetHeight) { + if (height !== parseInt(this.iframe.parentNode.style.height)) { + this.iframe.parentNode.style.height = height + 'px'; + } + !notSetHeight && (this.options.minFrameHeight = this.options.initialFrameHeight = height); + this.body.style.height = height + 'px'; + !notSetHeight && this.trigger('setHeight') + }, + + /** + * 为编辑器的编辑命令提供快捷键 + * 这个接口是为插件扩展提供的接口,主要是为新添加的插件,如果需要添加快捷键,所提供的接口 + * @method addshortcutkey + * @param { Object } keyset 命令名和快捷键键值对对象,多个按钮的快捷键用“+”分隔 + * @example + * ```javascript + * editor.addshortcutkey({ + * "Bold" : "ctrl+66",//^B + * "Italic" : "ctrl+73", //^I + * }); + * ``` + */ + /** + * 这个接口是为插件扩展提供的接口,主要是为新添加的插件,如果需要添加快捷键,所提供的接口 + * @method addshortcutkey + * @param { String } cmd 触发快捷键时,响应的命令 + * @param { String } keys 快捷键的字符串,多个按钮用“+”分隔 + * @example + * ```javascript + * editor.addshortcutkey("Underline", "ctrl+85"); //^U + * ``` + */ + addshortcutkey: function (cmd, keys) { + var obj = {}; + if (keys) { + obj[cmd] = keys + } else { + obj = cmd; + } + utils.extend(this.shortcutkeys, obj) + }, + + /** + * 对编辑器设置keydown事件监听,绑定快捷键和命令,当快捷键组合触发成功,会响应对应的命令 + * @method _bindshortcutKeys + * @private + */ + _bindshortcutKeys: function () { + var me = this, shortcutkeys = this.shortcutkeys; + me.addListener('keydown', function (type, e) { + var keyCode = e.keyCode || e.which; + for (var i in shortcutkeys) { + var tmp = shortcutkeys[i].split(','); + for (var t = 0, ti; ti = tmp[t++];) { + ti = ti.split(':'); + var key = ti[0], param = ti[1]; + if (/^(ctrl)(\+shift)?\+(\d+)$/.test(key.toLowerCase()) || /^(\d+)$/.test(key)) { + if (( (RegExp.$1 == 'ctrl' ? (e.ctrlKey || e.metaKey) : 0) + && (RegExp.$2 != "" ? e[RegExp.$2.slice(1) + "Key"] : 1) + && keyCode == RegExp.$3 + ) || + keyCode == RegExp.$1 + ) { + if (me.queryCommandState(i,param) != -1) + me.execCommand(i, param); + domUtils.preventDefault(e); + } + } + } + + } + }); + }, + + /** + * 获取编辑器的内容 + * @method getContent + * @warning 该方法获取到的是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @return { String } 编辑器的内容字符串, 如果编辑器的内容为空,或者是空的标签内容(如:”<p><br/></p>“), 则返回空字符串 + * @example + * ```javascript + * //编辑器html内容:

123456

+ * var content = editor.getContent(); //返回值:

123456

+ * ``` + */ + + /** + * 获取编辑器的内容。 可以通过参数定义编辑器内置的判空规则 + * @method getContent + * @param { Function } fn 自定的判空规则, 要求该方法返回一个boolean类型的值, + * 代表当前编辑器的内容是否空, + * 如果返回true, 则该方法将直接返回空字符串;如果返回false,则编辑器将返回 + * 经过内置过滤规则处理后的内容。 + * @remind 该方法在处理包含有初始化内容的时候能起到很好的作用。 + * @warning 该方法获取到的是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @return { String } 编辑器的内容字符串 + * @example + * ```javascript + * // editor 是一个编辑器的实例 + * var content = editor.getContent( function ( editor ) { + * return editor.body.innerHTML === '欢迎使用UEditor'; //返回空字符串 + * } ); + * ``` + */ + getContent: function (cmd, fn,notSetCursor,ignoreBlank,formatter) { + var me = this; + if (cmd && utils.isFunction(cmd)) { + fn = cmd; + cmd = ''; + } + if (fn ? !fn() : !this.hasContents()) { + return ''; + } + me.fireEvent('beforegetcontent'); + var root = UE.htmlparser(me.body.innerHTML,ignoreBlank); + me.filterOutputRule(root); + me.fireEvent('aftergetcontent', cmd,root); + return root.toHtml(formatter); + }, + + /** + * 取得完整的html代码,可以直接显示成完整的html文档 + * @method getAllHtml + * @return { String } 编辑器的内容html文档字符串 + * @eaxmple + * ```javascript + * editor.getAllHtml(); //返回格式大致是: ...... + * ``` + */ + getAllHtml: function () { + var me = this, + headHtml = [], + html = ''; + me.fireEvent('getAllHtml', headHtml); + if (browser.ie && browser.version > 8) { + var headHtmlForIE9 = ''; + utils.each(me.document.styleSheets, function (si) { + headHtmlForIE9 += ( si.href ? '' : ''); + }); + utils.each(me.document.getElementsByTagName('script'), function (si) { + headHtmlForIE9 += si.outerHTML; + }); + + } + return '' + (me.options.charset ? '' : '') + + (headHtmlForIE9 || me.document.getElementsByTagName('head')[0].innerHTML) + headHtml.join('\n') + '' + + '' + me.getContent(null, null, true) + ''; + }, + + /** + * 得到编辑器的纯文本内容,但会保留段落格式 + * @method getPlainTxt + * @return { String } 编辑器带段落格式的纯文本内容字符串 + * @example + * ```javascript + * //编辑器html内容:

1

2

+ * console.log(editor.getPlainTxt()); //输出:"1\n2\n + * ``` + */ + getPlainTxt: function () { + var reg = new RegExp(domUtils.fillChar, 'g'), + html = this.body.innerHTML.replace(/[\n\r]/g, '');//ie要先去了\n在处理 + html = html.replace(/<(p|div)[^>]*>(| )<\/\1>/gi, '\n') + .replace(//gi, '\n') + .replace(/<[^>/]+>/g, '') + .replace(/(\n)?<\/([^>]+)>/g, function (a, b, c) { + return dtd.$block[c] ? '\n' : b ? b : ''; + }); + //取出来的空格会有c2a0会变成乱码,处理这种情况\u00a0 + return html.replace(reg, '').replace(/\u00a0/g, ' ').replace(/ /g, ' '); + }, + + /** + * 获取编辑器中的纯文本内容,没有段落格式 + * @method getContentTxt + * @return { String } 编辑器不带段落格式的纯文本内容字符串 + * @example + * ```javascript + * //编辑器html内容:

1

2

+ * console.log(editor.getPlainTxt()); //输出:"12 + * ``` + */ + getContentTxt: function () { + var reg = new RegExp(domUtils.fillChar, 'g'); + //取出来的空格会有c2a0会变成乱码,处理这种情况\u00a0 + return this.body[browser.ie ? 'innerText' : 'textContent'].replace(reg, '').replace(/\u00a0/g, ' '); + }, + + /** + * 设置编辑器的内容,可修改编辑器当前的html内容 + * @method setContent + * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @warning 该方法会触发selectionchange事件 + * @param { String } html 要插入的html内容 + * @example + * ```javascript + * editor.getContent('

test

'); + * ``` + */ + + /** + * 设置编辑器的内容,可修改编辑器当前的html内容 + * @method setContent + * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @warning 该方法会触发selectionchange事件 + * @param { String } html 要插入的html内容 + * @param { Boolean } isAppendTo 若传入true,不清空原来的内容,在最后插入内容,否则,清空内容再插入 + * @example + * ```javascript + * //假设设置前的编辑器内容是

old text

+ * editor.setContent('

new text

', true); //插入的结果是

old text

new text

+ * ``` + */ + setContent: function (html, isAppendTo, notFireSelectionchange) { + var me = this; + + me.fireEvent('beforesetcontent', html); + var root = UE.htmlparser(html); + me.filterInputRule(root); + html = root.toHtml(); + + me.body.innerHTML = (isAppendTo ? me.body.innerHTML : '') + html; + + + function isCdataDiv(node){ + return node.tagName == 'DIV' && node.getAttribute('cdata_tag'); + } + //给文本或者inline节点套p标签 + if (me.options.enterTag == 'p') { + + var child = this.body.firstChild, tmpNode; + if (!child || child.nodeType == 1 && + (dtd.$cdata[child.tagName] || isCdataDiv(child) || + domUtils.isCustomeNode(child) + ) + && child === this.body.lastChild) { + this.body.innerHTML = '

' + (browser.ie ? ' ' : '
') + '

' + this.body.innerHTML; + + } else { + var p = me.document.createElement('p'); + while (child) { + while (child && (child.nodeType == 3 || child.nodeType == 1 && dtd.p[child.tagName] && !dtd.$cdata[child.tagName])) { + tmpNode = child.nextSibling; + p.appendChild(child); + child = tmpNode; + } + if (p.firstChild) { + if (!child) { + me.body.appendChild(p); + break; + } else { + child.parentNode.insertBefore(p, child); + p = me.document.createElement('p'); + } + } + child = child.nextSibling; + } + } + } + me.fireEvent('aftersetcontent'); + me.fireEvent('contentchange'); + + !notFireSelectionchange && me._selectionChange(); + //清除保存的选区 + me._bakRange = me._bakIERange = me._bakNativeRange = null; + //trace:1742 setContent后gecko能得到焦点问题 + var geckoSel; + if (browser.gecko && (geckoSel = this.selection.getNative())) { + geckoSel.removeAllRanges(); + } + if(me.options.autoSyncData){ + me.form && setValue(me.form,me); + } + }, + + /** + * 让编辑器获得焦点,默认focus到编辑器头部 + * @method focus + * @example + * ```javascript + * editor.focus() + * ``` + */ + + /** + * 让编辑器获得焦点,toEnd确定focus位置 + * @method focus + * @param { Boolean } toEnd 默认focus到编辑器头部,toEnd为true时focus到内容尾部 + * @example + * ```javascript + * editor.focus(true) + * ``` + */ + focus: function (toEnd) { + try { + var me = this, + rng = me.selection.getRange(); + if (toEnd) { + var node = me.body.lastChild; + if(node && node.nodeType == 1 && !dtd.$empty[node.tagName]){ + if(domUtils.isEmptyBlock(node)){ + rng.setStartAtFirst(node) + }else{ + rng.setStartAtLast(node) + } + rng.collapse(true); + } + rng.setCursor(true); + } else { + if(!rng.collapsed && domUtils.isBody(rng.startContainer) && rng.startOffset == 0){ + + var node = me.body.firstChild; + if(node && node.nodeType == 1 && !dtd.$empty[node.tagName]){ + rng.setStartAtFirst(node).collapse(true); + } + } + + rng.select(true); + + } + this.fireEvent('focus selectionchange'); + } catch (e) { + } + + }, + isFocus:function(){ + return this.selection.isFocus(); + }, + blur:function(){ + var sel = this.selection.getNative(); + if(sel.empty && browser.ie){ + var nativeRng = document.body.createTextRange(); + nativeRng.moveToElementText(document.body); + nativeRng.collapse(true); + nativeRng.select(); + sel.empty() + }else{ + sel.removeAllRanges() + } + + //this.fireEvent('blur selectionchange'); + }, + /** + * 初始化UE事件及部分事件代理 + * @method _initEvents + * @private + */ + _initEvents: function () { + var me = this, + doc = me.document, + win = me.window; + me._proxyDomEvent = utils.bind(me._proxyDomEvent, me); + domUtils.on(doc, ['click', 'contextmenu', 'mousedown', 'keydown', 'keyup', 'keypress', 'mouseup', 'mouseover', 'mouseout', 'selectstart'], me._proxyDomEvent); + domUtils.on(win, ['focus', 'blur'], me._proxyDomEvent); + domUtils.on(me.body,'drop',function(e){ + //阻止ff下默认的弹出新页面打开图片 + if(browser.gecko && e.stopPropagation) { e.stopPropagation(); } + me.fireEvent('contentchange') + }); + domUtils.on(doc, ['mouseup', 'keydown'], function (evt) { + //特殊键不触发selectionchange + if (evt.type == 'keydown' && (evt.ctrlKey || evt.metaKey || evt.shiftKey || evt.altKey)) { + return; + } + if (evt.button == 2)return; + me._selectionChange(250, evt); + }); + }, + /** + * 触发事件代理 + * @method _proxyDomEvent + * @private + * @return { * } fireEvent的返回值 + * @see UE.EventBase:fireEvent(String) + */ + _proxyDomEvent: function (evt) { + if(this.fireEvent('before' + evt.type.replace(/^on/, '').toLowerCase()) === false){ + return false; + } + if(this.fireEvent(evt.type.replace(/^on/, ''), evt) === false){ + return false; + } + return this.fireEvent('after' + evt.type.replace(/^on/, '').toLowerCase()) + }, + /** + * 变化选区 + * @method _selectionChange + * @private + */ + _selectionChange: function (delay, evt) { + var me = this; + //有光标才做selectionchange 为了解决未focus时点击source不能触发更改工具栏状态的问题(source命令notNeedUndo=1) +// if ( !me.selection.isFocus() ){ +// return; +// } + + + var hackForMouseUp = false; + var mouseX, mouseY; + if (browser.ie && browser.version < 9 && evt && evt.type == 'mouseup') { + var range = this.selection.getRange(); + if (!range.collapsed) { + hackForMouseUp = true; + mouseX = evt.clientX; + mouseY = evt.clientY; + } + } + clearTimeout(_selectionChangeTimer); + _selectionChangeTimer = setTimeout(function () { + if (!me.selection || !me.selection.getNative()) { + return; + } + //修复一个IE下的bug: 鼠标点击一段已选择的文本中间时,可能在mouseup后的一段时间内取到的range是在selection的type为None下的错误值. + //IE下如果用户是拖拽一段已选择文本,则不会触发mouseup事件,所以这里的特殊处理不会对其有影响 + var ieRange; + if (hackForMouseUp && me.selection.getNative().type == 'None') { + ieRange = me.document.body.createTextRange(); + try { + ieRange.moveToPoint(mouseX, mouseY); + } catch (ex) { + ieRange = null; + } + } + var bakGetIERange; + if (ieRange) { + bakGetIERange = me.selection.getIERange; + me.selection.getIERange = function () { + return ieRange; + }; + } + me.selection.cache(); + if (bakGetIERange) { + me.selection.getIERange = bakGetIERange; + } + if (me.selection._cachedRange && me.selection._cachedStartElement) { + me.fireEvent('beforeselectionchange'); + // 第二个参数causeByUi为true代表由用户交互造成的selectionchange. + me.fireEvent('selectionchange', !!evt); + me.fireEvent('afterselectionchange'); + me.selection.clear(); + } + }, delay || 50); + }, + + /** + * 执行编辑命令 + * @method _callCmdFn + * @private + * @param { String } fnName 函数名称 + * @param { * } args 传给命令函数的参数 + * @return { * } 返回命令函数运行的返回值 + */ + _callCmdFn: function (fnName, args) { + var cmdName = args[0].toLowerCase(), + cmd, cmdFn; + cmd = this.commands[cmdName] || UE.commands[cmdName]; + cmdFn = cmd && cmd[fnName]; + //没有querycommandstate或者没有command的都默认返回0 + if ((!cmd || !cmdFn) && fnName == 'queryCommandState') { + return 0; + } else if (cmdFn) { + return cmdFn.apply(this, args); + } + }, + + /** + * 执行编辑命令cmdName,完成富文本编辑效果 + * @method execCommand + * @param { String } cmdName 需要执行的命令 + * @remind 具体命令的使用请参考命令列表 + * @return { * } 返回命令函数运行的返回值 + * @example + * ```javascript + * editor.execCommand(cmdName); + * ``` + */ + execCommand: function (cmdName) { + cmdName = cmdName.toLowerCase(); + var me = this, + result, + cmd = me.commands[cmdName] || UE.commands[cmdName]; + if (!cmd || !cmd.execCommand) { + return null; + } + if (!cmd.notNeedUndo && !me.__hasEnterExecCommand) { + me.__hasEnterExecCommand = true; + if (me.queryCommandState.apply(me,arguments) != -1) { + me.fireEvent('saveScene'); + me.fireEvent.apply(me, ['beforeexeccommand', cmdName].concat(arguments)); + result = this._callCmdFn('execCommand', arguments); + //保存场景时,做了内容对比,再看是否进行contentchange触发,这里多触发了一次,去掉 +// (!cmd.ignoreContentChange && !me._ignoreContentChange) && me.fireEvent('contentchange'); + me.fireEvent.apply(me, ['afterexeccommand', cmdName].concat(arguments)); + me.fireEvent('saveScene'); + } + me.__hasEnterExecCommand = false; + } else { + result = this._callCmdFn('execCommand', arguments); + (!me.__hasEnterExecCommand && !cmd.ignoreContentChange && !me._ignoreContentChange) && me.fireEvent('contentchange') + } + (!me.__hasEnterExecCommand && !cmd.ignoreContentChange && !me._ignoreContentChange) && me._selectionChange(); + return result; + }, + + /** + * 根据传入的command命令,查选编辑器当前的选区,返回命令的状态 + * @method queryCommandState + * @param { String } cmdName 需要查询的命令名称 + * @remind 具体命令的使用请参考命令列表 + * @return { Number } number 返回放前命令的状态,返回值三种情况:(-1|0|1) + * @example + * ```javascript + * editor.queryCommandState(cmdName) => (-1|0|1) + * ``` + * @see COMMAND.LIST + */ + queryCommandState: function (cmdName) { + return this._callCmdFn('queryCommandState', arguments); + }, + + /** + * 根据传入的command命令,查选编辑器当前的选区,根据命令返回相关的值 + * @method queryCommandValue + * @param { String } cmdName 需要查询的命令名称 + * @remind 具体命令的使用请参考命令列表 + * @remind 只有部分插件有此方法 + * @return { * } 返回每个命令特定的当前状态值 + * @grammar editor.queryCommandValue(cmdName) => {*} + * @see COMMAND.LIST + */ + queryCommandValue: function (cmdName) { + return this._callCmdFn('queryCommandValue', arguments); + }, + + /** + * 检查编辑区域中是否有内容 + * @method hasContents + * @remind 默认有文本内容,或者有以下节点都不认为是空 + * table,ul,ol,dl,iframe,area,base,col,hr,img,embed,input,link,meta,param + * @return { Boolean } 检查有内容返回true,否则返回false + * @example + * ```javascript + * editor.hasContents() + * ``` + */ + + /** + * 检查编辑区域中是否有内容,若包含参数tags中的节点类型,直接返回true + * @method hasContents + * @param { Array } tags 传入数组判断时用到的节点类型 + * @return { Boolean } 若文档中包含tags数组里对应的tag,返回true,否则返回false + * @example + * ```javascript + * editor.hasContents(['span']); + * ``` + */ + hasContents: function (tags) { + if (tags) { + for (var i = 0, ci; ci = tags[i++];) { + if (this.document.getElementsByTagName(ci).length > 0) { + return true; + } + } + } + if (!domUtils.isEmptyBlock(this.body)) { + return true + } + //随时添加,定义的特殊标签如果存在,不能认为是空 + tags = ['div']; + for (i = 0; ci = tags[i++];) { + var nodes = domUtils.getElementsByTagName(this.document, ci); + for (var n = 0, cn; cn = nodes[n++];) { + if (domUtils.isCustomeNode(cn)) { + return true; + } + } + } + return false; + }, + + /** + * 重置编辑器,可用来做多个tab使用同一个编辑器实例 + * @method reset + * @remind 此方法会清空编辑器内容,清空回退列表,会触发reset事件 + * @example + * ```javascript + * editor.reset() + * ``` + */ + reset: function () { + this.fireEvent('reset'); + }, + + /** + * 设置当前编辑区域可以编辑 + * @method setEnabled + * @example + * ```javascript + * editor.setEnabled() + * ``` + */ + setEnabled: function () { + var me = this, range; + if (me.body.contentEditable == 'false') { + me.body.contentEditable = true; + range = me.selection.getRange(); + //有可能内容丢失了 + try { + range.moveToBookmark(me.lastBk); + delete me.lastBk + } catch (e) { + range.setStartAtFirst(me.body).collapse(true) + } + range.select(true); + if (me.bkqueryCommandState) { + me.queryCommandState = me.bkqueryCommandState; + delete me.bkqueryCommandState; + } + if (me.bkqueryCommandValue) { + me.queryCommandValue = me.bkqueryCommandValue; + delete me.bkqueryCommandValue; + } + me.fireEvent('selectionchange'); + } + }, + enable: function () { + return this.setEnabled(); + }, + + /** 设置当前编辑区域不可编辑 + * @method setDisabled + */ + + /** 设置当前编辑区域不可编辑,except中的命令除外 + * @method setDisabled + * @param { String } except 例外命令的字符串 + * @remind 即使设置了disable,此处配置的例外命令仍然可以执行 + * @example + * ```javascript + * editor.setDisabled('bold'); //禁用工具栏中除加粗之外的所有功能 + * ``` + */ + + /** 设置当前编辑区域不可编辑,except中的命令除外 + * @method setDisabled + * @param { Array } except 例外命令的字符串数组,数组中的命令仍然可以执行 + * @remind 即使设置了disable,此处配置的例外命令仍然可以执行 + * @example + * ```javascript + * editor.setDisabled(['bold','insertimage']); //禁用工具栏中除加粗和插入图片之外的所有功能 + * ``` + */ + setDisabled: function (except) { + var me = this; + except = except ? utils.isArray(except) ? except : [except] : []; + if (me.body.contentEditable == 'true') { + if (!me.lastBk) { + me.lastBk = me.selection.getRange().createBookmark(true); + } + me.body.contentEditable = false; + me.bkqueryCommandState = me.queryCommandState; + me.bkqueryCommandValue = me.queryCommandValue; + me.queryCommandState = function (type) { + if (utils.indexOf(except, type) != -1) { + return me.bkqueryCommandState.apply(me, arguments); + } + return -1; + }; + me.queryCommandValue = function (type) { + if (utils.indexOf(except, type) != -1) { + return me.bkqueryCommandValue.apply(me, arguments); + } + return null; + }; + me.fireEvent('selectionchange'); + } + }, + disable: function (except) { + return this.setDisabled(except); + }, + + /** + * 设置默认内容 + * @method _setDefaultContent + * @private + * @param { String } cont 要存入的内容 + */ + _setDefaultContent: function () { + function clear() { + var me = this; + if (me.document.getElementById('initContent')) { + me.body.innerHTML = '

' + (ie ? '' : '
') + '

'; + me.removeListener('firstBeforeExecCommand focus', clear); + setTimeout(function () { + me.focus(); + me._selectionChange(); + }, 0) + } + } + + return function (cont) { + var me = this; + me.body.innerHTML = '

' + cont + '

'; + + me.addListener('firstBeforeExecCommand focus', clear); + } + }(), + + /** + * 显示编辑器 + * @method setShow + * @example + * ```javascript + * editor.setShow() + * ``` + */ + setShow: function () { + var me = this, range = me.selection.getRange(); + if (me.container.style.display == 'none') { + //有可能内容丢失了 + try { + range.moveToBookmark(me.lastBk); + delete me.lastBk + } catch (e) { + range.setStartAtFirst(me.body).collapse(true) + } + //ie下focus实效,所以做了个延迟 + setTimeout(function () { + range.select(true); + }, 100); + me.container.style.display = ''; + } + + }, + show: function () { + return this.setShow(); + }, + /** + * 隐藏编辑器 + * @method setHide + * @example + * ```javascript + * editor.setHide() + * ``` + */ + setHide: function () { + var me = this; + if (!me.lastBk) { + me.lastBk = me.selection.getRange().createBookmark(true); + } + me.container.style.display = 'none' + }, + hide: function () { + return this.setHide(); + }, + + /** + * 根据指定的路径,获取对应的语言资源 + * @method getLang + * @param { String } path 路径根据的是lang目录下的语言文件的路径结构 + * @return { Object | String } 根据路径返回语言资源的Json格式对象或者语言字符串 + * @example + * ```javascript + * editor.getLang('contextMenu.delete'); //如果当前是中文,那返回是的是'删除' + * ``` + */ + getLang: function (path) { + var lang = UE.I18N[this.options.lang]; + if (!lang) { + throw Error("not import language file"); + } + path = (path || "").split("."); + for (var i = 0, ci; ci = path[i++];) { + lang = lang[ci]; + if (!lang)break; + } + return lang; + }, + + /** + * 计算编辑器html内容字符串的长度 + * @method getContentLength + * @return { Number } 返回计算的长度 + * @example + * ```javascript + * //编辑器html内容

132

+ * editor.getContentLength() //返回27 + * ``` + */ + /** + * 计算编辑器当前纯文本内容的长度 + * @method getContentLength + * @param { Boolean } ingoneHtml 传入true时,只按照纯文本来计算 + * @return { Number } 返回计算的长度,内容中有hr/img/iframe标签,长度加1 + * @example + * ```javascript + * //编辑器html内容

132

+ * editor.getContentLength() //返回3 + * ``` + */ + getContentLength: function (ingoneHtml, tagNames) { + var count = this.getContent(false,false,true).length; + if (ingoneHtml) { + tagNames = (tagNames || []).concat([ 'hr', 'img', 'iframe']); + count = this.getContentTxt().replace(/[\t\r\n]+/g, '').length; + for (var i = 0, ci; ci = tagNames[i++];) { + count += this.document.getElementsByTagName(ci).length; + } + } + return count; + }, + + /** + * 注册输入过滤规则 + * @method addInputRule + * @param { Function } rule 要添加的过滤规则 + * @example + * ```javascript + * editor.addInputRule(function(root){ + * $.each(root.getNodesByTagName('div'),function(i,node){ + * node.tagName="p"; + * }); + * }); + * ``` + */ + addInputRule: function (rule) { + this.inputRules.push(rule); + }, + + /** + * 执行注册的过滤规则 + * @method filterInputRule + * @param { UE.uNode } root 要过滤的uNode节点 + * @remind 执行editor.setContent方法和执行'inserthtml'命令后,会运行该过滤函数 + * @example + * ```javascript + * editor.filterInputRule(editor.body); + * ``` + * @see UE.Editor:addInputRule + */ + filterInputRule: function (root) { + for (var i = 0, ci; ci = this.inputRules[i++];) { + ci.call(this, root) + } + }, + + /** + * 注册输出过滤规则 + * @method addOutputRule + * @param { Function } rule 要添加的过滤规则 + * @example + * ```javascript + * editor.addOutputRule(function(root){ + * $.each(root.getNodesByTagName('p'),function(i,node){ + * node.tagName="div"; + * }); + * }); + * ``` + */ + addOutputRule: function (rule) { + this.outputRules.push(rule) + }, + + /** + * 根据输出过滤规则,过滤编辑器内容 + * @method filterOutputRule + * @remind 执行editor.getContent方法的时候,会先运行该过滤函数 + * @param { UE.uNode } root 要过滤的uNode节点 + * @example + * ```javascript + * editor.filterOutputRule(editor.body); + * ``` + * @see UE.Editor:addOutputRule + */ + filterOutputRule: function (root) { + for (var i = 0, ci; ci = this.outputRules[i++];) { + ci.call(this, root) + } + }, + + /** + * 根据action名称获取请求的路径 + * @method getActionUrl + * @remind 假如没有设置serverUrl,会根据imageUrl设置默认的controller路径 + * @param { String } action action名称 + * @example + * ```javascript + * editor.getActionUrl('config'); //返回 "/ueditor/php/controller.php?action=config" + * editor.getActionUrl('image'); //返回 "/ueditor/php/controller.php?action=uplaodimage" + * editor.getActionUrl('scrawl'); //返回 "/ueditor/php/controller.php?action=uplaodscrawl" + * editor.getActionUrl('imageManager'); //返回 "/ueditor/php/controller.php?action=listimage" + * ``` + */ + getActionUrl: function(action){ + var actionName = this.getOpt(action) || action, + imageUrl = this.getOpt('imageUrl'), + serverUrl = this.getOpt('serverUrl'); + + if(!serverUrl && imageUrl) { + serverUrl = imageUrl.replace(/^(.*[\/]).+([\.].+)$/, '$1controller$2'); + } + + if(serverUrl) { + serverUrl = serverUrl + (serverUrl.indexOf('?') == -1 ? '?':'&') + 'action=' + (actionName || ''); + return utils.formatUrl(serverUrl); + } else { + return ''; + } + } + }; + utils.inherits(Editor, EventBase); +})(); + + +// core/Editor.defaultoptions.js +//维护编辑器一下默认的不在插件中的配置项 +UE.Editor.defaultOptions = function(editor){ + + var _url = editor.options.UEDITOR_HOME_URL; + return { + isShow: true, + initialContent: '', + initialStyle:'', + autoClearinitialContent: false, + iframeCssUrl: _url + 'themes/iframe.css', + textarea: 'editorValue', + focus: false, + focusInEnd: true, + autoClearEmptyNode: true, + fullscreen: false, + readonly: false, + zIndex: 999, + imagePopup: true, + enterTag: 'p', + customDomain: false, + lang: 'zh-cn', + langPath: _url + 'lang/', + theme: 'default', + themePath: _url + 'themes/', + allHtmlEnabled: false, + scaleEnabled: false, + tableNativeEditInFF: false, + autoSyncData : true, + fileNameFormat: '{time}{rand:6}' + } +}; + +// core/loadconfig.js +(function(){ + + UE.Editor.prototype.loadServerConfig = function(){ + var me = this; + setTimeout(function(){ + try{ + me.options.imageUrl && me.setOpt('serverUrl', me.options.imageUrl.replace(/^(.*[\/]).+([\.].+)$/, '$1controller$2')); + + var configUrl = me.getActionUrl('config'), + isJsonp = utils.isCrossDomainUrl(configUrl); + + /* 发出ajax请求 */ + me._serverConfigLoaded = false; + + configUrl && UE.ajax.request(configUrl,{ + 'method': 'GET', + 'dataType': isJsonp ? 'jsonp':'', + 'onsuccess':function(r){ + try { + var config = isJsonp ? r:eval("("+r.responseText+")"); + utils.extend(me.options, config); + me.fireEvent('serverConfigLoaded'); + me._serverConfigLoaded = true; + } catch (e) { + showErrorMsg(me.getLang('loadconfigFormatError')); + } + }, + 'onerror':function(){ + showErrorMsg(me.getLang('loadconfigHttpError')); + } + }); + } catch(e){ + showErrorMsg(me.getLang('loadconfigError')); + } + }); + + function showErrorMsg(msg) { + console && console.error(msg); + //me.fireEvent('showMessage', { + // 'title': msg, + // 'type': 'error' + //}); + } + }; + + UE.Editor.prototype.isServerConfigLoaded = function(){ + var me = this; + return me._serverConfigLoaded || false; + }; + + UE.Editor.prototype.afterConfigReady = function(handler){ + if (!handler || !utils.isFunction(handler)) return; + var me = this; + var readyHandler = function(){ + handler.apply(me, arguments); + me.removeListener('serverConfigLoaded', readyHandler); + }; + + if (me.isServerConfigLoaded()) { + handler.call(me, 'serverConfigLoaded'); + } else { + me.addListener('serverConfigLoaded', readyHandler); + } + }; + +})(); + + +// core/ajax.js +/** + * @file + * @module UE.ajax + * @since 1.2.6.1 + */ + +/** + * 提供对ajax请求的支持 + * @module UE.ajax + */ +UE.ajax = function() { + + //创建一个ajaxRequest对象 + var fnStr = 'XMLHttpRequest()'; + try { + new ActiveXObject("Msxml2.XMLHTTP"); + fnStr = 'ActiveXObject(\'Msxml2.XMLHTTP\')'; + } catch (e) { + try { + new ActiveXObject("Microsoft.XMLHTTP"); + fnStr = 'ActiveXObject(\'Microsoft.XMLHTTP\')' + } catch (e) { + } + } + var creatAjaxRequest = new Function('return new ' + fnStr); + + + /** + * 将json参数转化成适合ajax提交的参数列表 + * @param json + */ + function json2str(json) { + var strArr = []; + for (var i in json) { + //忽略默认的几个参数 + if(i=="method" || i=="timeout" || i=="async" || i=="dataType" || i=="callback") continue; + //忽略控制 + if(json[i] == undefined || json[i] == null) continue; + //传递过来的对象和函数不在提交之列 + if (!((typeof json[i]).toLowerCase() == "function" || (typeof json[i]).toLowerCase() == "object")) { + strArr.push( encodeURIComponent(i) + "="+encodeURIComponent(json[i]) ); + } else if (utils.isArray(json[i])) { + //支持传数组内容 + for(var j = 0; j < json[i].length; j++) { + strArr.push( encodeURIComponent(i) + "[]="+encodeURIComponent(json[i][j]) ); + } + } + } + return strArr.join("&"); + } + + function doAjax(url, ajaxOptions) { + var xhr = creatAjaxRequest(), + //是否超时 + timeIsOut = false, + //默认参数 + defaultAjaxOptions = { + method:"POST", + timeout:5000, + async:true, + data:{},//需要传递对象的话只能覆盖 + onsuccess:function() { + }, + onerror:function() { + } + }; + + if (typeof url === "object") { + ajaxOptions = url; + url = ajaxOptions.url; + } + if (!xhr || !url) return; + var ajaxOpts = ajaxOptions ? utils.extend(defaultAjaxOptions,ajaxOptions) : defaultAjaxOptions; + + var submitStr = json2str(ajaxOpts); // { name:"Jim",city:"Beijing" } --> "name=Jim&city=Beijing" + //如果用户直接通过data参数传递json对象过来,则也要将此json对象转化为字符串 + if (!utils.isEmptyObject(ajaxOpts.data)){ + submitStr += (submitStr? "&":"") + json2str(ajaxOpts.data); + } + //超时检测 + var timerID = setTimeout(function() { + if (xhr.readyState != 4) { + timeIsOut = true; + xhr.abort(); + clearTimeout(timerID); + } + }, ajaxOpts.timeout); + + var method = ajaxOpts.method.toUpperCase(); + var str = url + (url.indexOf("?")==-1?"?":"&") + (method=="POST"?"":submitStr+ "&noCache=" + +new Date); + xhr.open(method, str, ajaxOpts.async); + xhr.onreadystatechange = function() { + if (xhr.readyState == 4) { + if (!timeIsOut && xhr.status == 200) { + ajaxOpts.onsuccess(xhr); + } else { + ajaxOpts.onerror(xhr); + } + } + }; + if (method == "POST") { + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + xhr.send(submitStr); + } else { + xhr.send(null); + } + } + + function doJsonp(url, opts) { + + var successhandler = opts.onsuccess || function(){}, + scr = document.createElement('SCRIPT'), + options = opts || {}, + charset = options['charset'], + callbackField = options['jsonp'] || 'callback', + callbackFnName, + timeOut = options['timeOut'] || 0, + timer, + reg = new RegExp('(\\?|&)' + callbackField + '=([^&]*)'), + matches; + + if (utils.isFunction(successhandler)) { + callbackFnName = 'bd__editor__' + Math.floor(Math.random() * 2147483648).toString(36); + window[callbackFnName] = getCallBack(0); + } else if(utils.isString(successhandler)){ + callbackFnName = successhandler; + } else { + if (matches = reg.exec(url)) { + callbackFnName = matches[2]; + } + } + + url = url.replace(reg, '\x241' + callbackField + '=' + callbackFnName); + + if (url.search(reg) < 0) { + url += (url.indexOf('?') < 0 ? '?' : '&') + callbackField + '=' + callbackFnName; + } + + var queryStr = json2str(opts); // { name:"Jim",city:"Beijing" } --> "name=Jim&city=Beijing" + //如果用户直接通过data参数传递json对象过来,则也要将此json对象转化为字符串 + if (!utils.isEmptyObject(opts.data)){ + queryStr += (queryStr? "&":"") + json2str(opts.data); + } + if (queryStr) { + url = url.replace(/\?/, '?' + queryStr + '&'); + } + + scr.onerror = getCallBack(1); + if( timeOut ){ + timer = setTimeout(getCallBack(1), timeOut); + } + createScriptTag(scr, url, charset); + + function createScriptTag(scr, url, charset) { + scr.setAttribute('type', 'text/javascript'); + scr.setAttribute('defer', 'defer'); + charset && scr.setAttribute('charset', charset); + scr.setAttribute('src', url); + document.getElementsByTagName('head')[0].appendChild(scr); + } + + function getCallBack(onTimeOut){ + return function(){ + try { + if(onTimeOut){ + options.onerror && options.onerror(); + }else{ + try{ + clearTimeout(timer); + successhandler.apply(window, arguments); + } catch (e){} + } + } catch (exception) { + options.onerror && options.onerror.call(window, exception); + } finally { + options.oncomplete && options.oncomplete.apply(window, arguments); + scr.parentNode && scr.parentNode.removeChild(scr); + window[callbackFnName] = null; + try { + delete window[callbackFnName]; + }catch(e){} + } + } + } + } + + return { + /** + * 根据给定的参数项,向指定的url发起一个ajax请求。 ajax请求完成后,会根据请求结果调用相应回调: 如果请求 + * 成功, 则调用onsuccess回调, 失败则调用 onerror 回调 + * @method request + * @param { URLString } url ajax请求的url地址 + * @param { Object } ajaxOptions ajax请求选项的键值对,支持的选项如下: + * @example + * ```javascript + * //向sayhello.php发起一个异步的Ajax GET请求, 请求超时时间为10s, 请求完成后执行相应的回调。 + * UE.ajax.requeset( 'sayhello.php', { + * + * //请求方法。可选值: 'GET', 'POST',默认值是'POST' + * method: 'GET', + * + * //超时时间。 默认为5000, 单位是ms + * timeout: 10000, + * + * //是否是异步请求。 true为异步请求, false为同步请求 + * async: true, + * + * //请求携带的数据。如果请求为GET请求, data会经过stringify后附加到请求url之后。 + * data: { + * name: 'ueditor' + * }, + * + * //请求成功后的回调, 该回调接受当前的XMLHttpRequest对象作为参数。 + * onsuccess: function ( xhr ) { + * console.log( xhr.responseText ); + * }, + * + * //请求失败或者超时后的回调。 + * onerror: function ( xhr ) { + * alert( 'Ajax请求失败' ); + * } + * + * } ); + * ``` + */ + + /** + * 根据给定的参数项发起一个ajax请求, 参数项里必须包含一个url地址。 ajax请求完成后,会根据请求结果调用相应回调: 如果请求 + * 成功, 则调用onsuccess回调, 失败则调用 onerror 回调。 + * @method request + * @warning 如果在参数项里未提供一个key为“url”的地址值,则该请求将直接退出。 + * @param { Object } ajaxOptions ajax请求选项的键值对,支持的选项如下: + * @example + * ```javascript + * + * //向sayhello.php发起一个异步的Ajax POST请求, 请求超时时间为5s, 请求完成后不执行任何回调。 + * UE.ajax.requeset( 'sayhello.php', { + * + * //请求的地址, 该项是必须的。 + * url: 'sayhello.php' + * + * } ); + * ``` + */ + request:function(url, opts) { + if (opts && opts.dataType == 'jsonp') { + doJsonp(url, opts); + } else { + doAjax(url, opts); + } + }, + getJSONP:function(url, data, fn) { + var opts = { + 'data': data, + 'oncomplete': fn + }; + doJsonp(url, opts); + } + }; + + +}(); + + +// core/filterword.js +/** + * UE过滤word的静态方法 + * @file + */ + +/** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @module UE + */ + + +/** + * 根据传入html字符串过滤word + * @module UE + * @since 1.2.6.1 + * @method filterWord + * @param { String } html html字符串 + * @return { String } 已过滤后的结果字符串 + * @example + * ```javascript + * UE.filterWord(html); + * ``` + */ +var filterWord = UE.filterWord = function () { + + //是否是word过来的内容 + function isWordDocument( str ) { + return /(class="?Mso|style="[^"]*\bmso\-|w:WordDocument|<(v|o):|lang=)/ig.test( str ); + } + //去掉小数 + function transUnit( v ) { + v = v.replace( /[\d.]+\w+/g, function ( m ) { + return utils.transUnitToPx(m); + } ); + return v; + } + + function filterPasteWord( str ) { + return str.replace(/[\t\r\n]+/g,' ') + .replace( //ig, "" ) + //转换图片 + .replace(/]*>[\s\S]*?.<\/v:shape>/gi,function(str){ + //opera能自己解析出image所这里直接返回空 + if(browser.opera){ + return ''; + } + try{ + //有可能是bitmap占为图,无用,直接过滤掉,主要体现在粘贴excel表格中 + if(/Bitmap/i.test(str)){ + return ''; + } + var width = str.match(/width:([ \d.]*p[tx])/i)[1], + height = str.match(/height:([ \d.]*p[tx])/i)[1], + src = str.match(/src=\s*"([^"]*)"/i)[1]; + return ''; + } catch(e){ + return ''; + } + }) + //针对wps添加的多余标签处理 + .replace(/<\/?div[^>]*>/g,'') + //去掉多余的属性 + .replace( /v:\w+=(["']?)[^'"]+\1/g, '' ) + .replace( /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|xml|meta|link|style|\w+:\w+)(?=[\s\/>]))[^>]*>/gi, "" ) + .replace( /

]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "

$1

" ) + //去掉多余的属性 + .replace( /\s+(class|lang|align)\s*=\s*(['"]?)([\w-]+)\2/ig, function(str,name,marks,val){ + //保留list的标示 + return name == 'class' && val == 'MsoListParagraph' ? str : '' + }) + //清除多余的font/span不能匹配 有可能是空格 + .replace( /<(font|span)[^>]*>(\s*)<\/\1>/gi, function(a,b,c){ + return c.replace(/[\t\r\n ]+/g,' ') + }) + //处理style的问题 + .replace( /(<[a-z][^>]*)\sstyle=(["'])([^\2]*?)\2/gi, function( str, tag, tmp, style ) { + var n = [], + s = style.replace( /^\s+|\s+$/, '' ) + .replace(/'/g,'\'') + .replace( /"/gi, "'" ) + .replace(/[\d.]+(cm|pt)/g,function(str){ + return utils.transUnitToPx(str) + }) + .split( /;\s*/g ); + + for ( var i = 0,v; v = s[i];i++ ) { + + var name, value, + parts = v.split( ":" ); + + if ( parts.length == 2 ) { + name = parts[0].toLowerCase(); + value = parts[1].toLowerCase(); + if(/^(background)\w*/.test(name) && value.replace(/(initial|\s)/g,'').length == 0 + || + /^(margin)\w*/.test(name) && /^0\w+$/.test(value) + ){ + continue; + } + + switch ( name ) { + case "mso-padding-alt": + case "mso-padding-top-alt": + case "mso-padding-right-alt": + case "mso-padding-bottom-alt": + case "mso-padding-left-alt": + case "mso-margin-alt": + case "mso-margin-top-alt": + case "mso-margin-right-alt": + case "mso-margin-bottom-alt": + case "mso-margin-left-alt": + //ie下会出现挤到一起的情况 + //case "mso-table-layout-alt": + case "mso-height": + case "mso-width": + case "mso-vertical-align-alt": + //trace:1819 ff下会解析出padding在table上 + if(!/]/.test(html)) { + return UE.htmlparser(html).children[0] + } else { + return new uNode({ + type:'element', + children:[], + tagName:html + }) + } + }; + uNode.createText = function (data,noTrans) { + return new UE.uNode({ + type:'text', + 'data':noTrans ? data : utils.unhtml(data || '') + }) + }; + function nodeToHtml(node, arr, formatter, current) { + switch (node.type) { + case 'root': + for (var i = 0, ci; ci = node.children[i++];) { + //插入新行 + if (formatter && ci.type == 'element' && !dtd.$inlineWithA[ci.tagName] && i > 1) { + insertLine(arr, current, true); + insertIndent(arr, current) + } + nodeToHtml(ci, arr, formatter, current) + } + break; + case 'text': + isText(node, arr); + break; + case 'element': + isElement(node, arr, formatter, current); + break; + case 'comment': + isComment(node, arr, formatter); + } + return arr; + } + + function isText(node, arr) { + if(node.parentNode.tagName == 'pre'){ + //源码模式下输入html标签,不能做转换处理,直接输出 + arr.push(node.data) + }else{ + arr.push(notTransTagName[node.parentNode.tagName] ? utils.html(node.data) : node.data.replace(/[ ]{2}/g,'  ')) + } + + } + + function isElement(node, arr, formatter, current) { + var attrhtml = ''; + if (node.attrs) { + attrhtml = []; + var attrs = node.attrs; + for (var a in attrs) { + //这里就针对 + //

'

+ //这里边的\"做转换,要不用innerHTML直接被截断了,属性src + //有可能做的不够 + attrhtml.push(a + (attrs[a] !== undefined ? '="' + (notTransAttrs[a] ? utils.html(attrs[a]).replace(/["]/g, function (a) { + return '"' + }) : utils.unhtml(attrs[a])) + '"' : '')) + } + attrhtml = attrhtml.join(' '); + } + arr.push('<' + node.tagName + + (attrhtml ? ' ' + attrhtml : '') + + (dtd.$empty[node.tagName] ? '\/' : '' ) + '>' + ); + //插入新行 + if (formatter && !dtd.$inlineWithA[node.tagName] && node.tagName != 'pre') { + if(node.children && node.children.length){ + current = insertLine(arr, current, true); + insertIndent(arr, current) + } + + } + if (node.children && node.children.length) { + for (var i = 0, ci; ci = node.children[i++];) { + if (formatter && ci.type == 'element' && !dtd.$inlineWithA[ci.tagName] && i > 1) { + insertLine(arr, current); + insertIndent(arr, current) + } + nodeToHtml(ci, arr, formatter, current) + } + } + if (!dtd.$empty[node.tagName]) { + if (formatter && !dtd.$inlineWithA[node.tagName] && node.tagName != 'pre') { + + if(node.children && node.children.length){ + current = insertLine(arr, current); + insertIndent(arr, current) + } + } + arr.push('<\/' + node.tagName + '>'); + } + + } + + function isComment(node, arr) { + arr.push(''); + } + + function getNodeById(root, id) { + var node; + if (root.type == 'element' && root.getAttr('id') == id) { + return root; + } + if (root.children && root.children.length) { + for (var i = 0, ci; ci = root.children[i++];) { + if (node = getNodeById(ci, id)) { + return node; + } + } + } + } + + function getNodesByTagName(node, tagName, arr) { + if (node.type == 'element' && node.tagName == tagName) { + arr.push(node); + } + if (node.children && node.children.length) { + for (var i = 0, ci; ci = node.children[i++];) { + getNodesByTagName(ci, tagName, arr) + } + } + } + function nodeTraversal(root,fn){ + if(root.children && root.children.length){ + for(var i= 0,ci;ci=root.children[i];){ + nodeTraversal(ci,fn); + //ci被替换的情况,这里就不再走 fn了 + if(ci.parentNode ){ + if(ci.children && ci.children.length){ + fn(ci) + } + if(ci.parentNode) i++ + } + } + }else{ + fn(root) + } + + } + uNode.prototype = { + + /** + * 当前节点对象,转换成html文本 + * @method toHtml + * @return { String } 返回转换后的html字符串 + * @example + * ```javascript + * node.toHtml(); + * ``` + */ + + /** + * 当前节点对象,转换成html文本 + * @method toHtml + * @param { Boolean } formatter 是否格式化返回值 + * @return { String } 返回转换后的html字符串 + * @example + * ```javascript + * node.toHtml( true ); + * ``` + */ + toHtml:function (formatter) { + var arr = []; + nodeToHtml(this, arr, formatter, 0); + return arr.join('') + }, + + /** + * 获取节点的html内容 + * @method innerHTML + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @return { String } 返回节点的html内容 + * @example + * ```javascript + * var htmlstr = node.innerHTML(); + * ``` + */ + + /** + * 设置节点的html内容 + * @method innerHTML + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @param { String } htmlstr 传入要设置的html内容 + * @return { UE.uNode } 返回节点本身 + * @example + * ```javascript + * node.innerHTML('text'); + * ``` + */ + innerHTML:function (htmlstr) { + if (this.type != 'element' || dtd.$empty[this.tagName]) { + return this; + } + if (utils.isString(htmlstr)) { + if(this.children){ + for (var i = 0, ci; ci = this.children[i++];) { + ci.parentNode = null; + } + } + this.children = []; + var tmpRoot = UE.htmlparser(htmlstr); + for (var i = 0, ci; ci = tmpRoot.children[i++];) { + this.children.push(ci); + ci.parentNode = this; + } + return this; + } else { + var tmpRoot = new UE.uNode({ + type:'root', + children:this.children + }); + return tmpRoot.toHtml(); + } + }, + + /** + * 获取节点的纯文本内容 + * @method innerText + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @return { String } 返回节点的存文本内容 + * @example + * ```javascript + * var textStr = node.innerText(); + * ``` + */ + + /** + * 设置节点的纯文本内容 + * @method innerText + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @param { String } textStr 传入要设置的文本内容 + * @return { UE.uNode } 返回节点本身 + * @example + * ```javascript + * node.innerText('text'); + * ``` + */ + innerText:function (textStr,noTrans) { + if (this.type != 'element' || dtd.$empty[this.tagName]) { + return this; + } + if (textStr) { + if(this.children){ + for (var i = 0, ci; ci = this.children[i++];) { + ci.parentNode = null; + } + } + this.children = []; + this.appendChild(uNode.createText(textStr,noTrans)); + return this; + } else { + return this.toHtml().replace(/<[^>]+>/g, ''); + } + }, + + /** + * 获取当前对象的data属性 + * @method getData + * @return { Object } 若节点的type值是elemenet,返回空字符串,否则返回节点的data属性 + * @example + * ```javascript + * node.getData(); + * ``` + */ + getData:function () { + if (this.type == 'element') + return ''; + return this.data + }, + + /** + * 获取当前节点下的第一个子节点 + * @method firstChild + * @return { UE.uNode } 返回第一个子节点 + * @example + * ```javascript + * node.firstChild(); //返回第一个子节点 + * ``` + */ + firstChild:function () { +// if (this.type != 'element' || dtd.$empty[this.tagName]) { +// return this; +// } + return this.children ? this.children[0] : null; + }, + + /** + * 获取当前节点下的最后一个子节点 + * @method lastChild + * @return { UE.uNode } 返回最后一个子节点 + * @example + * ```javascript + * node.lastChild(); //返回最后一个子节点 + * ``` + */ + lastChild:function () { +// if (this.type != 'element' || dtd.$empty[this.tagName] ) { +// return this; +// } + return this.children ? this.children[this.children.length - 1] : null; + }, + + /** + * 获取和当前节点有相同父亲节点的前一个节点 + * @method previousSibling + * @return { UE.uNode } 返回前一个节点 + * @example + * ```javascript + * node.children[2].previousSibling(); //返回子节点node.children[1] + * ``` + */ + previousSibling : function(){ + var parent = this.parentNode; + for (var i = 0, ci; ci = parent.children[i]; i++) { + if (ci === this) { + return i == 0 ? null : parent.children[i-1]; + } + } + + }, + + /** + * 获取和当前节点有相同父亲节点的后一个节点 + * @method nextSibling + * @return { UE.uNode } 返回后一个节点,找不到返回null + * @example + * ```javascript + * node.children[2].nextSibling(); //如果有,返回子节点node.children[3] + * ``` + */ + nextSibling : function(){ + var parent = this.parentNode; + for (var i = 0, ci; ci = parent.children[i++];) { + if (ci === this) { + return parent.children[i]; + } + } + }, + + /** + * 用新的节点替换当前节点 + * @method replaceChild + * @param { UE.uNode } target 要替换成该节点参数 + * @param { UE.uNode } source 要被替换掉的节点 + * @return { UE.uNode } 返回替换之后的节点对象 + * @example + * ```javascript + * node.replaceChild(newNode, childNode); //用newNode替换childNode,childNode是node的子节点 + * ``` + */ + replaceChild:function (target, source) { + if (this.children) { + if(target.parentNode){ + target.parentNode.removeChild(target); + } + for (var i = 0, ci; ci = this.children[i]; i++) { + if (ci === source) { + this.children.splice(i, 1, target); + source.parentNode = null; + target.parentNode = this; + return target; + } + } + } + }, + + /** + * 在节点的子节点列表最后位置插入一个节点 + * @method appendChild + * @param { UE.uNode } node 要插入的节点 + * @return { UE.uNode } 返回刚插入的子节点 + * @example + * ```javascript + * node.appendChild( newNode ); //在node内插入子节点newNode + * ``` + */ + appendChild:function (node) { + if (this.type == 'root' || (this.type == 'element' && !dtd.$empty[this.tagName])) { + if (!this.children) { + this.children = [] + } + if(node.parentNode){ + node.parentNode.removeChild(node); + } + for (var i = 0, ci; ci = this.children[i]; i++) { + if (ci === node) { + this.children.splice(i, 1); + break; + } + } + this.children.push(node); + node.parentNode = this; + return node; + } + + + }, + + /** + * 在传入节点的前面插入一个节点 + * @method insertBefore + * @param { UE.uNode } target 要插入的节点 + * @param { UE.uNode } source 在该参数节点前面插入 + * @return { UE.uNode } 返回刚插入的子节点 + * @example + * ```javascript + * node.parentNode.insertBefore(newNode, node); //在node节点后面插入newNode + * ``` + */ + insertBefore:function (target, source) { + if (this.children) { + if(target.parentNode){ + target.parentNode.removeChild(target); + } + for (var i = 0, ci; ci = this.children[i]; i++) { + if (ci === source) { + this.children.splice(i, 0, target); + target.parentNode = this; + return target; + } + } + + } + }, + + /** + * 在传入节点的后面插入一个节点 + * @method insertAfter + * @param { UE.uNode } target 要插入的节点 + * @param { UE.uNode } source 在该参数节点后面插入 + * @return { UE.uNode } 返回刚插入的子节点 + * @example + * ```javascript + * node.parentNode.insertAfter(newNode, node); //在node节点后面插入newNode + * ``` + */ + insertAfter:function (target, source) { + if (this.children) { + if(target.parentNode){ + target.parentNode.removeChild(target); + } + for (var i = 0, ci; ci = this.children[i]; i++) { + if (ci === source) { + this.children.splice(i + 1, 0, target); + target.parentNode = this; + return target; + } + + } + } + }, + + /** + * 从当前节点的子节点列表中,移除节点 + * @method removeChild + * @param { UE.uNode } node 要移除的节点引用 + * @param { Boolean } keepChildren 是否保留移除节点的子节点,若传入true,自动把移除节点的子节点插入到移除的位置 + * @return { * } 返回刚移除的子节点 + * @example + * ```javascript + * node.removeChild(childNode,true); //在node的子节点列表中移除child节点,并且吧child的子节点插入到移除的位置 + * ``` + */ + removeChild:function (node,keepChildren) { + if (this.children) { + for (var i = 0, ci; ci = this.children[i]; i++) { + if (ci === node) { + this.children.splice(i, 1); + ci.parentNode = null; + if(keepChildren && ci.children && ci.children.length){ + for(var j= 0,cj;cj=ci.children[j];j++){ + this.children.splice(i+j,0,cj); + cj.parentNode = this; + + } + } + return ci; + } + } + } + }, + + /** + * 获取当前节点所代表的元素属性,即获取attrs对象下的属性值 + * @method getAttr + * @param { String } attrName 要获取的属性名称 + * @return { * } 返回attrs对象下的属性值 + * @example + * ```javascript + * node.getAttr('title'); + * ``` + */ + getAttr:function (attrName) { + return this.attrs && this.attrs[attrName.toLowerCase()] + }, + + /** + * 设置当前节点所代表的元素属性,即设置attrs对象下的属性值 + * @method setAttr + * @param { String } attrName 要设置的属性名称 + * @param { * } attrVal 要设置的属性值,类型视设置的属性而定 + * @return { * } 返回attrs对象下的属性值 + * @example + * ```javascript + * node.setAttr('title','标题'); + * ``` + */ + setAttr:function (attrName, attrVal) { + if (!attrName) { + delete this.attrs; + return; + } + if(!this.attrs){ + this.attrs = {}; + } + if (utils.isObject(attrName)) { + for (var a in attrName) { + if (!attrName[a]) { + delete this.attrs[a] + } else { + this.attrs[a.toLowerCase()] = attrName[a]; + } + } + } else { + if (!attrVal) { + delete this.attrs[attrName] + } else { + this.attrs[attrName.toLowerCase()] = attrVal; + } + + } + }, + + /** + * 获取当前节点在父节点下的位置索引 + * @method getIndex + * @return { Number } 返回索引数值,如果没有父节点,返回-1 + * @example + * ```javascript + * node.getIndex(); + * ``` + */ + getIndex:function(){ + var parent = this.parentNode; + for(var i= 0,ci;ci=parent.children[i];i++){ + if(ci === this){ + return i; + } + } + return -1; + }, + + /** + * 在当前节点下,根据id查找节点 + * @method getNodeById + * @param { String } id 要查找的id + * @return { UE.uNode } 返回找到的节点 + * @example + * ```javascript + * node.getNodeById('textId'); + * ``` + */ + getNodeById:function (id) { + var node; + if (this.children && this.children.length) { + for (var i = 0, ci; ci = this.children[i++];) { + if (node = getNodeById(ci, id)) { + return node; + } + } + } + }, + + /** + * 在当前节点下,根据元素名称查找节点列表 + * @method getNodesByTagName + * @param { String } tagNames 要查找的元素名称 + * @return { Array } 返回找到的节点列表 + * @example + * ```javascript + * node.getNodesByTagName('span'); + * ``` + */ + getNodesByTagName:function (tagNames) { + tagNames = utils.trim(tagNames).replace(/[ ]{2,}/g, ' ').split(' '); + var arr = [], me = this; + utils.each(tagNames, function (tagName) { + if (me.children && me.children.length) { + for (var i = 0, ci; ci = me.children[i++];) { + getNodesByTagName(ci, tagName, arr) + } + } + }); + return arr; + }, + + /** + * 根据样式名称,获取节点的样式值 + * @method getStyle + * @param { String } name 要获取的样式名称 + * @return { String } 返回样式值 + * @example + * ```javascript + * node.getStyle('font-size'); + * ``` + */ + getStyle:function (name) { + var cssStyle = this.getAttr('style'); + if (!cssStyle) { + return '' + } + var reg = new RegExp('(^|;)\\s*' + name + ':([^;]+)','i'); + var match = cssStyle.match(reg); + if (match && match[0]) { + return match[2] + } + return ''; + }, + + /** + * 给节点设置样式 + * @method setStyle + * @param { String } name 要设置的的样式名称 + * @param { String } val 要设置的的样值 + * @example + * ```javascript + * node.setStyle('font-size', '12px'); + * ``` + */ + setStyle:function (name, val) { + function exec(name, val) { + var reg = new RegExp('(^|;)\\s*' + name + ':([^;]+;?)', 'gi'); + cssStyle = cssStyle.replace(reg, '$1'); + if (val) { + cssStyle = name + ':' + utils.unhtml(val) + ';' + cssStyle + } + + } + + var cssStyle = this.getAttr('style'); + if (!cssStyle) { + cssStyle = ''; + } + if (utils.isObject(name)) { + for (var a in name) { + exec(a, name[a]) + } + } else { + exec(name, val) + } + this.setAttr('style', utils.trim(cssStyle)) + }, + + /** + * 传入一个函数,递归遍历当前节点下的所有节点 + * @method traversal + * @param { Function } fn 遍历到节点的时,传入节点作为参数,运行此函数 + * @example + * ```javascript + * traversal(node, function(){ + * console.log(node.type); + * }); + * ``` + */ + traversal:function(fn){ + if(this.children && this.children.length){ + nodeTraversal(this,fn); + } + return this; + } + } +})(); + + +// core/htmlparser.js +/** + * html字符串转换成uNode节点 + * @file + * @module UE + * @since 1.2.6.1 + */ + +/** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @unfile + * @module UE + */ + +/** + * html字符串转换成uNode节点的静态方法 + * @method htmlparser + * @param { String } htmlstr 要转换的html代码 + * @param { Boolean } ignoreBlank 若设置为true,转换的时候忽略\n\r\t等空白字符 + * @return { uNode } 给定的html片段转换形成的uNode对象 + * @example + * ```javascript + * var root = UE.htmlparser('

htmlparser

', true); + * ``` + */ + +var htmlparser = UE.htmlparser = function (htmlstr,ignoreBlank) { + //todo 原来的方式 [^"'<>\/] 有\/就不能配对上 ') + } + html.push('') + } + //禁止指定table-width + return '
这样的标签了 + //先去掉了,加上的原因忘了,这里先记录 + var re_tag = /<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)-->)|(?:([^\s\/<>]+)\s*((?:(?:"[^"]*")|(?:'[^']*')|[^"'<>])*)\/?>))/g, + re_attr = /([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g; + + //ie下取得的html可能会有\n存在,要去掉,在处理replace(/[\t\r\n]*/g,'');代码高量的\n不能去除 + var allowEmptyTags = { + b:1,code:1,i:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,span:1, + sub:1,img:1,sup:1,font:1,big:1,small:1,iframe:1,a:1,br:1,pre:1 + }; + htmlstr = htmlstr.replace(new RegExp(domUtils.fillChar, 'g'), ''); + if(!ignoreBlank){ + htmlstr = htmlstr.replace(new RegExp('[\\r\\t\\n'+(ignoreBlank?'':' ')+']*<\/?(\\w+)\\s*(?:[^>]*)>[\\r\\t\\n'+(ignoreBlank?'':' ')+']*','g'), function(a,b){ + //br暂时单独处理 + if(b && allowEmptyTags[b.toLowerCase()]){ + return a.replace(/(^[\n\r]+)|([\n\r]+$)/g,''); + } + return a.replace(new RegExp('^[\\r\\n'+(ignoreBlank?'':' ')+']+'),'').replace(new RegExp('[\\r\\n'+(ignoreBlank?'':' ')+']+$'),''); + }); + } + + var notTransAttrs = { + 'href':1, + 'src':1 + }; + + var uNode = UE.uNode, + needParentNode = { + 'td':'tr', + 'tr':['tbody','thead','tfoot'], + 'tbody':'table', + 'th':'tr', + 'thead':'table', + 'tfoot':'table', + 'caption':'table', + 'li':['ul', 'ol'], + 'dt':'dl', + 'dd':'dl', + 'option':'select' + }, + needChild = { + 'ol':'li', + 'ul':'li' + }; + + function text(parent, data) { + + if(needChild[parent.tagName]){ + var tmpNode = uNode.createElement(needChild[parent.tagName]); + parent.appendChild(tmpNode); + tmpNode.appendChild(uNode.createText(data)); + parent = tmpNode; + }else{ + + parent.appendChild(uNode.createText(data)); + } + } + + function element(parent, tagName, htmlattr) { + var needParentTag; + if (needParentTag = needParentNode[tagName]) { + var tmpParent = parent,hasParent; + while(tmpParent.type != 'root'){ + if(utils.isArray(needParentTag) ? utils.indexOf(needParentTag, tmpParent.tagName) != -1 : needParentTag == tmpParent.tagName){ + parent = tmpParent; + hasParent = true; + break; + } + tmpParent = tmpParent.parentNode; + } + if(!hasParent){ + parent = element(parent, utils.isArray(needParentTag) ? needParentTag[0] : needParentTag) + } + } + //按dtd处理嵌套 +// if(parent.type != 'root' && !dtd[parent.tagName][tagName]) +// parent = parent.parentNode; + var elm = new uNode({ + parentNode:parent, + type:'element', + tagName:tagName.toLowerCase(), + //是自闭合的处理一下 + children:dtd.$empty[tagName] ? null : [] + }); + //如果属性存在,处理属性 + if (htmlattr) { + var attrs = {}, match; + while (match = re_attr.exec(htmlattr)) { + attrs[match[1].toLowerCase()] = notTransAttrs[match[1].toLowerCase()] ? (match[2] || match[3] || match[4]) : utils.unhtml(match[2] || match[3] || match[4]) + } + elm.attrs = attrs; + } + //trace:3970 +// //如果parent下不能放elm +// if(dtd.$inline[parent.tagName] && dtd.$block[elm.tagName] && !dtd[parent.tagName][elm.tagName]){ +// parent = parent.parentNode; +// elm.parentNode = parent; +// } + parent.children.push(elm); + //如果是自闭合节点返回父亲节点 + return dtd.$empty[tagName] ? parent : elm + } + + function comment(parent, data) { + parent.children.push(new uNode({ + type:'comment', + data:data, + parentNode:parent + })); + } + + var match, currentIndex = 0, nextIndex = 0; + //设置根节点 + var root = new uNode({ + type:'root', + children:[] + }); + var currentParent = root; + + while (match = re_tag.exec(htmlstr)) { + currentIndex = match.index; + try{ + if (currentIndex > nextIndex) { + //text node + text(currentParent, htmlstr.slice(nextIndex, currentIndex)); + } + if (match[3]) { + + if(dtd.$cdata[currentParent.tagName]){ + text(currentParent, match[0]); + }else{ + //start tag + currentParent = element(currentParent, match[3].toLowerCase(), match[4]); + } + + + } else if (match[1]) { + if(currentParent.type != 'root'){ + if(dtd.$cdata[currentParent.tagName] && !dtd.$cdata[match[1]]){ + text(currentParent, match[0]); + }else{ + var tmpParent = currentParent; + while(currentParent.type == 'element' && currentParent.tagName != match[1].toLowerCase()){ + currentParent = currentParent.parentNode; + if(currentParent.type == 'root'){ + currentParent = tmpParent; + throw 'break' + } + } + //end tag + currentParent = currentParent.parentNode; + } + + } + + } else if (match[2]) { + //comment + comment(currentParent, match[2]) + } + }catch(e){} + + nextIndex = re_tag.lastIndex; + + } + //如果结束是文本,就有可能丢掉,所以这里手动判断一下 + //例如
  • sdfsdfsdf
  • sdfsdfsdfsdf + if (nextIndex < htmlstr.length) { + text(currentParent, htmlstr.slice(nextIndex)); + } + return root; +}; + + +// core/filternode.js +/** + * UE过滤节点的静态方法 + * @file + */ + +/** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @module UE + */ + + +/** + * 根据传入节点和过滤规则过滤相应节点 + * @module UE + * @since 1.2.6.1 + * @method filterNode + * @param { Object } root 指定root节点 + * @param { Object } rules 过滤规则json对象 + * @example + * ```javascript + * UE.filterNode(root,editor.options.filterRules); + * ``` + */ +var filterNode = UE.filterNode = function () { + function filterNode(node,rules){ + switch (node.type) { + case 'text': + break; + case 'element': + var val; + if(val = rules[node.tagName]){ + if(val === '-'){ + node.parentNode.removeChild(node) + }else if(utils.isFunction(val)){ + var parentNode = node.parentNode, + index = node.getIndex(); + val(node); + if(node.parentNode){ + if(node.children){ + for(var i = 0,ci;ci=node.children[i];){ + filterNode(ci,rules); + if(ci.parentNode){ + i++; + } + } + } + }else{ + for(var i = index,ci;ci=parentNode.children[i];){ + filterNode(ci,rules); + if(ci.parentNode){ + i++; + } + } + } + + + }else{ + var attrs = val['$']; + if(attrs && node.attrs){ + var tmpAttrs = {},tmpVal; + for(var a in attrs){ + tmpVal = node.getAttr(a); + //todo 只先对style单独处理 + if(a == 'style' && utils.isArray(attrs[a])){ + var tmpCssStyle = []; + utils.each(attrs[a],function(v){ + var tmp; + if(tmp = node.getStyle(v)){ + tmpCssStyle.push(v + ':' + tmp); + } + }); + tmpVal = tmpCssStyle.join(';') + } + if(tmpVal){ + tmpAttrs[a] = tmpVal; + } + + } + node.attrs = tmpAttrs; + } + if(node.children){ + for(var i = 0,ci;ci=node.children[i];){ + filterNode(ci,rules); + if(ci.parentNode){ + i++; + } + } + } + } + }else{ + //如果不在名单里扣出子节点并删除该节点,cdata除外 + if(dtd.$cdata[node.tagName]){ + node.parentNode.removeChild(node) + }else{ + var parentNode = node.parentNode, + index = node.getIndex(); + node.parentNode.removeChild(node,true); + for(var i = index,ci;ci=parentNode.children[i];){ + filterNode(ci,rules); + if(ci.parentNode){ + i++; + } + } + } + } + break; + case 'comment': + node.parentNode.removeChild(node) + } + + } + return function(root,rules){ + if(utils.isEmptyObject(rules)){ + return root; + } + var val; + if(val = rules['-']){ + utils.each(val.split(' '),function(k){ + rules[k] = '-' + }) + } + for(var i= 0,ci;ci=root.children[i];){ + filterNode(ci,rules); + if(ci.parentNode){ + i++; + } + } + return root; + } +}(); + +// core/plugin.js +/** + * Created with JetBrains PhpStorm. + * User: campaign + * Date: 10/8/13 + * Time: 6:15 PM + * To change this template use File | Settings | File Templates. + */ +UE.plugin = function(){ + var _plugins = {}; + return { + register : function(pluginName,fn,oldOptionName,afterDisabled){ + if(oldOptionName && utils.isFunction(oldOptionName)){ + afterDisabled = oldOptionName; + oldOptionName = null + } + _plugins[pluginName] = { + optionName : oldOptionName || pluginName, + execFn : fn, + //当插件被禁用时执行 + afterDisabled : afterDisabled + } + }, + load : function(editor){ + utils.each(_plugins,function(plugin){ + var _export = plugin.execFn.call(editor); + if(editor.options[plugin.optionName] !== false){ + if(_export){ + //后边需要再做扩展 + utils.each(_export,function(v,k){ + switch(k.toLowerCase()){ + case 'shortcutkey': + editor.addshortcutkey(v); + break; + case 'bindevents': + utils.each(v,function(fn,eventName){ + editor.addListener(eventName,fn); + }); + break; + case 'bindmultievents': + utils.each(utils.isArray(v) ? v:[v],function(event){ + var types = utils.trim(event.type).split(/\s+/); + utils.each(types,function(eventName){ + editor.addListener(eventName, event.handler); + }); + }); + break; + case 'commands': + utils.each(v,function(execFn,execName){ + editor.commands[execName] = execFn + }); + break; + case 'outputrule': + editor.addOutputRule(v); + break; + case 'inputrule': + editor.addInputRule(v); + break; + case 'defaultoptions': + editor.setOpt(v) + } + }) + } + + }else if(plugin.afterDisabled){ + plugin.afterDisabled.call(editor) + } + + }); + //向下兼容 + utils.each(UE.plugins,function(plugin){ + plugin.call(editor); + }); + }, + run : function(pluginName,editor){ + var plugin = _plugins[pluginName]; + if(plugin){ + plugin.exeFn.call(editor) + } + } + } +}(); + +// core/keymap.js +var keymap = UE.keymap = { + 'Backspace' : 8, + 'Tab' : 9, + 'Enter' : 13, + + 'Shift':16, + 'Control':17, + 'Alt':18, + 'CapsLock':20, + + 'Esc':27, + + 'Spacebar':32, + + 'PageUp':33, + 'PageDown':34, + 'End':35, + 'Home':36, + + 'Left':37, + 'Up':38, + 'Right':39, + 'Down':40, + + 'Insert':45, + + 'Del':46, + + 'NumLock':144, + + 'Cmd':91, + + '=':187, + '-':189, + + "b":66, + 'i':73, + //回退 + 'z':90, + 'y':89, + //粘贴 + 'v' : 86, + 'x' : 88, + + 's' : 83, + + 'n' : 78 +}; + +// core/localstorage.js +//存储媒介封装 +var LocalStorage = UE.LocalStorage = (function () { + + var storage = window.localStorage || getUserData() || null, + LOCAL_FILE = 'localStorage'; + + return { + + saveLocalData: function (key, data) { + + if (storage && data) { + storage.setItem(key, data); + return true; + } + + return false; + + }, + + getLocalData: function (key) { + + if (storage) { + return storage.getItem(key); + } + + return null; + + }, + + removeItem: function (key) { + + storage && storage.removeItem(key); + + } + + }; + + function getUserData() { + + var container = document.createElement("div"); + container.style.display = "none"; + + if (!container.addBehavior) { + return null; + } + + container.addBehavior("#default#userdata"); + + return { + + getItem: function (key) { + + var result = null; + + try { + document.body.appendChild(container); + container.load(LOCAL_FILE); + result = container.getAttribute(key); + document.body.removeChild(container); + } catch (e) { + } + + return result; + + }, + + setItem: function (key, value) { + + document.body.appendChild(container); + container.setAttribute(key, value); + container.save(LOCAL_FILE); + document.body.removeChild(container); + + }, + + //// 暂时没有用到 + //clear: function () { + // + // var expiresTime = new Date(); + // expiresTime.setFullYear(expiresTime.getFullYear() - 1); + // document.body.appendChild(container); + // container.expires = expiresTime.toUTCString(); + // container.save(LOCAL_FILE); + // document.body.removeChild(container); + // + //}, + + removeItem: function (key) { + + document.body.appendChild(container); + container.removeAttribute(key); + container.save(LOCAL_FILE); + document.body.removeChild(container); + + } + + }; + + } + +})(); + +(function () { + + var ROOTKEY = 'ueditor_preference'; + + UE.Editor.prototype.setPreferences = function(key,value){ + var obj = {}; + if (utils.isString(key)) { + obj[ key ] = value; + } else { + obj = key; + } + var data = LocalStorage.getLocalData(ROOTKEY); + if (data && (data = utils.str2json(data))) { + utils.extend(data, obj); + } else { + data = obj; + } + data && LocalStorage.saveLocalData(ROOTKEY, utils.json2str(data)); + }; + + UE.Editor.prototype.getPreferences = function(key){ + var data = LocalStorage.getLocalData(ROOTKEY); + if (data && (data = utils.str2json(data))) { + return key ? data[key] : data + } + return null; + }; + + UE.Editor.prototype.removePreferences = function (key) { + var data = LocalStorage.getLocalData(ROOTKEY); + if (data && (data = utils.str2json(data))) { + data[key] = undefined; + delete data[key] + } + data && LocalStorage.saveLocalData(ROOTKEY, utils.json2str(data)); + }; + +})(); + + +// plugins/defaultfilter.js +///import core +///plugin 编辑器默认的过滤转换机制 + +UE.plugins['defaultfilter'] = function () { + var me = this; + me.setOpt({ + 'allowDivTransToP':true, + 'disabledTableInTable':true + }); + //默认的过滤处理 + //进入编辑器的内容处理 + me.addInputRule(function (root) { + var allowDivTransToP = this.options.allowDivTransToP; + var val; + function tdParent(node){ + while(node && node.type == 'element'){ + if(node.tagName == 'td'){ + return true; + } + node = node.parentNode; + } + return false; + } + //进行默认的处理 + root.traversal(function (node) { + if (node.type == 'element') { + if (!dtd.$cdata[node.tagName] && me.options.autoClearEmptyNode && dtd.$inline[node.tagName] && !dtd.$empty[node.tagName] && (!node.attrs || utils.isEmptyObject(node.attrs))) { + if (!node.firstChild()) node.parentNode.removeChild(node); + else if (node.tagName == 'span' && (!node.attrs || utils.isEmptyObject(node.attrs))) { + node.parentNode.removeChild(node, true) + } + return; + } + switch (node.tagName) { + case 'style': + case 'script': + node.setAttr({ + cdata_tag: node.tagName, + cdata_data: (node.innerHTML() || ''), + '_ue_custom_node_':'true' + }); + node.tagName = 'div'; + node.innerHTML(''); + break; + case 'a': + if (val = node.getAttr('href')) { + node.setAttr('_href', val) + } + break; + case 'img': + //todo base64暂时去掉,后边做远程图片上传后,干掉这个 + if (val = node.getAttr('src')) { + if (/^data:/.test(val)) { + node.parentNode.removeChild(node); + break; + } + } + node.setAttr('_src', node.getAttr('src')); + break; + case 'span': + if (browser.webkit && (val = node.getStyle('white-space'))) { + if (/nowrap|normal/.test(val)) { + node.setStyle('white-space', ''); + if (me.options.autoClearEmptyNode && utils.isEmptyObject(node.attrs)) { + node.parentNode.removeChild(node, true) + } + } + } + val = node.getAttr('id'); + if(val && /^_baidu_bookmark_/i.test(val)){ + node.parentNode.removeChild(node) + } + break; + case 'p': + if (val = node.getAttr('align')) { + node.setAttr('align'); + node.setStyle('text-align', val) + } + //trace:3431 +// var cssStyle = node.getAttr('style'); +// if (cssStyle) { +// cssStyle = cssStyle.replace(/(margin|padding)[^;]+/g, ''); +// node.setAttr('style', cssStyle) +// +// } + //p标签不允许嵌套 + utils.each(node.children,function(n){ + if(n.type == 'element' && n.tagName == 'p'){ + var next = n.nextSibling(); + node.parentNode.insertAfter(n,node); + var last = n; + while(next){ + var tmp = next.nextSibling(); + node.parentNode.insertAfter(next,last); + last = next; + next = tmp; + } + return false; + } + }); + if (!node.firstChild()) { + node.innerHTML(browser.ie ? ' ' : '
    ') + } + break; + case 'div': + if(node.getAttr('cdata_tag')){ + break; + } + //针对代码这里不处理插入代码的div + val = node.getAttr('class'); + if(val && /^line number\d+/.test(val)){ + break; + } + if(!allowDivTransToP){ + break; + } + var tmpNode, p = UE.uNode.createElement('p'); + while (tmpNode = node.firstChild()) { + if (tmpNode.type == 'text' || !UE.dom.dtd.$block[tmpNode.tagName]) { + p.appendChild(tmpNode); + } else { + if (p.firstChild()) { + node.parentNode.insertBefore(p, node); + p = UE.uNode.createElement('p'); + } else { + node.parentNode.insertBefore(tmpNode, node); + } + } + } + if (p.firstChild()) { + node.parentNode.insertBefore(p, node); + } + node.parentNode.removeChild(node); + break; + case 'dl': + node.tagName = 'ul'; + break; + case 'dt': + case 'dd': + node.tagName = 'li'; + break; + case 'li': + var className = node.getAttr('class'); + if (!className || !/list\-/.test(className)) { + node.setAttr() + } + var tmpNodes = node.getNodesByTagName('ol ul'); + UE.utils.each(tmpNodes, function (n) { + node.parentNode.insertAfter(n, node); + }); + break; + case 'td': + case 'th': + case 'caption': + if(!node.children || !node.children.length){ + node.appendChild(browser.ie11below ? UE.uNode.createText(' ') : UE.uNode.createElement('br')) + } + break; + case 'table': + if(me.options.disabledTableInTable && tdParent(node)){ + node.parentNode.insertBefore(UE.uNode.createText(node.innerText()),node); + node.parentNode.removeChild(node) + } + } + + } +// if(node.type == 'comment'){ +// node.parentNode.removeChild(node); +// } + }) + + }); + + //从编辑器出去的内容处理 + me.addOutputRule(function (root) { + + var val; + root.traversal(function (node) { + if (node.type == 'element') { + + if (me.options.autoClearEmptyNode && dtd.$inline[node.tagName] && !dtd.$empty[node.tagName] && (!node.attrs || utils.isEmptyObject(node.attrs))) { + + if (!node.firstChild()) node.parentNode.removeChild(node); + else if (node.tagName == 'span' && (!node.attrs || utils.isEmptyObject(node.attrs))) { + node.parentNode.removeChild(node, true) + } + return; + } + switch (node.tagName) { + case 'div': + if (val = node.getAttr('cdata_tag')) { + node.tagName = val; + node.appendChild(UE.uNode.createText(node.getAttr('cdata_data'))); + node.setAttr({cdata_tag: '', cdata_data: '','_ue_custom_node_':''}); + } + break; + case 'a': + if (val = node.getAttr('_href')) { + node.setAttr({ + 'href': utils.html(val), + '_href': '' + }) + } + break; + break; + case 'span': + val = node.getAttr('id'); + if(val && /^_baidu_bookmark_/i.test(val)){ + node.parentNode.removeChild(node) + } + break; + case 'img': + if (val = node.getAttr('_src')) { + node.setAttr({ + 'src': node.getAttr('_src'), + '_src': '' + }) + } + + + } + } + + }) + + + }); +}; + + +// plugins/inserthtml.js +/** + * 插入html字符串插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入html代码 + * @command inserthtml + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } html 插入的html字符串 + * @remaind 插入的标签内容是在当前的选区位置上插入,如果当前是闭合状态,那直接插入内容, 如果当前是选中状态,将先清除当前选中内容后,再做插入 + * @warning 注意:该命令会对当前选区的位置,对插入的内容进行过滤转换处理。 过滤的规则遵循html语意化的原则。 + * @example + * ```javascript + * //xxx[BB]xxx 当前选区为非闭合选区,选中BB这两个文本 + * //执行命令,插入CC + * //插入后的效果 xxxCCxxx + * //

    xx|xxx

    当前选区为闭合状态 + * //插入

    CC

    + * //结果

    xx

    CC

    xxx

    + * //

    xxxx

    |

    xxx

    当前选区在两个p标签之间 + * //插入 xxxx + * //结果

    xxxx

    xxxx

    xxx

    + * ``` + */ + +UE.commands['inserthtml'] = { + execCommand: function (command,html,notNeedFilter){ + var me = this, + range, + div; + if(!html){ + return; + } + if(me.fireEvent('beforeinserthtml',html) === true){ + return; + } + range = me.selection.getRange(); + div = range.document.createElement( 'div' ); + div.style.display = 'inline'; + + if (!notNeedFilter) { + var root = UE.htmlparser(html); + //如果给了过滤规则就先进行过滤 + if(me.options.filterRules){ + UE.filterNode(root,me.options.filterRules); + } + //执行默认的处理 + me.filterInputRule(root); + html = root.toHtml() + } + div.innerHTML = utils.trim( html ); + + if ( !range.collapsed ) { + var tmpNode = range.startContainer; + if(domUtils.isFillChar(tmpNode)){ + range.setStartBefore(tmpNode) + } + tmpNode = range.endContainer; + if(domUtils.isFillChar(tmpNode)){ + range.setEndAfter(tmpNode) + } + range.txtToElmBoundary(); + //结束边界可能放到了br的前边,要把br包含进来 + // x[xxx]
    + if(range.endContainer && range.endContainer.nodeType == 1){ + tmpNode = range.endContainer.childNodes[range.endOffset]; + if(tmpNode && domUtils.isBr(tmpNode)){ + range.setEndAfter(tmpNode); + } + } + if(range.startOffset == 0){ + tmpNode = range.startContainer; + if(domUtils.isBoundaryNode(tmpNode,'firstChild') ){ + tmpNode = range.endContainer; + if(range.endOffset == (tmpNode.nodeType == 3 ? tmpNode.nodeValue.length : tmpNode.childNodes.length) && domUtils.isBoundaryNode(tmpNode,'lastChild')){ + me.body.innerHTML = '

    '+(browser.ie ? '' : '
    ')+'

    '; + range.setStart(me.body.firstChild,0).collapse(true) + + } + } + } + !range.collapsed && range.deleteContents(); + if(range.startContainer.nodeType == 1){ + var child = range.startContainer.childNodes[range.startOffset],pre; + if(child && domUtils.isBlockElm(child) && (pre = child.previousSibling) && domUtils.isBlockElm(pre)){ + range.setEnd(pre,pre.childNodes.length).collapse(); + while(child.firstChild){ + pre.appendChild(child.firstChild); + } + domUtils.remove(child); + } + } + + } + + + var child,parent,pre,tmp,hadBreak = 0, nextNode; + //如果当前位置选中了fillchar要干掉,要不会产生空行 + if(range.inFillChar()){ + child = range.startContainer; + if(domUtils.isFillChar(child)){ + range.setStartBefore(child).collapse(true); + domUtils.remove(child); + }else if(domUtils.isFillChar(child,true)){ + child.nodeValue = child.nodeValue.replace(fillCharReg,''); + range.startOffset--; + range.collapsed && range.collapse(true) + } + } + //列表单独处理 + var li = domUtils.findParentByTagName(range.startContainer,'li',true); + if(li){ + var next,last; + while(child = div.firstChild){ + //针对hr单独处理一下先 + while(child && (child.nodeType == 3 || !domUtils.isBlockElm(child) || child.tagName=='HR' )){ + next = child.nextSibling; + range.insertNode( child).collapse(); + last = child; + child = next; + + } + if(child){ + if(/^(ol|ul)$/i.test(child.tagName)){ + while(child.firstChild){ + last = child.firstChild; + domUtils.insertAfter(li,child.firstChild); + li = li.nextSibling; + } + domUtils.remove(child) + }else{ + var tmpLi; + next = child.nextSibling; + tmpLi = me.document.createElement('li'); + domUtils.insertAfter(li,tmpLi); + tmpLi.appendChild(child); + last = child; + child = next; + li = tmpLi; + } + } + } + li = domUtils.findParentByTagName(range.startContainer,'li',true); + if(domUtils.isEmptyBlock(li)){ + domUtils.remove(li) + } + if(last){ + + range.setStartAfter(last).collapse(true).select(true) + } + }else{ + while ( child = div.firstChild ) { + if(hadBreak){ + var p = me.document.createElement('p'); + while(child && (child.nodeType == 3 || !dtd.$block[child.tagName])){ + nextNode = child.nextSibling; + p.appendChild(child); + child = nextNode; + } + if(p.firstChild){ + + child = p + } + } + range.insertNode( child ); + nextNode = child.nextSibling; + if ( !hadBreak && child.nodeType == domUtils.NODE_ELEMENT && domUtils.isBlockElm( child ) ){ + + parent = domUtils.findParent( child,function ( node ){ return domUtils.isBlockElm( node ); } ); + if ( parent && parent.tagName.toLowerCase() != 'body' && !(dtd[parent.tagName][child.nodeName] && child.parentNode === parent)){ + if(!dtd[parent.tagName][child.nodeName]){ + pre = parent; + }else{ + tmp = child.parentNode; + while (tmp !== parent){ + pre = tmp; + tmp = tmp.parentNode; + + } + } + + + domUtils.breakParent( child, pre || tmp ); + //去掉break后前一个多余的节点

    |<[p> ==>

    |

    + var pre = child.previousSibling; + domUtils.trimWhiteTextNode(pre); + if(!pre.childNodes.length){ + domUtils.remove(pre); + } + //trace:2012,在非ie的情况,切开后剩下的节点有可能不能点入光标添加br占位 + + if(!browser.ie && + (next = child.nextSibling) && + domUtils.isBlockElm(next) && + next.lastChild && + !domUtils.isBr(next.lastChild)){ + next.appendChild(me.document.createElement('br')); + } + hadBreak = 1; + } + } + var next = child.nextSibling; + if(!div.firstChild && next && domUtils.isBlockElm(next)){ + + range.setStart(next,0).collapse(true); + break; + } + range.setEndAfter( child ).collapse(); + + } + + child = range.startContainer; + + if(nextNode && domUtils.isBr(nextNode)){ + domUtils.remove(nextNode) + } + //用chrome可能有空白展位符 + if(domUtils.isBlockElm(child) && domUtils.isEmptyNode(child)){ + if(nextNode = child.nextSibling){ + domUtils.remove(child); + if(nextNode.nodeType == 1 && dtd.$block[nextNode.tagName]){ + + range.setStart(nextNode,0).collapse(true).shrinkBoundary() + } + }else{ + + try{ + child.innerHTML = browser.ie ? domUtils.fillChar : '
    '; + }catch(e){ + range.setStartBefore(child); + domUtils.remove(child) + } + + } + + } + //加上true因为在删除表情等时会删两次,第一次是删的fillData + try{ + range.select(true); + }catch(e){} + + } + + + + setTimeout(function(){ + range = me.selection.getRange(); + range.scrollToView(me.autoHeightEnabled,me.autoHeightEnabled ? domUtils.getXY(me.iframe).y:0); + me.fireEvent('afterinserthtml', html); + },200); + } +}; + + +// plugins/autotypeset.js +/** + * 自动排版 + * @file + * @since 1.2.6.1 + */ + +/** + * 对当前编辑器的内容执行自动排版, 排版的行为根据config配置文件里的“autotypeset”选项进行控制。 + * @command autotypeset + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'autotypeset' ); + * ``` + */ + +UE.plugins['autotypeset'] = function(){ + + this.setOpt({'autotypeset': { + mergeEmptyline: true, //合并空行 + removeClass: true, //去掉冗余的class + removeEmptyline: false, //去掉空行 + textAlign:"left", //段落的排版方式,可以是 left,right,center,justify 去掉这个属性表示不执行排版 + imageBlockLine: 'center', //图片的浮动方式,独占一行剧中,左右浮动,默认: center,left,right,none 去掉这个属性表示不执行排版 + pasteFilter: false, //根据规则过滤没事粘贴进来的内容 + clearFontSize: false, //去掉所有的内嵌字号,使用编辑器默认的字号 + clearFontFamily: false, //去掉所有的内嵌字体,使用编辑器默认的字体 + removeEmptyNode: false, // 去掉空节点 + //可以去掉的标签 + removeTagNames: utils.extend({div:1},dtd.$removeEmpty), + indent: false, // 行首缩进 + indentValue : '2em', //行首缩进的大小 + bdc2sb: false, + tobdc: false + }}); + + var me = this, + opt = me.options.autotypeset, + remainClass = { + 'selectTdClass':1, + 'pagebreak':1, + 'anchorclass':1 + }, + remainTag = { + 'li':1 + }, + tags = { + div:1, + p:1, + //trace:2183 这些也认为是行 + blockquote:1,center:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1, + span:1 + }, + highlightCont; + //升级了版本,但配置项目里没有autotypeset + if(!opt){ + return; + } + + readLocalOpts(); + + function isLine(node,notEmpty){ + if(!node || node.nodeType == 3) + return 0; + if(domUtils.isBr(node)) + return 1; + if(node && node.parentNode && tags[node.tagName.toLowerCase()]){ + if(highlightCont && highlightCont.contains(node) + || + node.getAttribute('pagebreak') + ){ + return 0; + } + + return notEmpty ? !domUtils.isEmptyBlock(node) : domUtils.isEmptyBlock(node,new RegExp('[\\s'+domUtils.fillChar + +']','g')); + } + } + + function removeNotAttributeSpan(node){ + if(!node.style.cssText){ + domUtils.removeAttributes(node,['style']); + if(node.tagName.toLowerCase() == 'span' && domUtils.hasNoAttributes(node)){ + domUtils.remove(node,true); + } + } + } + function autotype(type,html){ + + var me = this,cont; + if(html){ + if(!opt.pasteFilter){ + return; + } + cont = me.document.createElement('div'); + cont.innerHTML = html.html; + }else{ + cont = me.document.body; + } + var nodes = domUtils.getElementsByTagName(cont,'*'); + + // 行首缩进,段落方向,段间距,段内间距 + for(var i=0,ci;ci=nodes[i++];){ + + if(me.fireEvent('excludeNodeinautotype',ci) === true){ + continue; + } + //font-size + if(opt.clearFontSize && ci.style.fontSize){ + domUtils.removeStyle(ci,'font-size'); + + removeNotAttributeSpan(ci); + + } + //font-family + if(opt.clearFontFamily && ci.style.fontFamily){ + domUtils.removeStyle(ci,'font-family'); + removeNotAttributeSpan(ci); + } + + if(isLine(ci)){ + //合并空行 + if(opt.mergeEmptyline ){ + var next = ci.nextSibling,tmpNode,isBr = domUtils.isBr(ci); + while(isLine(next)){ + tmpNode = next; + next = tmpNode.nextSibling; + if(isBr && (!next || next && !domUtils.isBr(next))){ + break; + } + domUtils.remove(tmpNode); + } + + } + //去掉空行,保留占位的空行 + if(opt.removeEmptyline && domUtils.inDoc(ci,cont) && !remainTag[ci.parentNode.tagName.toLowerCase()] ){ + if(domUtils.isBr(ci)){ + next = ci.nextSibling; + if(next && !domUtils.isBr(next)){ + continue; + } + } + domUtils.remove(ci); + continue; + + } + + } + if(isLine(ci,true) && ci.tagName != 'SPAN'){ + if(opt.indent){ + ci.style.textIndent = opt.indentValue; + } + if(opt.textAlign){ + ci.style.textAlign = opt.textAlign; + } + // if(opt.lineHeight) + // ci.style.lineHeight = opt.lineHeight + 'cm'; + + } + + //去掉class,保留的class不去掉 + if(opt.removeClass && ci.className && !remainClass[ci.className.toLowerCase()]){ + + if(highlightCont && highlightCont.contains(ci)){ + continue; + } + domUtils.removeAttributes(ci,['class']); + } + + //表情不处理 + if(opt.imageBlockLine && ci.tagName.toLowerCase() == 'img' && !ci.getAttribute('emotion')){ + if(html){ + var img = ci; + switch (opt.imageBlockLine){ + case 'left': + case 'right': + case 'none': + var pN = img.parentNode,tmpNode,pre,next; + while(dtd.$inline[pN.tagName] || pN.tagName == 'A'){ + pN = pN.parentNode; + } + tmpNode = pN; + if(tmpNode.tagName == 'P' && domUtils.getStyle(tmpNode,'text-align') == 'center'){ + if(!domUtils.isBody(tmpNode) && domUtils.getChildCount(tmpNode,function(node){return !domUtils.isBr(node) && !domUtils.isWhitespace(node)}) == 1){ + pre = tmpNode.previousSibling; + next = tmpNode.nextSibling; + if(pre && next && pre.nodeType == 1 && next.nodeType == 1 && pre.tagName == next.tagName && domUtils.isBlockElm(pre)){ + pre.appendChild(tmpNode.firstChild); + while(next.firstChild){ + pre.appendChild(next.firstChild); + } + domUtils.remove(tmpNode); + domUtils.remove(next); + }else{ + domUtils.setStyle(tmpNode,'text-align',''); + } + + + } + + + } + domUtils.setStyle(img,'float', opt.imageBlockLine); + break; + case 'center': + if(me.queryCommandValue('imagefloat') != 'center'){ + pN = img.parentNode; + domUtils.setStyle(img,'float','none'); + tmpNode = img; + while(pN && domUtils.getChildCount(pN,function(node){return !domUtils.isBr(node) && !domUtils.isWhitespace(node)}) == 1 + && (dtd.$inline[pN.tagName] || pN.tagName == 'A')){ + tmpNode = pN; + pN = pN.parentNode; + } + var pNode = me.document.createElement('p'); + domUtils.setAttributes(pNode,{ + + style:'text-align:center' + }); + tmpNode.parentNode.insertBefore(pNode,tmpNode); + pNode.appendChild(tmpNode); + domUtils.setStyle(tmpNode,'float',''); + + } + + + } + } else { + var range = me.selection.getRange(); + range.selectNode(ci).select(); + me.execCommand('imagefloat', opt.imageBlockLine); + } + + } + + //去掉冗余的标签 + if(opt.removeEmptyNode){ + if(opt.removeTagNames[ci.tagName.toLowerCase()] && domUtils.hasNoAttributes(ci) && domUtils.isEmptyBlock(ci)){ + domUtils.remove(ci); + } + } + } + if(opt.tobdc){ + var root = UE.htmlparser(cont.innerHTML); + root.traversal(function(node){ + if(node.type == 'text'){ + node.data = ToDBC(node.data) + } + }); + cont.innerHTML = root.toHtml() + } + if(opt.bdc2sb){ + var root = UE.htmlparser(cont.innerHTML); + root.traversal(function(node){ + if(node.type == 'text'){ + node.data = DBC2SB(node.data) + } + }); + cont.innerHTML = root.toHtml() + } + if(html){ + html.html = cont.innerHTML; + } + } + if(opt.pasteFilter){ + me.addListener('beforepaste',autotype); + } + + function DBC2SB(str) { + var result = ''; + for (var i = 0; i < str.length; i++) { + var code = str.charCodeAt(i); //获取当前字符的unicode编码 + if (code >= 65281 && code <= 65373)//在这个unicode编码范围中的是所有的英文字母已经各种字符 + { + result += String.fromCharCode(str.charCodeAt(i) - 65248); //把全角字符的unicode编码转换为对应半角字符的unicode码 + } else if (code == 12288)//空格 + { + result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32); + } else { + result += str.charAt(i); + } + } + return result; + } + function ToDBC(txtstring) { + txtstring = utils.html(txtstring); + var tmp = ""; + var mark = "";/*用于判断,如果是html尖括里的标记,则不进行全角的转换*/ + for (var i = 0; i < txtstring.length; i++) { + if (txtstring.charCodeAt(i) == 32) { + tmp = tmp + String.fromCharCode(12288); + } + else if (txtstring.charCodeAt(i) < 127) { + tmp = tmp + String.fromCharCode(txtstring.charCodeAt(i) + 65248); + } + else { + tmp += txtstring.charAt(i); + } + } + return tmp; + } + + function readLocalOpts() { + var cookieOpt = me.getPreferences('autotypeset'); + utils.extend(me.options.autotypeset, cookieOpt); + } + + me.commands['autotypeset'] = { + execCommand:function () { + me.removeListener('beforepaste',autotype); + if(opt.pasteFilter){ + me.addListener('beforepaste',autotype); + } + autotype.call(me) + } + + }; + +}; + + + +// plugins/autosubmit.js +/** + * 快捷键提交 + * @file + * @since 1.2.6.1 + */ + +/** + * 提交表单 + * @command autosubmit + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'autosubmit' ); + * ``` + */ + +UE.plugin.register('autosubmit',function(){ + return { + shortcutkey:{ + "autosubmit":"ctrl+13" //手动提交 + }, + commands:{ + 'autosubmit':{ + execCommand:function () { + var me=this, + form = domUtils.findParentByTagName(me.iframe,"form", false); + if (form){ + if(me.fireEvent("beforesubmit")===false){ + return; + } + me.sync(); + form.submit(); + } + } + } + } + } +}); + +// plugins/background.js +/** + * 背景插件,为UEditor提供设置背景功能 + * @file + * @since 1.2.6.1 + */ +UE.plugin.register('background', function () { + var me = this, + cssRuleId = 'editor_background', + isSetColored, + reg = new RegExp('body[\\s]*\\{(.+)\\}', 'i'); + + function stringToObj(str) { + var obj = {}, styles = str.split(';'); + utils.each(styles, function (v) { + var index = v.indexOf(':'), + key = utils.trim(v.substr(0, index)).toLowerCase(); + key && (obj[key] = utils.trim(v.substr(index + 1) || '')); + }); + return obj; + } + + function setBackground(obj) { + if (obj) { + var styles = []; + for (var name in obj) { + if (obj.hasOwnProperty(name)) { + styles.push(name + ":" + obj[name] + '; '); + } + } + utils.cssRule(cssRuleId, styles.length ? ('body{' + styles.join("") + '}') : '', me.document); + } else { + utils.cssRule(cssRuleId, '', me.document) + } + } + //重写editor.hasContent方法 + + var orgFn = me.hasContents; + me.hasContents = function(){ + if(me.queryCommandValue('background')){ + return true + } + return orgFn.apply(me,arguments); + }; + return { + bindEvents: { + 'getAllHtml': function (type, headHtml) { + var body = this.body, + su = domUtils.getComputedStyle(body, "background-image"), + url = ""; + if (su.indexOf(me.options.imagePath) > 0) { + url = su.substring(su.indexOf(me.options.imagePath), su.length - 1).replace(/"|\(|\)/ig, ""); + } else { + url = su != "none" ? su.replace(/url\("?|"?\)/ig, "") : ""; + } + var html = ' '; + headHtml.push(html); + }, + 'aftersetcontent': function () { + if(isSetColored == false) setBackground(); + } + }, + inputRule: function (root) { + isSetColored = false; + utils.each(root.getNodesByTagName('p'), function (p) { + var styles = p.getAttr('data-background'); + if (styles) { + isSetColored = true; + setBackground(stringToObj(styles)); + p.parentNode.removeChild(p); + } + }) + }, + outputRule: function (root) { + var me = this, + styles = (utils.cssRule(cssRuleId, me.document) || '').replace(/[\n\r]+/g, '').match(reg); + if (styles) { + root.appendChild(UE.uNode.createElement('


    ')); + } + }, + commands: { + 'background': { + execCommand: function (cmd, obj) { + setBackground(obj); + }, + queryCommandValue: function () { + var me = this, + styles = (utils.cssRule(cssRuleId, me.document) || '').replace(/[\n\r]+/g, '').match(reg); + return styles ? stringToObj(styles[1]) : null; + }, + notNeedUndo: true + } + } + } +}); + +// plugins/image.js +/** + * 图片插入、排版插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 图片对齐方式 + * @command imagefloat + * @method execCommand + * @remind 值center为独占一行居中 + * @param { String } cmd 命令字符串 + * @param { String } align 对齐方式,可传left、right、none、center + * @remaind center表示图片独占一行 + * @example + * ```javascript + * editor.execCommand( 'imagefloat', 'center' ); + * ``` + */ + +/** + * 如果选区所在位置是图片区域 + * @command imagefloat + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回图片对齐方式 + * @example + * ```javascript + * editor.queryCommandValue( 'imagefloat' ); + * ``` + */ + +UE.commands['imagefloat'] = { + execCommand:function (cmd, align) { + var me = this, + range = me.selection.getRange(); + if (!range.collapsed) { + var img = range.getClosedNode(); + if (img && img.tagName == 'IMG') { + switch (align) { + case 'left': + case 'right': + case 'none': + var pN = img.parentNode, tmpNode, pre, next; + while (dtd.$inline[pN.tagName] || pN.tagName == 'A') { + pN = pN.parentNode; + } + tmpNode = pN; + if (tmpNode.tagName == 'P' && domUtils.getStyle(tmpNode, 'text-align') == 'center') { + if (!domUtils.isBody(tmpNode) && domUtils.getChildCount(tmpNode, function (node) { + return !domUtils.isBr(node) && !domUtils.isWhitespace(node); + }) == 1) { + pre = tmpNode.previousSibling; + next = tmpNode.nextSibling; + if (pre && next && pre.nodeType == 1 && next.nodeType == 1 && pre.tagName == next.tagName && domUtils.isBlockElm(pre)) { + pre.appendChild(tmpNode.firstChild); + while (next.firstChild) { + pre.appendChild(next.firstChild); + } + domUtils.remove(tmpNode); + domUtils.remove(next); + } else { + domUtils.setStyle(tmpNode, 'text-align', ''); + } + + + } + + range.selectNode(img).select(); + } + domUtils.setStyle(img, 'float', align == 'none' ? '' : align); + if(align == 'none'){ + domUtils.removeAttributes(img,'align'); + } + + break; + case 'center': + if (me.queryCommandValue('imagefloat') != 'center') { + pN = img.parentNode; + domUtils.setStyle(img, 'float', ''); + domUtils.removeAttributes(img,'align'); + tmpNode = img; + while (pN && domUtils.getChildCount(pN, function (node) { + return !domUtils.isBr(node) && !domUtils.isWhitespace(node); + }) == 1 + && (dtd.$inline[pN.tagName] || pN.tagName == 'A')) { + tmpNode = pN; + pN = pN.parentNode; + } + range.setStartBefore(tmpNode).setCursor(false); + pN = me.document.createElement('div'); + pN.appendChild(tmpNode); + domUtils.setStyle(tmpNode, 'float', ''); + + me.execCommand('insertHtml', '

    ' + pN.innerHTML + '

    '); + + tmpNode = me.document.getElementById('_img_parent_tmp'); + tmpNode.removeAttribute('id'); + tmpNode = tmpNode.firstChild; + range.selectNode(tmpNode).select(); + //去掉后边多余的元素 + next = tmpNode.parentNode.nextSibling; + if (next && domUtils.isEmptyNode(next)) { + domUtils.remove(next); + } + + } + + break; + } + + } + } + }, + queryCommandValue:function () { + var range = this.selection.getRange(), + startNode, floatStyle; + if (range.collapsed) { + return 'none'; + } + startNode = range.getClosedNode(); + if (startNode && startNode.nodeType == 1 && startNode.tagName == 'IMG') { + floatStyle = domUtils.getComputedStyle(startNode, 'float') || startNode.getAttribute('align'); + + if (floatStyle == 'none') { + floatStyle = domUtils.getComputedStyle(startNode.parentNode, 'text-align') == 'center' ? 'center' : floatStyle; + } + return { + left:1, + right:1, + center:1 + }[floatStyle] ? floatStyle : 'none'; + } + return 'none'; + + + }, + queryCommandState:function () { + var range = this.selection.getRange(), + startNode; + + if (range.collapsed) return -1; + + startNode = range.getClosedNode(); + if (startNode && startNode.nodeType == 1 && startNode.tagName == 'IMG') { + return 0; + } + return -1; + } +}; + + +/** + * 插入图片 + * @command insertimage + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } opt 属性键值对,这些属性都将被复制到当前插入图片 + * @remind 该命令第二个参数可接受一个图片配置项对象的数组,可以插入多张图片, + * 此时数组的每一个元素都是一个Object类型的图片属性集合。 + * @example + * ```javascript + * editor.execCommand( 'insertimage', { + * src:'a/b/c.jpg', + * width:'100', + * height:'100' + * } ); + * ``` + * @example + * ```javascript + * editor.execCommand( 'insertimage', [{ + * src:'a/b/c.jpg', + * width:'100', + * height:'100' + * },{ + * src:'a/b/d.jpg', + * width:'100', + * height:'100' + * }] ); + * ``` + */ + +UE.commands['insertimage'] = { + execCommand:function (cmd, opt) { + + opt = utils.isArray(opt) ? opt : [opt]; + if (!opt.length) { + return; + } + var me = this, + range = me.selection.getRange(), + img = range.getClosedNode(); + + if(me.fireEvent('beforeinsertimage', opt) === true){ + return; + } + + function unhtmlData(imgCi) { + + utils.each('width,height,border,hspace,vspace'.split(','), function (item) { + + if (imgCi[item]) { + imgCi[item] = parseInt(imgCi[item], 10) || 0; + } + }); + + utils.each('src,_src'.split(','), function (item) { + + if (imgCi[item]) { + imgCi[item] = utils.unhtmlForUrl(imgCi[item]); + } + }); + utils.each('title,alt'.split(','), function (item) { + + if (imgCi[item]) { + imgCi[item] = utils.unhtml(imgCi[item]); + } + }); + } + + if (img && /img/i.test(img.tagName) && (img.className != "edui-faked-video" || img.className.indexOf("edui-upload-video")!=-1) && !img.getAttribute("word_img")) { + var first = opt.shift(); + var floatStyle = first['floatStyle']; + delete first['floatStyle']; +//// img.style.border = (first.border||0) +"px solid #000"; +//// img.style.margin = (first.margin||0) +"px"; +// img.style.cssText += ';margin:' + (first.margin||0) +"px;" + 'border:' + (first.border||0) +"px solid #000"; + domUtils.setAttributes(img, first); + me.execCommand('imagefloat', floatStyle); + if (opt.length > 0) { + range.setStartAfter(img).setCursor(false, true); + me.execCommand('insertimage', opt); + } + + } else { + var html = [], str = '', ci; + ci = opt[0]; + if (opt.length == 1) { + unhtmlData(ci); + + str = '' + ci.alt + ''; + if (ci['floatStyle'] == 'center') { + str = '

    ' + str + '

    '; + } + html.push(str); + + } else { + for (var i = 0; ci = opt[i++];) { + unhtmlData(ci); + str = '

    '; + html.push(str); + } + } + + me.execCommand('insertHtml', html.join('')); + } + + me.fireEvent('afterinsertimage', opt) + } +}; + + +// plugins/justify.js +/** + * 段落格式 + * @file + * @since 1.2.6.1 + */ + +/** + * 段落对齐方式 + * @command justify + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } align 对齐方式:left => 居左,right => 居右,center => 居中,justify => 两端对齐 + * @example + * ```javascript + * editor.execCommand( 'justify', 'center' ); + * ``` + */ +/** + * 如果选区所在位置是段落区域,返回当前段落对齐方式 + * @command justify + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回段落对齐方式 + * @example + * ```javascript + * editor.queryCommandValue( 'justify' ); + * ``` + */ + +UE.plugins['justify']=function(){ + var me=this, + block = domUtils.isBlockElm, + defaultValue = { + left:1, + right:1, + center:1, + justify:1 + }, + doJustify = function (range, style) { + var bookmark = range.createBookmark(), + filterFn = function (node) { + return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' && !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace(node); + }; + + range.enlarge(true); + var bookmark2 = range.createBookmark(), + current = domUtils.getNextDomNode(bookmark2.start, false, filterFn), + tmpRange = range.cloneRange(), + tmpNode; + while (current && !(domUtils.getPosition(current, bookmark2.end) & domUtils.POSITION_FOLLOWING)) { + if (current.nodeType == 3 || !block(current)) { + tmpRange.setStartBefore(current); + while (current && current !== bookmark2.end && !block(current)) { + tmpNode = current; + current = domUtils.getNextDomNode(current, false, null, function (node) { + return !block(node); + }); + } + tmpRange.setEndAfter(tmpNode); + var common = tmpRange.getCommonAncestor(); + if (!domUtils.isBody(common) && block(common)) { + domUtils.setStyles(common, utils.isString(style) ? {'text-align':style} : style); + current = common; + } else { + var p = range.document.createElement('p'); + domUtils.setStyles(p, utils.isString(style) ? {'text-align':style} : style); + var frag = tmpRange.extractContents(); + p.appendChild(frag); + tmpRange.insertNode(p); + current = p; + } + current = domUtils.getNextDomNode(current, false, filterFn); + } else { + current = domUtils.getNextDomNode(current, true, filterFn); + } + } + return range.moveToBookmark(bookmark2).moveToBookmark(bookmark); + }; + + UE.commands['justify'] = { + execCommand:function (cmdName, align) { + var range = this.selection.getRange(), + txt; + + //闭合时单独处理 + if (range.collapsed) { + txt = this.document.createTextNode('p'); + range.insertNode(txt); + } + doJustify(range, align); + if (txt) { + range.setStartBefore(txt).collapse(true); + domUtils.remove(txt); + } + + range.select(); + + + return true; + }, + queryCommandValue:function () { + var startNode = this.selection.getStart(), + value = domUtils.getComputedStyle(startNode, 'text-align'); + return defaultValue[value] ? value : 'left'; + }, + queryCommandState:function () { + var start = this.selection.getStart(), + cell = start && domUtils.findParentByTagName(start, ["td", "th","caption"], true); + + return cell? -1:0; + } + + }; +}; + + +// plugins/font.js +/** + * 字体颜色,背景色,字号,字体,下划线,删除线 + * @file + * @since 1.2.6.1 + */ + +/** + * 字体颜色 + * @command forecolor + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 色值(必须十六进制) + * @example + * ```javascript + * editor.execCommand( 'forecolor', '#000' ); + * ``` + */ +/** + * 返回选区字体颜色 + * @command forecolor + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体颜色 + * @example + * ```javascript + * editor.queryCommandValue( 'forecolor' ); + * ``` + */ + +/** + * 字体背景颜色 + * @command backcolor + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 色值(必须十六进制) + * @example + * ```javascript + * editor.execCommand( 'backcolor', '#000' ); + * ``` + */ +/** + * 返回选区字体颜色 + * @command backcolor + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体背景颜色 + * @example + * ```javascript + * editor.queryCommandValue( 'backcolor' ); + * ``` + */ + +/** + * 字体大小 + * @command fontsize + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 字体大小 + * @example + * ```javascript + * editor.execCommand( 'fontsize', '14px' ); + * ``` + */ +/** + * 返回选区字体大小 + * @command fontsize + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体大小 + * @example + * ```javascript + * editor.queryCommandValue( 'fontsize' ); + * ``` + */ + +/** + * 字体样式 + * @command fontfamily + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 字体样式 + * @example + * ```javascript + * editor.execCommand( 'fontfamily', '微软雅黑' ); + * ``` + */ +/** + * 返回选区字体样式 + * @command fontfamily + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体样式 + * @example + * ```javascript + * editor.queryCommandValue( 'fontfamily' ); + * ``` + */ + +/** + * 字体下划线,与删除线互斥 + * @command underline + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'underline' ); + * ``` + */ + +/** + * 字体删除线,与下划线互斥 + * @command strikethrough + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'strikethrough' ); + * ``` + */ + +/** + * 字体边框 + * @command fontborder + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'fontborder' ); + * ``` + */ + +UE.plugins['font'] = function () { + var me = this, + fonts = { + 'forecolor': 'color', + 'backcolor': 'background-color', + 'fontsize': 'font-size', + 'fontfamily': 'font-family', + 'underline': 'text-decoration', + 'strikethrough': 'text-decoration', + 'fontborder': 'border' + }, + needCmd = {'underline': 1, 'strikethrough': 1, 'fontborder': 1}, + needSetChild = { + 'forecolor': 'color', + 'backcolor': 'background-color', + 'fontsize': 'font-size', + 'fontfamily': 'font-family' + + }; + me.setOpt({ + 'fontfamily': [ + { name: 'songti', val: '宋体,SimSun'}, + { name: 'yahei', val: '微软雅黑,Microsoft YaHei'}, + { name: 'kaiti', val: '楷体,楷体_GB2312, SimKai'}, + { name: 'heiti', val: '黑体, SimHei'}, + { name: 'lishu', val: '隶书, SimLi'}, + { name: 'andaleMono', val: 'andale mono'}, + { name: 'arial', val: 'arial, helvetica,sans-serif'}, + { name: 'arialBlack', val: 'arial black,avant garde'}, + { name: 'comicSansMs', val: 'comic sans ms'}, + { name: 'impact', val: 'impact,chicago'}, + { name: 'timesNewRoman', val: 'times new roman'} + ], + 'fontsize': [10, 11, 12, 14, 16, 18, 20, 24, 36] + }); + + function mergeWithParent(node){ + var parent; + while(parent = node.parentNode){ + if(parent.tagName == 'SPAN' && domUtils.getChildCount(parent,function(child){ + return !domUtils.isBookmarkNode(child) && !domUtils.isBr(child) + }) == 1) { + parent.style.cssText += node.style.cssText; + domUtils.remove(node,true); + node = parent; + + }else{ + break; + } + } + + } + function mergeChild(rng,cmdName,value){ + if(needSetChild[cmdName]){ + rng.adjustmentBoundary(); + if(!rng.collapsed && rng.startContainer.nodeType == 1){ + var start = rng.startContainer.childNodes[rng.startOffset]; + if(start && domUtils.isTagNode(start,'span')){ + var bk = rng.createBookmark(); + utils.each(domUtils.getElementsByTagName(start, 'span'), function (span) { + if (!span.parentNode || domUtils.isBookmarkNode(span))return; + if(cmdName == 'backcolor' && domUtils.getComputedStyle(span,'background-color').toLowerCase() === value){ + return; + } + domUtils.removeStyle(span,needSetChild[cmdName]); + if(span.style.cssText.replace(/^\s+$/,'').length == 0){ + domUtils.remove(span,true) + } + }); + rng.moveToBookmark(bk) + } + } + } + + } + function mergesibling(rng,cmdName,value) { + var collapsed = rng.collapsed, + bk = rng.createBookmark(), common; + if (collapsed) { + common = bk.start.parentNode; + while (dtd.$inline[common.tagName]) { + common = common.parentNode; + } + } else { + common = domUtils.getCommonAncestor(bk.start, bk.end); + } + utils.each(domUtils.getElementsByTagName(common, 'span'), function (span) { + if (!span.parentNode || domUtils.isBookmarkNode(span))return; + if (/\s*border\s*:\s*none;?\s*/i.test(span.style.cssText)) { + if(/^\s*border\s*:\s*none;?\s*$/.test(span.style.cssText)){ + domUtils.remove(span, true); + }else{ + domUtils.removeStyle(span,'border'); + } + return + } + if (/border/i.test(span.style.cssText) && span.parentNode.tagName == 'SPAN' && /border/i.test(span.parentNode.style.cssText)) { + span.style.cssText = span.style.cssText.replace(/border[^:]*:[^;]+;?/gi, ''); + } + if(!(cmdName=='fontborder' && value=='none')){ + var next = span.nextSibling; + while (next && next.nodeType == 1 && next.tagName == 'SPAN' ) { + if(domUtils.isBookmarkNode(next) && cmdName == 'fontborder') { + span.appendChild(next); + next = span.nextSibling; + continue; + } + if (next.style.cssText == span.style.cssText) { + domUtils.moveChild(next, span); + domUtils.remove(next); + } + if (span.nextSibling === next) + break; + next = span.nextSibling; + } + } + + + mergeWithParent(span); + if(browser.ie && browser.version > 8 ){ + //拷贝父亲们的特别的属性,这里只做背景颜色的处理 + var parent = domUtils.findParent(span,function(n){return n.tagName == 'SPAN' && /background-color/.test(n.style.cssText)}); + if(parent && !/background-color/.test(span.style.cssText)){ + span.style.backgroundColor = parent.style.backgroundColor; + } + } + + }); + rng.moveToBookmark(bk); + mergeChild(rng,cmdName,value) + } + + me.addInputRule(function (root) { + utils.each(root.getNodesByTagName('u s del font strike'), function (node) { + if (node.tagName == 'font') { + var cssStyle = []; + for (var p in node.attrs) { + switch (p) { + case 'size': + cssStyle.push('font-size:' + + ({ + '1':'10', + '2':'12', + '3':'16', + '4':'18', + '5':'24', + '6':'32', + '7':'48' + }[node.attrs[p]] || node.attrs[p]) + 'px'); + break; + case 'color': + cssStyle.push('color:' + node.attrs[p]); + break; + case 'face': + cssStyle.push('font-family:' + node.attrs[p]); + break; + case 'style': + cssStyle.push(node.attrs[p]); + } + } + node.attrs = { + 'style': cssStyle.join(';') + }; + } else { + var val = node.tagName == 'u' ? 'underline' : 'line-through'; + node.attrs = { + 'style': (node.getAttr('style') || '') + 'text-decoration:' + val + ';' + } + } + node.tagName = 'span'; + }); +// utils.each(root.getNodesByTagName('span'), function (node) { +// var val; +// if(val = node.getAttr('class')){ +// if(/fontstrikethrough/.test(val)){ +// node.setStyle('text-decoration','line-through'); +// if(node.attrs['class']){ +// node.attrs['class'] = node.attrs['class'].replace(/fontstrikethrough/,''); +// }else{ +// node.setAttr('class') +// } +// } +// if(/fontborder/.test(val)){ +// node.setStyle('border','1px solid #000'); +// if(node.attrs['class']){ +// node.attrs['class'] = node.attrs['class'].replace(/fontborder/,''); +// }else{ +// node.setAttr('class') +// } +// } +// } +// }); + }); +// me.addOutputRule(function(root){ +// utils.each(root.getNodesByTagName('span'), function (node) { +// var val; +// if(val = node.getStyle('text-decoration')){ +// if(/line-through/.test(val)){ +// if(node.attrs['class']){ +// node.attrs['class'] += ' fontstrikethrough'; +// }else{ +// node.setAttr('class','fontstrikethrough') +// } +// } +// +// node.setStyle('text-decoration') +// } +// if(val = node.getStyle('border')){ +// if(/1px/.test(val) && /solid/.test(val)){ +// if(node.attrs['class']){ +// node.attrs['class'] += ' fontborder'; +// +// }else{ +// node.setAttr('class','fontborder') +// } +// } +// node.setStyle('border') +// +// } +// }); +// }); + for (var p in fonts) { + (function (cmd, style) { + UE.commands[cmd] = { + execCommand: function (cmdName, value) { + value = value || (this.queryCommandState(cmdName) ? 'none' : cmdName == 'underline' ? 'underline' : + cmdName == 'fontborder' ? '1px solid #000' : + 'line-through'); + var me = this, + range = this.selection.getRange(), + text; + + if (value == 'default') { + + if (range.collapsed) { + text = me.document.createTextNode('font'); + range.insertNode(text).select(); + + } + me.execCommand('removeFormat', 'span,a', style); + if (text) { + range.setStartBefore(text).collapse(true); + domUtils.remove(text); + } + mergesibling(range,cmdName,value); + range.select() + } else { + if (!range.collapsed) { + if (needCmd[cmd] && me.queryCommandValue(cmd)) { + me.execCommand('removeFormat', 'span,a', style); + } + range = me.selection.getRange(); + + range.applyInlineStyle('span', {'style': style + ':' + value}); + mergesibling(range, cmdName,value); + range.select(); + } else { + + var span = domUtils.findParentByTagName(range.startContainer, 'span', true); + text = me.document.createTextNode('font'); + if (span && !span.children.length && !span[browser.ie ? 'innerText' : 'textContent'].replace(fillCharReg, '').length) { + //for ie hack when enter + range.insertNode(text); + if (needCmd[cmd]) { + range.selectNode(text).select(); + me.execCommand('removeFormat', 'span,a', style, null); + + span = domUtils.findParentByTagName(text, 'span', true); + range.setStartBefore(text); + + } + span && (span.style.cssText += ';' + style + ':' + value); + range.collapse(true).select(); + + + } else { + range.insertNode(text); + range.selectNode(text).select(); + span = range.document.createElement('span'); + + if (needCmd[cmd]) { + //a标签内的不处理跳过 + if (domUtils.findParentByTagName(text, 'a', true)) { + range.setStartBefore(text).setCursor(); + domUtils.remove(text); + return; + } + me.execCommand('removeFormat', 'span,a', style); + } + + span.style.cssText = style + ':' + value; + + + text.parentNode.insertBefore(span, text); + //修复,span套span 但样式不继承的问题 + if (!browser.ie || browser.ie && browser.version == 9) { + var spanParent = span.parentNode; + while (!domUtils.isBlockElm(spanParent)) { + if (spanParent.tagName == 'SPAN') { + //opera合并style不会加入";" + span.style.cssText = spanParent.style.cssText + ";" + span.style.cssText; + } + spanParent = spanParent.parentNode; + } + } + + + if (opera) { + setTimeout(function () { + range.setStart(span, 0).collapse(true); + mergesibling(range, cmdName,value); + range.select(); + }); + } else { + range.setStart(span, 0).collapse(true); + mergesibling(range,cmdName,value); + range.select(); + } + + //trace:981 + //domUtils.mergeToParent(span) + } + domUtils.remove(text); + } + + + } + return true; + }, + queryCommandValue: function (cmdName) { + var startNode = this.selection.getStart(); + + //trace:946 + if (cmdName == 'underline' || cmdName == 'strikethrough') { + var tmpNode = startNode, value; + while (tmpNode && !domUtils.isBlockElm(tmpNode) && !domUtils.isBody(tmpNode)) { + if (tmpNode.nodeType == 1) { + value = domUtils.getComputedStyle(tmpNode, style); + if (value != 'none') { + return value; + } + } + + tmpNode = tmpNode.parentNode; + } + return 'none'; + } + if (cmdName == 'fontborder') { + var tmp = startNode, val; + while (tmp && dtd.$inline[tmp.tagName]) { + if (val = domUtils.getComputedStyle(tmp, 'border')) { + + if (/1px/.test(val) && /solid/.test(val)) { + return val; + } + } + tmp = tmp.parentNode; + } + return '' + } + + if( cmdName == 'FontSize' ) { + var styleVal = domUtils.getComputedStyle(startNode, style), + tmp = /^([\d\.]+)(\w+)$/.exec( styleVal ); + + if( tmp ) { + + return Math.floor( tmp[1] ) + tmp[2]; + + } + + return styleVal; + + } + + return domUtils.getComputedStyle(startNode, style); + }, + queryCommandState: function (cmdName) { + if (!needCmd[cmdName]) + return 0; + var val = this.queryCommandValue(cmdName); + if (cmdName == 'fontborder') { + return /1px/.test(val) && /solid/.test(val) + } else { + return cmdName == 'underline' ? /underline/.test(val) : /line\-through/.test(val); + + } + + } + }; + })(p, fonts[p]); + } +}; + +// plugins/link.js +/** + * 超链接 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入超链接 + * @command link + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } options 设置自定义属性,例如:url、title、target + * @example + * ```javascript + * editor.execCommand( 'link', '{ + * url:'ueditor.baidu.com', + * title:'ueditor', + * target:'_blank' + * }' ); + * ``` + */ +/** + * 返回当前选中的第一个超链接节点 + * @command link + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { Element } 超链接节点 + * @example + * ```javascript + * editor.queryCommandValue( 'link' ); + * ``` + */ + +/** + * 取消超链接 + * @command unlink + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'unlink'); + * ``` + */ + +UE.plugins['link'] = function(){ + function optimize( range ) { + var start = range.startContainer,end = range.endContainer; + + if ( start = domUtils.findParentByTagName( start, 'a', true ) ) { + range.setStartBefore( start ); + } + if ( end = domUtils.findParentByTagName( end, 'a', true ) ) { + range.setEndAfter( end ); + } + } + + + UE.commands['unlink'] = { + execCommand : function() { + var range = this.selection.getRange(), + bookmark; + if(range.collapsed && !domUtils.findParentByTagName( range.startContainer, 'a', true )){ + return; + } + bookmark = range.createBookmark(); + optimize( range ); + range.removeInlineStyle( 'a' ).moveToBookmark( bookmark ).select(); + }, + queryCommandState : function(){ + return !this.highlight && this.queryCommandValue('link') ? 0 : -1; + } + + }; + function doLink(range,opt,me){ + var rngClone = range.cloneRange(), + link = me.queryCommandValue('link'); + optimize( range = range.adjustmentBoundary() ); + var start = range.startContainer; + if(start.nodeType == 1 && link){ + start = start.childNodes[range.startOffset]; + if(start && start.nodeType == 1 && start.tagName == 'A' && /^(?:https?|ftp|file)\s*:\s*\/\//.test(start[browser.ie?'innerText':'textContent'])){ + start[browser.ie ? 'innerText' : 'textContent'] = utils.html(opt.textValue||opt.href); + + } + } + if( !rngClone.collapsed || link){ + range.removeInlineStyle( 'a' ); + rngClone = range.cloneRange(); + } + + if ( rngClone.collapsed ) { + var a = range.document.createElement( 'a'), + text = ''; + if(opt.textValue){ + + text = utils.html(opt.textValue); + delete opt.textValue; + }else{ + text = utils.html(opt.href); + + } + domUtils.setAttributes( a, opt ); + start = domUtils.findParentByTagName( rngClone.startContainer, 'a', true ); + if(start && domUtils.isInNodeEndBoundary(rngClone,start)){ + range.setStartAfter(start).collapse(true); + + } + a[browser.ie ? 'innerText' : 'textContent'] = text; + range.insertNode(a).selectNode( a ); + } else { + range.applyInlineStyle( 'a', opt ); + + } + } + UE.commands['link'] = { + execCommand : function( cmdName, opt ) { + var range; + opt._href && (opt._href = utils.unhtml(opt._href,/[<">]/g)); + opt.href && (opt.href = utils.unhtml(opt.href,/[<">]/g)); + opt.textValue && (opt.textValue = utils.unhtml(opt.textValue,/[<">]/g)); + doLink(range=this.selection.getRange(),opt,this); + //闭合都不加占位符,如果加了会在a后边多个占位符节点,导致a是图片背景组成的列表,出现空白问题 + range.collapse().select(true); + + }, + queryCommandValue : function() { + var range = this.selection.getRange(), + node; + if ( range.collapsed ) { +// node = this.selection.getStart(); + //在ie下getstart()取值偏上了 + node = range.startContainer; + node = node.nodeType == 1 ? node : node.parentNode; + + if ( node && (node = domUtils.findParentByTagName( node, 'a', true )) && ! domUtils.isInNodeEndBoundary(range,node)) { + + return node; + } + } else { + //trace:1111 如果是

    xx

    startContainer是p就会找不到a + range.shrinkBoundary(); + var start = range.startContainer.nodeType == 3 || !range.startContainer.childNodes[range.startOffset] ? range.startContainer : range.startContainer.childNodes[range.startOffset], + end = range.endContainer.nodeType == 3 || range.endOffset == 0 ? range.endContainer : range.endContainer.childNodes[range.endOffset-1], + common = range.getCommonAncestor(); + node = domUtils.findParentByTagName( common, 'a', true ); + if ( !node && common.nodeType == 1){ + + var as = common.getElementsByTagName( 'a' ), + ps,pe; + + for ( var i = 0,ci; ci = as[i++]; ) { + ps = domUtils.getPosition( ci, start ),pe = domUtils.getPosition( ci,end); + if ( (ps & domUtils.POSITION_FOLLOWING || ps & domUtils.POSITION_CONTAINS) + && + (pe & domUtils.POSITION_PRECEDING || pe & domUtils.POSITION_CONTAINS) + ) { + node = ci; + break; + } + } + } + return node; + } + + }, + queryCommandState : function() { + //判断如果是视频的话连接不可用 + //fix 853 + var img = this.selection.getRange().getClosedNode(), + flag = img && (img.className == "edui-faked-video" || img.className.indexOf("edui-upload-video")!=-1); + return flag ? -1 : 0; + } + }; +}; + +// plugins/iframe.js +///import core +///import plugins\inserthtml.js +///commands 插入框架 +///commandsName InsertFrame +///commandsTitle 插入Iframe +///commandsDialog dialogs\insertframe + +UE.plugins['insertframe'] = function() { + var me =this; + function deleteIframe(){ + me._iframe && delete me._iframe; + } + + me.addListener("selectionchange",function(){ + deleteIframe(); + }); + +}; + + + +// plugins/scrawl.js +///import core +///commands 涂鸦 +///commandsName Scrawl +///commandsTitle 涂鸦 +///commandsDialog dialogs\scrawl +UE.commands['scrawl'] = { + queryCommandState : function(){ + return ( browser.ie && browser.version <= 8 ) ? -1 :0; + } +}; + + +// plugins/removeformat.js +/** + * 清除格式 + * @file + * @since 1.2.6.1 + */ + +/** + * 清除文字样式 + * @command removeformat + * @method execCommand + * @param { String } cmd 命令字符串 + * @param {String} tags 以逗号隔开的标签。如:strong + * @param {String} style 样式如:color + * @param {String} attrs 属性如:width + * @example + * ```javascript + * editor.execCommand( 'removeformat', 'strong','color','width' ); + * ``` + */ + +UE.plugins['removeformat'] = function(){ + var me = this; + me.setOpt({ + 'removeFormatTags': 'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var', + 'removeFormatAttributes':'class,style,lang,width,height,align,hspace,valign' + }); + me.commands['removeformat'] = { + execCommand : function( cmdName, tags, style, attrs,notIncludeA ) { + + var tagReg = new RegExp( '^(?:' + (tags || this.options.removeFormatTags).replace( /,/g, '|' ) + ')$', 'i' ) , + removeFormatAttributes = style ? [] : (attrs || this.options.removeFormatAttributes).split( ',' ), + range = new dom.Range( this.document ), + bookmark,node,parent, + filter = function( node ) { + return node.nodeType == 1; + }; + + function isRedundantSpan (node) { + if (node.nodeType == 3 || node.tagName.toLowerCase() != 'span'){ + return 0; + } + if (browser.ie) { + //ie 下判断实效,所以只能简单用style来判断 + //return node.style.cssText == '' ? 1 : 0; + var attrs = node.attributes; + if ( attrs.length ) { + for ( var i = 0,l = attrs.length; i + var node = range.startContainer, + tmp, + collapsed = range.collapsed; + while(node.nodeType == 1 && domUtils.isEmptyNode(node) && dtd.$removeEmpty[node.tagName]){ + tmp = node.parentNode; + range.setStartBefore(node); + //trace:937 + //更新结束边界 + if(range.startContainer === range.endContainer){ + range.endOffset--; + } + domUtils.remove(node); + node = tmp; + } + + if(!collapsed){ + node = range.endContainer; + while(node.nodeType == 1 && domUtils.isEmptyNode(node) && dtd.$removeEmpty[node.tagName]){ + tmp = node.parentNode; + range.setEndBefore(node); + domUtils.remove(node); + + node = tmp; + } + + + } + } + + + + range = this.selection.getRange(); + doRemove( range ); + range.select(); + + } + + }; + +}; + + +// plugins/blockquote.js +/** + * 添加引用 + * @file + * @since 1.2.6.1 + */ + +/** + * 添加引用 + * @command blockquote + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'blockquote' ); + * ``` + */ + +/** + * 添加引用 + * @command blockquote + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } attrs 节点属性 + * @example + * ```javascript + * editor.execCommand( 'blockquote',{ + * style: "color: red;" + * } ); + * ``` + */ + + +UE.plugins['blockquote'] = function(){ + var me = this; + function getObj(editor){ + return domUtils.filterNodeList(editor.selection.getStartElementPath(),'blockquote'); + } + me.commands['blockquote'] = { + execCommand : function( cmdName, attrs ) { + var range = this.selection.getRange(), + obj = getObj(this), + blockquote = dtd.blockquote, + bookmark = range.createBookmark(); + + if ( obj ) { + + var start = range.startContainer, + startBlock = domUtils.isBlockElm(start) ? start : domUtils.findParent(start,function(node){return domUtils.isBlockElm(node)}), + + end = range.endContainer, + endBlock = domUtils.isBlockElm(end) ? end : domUtils.findParent(end,function(node){return domUtils.isBlockElm(node)}); + + //处理一下li + startBlock = domUtils.findParentByTagName(startBlock,'li',true) || startBlock; + endBlock = domUtils.findParentByTagName(endBlock,'li',true) || endBlock; + + + if(startBlock.tagName == 'LI' || startBlock.tagName == 'TD' || startBlock === obj || domUtils.isBody(startBlock)){ + domUtils.remove(obj,true); + }else{ + domUtils.breakParent(startBlock,obj); + } + + if(startBlock !== endBlock){ + obj = domUtils.findParentByTagName(endBlock,'blockquote'); + if(obj){ + if(endBlock.tagName == 'LI' || endBlock.tagName == 'TD'|| domUtils.isBody(endBlock)){ + obj.parentNode && domUtils.remove(obj,true); + }else{ + domUtils.breakParent(endBlock,obj); + } + + } + } + + var blockquotes = domUtils.getElementsByTagName(this.document,'blockquote'); + for(var i=0,bi;bi=blockquotes[i++];){ + if(!bi.childNodes.length){ + domUtils.remove(bi); + }else if(domUtils.getPosition(bi,startBlock)&domUtils.POSITION_FOLLOWING && domUtils.getPosition(bi,endBlock)&domUtils.POSITION_PRECEDING){ + domUtils.remove(bi,true); + } + } + + + + + } else { + + var tmpRange = range.cloneRange(), + node = tmpRange.startContainer.nodeType == 1 ? tmpRange.startContainer : tmpRange.startContainer.parentNode, + preNode = node, + doEnd = 1; + + //调整开始 + while ( 1 ) { + if ( domUtils.isBody(node) ) { + if ( preNode !== node ) { + if ( range.collapsed ) { + tmpRange.selectNode( preNode ); + doEnd = 0; + } else { + tmpRange.setStartBefore( preNode ); + } + }else{ + tmpRange.setStart(node,0); + } + + break; + } + if ( !blockquote[node.tagName] ) { + if ( range.collapsed ) { + tmpRange.selectNode( preNode ); + } else{ + tmpRange.setStartBefore( preNode); + } + break; + } + + preNode = node; + node = node.parentNode; + } + + //调整结束 + if ( doEnd ) { + preNode = node = node = tmpRange.endContainer.nodeType == 1 ? tmpRange.endContainer : tmpRange.endContainer.parentNode; + while ( 1 ) { + + if ( domUtils.isBody( node ) ) { + if ( preNode !== node ) { + + tmpRange.setEndAfter( preNode ); + + } else { + tmpRange.setEnd( node, node.childNodes.length ); + } + + break; + } + if ( !blockquote[node.tagName] ) { + tmpRange.setEndAfter( preNode ); + break; + } + + preNode = node; + node = node.parentNode; + } + + } + + + node = range.document.createElement( 'blockquote' ); + domUtils.setAttributes( node, attrs ); + node.appendChild( tmpRange.extractContents() ); + tmpRange.insertNode( node ); + //去除重复的 + var childs = domUtils.getElementsByTagName(node,'blockquote'); + for(var i=0,ci;ci=childs[i++];){ + if(ci.parentNode){ + domUtils.remove(ci,true); + } + } + + } + range.moveToBookmark( bookmark ).select(); + }, + queryCommandState : function() { + return getObj(this) ? 1 : 0; + } + }; +}; + + + +// plugins/convertcase.js +/** + * 大小写转换 + * @file + * @since 1.2.6.1 + */ + +/** + * 把选区内文本变大写,与“tolowercase”命令互斥 + * @command touppercase + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'touppercase' ); + * ``` + */ + +/** + * 把选区内文本变小写,与“touppercase”命令互斥 + * @command tolowercase + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'tolowercase' ); + * ``` + */ +UE.commands['touppercase'] = +UE.commands['tolowercase'] = { + execCommand:function (cmd) { + var me = this; + var rng = me.selection.getRange(); + if(rng.collapsed){ + return rng; + } + var bk = rng.createBookmark(), + bkEnd = bk.end, + filterFn = function( node ) { + return !domUtils.isBr(node) && !domUtils.isWhitespace( node ); + }, + curNode = domUtils.getNextDomNode( bk.start, false, filterFn ); + while ( curNode && (domUtils.getPosition( curNode, bkEnd ) & domUtils.POSITION_PRECEDING) ) { + + if ( curNode.nodeType == 3 ) { + curNode.nodeValue = curNode.nodeValue[cmd == 'touppercase' ? 'toUpperCase' : 'toLowerCase'](); + } + curNode = domUtils.getNextDomNode( curNode, true, filterFn ); + if(curNode === bkEnd){ + break; + } + + } + rng.moveToBookmark(bk).select(); + } +}; + + + +// plugins/indent.js +/** + * 首行缩进 + * @file + * @since 1.2.6.1 + */ + +/** + * 缩进 + * @command indent + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'indent' ); + * ``` + */ +UE.commands['indent'] = { + execCommand : function() { + var me = this,value = me.queryCommandState("indent") ? "0em" : (me.options.indentValue || '2em'); + me.execCommand('Paragraph','p',{style:'text-indent:'+ value}); + }, + queryCommandState : function() { + var pN = domUtils.filterNodeList(this.selection.getStartElementPath(),'p h1 h2 h3 h4 h5 h6'); + return pN && pN.style.textIndent && parseInt(pN.style.textIndent) ? 1 : 0; + } + +}; + + +// plugins/print.js +/** + * 打印 + * @file + * @since 1.2.6.1 + */ + +/** + * 打印 + * @command print + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'print' ); + * ``` + */ +UE.commands['print'] = { + execCommand : function(){ + this.window.print(); + }, + notNeedUndo : 1 +}; + + + +// plugins/preview.js +/** + * 预览 + * @file + * @since 1.2.6.1 + */ + +/** + * 预览 + * @command preview + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'preview' ); + * ``` + */ +UE.commands['preview'] = { + execCommand : function(){ + var w = window.open('', '_blank', ''), + d = w.document; + d.open(); + d.write('
    '+this.getContent(null,null,true)+'
    '); + d.close(); + }, + notNeedUndo : 1 +}; + + +// plugins/selectall.js +/** + * 全选 + * @file + * @since 1.2.6.1 + */ + +/** + * 选中所有内容 + * @command selectall + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'selectall' ); + * ``` + */ +UE.plugins['selectall'] = function(){ + var me = this; + me.commands['selectall'] = { + execCommand : function(){ + //去掉了原生的selectAll,因为会出现报错和当内容为空时,不能出现闭合状态的光标 + var me = this,body = me.body, + range = me.selection.getRange(); + range.selectNodeContents(body); + if(domUtils.isEmptyBlock(body)){ + //opera不能自动合并到元素的里边,要手动处理一下 + if(browser.opera && body.firstChild && body.firstChild.nodeType == 1){ + range.setStartAtFirst(body.firstChild); + } + range.collapse(true); + } + range.select(true); + }, + notNeedUndo : 1 + }; + + + //快捷键 + me.addshortcutkey({ + "selectAll" : "ctrl+65" + }); +}; + + +// plugins/paragraph.js +/** + * 段落样式 + * @file + * @since 1.2.6.1 + */ + +/** + * 段落格式 + * @command paragraph + * @method execCommand + * @param { String } cmd 命令字符串 + * @param {String} style 标签值为:'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' + * @param {Object} attrs 标签的属性 + * @example + * ```javascript + * editor.execCommand( 'Paragraph','h1','{ + * class:'test' + * }' ); + * ``` + */ + +/** + * 返回选区内节点标签名 + * @command paragraph + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 节点标签名 + * @example + * ```javascript + * editor.queryCommandValue( 'Paragraph' ); + * ``` + */ + +UE.plugins['paragraph'] = function() { + var me = this, + block = domUtils.isBlockElm, + notExchange = ['TD','LI','PRE'], + + doParagraph = function(range,style,attrs,sourceCmdName){ + var bookmark = range.createBookmark(), + filterFn = function( node ) { + return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' && !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace( node ); + }, + para; + + range.enlarge( true ); + var bookmark2 = range.createBookmark(), + current = domUtils.getNextDomNode( bookmark2.start, false, filterFn ), + tmpRange = range.cloneRange(), + tmpNode; + while ( current && !(domUtils.getPosition( current, bookmark2.end ) & domUtils.POSITION_FOLLOWING) ) { + if ( current.nodeType == 3 || !block( current ) ) { + tmpRange.setStartBefore( current ); + while ( current && current !== bookmark2.end && !block( current ) ) { + tmpNode = current; + current = domUtils.getNextDomNode( current, false, null, function( node ) { + return !block( node ); + } ); + } + tmpRange.setEndAfter( tmpNode ); + + para = range.document.createElement( style ); + if(attrs){ + domUtils.setAttributes(para,attrs); + if(sourceCmdName && sourceCmdName == 'customstyle' && attrs.style){ + para.style.cssText = attrs.style; + } + } + para.appendChild( tmpRange.extractContents() ); + //需要内容占位 + if(domUtils.isEmptyNode(para)){ + domUtils.fillChar(range.document,para); + + } + + tmpRange.insertNode( para ); + + var parent = para.parentNode; + //如果para上一级是一个block元素且不是body,td就删除它 + if ( block( parent ) && !domUtils.isBody( para.parentNode ) && utils.indexOf(notExchange,parent.tagName)==-1) { + //存储dir,style + if(!(sourceCmdName && sourceCmdName == 'customstyle')){ + parent.getAttribute('dir') && para.setAttribute('dir',parent.getAttribute('dir')); + //trace:1070 + parent.style.cssText && (para.style.cssText = parent.style.cssText + ';' + para.style.cssText); + //trace:1030 + parent.style.textAlign && !para.style.textAlign && (para.style.textAlign = parent.style.textAlign); + parent.style.textIndent && !para.style.textIndent && (para.style.textIndent = parent.style.textIndent); + parent.style.padding && !para.style.padding && (para.style.padding = parent.style.padding); + } + + //trace:1706 选择的就是h1-6要删除 + if(attrs && /h\d/i.test(parent.tagName) && !/h\d/i.test(para.tagName) ){ + domUtils.setAttributes(parent,attrs); + if(sourceCmdName && sourceCmdName == 'customstyle' && attrs.style){ + parent.style.cssText = attrs.style; + } + domUtils.remove(para,true); + para = parent; + }else{ + domUtils.remove( para.parentNode, true ); + } + + } + if( utils.indexOf(notExchange,parent.tagName)!=-1){ + current = parent; + }else{ + current = para; + } + + + current = domUtils.getNextDomNode( current, false, filterFn ); + } else { + current = domUtils.getNextDomNode( current, true, filterFn ); + } + } + return range.moveToBookmark( bookmark2 ).moveToBookmark( bookmark ); + }; + me.setOpt('paragraph',{'p':'', 'h1':'', 'h2':'', 'h3':'', 'h4':'', 'h5':'', 'h6':''}); + me.commands['paragraph'] = { + execCommand : function( cmdName, style,attrs,sourceCmdName ) { + var range = this.selection.getRange(); + //闭合时单独处理 + if(range.collapsed){ + var txt = this.document.createTextNode('p'); + range.insertNode(txt); + //去掉冗余的fillchar + if(browser.ie){ + var node = txt.previousSibling; + if(node && domUtils.isWhitespace(node)){ + domUtils.remove(node); + } + node = txt.nextSibling; + if(node && domUtils.isWhitespace(node)){ + domUtils.remove(node); + } + } + + } + range = doParagraph(range,style,attrs,sourceCmdName); + if(txt){ + range.setStartBefore(txt).collapse(true); + pN = txt.parentNode; + + domUtils.remove(txt); + + if(domUtils.isBlockElm(pN)&&domUtils.isEmptyNode(pN)){ + domUtils.fillNode(this.document,pN); + } + + } + + if(browser.gecko && range.collapsed && range.startContainer.nodeType == 1){ + var child = range.startContainer.childNodes[range.startOffset]; + if(child && child.nodeType == 1 && child.tagName.toLowerCase() == style){ + range.setStart(child,0).collapse(true); + } + } + //trace:1097 原来有true,原因忘了,但去了就不能清除多余的占位符了 + range.select(); + + + return true; + }, + queryCommandValue : function() { + var node = domUtils.filterNodeList(this.selection.getStartElementPath(),'p h1 h2 h3 h4 h5 h6'); + return node ? node.tagName.toLowerCase() : ''; + } + }; +}; + + +// plugins/directionality.js +/** + * 设置文字输入的方向的插件 + * @file + * @since 1.2.6.1 + */ +(function() { + var block = domUtils.isBlockElm , + getObj = function(editor){ +// var startNode = editor.selection.getStart(), +// parents; +// if ( startNode ) { +// //查找所有的是block的父亲节点 +// parents = domUtils.findParents( startNode, true, block, true ); +// for ( var i = 0,ci; ci = parents[i++]; ) { +// if ( ci.getAttribute( 'dir' ) ) { +// return ci; +// } +// } +// } + return domUtils.filterNodeList(editor.selection.getStartElementPath(),function(n){return n && n.nodeType == 1 && n.getAttribute('dir')}); + + }, + doDirectionality = function(range,editor,forward){ + + var bookmark, + filterFn = function( node ) { + return node.nodeType == 1 ? !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace(node); + }, + + obj = getObj( editor ); + + if ( obj && range.collapsed ) { + obj.setAttribute( 'dir', forward ); + return range; + } + bookmark = range.createBookmark(); + range.enlarge( true ); + var bookmark2 = range.createBookmark(), + current = domUtils.getNextDomNode( bookmark2.start, false, filterFn ), + tmpRange = range.cloneRange(), + tmpNode; + while ( current && !(domUtils.getPosition( current, bookmark2.end ) & domUtils.POSITION_FOLLOWING) ) { + if ( current.nodeType == 3 || !block( current ) ) { + tmpRange.setStartBefore( current ); + while ( current && current !== bookmark2.end && !block( current ) ) { + tmpNode = current; + current = domUtils.getNextDomNode( current, false, null, function( node ) { + return !block( node ); + } ); + } + tmpRange.setEndAfter( tmpNode ); + var common = tmpRange.getCommonAncestor(); + if ( !domUtils.isBody( common ) && block( common ) ) { + //遍历到了block节点 + common.setAttribute( 'dir', forward ); + current = common; + } else { + //没有遍历到,添加一个block节点 + var p = range.document.createElement( 'p' ); + p.setAttribute( 'dir', forward ); + var frag = tmpRange.extractContents(); + p.appendChild( frag ); + tmpRange.insertNode( p ); + current = p; + } + + current = domUtils.getNextDomNode( current, false, filterFn ); + } else { + current = domUtils.getNextDomNode( current, true, filterFn ); + } + } + return range.moveToBookmark( bookmark2 ).moveToBookmark( bookmark ); + }; + + /** + * 文字输入方向 + * @command directionality + * @method execCommand + * @param { String } cmdName 命令字符串 + * @param { String } forward 传入'ltr'表示从左向右输入,传入'rtl'表示从右向左输入 + * @example + * ```javascript + * editor.execCommand( 'directionality', 'ltr'); + * ``` + */ + + /** + * 查询当前选区的文字输入方向 + * @command directionality + * @method queryCommandValue + * @param { String } cmdName 命令字符串 + * @return { String } 返回'ltr'表示从左向右输入,返回'rtl'表示从右向左输入 + * @example + * ```javascript + * editor.queryCommandValue( 'directionality'); + * ``` + */ + UE.commands['directionality'] = { + execCommand : function( cmdName,forward ) { + var range = this.selection.getRange(); + //闭合时单独处理 + if(range.collapsed){ + var txt = this.document.createTextNode('d'); + range.insertNode(txt); + } + doDirectionality(range,this,forward); + if(txt){ + range.setStartBefore(txt).collapse(true); + domUtils.remove(txt); + } + + range.select(); + return true; + }, + queryCommandValue : function() { + var node = getObj(this); + return node ? node.getAttribute('dir') : 'ltr'; + } + }; +})(); + + + +// plugins/horizontal.js +/** + * 插入分割线插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入分割线 + * @command horizontal + * @method execCommand + * @param { String } cmdName 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'horizontal' ); + * ``` + */ +UE.plugins['horizontal'] = function(){ + var me = this; + me.commands['horizontal'] = { + execCommand : function( cmdName ) { + var me = this; + if(me.queryCommandState(cmdName)!==-1){ + me.execCommand('insertHtml','
    '); + var range = me.selection.getRange(), + start = range.startContainer; + if(start.nodeType == 1 && !start.childNodes[range.startOffset] ){ + + var tmp; + if(tmp = start.childNodes[range.startOffset - 1]){ + if(tmp.nodeType == 1 && tmp.tagName == 'HR'){ + if(me.options.enterTag == 'p'){ + tmp = me.document.createElement('p'); + range.insertNode(tmp); + range.setStart(tmp,0).setCursor(); + + }else{ + tmp = me.document.createElement('br'); + range.insertNode(tmp); + range.setStartBefore(tmp).setCursor(); + } + } + } + + } + return true; + } + + }, + //边界在table里不能加分隔线 + queryCommandState : function() { + return domUtils.filterNodeList(this.selection.getStartElementPath(),'table') ? -1 : 0; + } + }; +// me.addListener('delkeyup',function(){ +// var rng = this.selection.getRange(); +// if(browser.ie && browser.version > 8){ +// rng.txtToElmBoundary(true); +// if(domUtils.isStartInblock(rng)){ +// var tmpNode = rng.startContainer; +// var pre = tmpNode.previousSibling; +// if(pre && domUtils.isTagNode(pre,'hr')){ +// domUtils.remove(pre); +// rng.select(); +// return; +// } +// } +// } +// if(domUtils.isBody(rng.startContainer)){ +// var hr = rng.startContainer.childNodes[rng.startOffset -1]; +// if(hr && hr.nodeName == 'HR'){ +// var next = hr.nextSibling; +// if(next){ +// rng.setStart(next,0) +// }else if(hr.previousSibling){ +// rng.setStartAtLast(hr.previousSibling) +// }else{ +// var p = this.document.createElement('p'); +// hr.parentNode.insertBefore(p,hr); +// domUtils.fillNode(this.document,p); +// rng.setStart(p,0); +// } +// domUtils.remove(hr); +// rng.setCursor(false,true); +// } +// } +// }) + me.addListener('delkeydown',function(name,evt){ + var rng = this.selection.getRange(); + rng.txtToElmBoundary(true); + if(domUtils.isStartInblock(rng)){ + var tmpNode = rng.startContainer; + var pre = tmpNode.previousSibling; + if(pre && domUtils.isTagNode(pre,'hr')){ + domUtils.remove(pre); + rng.select(); + domUtils.preventDefault(evt); + return true; + + } + } + + }) +}; + + + +// plugins/time.js +/** + * 插入时间和日期 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入时间,默认格式:12:59:59 + * @command time + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'time'); + * ``` + */ + +/** + * 插入日期,默认格式:2013-08-30 + * @command date + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'date'); + * ``` + */ +UE.commands['time'] = UE.commands["date"] = { + execCommand : function(cmd, format){ + var date = new Date; + + function formatTime(date, format) { + var hh = ('0' + date.getHours()).slice(-2), + ii = ('0' + date.getMinutes()).slice(-2), + ss = ('0' + date.getSeconds()).slice(-2); + format = format || 'hh:ii:ss'; + return format.replace(/hh/ig, hh).replace(/ii/ig, ii).replace(/ss/ig, ss); + } + function formatDate(date, format) { + var yyyy = ('000' + date.getFullYear()).slice(-4), + yy = yyyy.slice(-2), + mm = ('0' + (date.getMonth()+1)).slice(-2), + dd = ('0' + date.getDate()).slice(-2); + format = format || 'yyyy-mm-dd'; + return format.replace(/yyyy/ig, yyyy).replace(/yy/ig, yy).replace(/mm/ig, mm).replace(/dd/ig, dd); + } + + this.execCommand('insertHtml',cmd == "time" ? formatTime(date, format):formatDate(date, format) ); + } +}; + + +// plugins/rowspacing.js +/** + * 段前段后间距插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 设置段间距 + * @command rowspacing + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 段间距的值,以px为单位 + * @param { String } dir 间距位置,top或bottom,分别表示段前和段后 + * @example + * ```javascript + * editor.execCommand( 'rowspacing', '10', 'top' ); + * ``` + */ + +UE.plugins['rowspacing'] = function(){ + var me = this; + me.setOpt({ + 'rowspacingtop':['5', '10', '15', '20', '25'], + 'rowspacingbottom':['5', '10', '15', '20', '25'] + + }); + me.commands['rowspacing'] = { + execCommand : function( cmdName,value,dir ) { + this.execCommand('paragraph','p',{style:'margin-'+dir+':'+value + 'px'}); + return true; + }, + queryCommandValue : function(cmdName,dir) { + var pN = domUtils.filterNodeList(this.selection.getStartElementPath(),function(node){return domUtils.isBlockElm(node) }), + value; + //trace:1026 + if(pN){ + value = domUtils.getComputedStyle(pN,'margin-'+dir).replace(/[^\d]/g,''); + return !value ? 0 : value; + } + return 0; + + } + }; +}; + + + + +// plugins/lineheight.js +/** + * 设置行内间距 + * @file + * @since 1.2.6.1 + */ +UE.plugins['lineheight'] = function(){ + var me = this; + me.setOpt({'lineheight':['1', '1.5','1.75','2', '3', '4', '5']}); + + /** + * 行距 + * @command lineheight + * @method execCommand + * @param { String } cmdName 命令字符串 + * @param { String } value 传入的行高值, 该值是当前字体的倍数, 例如: 1.5, 1.75 + * @example + * ```javascript + * editor.execCommand( 'lineheight', 1.5); + * ``` + */ + /** + * 查询当前选区内容的行高大小 + * @command lineheight + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回当前行高大小 + * @example + * ```javascript + * editor.queryCommandValue( 'lineheight' ); + * ``` + */ + + me.commands['lineheight'] = { + execCommand : function( cmdName,value ) { + this.execCommand('paragraph','p',{style:'line-height:'+ (value == "1" ? "normal" : value + 'em') }); + return true; + }, + queryCommandValue : function() { + var pN = domUtils.filterNodeList(this.selection.getStartElementPath(),function(node){return domUtils.isBlockElm(node)}); + if(pN){ + var value = domUtils.getComputedStyle(pN,'line-height'); + return value == 'normal' ? 1 : value.replace(/[^\d.]*/ig,""); + } + } + }; +}; + + + + +// plugins/insertcode.js +/** + * 插入代码插件 + * @file + * @since 1.2.6.1 + */ + +UE.plugins['insertcode'] = function() { + var me = this; + me.ready(function(){ + utils.cssRule('pre','pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}', + me.document) + }); + me.setOpt('insertcode',{ + 'as3':'ActionScript3', + 'bash':'Bash/Shell', + 'cpp':'C/C++', + 'css':'Css', + 'cf':'CodeFunction', + 'c#':'C#', + 'delphi':'Delphi', + 'diff':'Diff', + 'erlang':'Erlang', + 'groovy':'Groovy', + 'html':'Html', + 'java':'Java', + 'jfx':'JavaFx', + 'js':'Javascript', + 'pl':'Perl', + 'php':'Php', + 'plain':'Plain Text', + 'ps':'PowerShell', + 'python':'Python', + 'ruby':'Ruby', + 'scala':'Scala', + 'sql':'Sql', + 'vb':'Vb', + 'xml':'Xml' + }); + + /** + * 插入代码 + * @command insertcode + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } lang 插入代码的语言 + * @example + * ```javascript + * editor.execCommand( 'insertcode', 'javascript' ); + * ``` + */ + + /** + * 如果选区所在位置是插入插入代码区域,返回代码的语言 + * @command insertcode + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回代码的语言 + * @example + * ```javascript + * editor.queryCommandValue( 'insertcode' ); + * ``` + */ + + me.commands['insertcode'] = { + execCommand : function(cmd,lang){ + var me = this, + rng = me.selection.getRange(), + pre = domUtils.findParentByTagName(rng.startContainer,'pre',true); + if(pre){ + pre.className = 'brush:'+lang+';toolbar:false;'; + }else{ + var code = ''; + if(rng.collapsed){ + code = browser.ie && browser.ie11below ? (browser.version <= 8 ? ' ':''):'
    '; + }else{ + var frag = rng.extractContents(); + var div = me.document.createElement('div'); + div.appendChild(frag); + + utils.each(UE.filterNode(UE.htmlparser(div.innerHTML.replace(/[\r\t]/g,'')),me.options.filterTxtRules).children,function(node){ + if(browser.ie && browser.ie11below && browser.version > 8){ + + if(node.type =='element'){ + if(node.tagName == 'br'){ + code += '\n' + }else if(!dtd.$empty[node.tagName]){ + utils.each(node.children,function(cn){ + if(cn.type =='element'){ + if(cn.tagName == 'br'){ + code += '\n' + }else if(!dtd.$empty[node.tagName]){ + code += cn.innerText(); + } + }else{ + code += cn.data + } + }) + if(!/\n$/.test(code)){ + code += '\n'; + } + } + }else{ + code += node.data + '\n' + } + if(!node.nextSibling() && /\n$/.test(code)){ + code = code.replace(/\n$/,''); + } + }else{ + if(browser.ie && browser.ie11below){ + + if(node.type =='element'){ + if(node.tagName == 'br'){ + code += '
    ' + }else if(!dtd.$empty[node.tagName]){ + utils.each(node.children,function(cn){ + if(cn.type =='element'){ + if(cn.tagName == 'br'){ + code += '
    ' + }else if(!dtd.$empty[node.tagName]){ + code += cn.innerText(); + } + }else{ + code += cn.data + } + }); + if(!/br>$/.test(code)){ + code += '
    '; + } + } + }else{ + code += node.data + '
    ' + } + if(!node.nextSibling() && /
    $/.test(code)){ + code = code.replace(/
    $/,''); + } + + }else{ + code += (node.type == 'element' ? (dtd.$empty[node.tagName] ? '' : node.innerText()) : node.data); + if(!/br\/?\s*>$/.test(code)){ + if(!node.nextSibling()) + return; + code += '
    ' + } + } + + } + + }); + } + me.execCommand('inserthtml','
    '+code+'
    ',true); + + pre = me.document.getElementById('coder'); + domUtils.removeAttributes(pre,'id'); + var tmpNode = pre.previousSibling; + + if(tmpNode && (tmpNode.nodeType == 3 && tmpNode.nodeValue.length == 1 && browser.ie && browser.version == 6 || domUtils.isEmptyBlock(tmpNode))){ + + domUtils.remove(tmpNode) + } + var rng = me.selection.getRange(); + if(domUtils.isEmptyBlock(pre)){ + rng.setStart(pre,0).setCursor(false,true) + }else{ + rng.selectNodeContents(pre).select() + } + } + + + + }, + queryCommandValue : function(){ + var path = this.selection.getStartElementPath(); + var lang = ''; + utils.each(path,function(node){ + if(node.nodeName =='PRE'){ + var match = node.className.match(/brush:([^;]+)/); + lang = match && match[1] ? match[1] : ''; + return false; + } + }); + return lang; + } + }; + + me.addInputRule(function(root){ + utils.each(root.getNodesByTagName('pre'),function(pre){ + var brs = pre.getNodesByTagName('br'); + if(brs.length){ + browser.ie && browser.ie11below && browser.version > 8 && utils.each(brs,function(br){ + var txt = UE.uNode.createText('\n'); + br.parentNode.insertBefore(txt,br); + br.parentNode.removeChild(br); + }); + return; + } + if(browser.ie && browser.ie11below && browser.version > 8) + return; + var code = pre.innerText().split(/\n/); + pre.innerHTML(''); + utils.each(code,function(c){ + if(c.length){ + pre.appendChild(UE.uNode.createText(c)); + } + pre.appendChild(UE.uNode.createElement('br')) + }) + }) + }); + me.addOutputRule(function(root){ + utils.each(root.getNodesByTagName('pre'),function(pre){ + var code = ''; + utils.each(pre.children,function(n){ + if(n.type == 'text'){ + //在ie下文本内容有可能末尾带有\n要去掉 + //trace:3396 + code += n.data.replace(/[ ]/g,' ').replace(/\n$/,''); + }else{ + if(n.tagName == 'br'){ + code += '\n' + }else{ + code += (!dtd.$empty[n.tagName] ? '' : n.innerText()); + } + + } + + }); + + pre.innerText(code.replace(/( |\n)+$/,'')) + }) + }); + //不需要判断highlight的command列表 + me.notNeedCodeQuery ={ + help:1, + undo:1, + redo:1, + source:1, + print:1, + searchreplace:1, + fullscreen:1, + preview:1, + insertparagraph:1, + elementpath:1, + insertcode:1, + inserthtml:1, + selectall:1 + }; + //将queyCommamndState重置 + var orgQuery = me.queryCommandState; + me.queryCommandState = function(cmd){ + var me = this; + + if(!me.notNeedCodeQuery[cmd.toLowerCase()] && me.selection && me.queryCommandValue('insertcode')){ + return -1; + } + return UE.Editor.prototype.queryCommandState.apply(this,arguments) + }; + me.addListener('beforeenterkeydown',function(){ + var rng = me.selection.getRange(); + var pre = domUtils.findParentByTagName(rng.startContainer,'pre',true); + if(pre){ + me.fireEvent('saveScene'); + if(!rng.collapsed){ + rng.deleteContents(); + } + if(!browser.ie || browser.ie9above){ + var tmpNode = me.document.createElement('br'),pre; + rng.insertNode(tmpNode).setStartAfter(tmpNode).collapse(true); + var next = tmpNode.nextSibling; + if(!next && (!browser.ie || browser.version > 10)){ + rng.insertNode(tmpNode.cloneNode(false)); + }else{ + rng.setStartAfter(tmpNode); + } + pre = tmpNode.previousSibling; + var tmp; + while(pre ){ + tmp = pre; + pre = pre.previousSibling; + if(!pre || pre.nodeName == 'BR'){ + pre = tmp; + break; + } + } + if(pre){ + var str = ''; + while(pre && pre.nodeName != 'BR' && new RegExp('^[\\s'+domUtils.fillChar+']*$').test(pre.nodeValue)){ + str += pre.nodeValue; + pre = pre.nextSibling; + } + if(pre.nodeName != 'BR'){ + var match = pre.nodeValue.match(new RegExp('^([\\s'+domUtils.fillChar+']+)')); + if(match && match[1]){ + str += match[1] + } + + } + if(str){ + str = me.document.createTextNode(str); + rng.insertNode(str).setStartAfter(str); + } + } + rng.collapse(true).select(true); + }else{ + if(browser.version > 8){ + + var txt = me.document.createTextNode('\n'); + var start = rng.startContainer; + if(rng.startOffset == 0){ + var preNode = start.previousSibling; + if(preNode){ + rng.insertNode(txt); + var fillchar = me.document.createTextNode(' '); + rng.setStartAfter(txt).insertNode(fillchar).setStart(fillchar,0).collapse(true).select(true) + } + }else{ + rng.insertNode(txt).setStartAfter(txt); + var fillchar = me.document.createTextNode(' '); + start = rng.startContainer.childNodes[rng.startOffset]; + if(start && !/^\n/.test(start.nodeValue)){ + rng.setStartBefore(txt) + } + rng.insertNode(fillchar).setStart(fillchar,0).collapse(true).select(true) + } + + }else{ + var tmpNode = me.document.createElement('br'); + rng.insertNode(tmpNode); + rng.insertNode(me.document.createTextNode(domUtils.fillChar)); + rng.setStartAfter(tmpNode); + pre = tmpNode.previousSibling; + var tmp; + while(pre ){ + tmp = pre; + pre = pre.previousSibling; + if(!pre || pre.nodeName == 'BR'){ + pre = tmp; + break; + } + } + if(pre){ + var str = ''; + while(pre && pre.nodeName != 'BR' && new RegExp('^[ '+domUtils.fillChar+']*$').test(pre.nodeValue)){ + str += pre.nodeValue; + pre = pre.nextSibling; + } + if(pre.nodeName != 'BR'){ + var match = pre.nodeValue.match(new RegExp('^([ '+domUtils.fillChar+']+)')); + if(match && match[1]){ + str += match[1] + } + + } + + str = me.document.createTextNode(str); + rng.insertNode(str).setStartAfter(str); + } + rng.collapse(true).select(); + } + + + } + me.fireEvent('saveScene'); + return true; + } + + + }); + + me.addListener('tabkeydown',function(cmd,evt){ + var rng = me.selection.getRange(); + var pre = domUtils.findParentByTagName(rng.startContainer,'pre',true); + if(pre){ + me.fireEvent('saveScene'); + if(evt.shiftKey){ + + }else{ + if(!rng.collapsed){ + var bk = rng.createBookmark(); + var start = bk.start.previousSibling; + + while(start){ + if(pre.firstChild === start && !domUtils.isBr(start)){ + pre.insertBefore(me.document.createTextNode(' '),start); + + break; + } + if(domUtils.isBr(start)){ + pre.insertBefore(me.document.createTextNode(' '),start.nextSibling); + + break; + } + start = start.previousSibling; + } + var end = bk.end; + start = bk.start.nextSibling; + if(pre.firstChild === bk.start){ + pre.insertBefore(me.document.createTextNode(' '),start.nextSibling) + + } + while(start && start !== end){ + if(domUtils.isBr(start) && start.nextSibling){ + if(start.nextSibling === end){ + break; + } + pre.insertBefore(me.document.createTextNode(' '),start.nextSibling) + } + + start = start.nextSibling; + } + rng.moveToBookmark(bk).select(); + }else{ + var tmpNode = me.document.createTextNode(' '); + rng.insertNode(tmpNode).setStartAfter(tmpNode).collapse(true).select(true); + } + } + + + me.fireEvent('saveScene'); + return true; + } + + + }); + + + me.addListener('beforeinserthtml',function(evtName,html){ + var me = this, + rng = me.selection.getRange(), + pre = domUtils.findParentByTagName(rng.startContainer,'pre',true); + if(pre){ + if(!rng.collapsed){ + rng.deleteContents() + } + var htmlstr = ''; + if(browser.ie && browser.version > 8){ + + utils.each(UE.filterNode(UE.htmlparser(html),me.options.filterTxtRules).children,function(node){ + if(node.type =='element'){ + if(node.tagName == 'br'){ + htmlstr += '\n' + }else if(!dtd.$empty[node.tagName]){ + utils.each(node.children,function(cn){ + if(cn.type =='element'){ + if(cn.tagName == 'br'){ + htmlstr += '\n' + }else if(!dtd.$empty[node.tagName]){ + htmlstr += cn.innerText(); + } + }else{ + htmlstr += cn.data + } + }) + if(!/\n$/.test(htmlstr)){ + htmlstr += '\n'; + } + } + }else{ + htmlstr += node.data + '\n' + } + if(!node.nextSibling() && /\n$/.test(htmlstr)){ + htmlstr = htmlstr.replace(/\n$/,''); + } + }); + var tmpNode = me.document.createTextNode(utils.html(htmlstr.replace(/ /g,' '))); + rng.insertNode(tmpNode).selectNode(tmpNode).select(); + }else{ + var frag = me.document.createDocumentFragment(); + + utils.each(UE.filterNode(UE.htmlparser(html),me.options.filterTxtRules).children,function(node){ + if(node.type =='element'){ + if(node.tagName == 'br'){ + frag.appendChild(me.document.createElement('br')) + }else if(!dtd.$empty[node.tagName]){ + utils.each(node.children,function(cn){ + if(cn.type =='element'){ + if(cn.tagName == 'br'){ + + frag.appendChild(me.document.createElement('br')) + }else if(!dtd.$empty[node.tagName]){ + frag.appendChild(me.document.createTextNode(utils.html(cn.innerText().replace(/ /g,' ')))); + + } + }else{ + frag.appendChild(me.document.createTextNode(utils.html( cn.data.replace(/ /g,' ')))); + + } + }) + if(frag.lastChild.nodeName != 'BR'){ + frag.appendChild(me.document.createElement('br')) + } + } + }else{ + frag.appendChild(me.document.createTextNode(utils.html( node.data.replace(/ /g,' ')))); + } + if(!node.nextSibling() && frag.lastChild.nodeName == 'BR'){ + frag.removeChild(frag.lastChild) + } + + + }); + rng.insertNode(frag).select(); + + } + + return true; + } + }); + //方向键的处理 + me.addListener('keydown',function(cmd,evt){ + var me = this,keyCode = evt.keyCode || evt.which; + if(keyCode == 40){ + var rng = me.selection.getRange(),pre,start = rng.startContainer; + if(rng.collapsed && (pre = domUtils.findParentByTagName(rng.startContainer,'pre',true)) && !pre.nextSibling){ + var last = pre.lastChild + while(last && last.nodeName == 'BR'){ + last = last.previousSibling; + } + if(last === start || rng.startContainer === pre && rng.startOffset == pre.childNodes.length){ + me.execCommand('insertparagraph'); + domUtils.preventDefault(evt) + } + + } + } + }); + //trace:3395 + me.addListener('delkeydown',function(type,evt){ + var rng = this.selection.getRange(); + rng.txtToElmBoundary(true); + var start = rng.startContainer; + if(domUtils.isTagNode(start,'pre') && rng.collapsed && domUtils.isStartInblock(rng)){ + var p = me.document.createElement('p'); + domUtils.fillNode(me.document,p); + start.parentNode.insertBefore(p,start); + domUtils.remove(start); + rng.setStart(p,0).setCursor(false,true); + domUtils.preventDefault(evt); + return true; + } + }) +}; + + +// plugins/cleardoc.js +/** + * 清空文档插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 清空文档 + * @command cleardoc + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor 是编辑器实例 + * editor.execCommand('cleardoc'); + * ``` + */ + +UE.commands['cleardoc'] = { + execCommand : function( cmdName) { + var me = this, + enterTag = me.options.enterTag, + range = me.selection.getRange(); + if(enterTag == "br"){ + me.body.innerHTML = "
    "; + range.setStart(me.body,0).setCursor(); + }else{ + me.body.innerHTML = "

    "+(ie ? "" : "
    ")+"

    "; + range.setStart(me.body.firstChild,0).setCursor(false,true); + } + setTimeout(function(){ + me.fireEvent("clearDoc"); + },0); + + } +}; + + + +// plugins/anchor.js +/** + * 锚点插件,为UEditor提供插入锚点支持 + * @file + * @since 1.2.6.1 + */ +UE.plugin.register('anchor', function (){ + + return { + bindEvents:{ + 'ready':function(){ + utils.cssRule('anchor', + '.anchorclass{background: url(\'' + + this.options.themePath + + this.options.theme +'/images/anchor.gif\') no-repeat scroll left center transparent;cursor: auto;display: inline-block;height: 16px;width: 15px;}', + this.document); + } + }, + outputRule: function(root){ + utils.each(root.getNodesByTagName('img'),function(a){ + var val; + if(val = a.getAttr('anchorname')){ + a.tagName = 'a'; + a.setAttr({ + anchorname : '', + name : val, + 'class' : '' + }) + } + }) + }, + inputRule:function(root){ + utils.each(root.getNodesByTagName('a'),function(a){ + var val; + if((val = a.getAttr('name')) && !a.getAttr('href')){ + a.tagName = 'img'; + a.setAttr({ + anchorname :a.getAttr('name'), + 'class' : 'anchorclass' + }); + a.setAttr('name') + + } + }) + + }, + commands:{ + /** + * 插入锚点 + * @command anchor + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } name 锚点名称字符串 + * @example + * ```javascript + * //editor 是编辑器实例 + * editor.execCommand('anchor', 'anchor1'); + * ``` + */ + 'anchor':{ + execCommand:function (cmd, name) { + var range = this.selection.getRange(),img = range.getClosedNode(); + if (img && img.getAttribute('anchorname')) { + if (name) { + img.setAttribute('anchorname', name); + } else { + range.setStartBefore(img).setCursor(); + domUtils.remove(img); + } + } else { + if (name) { + //只在选区的开始插入 + var anchor = this.document.createElement('img'); + range.collapse(true); + domUtils.setAttributes(anchor,{ + 'anchorname':name, + 'class':'anchorclass' + }); + range.insertNode(anchor).setStartAfter(anchor).setCursor(false,true); + } + } + } + } + } + } +}); + + +// plugins/wordcount.js +///import core +///commands 字数统计 +///commandsName WordCount,wordCount +///commandsTitle 字数统计 +/* + * Created by JetBrains WebStorm. + * User: taoqili + * Date: 11-9-7 + * Time: 下午8:18 + * To change this template use File | Settings | File Templates. + */ + +UE.plugins['wordcount'] = function(){ + var me = this; + me.setOpt('wordCount',true); + me.addListener('contentchange',function(){ + me.fireEvent('wordcount'); + }); + var timer; + me.addListener('ready',function(){ + var me = this; + domUtils.on(me.body,"keyup",function(evt){ + var code = evt.keyCode||evt.which, + //忽略的按键,ctr,alt,shift,方向键 + ignores = {"16":1,"18":1,"20":1,"37":1,"38":1,"39":1,"40":1}; + if(code in ignores) return; + clearTimeout(timer); + timer = setTimeout(function(){ + me.fireEvent('wordcount'); + },200) + }) + }); +}; + + +// plugins/pagebreak.js +/** + * 分页功能插件 + * @file + * @since 1.2.6.1 + */ +UE.plugins['pagebreak'] = function () { + var me = this, + notBreakTags = ['td']; + me.setOpt('pageBreakTag','_ueditor_page_break_tag_'); + + function fillNode(node){ + if(domUtils.isEmptyBlock(node)){ + var firstChild = node.firstChild,tmpNode; + + while(firstChild && firstChild.nodeType == 1 && domUtils.isEmptyBlock(firstChild)){ + tmpNode = firstChild; + firstChild = firstChild.firstChild; + } + !tmpNode && (tmpNode = node); + domUtils.fillNode(me.document,tmpNode); + } + } + //分页符样式添加 + + me.ready(function(){ + utils.cssRule('pagebreak','.pagebreak{display:block;clear:both !important;cursor:default !important;width: 100% !important;margin:0;}',me.document); + }); + function isHr(node){ + return node && node.nodeType == 1 && node.tagName == 'HR' && node.className == 'pagebreak'; + } + me.addInputRule(function(root){ + root.traversal(function(node){ + if(node.type == 'text' && node.data == me.options.pageBreakTag){ + var hr = UE.uNode.createElement('
    '); + node.parentNode.insertBefore(hr,node); + node.parentNode.removeChild(node) + } + }) + }); + me.addOutputRule(function(node){ + utils.each(node.getNodesByTagName('hr'),function(n){ + if(n.getAttr('class') == 'pagebreak'){ + var txt = UE.uNode.createText(me.options.pageBreakTag); + n.parentNode.insertBefore(txt,n); + n.parentNode.removeChild(n); + } + }) + + }); + + /** + * 插入分页符 + * @command pagebreak + * @method execCommand + * @param { String } cmd 命令字符串 + * @remind 在表格中插入分页符会把表格切分成两部分 + * @remind 获取编辑器内的数据时, 编辑器会把分页符转换成“_ueditor_page_break_tag_”字符串, + * 以便于提交数据到服务器端后处理分页。 + * @example + * ```javascript + * editor.execCommand( 'pagebreak'); //插入一个hr标签,带有样式类名pagebreak + * ``` + */ + + me.commands['pagebreak'] = { + execCommand:function () { + var range = me.selection.getRange(),hr = me.document.createElement('hr'); + domUtils.setAttributes(hr,{ + 'class' : 'pagebreak', + noshade:"noshade", + size:"5" + }); + domUtils.unSelectable(hr); + //table单独处理 + var node = domUtils.findParentByTagName(range.startContainer, notBreakTags, true), + + parents = [], pN; + if (node) { + switch (node.tagName) { + case 'TD': + pN = node.parentNode; + if (!pN.previousSibling) { + var table = domUtils.findParentByTagName(pN, 'table'); +// var tableWrapDiv = table.parentNode; +// if(tableWrapDiv && tableWrapDiv.nodeType == 1 +// && tableWrapDiv.tagName == 'DIV' +// && tableWrapDiv.getAttribute('dropdrag') +// ){ +// domUtils.remove(tableWrapDiv,true); +// } + table.parentNode.insertBefore(hr, table); + parents = domUtils.findParents(hr, true); + + } else { + pN.parentNode.insertBefore(hr, pN); + parents = domUtils.findParents(hr); + + } + pN = parents[1]; + if (hr !== pN) { + domUtils.breakParent(hr, pN); + + } + //table要重写绑定一下拖拽 + me.fireEvent('afteradjusttable',me.document); + } + + } else { + + if (!range.collapsed) { + range.deleteContents(); + var start = range.startContainer; + while ( !domUtils.isBody(start) && domUtils.isBlockElm(start) && domUtils.isEmptyNode(start)) { + range.setStartBefore(start).collapse(true); + domUtils.remove(start); + start = range.startContainer; + } + + } + range.insertNode(hr); + + var pN = hr.parentNode, nextNode; + while (!domUtils.isBody(pN)) { + domUtils.breakParent(hr, pN); + nextNode = hr.nextSibling; + if (nextNode && domUtils.isEmptyBlock(nextNode)) { + domUtils.remove(nextNode); + } + pN = hr.parentNode; + } + nextNode = hr.nextSibling; + var pre = hr.previousSibling; + if(isHr(pre)){ + domUtils.remove(pre); + }else{ + pre && fillNode(pre); + } + + if(!nextNode){ + var p = me.document.createElement('p'); + + hr.parentNode.appendChild(p); + domUtils.fillNode(me.document,p); + range.setStart(p,0).collapse(true); + }else{ + if(isHr(nextNode)){ + domUtils.remove(nextNode); + }else{ + fillNode(nextNode); + } + range.setEndAfter(hr).collapse(false); + } + + range.select(true); + + } + + } + }; +}; + +// plugins/wordimage.js +///import core +///commands 本地图片引导上传 +///commandsName WordImage +///commandsTitle 本地图片引导上传 +///commandsDialog dialogs\wordimage + +UE.plugin.register('wordimage',function(){ + var me = this, + images = []; + return { + commands : { + 'wordimage':{ + execCommand:function () { + var images = domUtils.getElementsByTagName(me.body, "img"); + var urlList = []; + for (var i = 0, ci; ci = images[i++];) { + var url = ci.getAttribute("word_img"); + url && urlList.push(url); + } + return urlList; + }, + queryCommandState:function () { + images = domUtils.getElementsByTagName(me.body, "img"); + for (var i = 0, ci; ci = images[i++];) { + if (ci.getAttribute("word_img")) { + return 1; + } + } + return -1; + }, + notNeedUndo:true + } + }, + inputRule : function (root) { + utils.each(root.getNodesByTagName('img'), function (img) { + var attrs = img.attrs, + flag = parseInt(attrs.width) < 128 || parseInt(attrs.height) < 43, + opt = me.options, + src = opt.UEDITOR_HOME_URL + 'themes/default/images/spacer.gif'; + if (attrs['src'] && /^(?:(file:\/+))/.test(attrs['src'])) { + img.setAttr({ + width:attrs.width, + height:attrs.height, + alt:attrs.alt, + word_img: attrs.src, + src:src, + 'style':'background:url(' + ( flag ? opt.themePath + opt.theme + '/images/word.gif' : opt.langPath + opt.lang + '/images/localimage.png') + ') no-repeat center center;border:1px solid #ddd' + }) + } + }) + } + } +}); + +// plugins/dragdrop.js +UE.plugins['dragdrop'] = function (){ + + var me = this; + me.ready(function(){ + domUtils.on(this.body,'dragend',function(){ + var rng = me.selection.getRange(); + var node = rng.getClosedNode()||me.selection.getStart(); + + if(node && node.tagName == 'IMG'){ + + var pre = node.previousSibling,next; + while(next = node.nextSibling){ + if(next.nodeType == 1 && next.tagName == 'SPAN' && !next.firstChild){ + domUtils.remove(next) + }else{ + break; + } + } + + + if((pre && pre.nodeType == 1 && !domUtils.isEmptyBlock(pre) || !pre) && (!next || next && !domUtils.isEmptyBlock(next))){ + if(pre && pre.tagName == 'P' && !domUtils.isEmptyBlock(pre)){ + pre.appendChild(node); + domUtils.moveChild(next,pre); + domUtils.remove(next); + }else if(next && next.tagName == 'P' && !domUtils.isEmptyBlock(next)){ + next.insertBefore(node,next.firstChild); + } + + if(pre && pre.tagName == 'P' && domUtils.isEmptyBlock(pre)){ + domUtils.remove(pre) + } + if(next && next.tagName == 'P' && domUtils.isEmptyBlock(next)){ + domUtils.remove(next) + } + rng.selectNode(node).select(); + me.fireEvent('saveScene'); + + } + + } + + }) + }); + me.addListener('keyup', function(type, evt) { + var keyCode = evt.keyCode || evt.which; + if (keyCode == 13) { + var rng = me.selection.getRange(),node; + if(node = domUtils.findParentByTagName(rng.startContainer,'p',true)){ + if(domUtils.getComputedStyle(node,'text-align') == 'center'){ + domUtils.removeStyle(node,'text-align') + } + } + } + }) +}; + + +// plugins/undo.js +/** + * undo redo + * @file + * @since 1.2.6.1 + */ + +/** + * 撤销上一次执行的命令 + * @command undo + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'undo' ); + * ``` + */ + +/** + * 重做上一次执行的命令 + * @command redo + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'redo' ); + * ``` + */ + +UE.plugins['undo'] = function () { + var saveSceneTimer; + var me = this, + maxUndoCount = me.options.maxUndoCount || 20, + maxInputCount = me.options.maxInputCount || 20, + fillchar = new RegExp(domUtils.fillChar + '|<\/hr>', 'gi');// ie会产生多余的 + var noNeedFillCharTags = { + ol:1,ul:1,table:1,tbody:1,tr:1,body:1 + }; + var orgState = me.options.autoClearEmptyNode; + function compareAddr(indexA, indexB) { + if (indexA.length != indexB.length) + return 0; + for (var i = 0, l = indexA.length; i < l; i++) { + if (indexA[i] != indexB[i]) + return 0 + } + return 1; + } + + function compareRangeAddress(rngAddrA, rngAddrB) { + if (rngAddrA.collapsed != rngAddrB.collapsed) { + return 0; + } + if (!compareAddr(rngAddrA.startAddress, rngAddrB.startAddress) || !compareAddr(rngAddrA.endAddress, rngAddrB.endAddress)) { + return 0; + } + return 1; + } + + function UndoManager() { + this.list = []; + this.index = 0; + this.hasUndo = false; + this.hasRedo = false; + this.undo = function () { + if (this.hasUndo) { + if (!this.list[this.index - 1] && this.list.length == 1) { + this.reset(); + return; + } + while (this.list[this.index].content == this.list[this.index - 1].content) { + this.index--; + if (this.index == 0) { + return this.restore(0); + } + } + this.restore(--this.index); + } + }; + this.redo = function () { + if (this.hasRedo) { + while (this.list[this.index].content == this.list[this.index + 1].content) { + this.index++; + if (this.index == this.list.length - 1) { + return this.restore(this.index); + } + } + this.restore(++this.index); + } + }; + + this.restore = function () { + var me = this.editor; + var scene = this.list[this.index]; + var root = UE.htmlparser(scene.content.replace(fillchar, '')); + me.options.autoClearEmptyNode = false; + me.filterInputRule(root); + me.options.autoClearEmptyNode = orgState; + //trace:873 + //去掉展位符 + me.document.body.innerHTML = root.toHtml(); + me.fireEvent('afterscencerestore'); + //处理undo后空格不展位的问题 + if (browser.ie) { + utils.each(domUtils.getElementsByTagName(me.document,'td th caption p'),function(node){ + if(domUtils.isEmptyNode(node)){ + domUtils.fillNode(me.document, node); + } + }) + } + + try{ + var rng = new dom.Range(me.document).moveToAddress(scene.address); + rng.select(noNeedFillCharTags[rng.startContainer.nodeName.toLowerCase()]); + }catch(e){} + + this.update(); + this.clearKey(); + //不能把自己reset了 + me.fireEvent('reset', true); + }; + + this.getScene = function () { + var me = this.editor; + var rng = me.selection.getRange(), + rngAddress = rng.createAddress(false,true); + me.fireEvent('beforegetscene'); + var root = UE.htmlparser(me.body.innerHTML); + me.options.autoClearEmptyNode = false; + me.filterOutputRule(root); + me.options.autoClearEmptyNode = orgState; + var cont = root.toHtml(); + //trace:3461 + //这个会引起回退时导致空格丢失的情况 +// browser.ie && (cont = cont.replace(/> <').replace(/\s*\s*/g, '>')); + me.fireEvent('aftergetscene'); + + return { + address:rngAddress, + content:cont + } + }; + this.save = function (notCompareRange,notSetCursor) { + clearTimeout(saveSceneTimer); + var currentScene = this.getScene(notSetCursor), + lastScene = this.list[this.index]; + + if(lastScene && lastScene.content != currentScene.content){ + me.trigger('contentchange') + } + //内容相同位置相同不存 + if (lastScene && lastScene.content == currentScene.content && + ( notCompareRange ? 1 : compareRangeAddress(lastScene.address, currentScene.address) ) + ) { + return; + } + this.list = this.list.slice(0, this.index + 1); + this.list.push(currentScene); + //如果大于最大数量了,就把最前的剔除 + if (this.list.length > maxUndoCount) { + this.list.shift(); + } + this.index = this.list.length - 1; + this.clearKey(); + //跟新undo/redo状态 + this.update(); + + }; + this.update = function () { + this.hasRedo = !!this.list[this.index + 1]; + this.hasUndo = !!this.list[this.index - 1]; + }; + this.reset = function () { + this.list = []; + this.index = 0; + this.hasUndo = false; + this.hasRedo = false; + this.clearKey(); + }; + this.clearKey = function () { + keycont = 0; + lastKeyCode = null; + }; + } + + me.undoManger = new UndoManager(); + me.undoManger.editor = me; + function saveScene() { + this.undoManger.save(); + } + + me.addListener('saveScene', function () { + var args = Array.prototype.splice.call(arguments,1); + this.undoManger.save.apply(this.undoManger,args); + }); + +// me.addListener('beforeexeccommand', saveScene); +// me.addListener('afterexeccommand', saveScene); + + me.addListener('reset', function (type, exclude) { + if (!exclude) { + this.undoManger.reset(); + } + }); + me.commands['redo'] = me.commands['undo'] = { + execCommand:function (cmdName) { + this.undoManger[cmdName](); + }, + queryCommandState:function (cmdName) { + return this.undoManger['has' + (cmdName.toLowerCase() == 'undo' ? 'Undo' : 'Redo')] ? 0 : -1; + }, + notNeedUndo:1 + }; + + var keys = { + // /*Backspace*/ 8:1, /*Delete*/ 46:1, + /*Shift*/ 16:1, /*Ctrl*/ 17:1, /*Alt*/ 18:1, + 37:1, 38:1, 39:1, 40:1 + + }, + keycont = 0, + lastKeyCode; + //输入法状态下不计算字符数 + var inputType = false; + me.addListener('ready', function () { + domUtils.on(this.body, 'compositionstart', function () { + inputType = true; + }); + domUtils.on(this.body, 'compositionend', function () { + inputType = false; + }) + }); + //快捷键 + me.addshortcutkey({ + "Undo":"ctrl+90", //undo + "Redo":"ctrl+89" //redo + + }); + var isCollapsed = true; + me.addListener('keydown', function (type, evt) { + + var me = this; + var keyCode = evt.keyCode || evt.which; + if (!keys[keyCode] && !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) { + if (inputType) + return; + + if(!me.selection.getRange().collapsed){ + me.undoManger.save(false,true); + isCollapsed = false; + return; + } + if (me.undoManger.list.length == 0) { + me.undoManger.save(true); + } + clearTimeout(saveSceneTimer); + function save(cont){ + cont.undoManger.save(false,true); + cont.fireEvent('selectionchange'); + } + saveSceneTimer = setTimeout(function(){ + if(inputType){ + var interalTimer = setInterval(function(){ + if(!inputType){ + save(me); + clearInterval(interalTimer) + } + },300) + return; + } + save(me); + },200); + + lastKeyCode = keyCode; + keycont++; + if (keycont >= maxInputCount ) { + save(me) + } + } + }); + me.addListener('keyup', function (type, evt) { + var keyCode = evt.keyCode || evt.which; + if (!keys[keyCode] && !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) { + if (inputType) + return; + if(!isCollapsed){ + this.undoManger.save(false,true); + isCollapsed = true; + } + } + }); + //扩展实例,添加关闭和开启命令undo + me.stopCmdUndo = function(){ + me.__hasEnterExecCommand = true; + }; + me.startCmdUndo = function(){ + me.__hasEnterExecCommand = false; + } +}; + + +// plugins/copy.js +UE.plugin.register('copy', function () { + + var me = this; + + function initZeroClipboard() { + + ZeroClipboard.config({ + debug: false, + swfPath: me.options.UEDITOR_HOME_URL + 'third-party/zeroclipboard/ZeroClipboard.swf' + }); + + var client = me.zeroclipboard = new ZeroClipboard(); + + // 复制内容 + client.on('copy', function (e) { + var client = e.client, + rng = me.selection.getRange(), + div = document.createElement('div'); + + div.appendChild(rng.cloneContents()); + client.setText(div.innerText || div.textContent); + client.setHtml(div.innerHTML); + rng.select(); + }); + // hover事件传递到target + client.on('mouseover mouseout', function (e) { + var target = e.target; + if (e.type == 'mouseover') { + domUtils.addClass(target, 'edui-state-hover'); + } else if (e.type == 'mouseout') { + domUtils.removeClasses(target, 'edui-state-hover'); + } + }); + // flash加载不成功 + client.on('wrongflash noflash', function () { + ZeroClipboard.destroy(); + }); + } + + return { + bindEvents: { + 'ready': function () { + if (!browser.ie) { + if (window.ZeroClipboard) { + initZeroClipboard(); + } else { + utils.loadFile(document, { + src: me.options.UEDITOR_HOME_URL + "third-party/zeroclipboard/ZeroClipboard.js", + tag: "script", + type: "text/javascript", + defer: "defer" + }, function () { + initZeroClipboard(); + }); + } + } + } + }, + commands: { + 'copy': { + execCommand: function (cmd) { + if (!me.document.execCommand('copy')) { + alert(me.getLang('copymsg')); + } + } + } + } + } +}); + + +// plugins/paste.js +///import core +///import plugins/inserthtml.js +///import plugins/undo.js +///import plugins/serialize.js +///commands 粘贴 +///commandsName PastePlain +///commandsTitle 纯文本粘贴模式 +/** + * @description 粘贴 + * @author zhanyi + */ +UE.plugins['paste'] = function () { + function getClipboardData(callback) { + var doc = this.document; + if (doc.getElementById('baidu_pastebin')) { + return; + } + var range = this.selection.getRange(), + bk = range.createBookmark(), + //创建剪贴的容器div + pastebin = doc.createElement('div'); + pastebin.id = 'baidu_pastebin'; + // Safari 要求div必须有内容,才能粘贴内容进来 + browser.webkit && pastebin.appendChild(doc.createTextNode(domUtils.fillChar + domUtils.fillChar)); + doc.body.appendChild(pastebin); + //trace:717 隐藏的span不能得到top + //bk.start.innerHTML = ' '; + bk.start.style.display = ''; + pastebin.style.cssText = "position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:" + + //要在现在光标平行的位置加入,否则会出现跳动的问题 + domUtils.getXY(bk.start).y + 'px'; + + range.selectNodeContents(pastebin).select(true); + + setTimeout(function () { + if (browser.webkit) { + for (var i = 0, pastebins = doc.querySelectorAll('#baidu_pastebin'), pi; pi = pastebins[i++];) { + if (domUtils.isEmptyNode(pi)) { + domUtils.remove(pi); + } else { + pastebin = pi; + break; + } + } + } + try { + pastebin.parentNode.removeChild(pastebin); + } catch (e) { + } + range.moveToBookmark(bk).select(true); + callback(pastebin); + }, 0); + } + + var me = this; + + me.setOpt({ + retainOnlyLabelPasted : false + }); + + var txtContent, htmlContent, address; + + function getPureHtml(html){ + return html.replace(/<(\/?)([\w\-]+)([^>]*)>/gi, function (a, b, tagName, attrs) { + tagName = tagName.toLowerCase(); + if ({img: 1}[tagName]) { + return a; + } + attrs = attrs.replace(/([\w\-]*?)\s*=\s*(("([^"]*)")|('([^']*)')|([^\s>]+))/gi, function (str, atr, val) { + if ({ + 'src': 1, + 'href': 1, + 'name': 1 + }[atr.toLowerCase()]) { + return atr + '=' + val + ' ' + } + return '' + }); + if ({ + 'span': 1, + 'div': 1 + }[tagName]) { + return '' + } else { + + return '<' + b + tagName + ' ' + utils.trim(attrs) + '>' + } + + }); + } + function filter(div) { + var html; + if (div.firstChild) { + //去掉cut中添加的边界值 + var nodes = domUtils.getElementsByTagName(div, 'span'); + for (var i = 0, ni; ni = nodes[i++];) { + if (ni.id == '_baidu_cut_start' || ni.id == '_baidu_cut_end') { + domUtils.remove(ni); + } + } + + if (browser.webkit) { + + var brs = div.querySelectorAll('div br'); + for (var i = 0, bi; bi = brs[i++];) { + var pN = bi.parentNode; + if (pN.tagName == 'DIV' && pN.childNodes.length == 1) { + pN.innerHTML = '


    '; + domUtils.remove(pN); + } + } + var divs = div.querySelectorAll('#baidu_pastebin'); + for (var i = 0, di; di = divs[i++];) { + var tmpP = me.document.createElement('p'); + di.parentNode.insertBefore(tmpP, di); + while (di.firstChild) { + tmpP.appendChild(di.firstChild); + } + domUtils.remove(di); + } + + var metas = div.querySelectorAll('meta'); + for (var i = 0, ci; ci = metas[i++];) { + domUtils.remove(ci); + } + + var brs = div.querySelectorAll('br'); + for (i = 0; ci = brs[i++];) { + if (/^apple-/i.test(ci.className)) { + domUtils.remove(ci); + } + } + } + if (browser.gecko) { + var dirtyNodes = div.querySelectorAll('[_moz_dirty]'); + for (i = 0; ci = dirtyNodes[i++];) { + ci.removeAttribute('_moz_dirty'); + } + } + if (!browser.ie) { + var spans = div.querySelectorAll('span.Apple-style-span'); + for (var i = 0, ci; ci = spans[i++];) { + domUtils.remove(ci, true); + } + } + + //ie下使用innerHTML会产生多余的\r\n字符,也会产生 这里过滤掉 + html = div.innerHTML;//.replace(/>(?:(\s| )*?)<'); + + //过滤word粘贴过来的冗余属性 + html = UE.filterWord(html); + //取消了忽略空白的第二个参数,粘贴过来的有些是有空白的,会被套上相关的标签 + var root = UE.htmlparser(html); + //如果给了过滤规则就先进行过滤 + if (me.options.filterRules) { + UE.filterNode(root, me.options.filterRules); + } + //执行默认的处理 + me.filterInputRule(root); + //针对chrome的处理 + if (browser.webkit) { + var br = root.lastChild(); + if (br && br.type == 'element' && br.tagName == 'br') { + root.removeChild(br) + } + utils.each(me.body.querySelectorAll('div'), function (node) { + if (domUtils.isEmptyBlock(node)) { + domUtils.remove(node,true) + } + }) + } + html = {'html': root.toHtml()}; + me.fireEvent('beforepaste', html, root); + //抢了默认的粘贴,那后边的内容就不执行了,比如表格粘贴 + if(!html.html){ + return; + } + root = UE.htmlparser(html.html,true); + //如果开启了纯文本模式 + if (me.queryCommandState('pasteplain') === 1) { + me.execCommand('insertHtml', UE.filterNode(root, me.options.filterTxtRules).toHtml(), true); + } else { + //文本模式 + UE.filterNode(root, me.options.filterTxtRules); + txtContent = root.toHtml(); + //完全模式 + htmlContent = html.html; + + address = me.selection.getRange().createAddress(true); + me.execCommand('insertHtml', me.getOpt('retainOnlyLabelPasted') === true ? getPureHtml(htmlContent) : htmlContent, true); + } + me.fireEvent("afterpaste", html); + } + } + + me.addListener('pasteTransfer', function (cmd, plainType) { + + if (address && txtContent && htmlContent && txtContent != htmlContent) { + var range = me.selection.getRange(); + range.moveToAddress(address, true); + + if (!range.collapsed) { + + while (!domUtils.isBody(range.startContainer) + ) { + var start = range.startContainer; + if(start.nodeType == 1){ + start = start.childNodes[range.startOffset]; + if(!start){ + range.setStartBefore(range.startContainer); + continue; + } + var pre = start.previousSibling; + + if(pre && pre.nodeType == 3 && new RegExp('^[\n\r\t '+domUtils.fillChar+']*$').test(pre.nodeValue)){ + range.setStartBefore(pre) + } + } + if(range.startOffset == 0){ + range.setStartBefore(range.startContainer); + }else{ + break; + } + + } + while (!domUtils.isBody(range.endContainer) + ) { + var end = range.endContainer; + if(end.nodeType == 1){ + end = end.childNodes[range.endOffset]; + if(!end){ + range.setEndAfter(range.endContainer); + continue; + } + var next = end.nextSibling; + if(next && next.nodeType == 3 && new RegExp('^[\n\r\t'+domUtils.fillChar+']*$').test(next.nodeValue)){ + range.setEndAfter(next) + } + } + if(range.endOffset == range.endContainer[range.endContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length){ + range.setEndAfter(range.endContainer); + }else{ + break; + } + + } + + } + + range.deleteContents(); + range.select(true); + me.__hasEnterExecCommand = true; + var html = htmlContent; + if (plainType === 2 ) { + html = getPureHtml(html); + } else if (plainType) { + html = txtContent; + } + me.execCommand('inserthtml', html, true); + me.__hasEnterExecCommand = false; + var rng = me.selection.getRange(); + while (!domUtils.isBody(rng.startContainer) && !rng.startOffset && + rng.startContainer[rng.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length + ) { + rng.setStartBefore(rng.startContainer); + } + var tmpAddress = rng.createAddress(true); + address.endAddress = tmpAddress.startAddress; + } + }); + + me.addListener('ready', function () { + domUtils.on(me.body, 'cut', function () { + var range = me.selection.getRange(); + if (!range.collapsed && me.undoManger) { + me.undoManger.save(); + } + }); + + //ie下beforepaste在点击右键时也会触发,所以用监控键盘才处理 + domUtils.on(me.body, browser.ie || browser.opera ? 'keydown' : 'paste', function (e) { + if ((browser.ie || browser.opera) && ((!e.ctrlKey && !e.metaKey) || e.keyCode != '86')) { + return; + } + getClipboardData.call(me, function (div) { + filter(div); + }); + }); + + }); + + me.commands['paste'] = { + execCommand: function (cmd) { + if (browser.ie) { + getClipboardData.call(me, function (div) { + filter(div); + }); + me.document.execCommand('paste'); + } else { + alert(me.getLang('pastemsg')); + } + } + } +}; + + + +// plugins/puretxtpaste.js +/** + * 纯文本粘贴插件 + * @file + * @since 1.2.6.1 + */ + +UE.plugins['pasteplain'] = function(){ + var me = this; + me.setOpt({ + 'pasteplain':false, + 'filterTxtRules' : function(){ + function transP(node){ + node.tagName = 'p'; + node.setStyle(); + } + function removeNode(node){ + node.parentNode.removeChild(node,true) + } + return { + //直接删除及其字节点内容 + '-' : 'script style object iframe embed input select', + 'p': {$:{}}, + 'br':{$:{}}, + div: function (node) { + var tmpNode, p = UE.uNode.createElement('p'); + while (tmpNode = node.firstChild()) { + if (tmpNode.type == 'text' || !UE.dom.dtd.$block[tmpNode.tagName]) { + p.appendChild(tmpNode); + } else { + if (p.firstChild()) { + node.parentNode.insertBefore(p, node); + p = UE.uNode.createElement('p'); + } else { + node.parentNode.insertBefore(tmpNode, node); + } + } + } + if (p.firstChild()) { + node.parentNode.insertBefore(p, node); + } + node.parentNode.removeChild(node); + }, + ol: removeNode, + ul: removeNode, + dl:removeNode, + dt:removeNode, + dd:removeNode, + 'li':removeNode, + 'caption':transP, + 'th':transP, + 'tr':transP, + 'h1':transP,'h2':transP,'h3':transP,'h4':transP,'h5':transP,'h6':transP, + 'td':function(node){ + //没有内容的td直接删掉 + var txt = !!node.innerText(); + if(txt){ + node.parentNode.insertAfter(UE.uNode.createText('    '),node); + } + node.parentNode.removeChild(node,node.innerText()) + } + } + }() + }); + //暂时这里支持一下老版本的属性 + var pasteplain = me.options.pasteplain; + + /** + * 启用或取消纯文本粘贴模式 + * @command pasteplain + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.queryCommandState( 'pasteplain' ); + * ``` + */ + + /** + * 查询当前是否处于纯文本粘贴模式 + * @command pasteplain + * @method queryCommandState + * @param { String } cmd 命令字符串 + * @return { int } 如果处于纯文本模式,返回1,否则,返回0 + * @example + * ```javascript + * editor.queryCommandState( 'pasteplain' ); + * ``` + */ + me.commands['pasteplain'] = { + queryCommandState: function (){ + return pasteplain ? 1 : 0; + }, + execCommand: function (){ + pasteplain = !pasteplain|0; + }, + notNeedUndo : 1 + }; +}; + +// plugins/list.js +/** + * 有序列表,无序列表插件 + * @file + * @since 1.2.6.1 + */ + +UE.plugins['list'] = function () { + var me = this, + notExchange = { + 'TD':1, + 'PRE':1, + 'BLOCKQUOTE':1 + }; + var customStyle = { + 'cn' : 'cn-1-', + 'cn1' : 'cn-2-', + 'cn2' : 'cn-3-', + 'num': 'num-1-', + 'num1' : 'num-2-', + 'num2' : 'num-3-', + 'dash' : 'dash', + 'dot':'dot' + }; + + me.setOpt( { + 'autoTransWordToList':false, + 'insertorderedlist':{ + 'num':'', + 'num1':'', + 'num2':'', + 'cn':'', + 'cn1':'', + 'cn2':'', + 'decimal':'', + 'lower-alpha':'', + 'lower-roman':'', + 'upper-alpha':'', + 'upper-roman':'' + }, + 'insertunorderedlist':{ + 'circle':'', + 'disc':'', + 'square':'', + 'dash' : '', + 'dot':'' + }, + listDefaultPaddingLeft : '30', + listiconpath : 'http://bs.baidu.com/listicon/', + maxListLevel : -1,//-1不限制 + disablePInList:false + } ); + function listToArray(list){ + var arr = []; + for(var p in list){ + arr.push(p) + } + return arr; + } + var listStyle = { + 'OL':listToArray(me.options.insertorderedlist), + 'UL':listToArray(me.options.insertunorderedlist) + }; + var liiconpath = me.options.listiconpath; + + //根据用户配置,调整customStyle + for(var s in customStyle){ + if(!me.options.insertorderedlist.hasOwnProperty(s) && !me.options.insertunorderedlist.hasOwnProperty(s)){ + delete customStyle[s]; + } + } + + me.ready(function () { + var customCss = []; + for(var p in customStyle){ + if(p == 'dash' || p == 'dot'){ + customCss.push('li.list-' + customStyle[p] + '{background-image:url(' + liiconpath +customStyle[p]+'.gif)}'); + customCss.push('ul.custom_'+p+'{list-style:none;}ul.custom_'+p+' li{background-position:0 3px;background-repeat:no-repeat}'); + }else{ + for(var i= 0;i<99;i++){ + customCss.push('li.list-' + customStyle[p] + i + '{background-image:url(' + liiconpath + 'list-'+customStyle[p] + i + '.gif)}') + } + customCss.push('ol.custom_'+p+'{list-style:none;}ol.custom_'+p+' li{background-position:0 3px;background-repeat:no-repeat}'); + } + switch(p){ + case 'cn': + customCss.push('li.list-'+p+'-paddingleft-1{padding-left:25px}'); + customCss.push('li.list-'+p+'-paddingleft-2{padding-left:40px}'); + customCss.push('li.list-'+p+'-paddingleft-3{padding-left:55px}'); + break; + case 'cn1': + customCss.push('li.list-'+p+'-paddingleft-1{padding-left:30px}'); + customCss.push('li.list-'+p+'-paddingleft-2{padding-left:40px}'); + customCss.push('li.list-'+p+'-paddingleft-3{padding-left:55px}'); + break; + case 'cn2': + customCss.push('li.list-'+p+'-paddingleft-1{padding-left:40px}'); + customCss.push('li.list-'+p+'-paddingleft-2{padding-left:55px}'); + customCss.push('li.list-'+p+'-paddingleft-3{padding-left:68px}'); + break; + case 'num': + case 'num1': + customCss.push('li.list-'+p+'-paddingleft-1{padding-left:25px}'); + break; + case 'num2': + customCss.push('li.list-'+p+'-paddingleft-1{padding-left:35px}'); + customCss.push('li.list-'+p+'-paddingleft-2{padding-left:40px}'); + break; + case 'dash': + customCss.push('li.list-'+p+'-paddingleft{padding-left:35px}'); + break; + case 'dot': + customCss.push('li.list-'+p+'-paddingleft{padding-left:20px}'); + } + } + customCss.push('.list-paddingleft-1{padding-left:0}'); + customCss.push('.list-paddingleft-2{padding-left:'+me.options.listDefaultPaddingLeft+'px}'); + customCss.push('.list-paddingleft-3{padding-left:'+me.options.listDefaultPaddingLeft*2+'px}'); + //如果不给宽度会在自定应样式里出现滚动条 + utils.cssRule('list', 'ol,ul{margin:0;pading:0;'+(browser.ie ? '' : 'width:95%')+'}li{clear:both;}'+customCss.join('\n'), me.document); + }); + //单独处理剪切的问题 + me.ready(function(){ + domUtils.on(me.body,'cut',function(){ + setTimeout(function(){ + var rng = me.selection.getRange(),li; + //trace:3416 + if(!rng.collapsed){ + if(li = domUtils.findParentByTagName(rng.startContainer,'li',true)){ + if(!li.nextSibling && domUtils.isEmptyBlock(li)){ + var pn = li.parentNode,node; + if(node = pn.previousSibling){ + domUtils.remove(pn); + rng.setStartAtLast(node).collapse(true); + rng.select(true); + }else if(node = pn.nextSibling){ + domUtils.remove(pn); + rng.setStartAtFirst(node).collapse(true); + rng.select(true); + }else{ + var tmpNode = me.document.createElement('p'); + domUtils.fillNode(me.document,tmpNode); + pn.parentNode.insertBefore(tmpNode,pn); + domUtils.remove(pn); + rng.setStart(tmpNode,0).collapse(true); + rng.select(true); + } + } + } + } + + }) + }) + }); + + function getStyle(node){ + var cls = node.className; + if(domUtils.hasClass(node,/custom_/)){ + return cls.match(/custom_(\w+)/)[1] + } + return domUtils.getStyle(node, 'list-style-type') + + } + + me.addListener('beforepaste',function(type,html){ + var me = this, + rng = me.selection.getRange(),li; + var root = UE.htmlparser(html.html,true); + if(li = domUtils.findParentByTagName(rng.startContainer,'li',true)){ + var list = li.parentNode,tagName = list.tagName == 'OL' ? 'ul':'ol'; + utils.each(root.getNodesByTagName(tagName),function(n){ + n.tagName = list.tagName; + n.setAttr(); + if(n.parentNode === root){ + type = getStyle(list) || (list.tagName == 'OL' ? 'decimal' : 'disc') + }else{ + var className = n.parentNode.getAttr('class'); + if(className && /custom_/.test(className)){ + type = className.match(/custom_(\w+)/)[1] + }else{ + type = n.parentNode.getStyle('list-style-type'); + } + if(!type){ + type = list.tagName == 'OL' ? 'decimal' : 'disc'; + } + } + var index = utils.indexOf(listStyle[list.tagName], type); + if(n.parentNode !== root) + index = index + 1 == listStyle[list.tagName].length ? 0 : index + 1; + var currentStyle = listStyle[list.tagName][index]; + if(customStyle[currentStyle]){ + n.setAttr('class', 'custom_' + currentStyle) + + }else{ + n.setStyle('list-style-type',currentStyle) + } + }) + + } + + html.html = root.toHtml(); + }); + //导出时,去掉p标签 + me.getOpt('disablePInList') === true && me.addOutputRule(function(root){ + utils.each(root.getNodesByTagName('li'),function(li){ + var newChildrens = [],index=0; + utils.each(li.children,function(n){ + if(n.tagName == 'p'){ + var tmpNode; + while(tmpNode = n.children.pop()) { + newChildrens.splice(index,0,tmpNode); + tmpNode.parentNode = li; + lastNode = tmpNode; + } + tmpNode = newChildrens[newChildrens.length-1]; + if(!tmpNode || tmpNode.type != 'element' || tmpNode.tagName != 'br'){ + var br = UE.uNode.createElement('br'); + br.parentNode = li; + newChildrens.push(br); + } + + index = newChildrens.length; + } + }); + if(newChildrens.length){ + li.children = newChildrens; + } + }); + }); + //进入编辑器的li要套p标签 + me.addInputRule(function(root){ + utils.each(root.getNodesByTagName('li'),function(li){ + var tmpP = UE.uNode.createElement('p'); + for(var i= 0,ci;ci=li.children[i];){ + if(ci.type == 'text' || dtd.p[ci.tagName]){ + tmpP.appendChild(ci); + }else{ + if(tmpP.firstChild()){ + li.insertBefore(tmpP,ci); + tmpP = UE.uNode.createElement('p'); + i = i + 2; + }else{ + i++; + } + + } + } + if(tmpP.firstChild() && !tmpP.parentNode || !li.firstChild()){ + li.appendChild(tmpP); + } + //trace:3357 + //p不能为空 + if (!tmpP.firstChild()) { + tmpP.innerHTML(browser.ie ? ' ' : '
    ') + } + //去掉末尾的空白 + var p = li.firstChild(); + var lastChild = p.lastChild(); + if(lastChild && lastChild.type == 'text' && /^\s*$/.test(lastChild.data)){ + p.removeChild(lastChild) + } + }); + if(me.options.autoTransWordToList){ + var orderlisttype = { + 'num1':/^\d+\)/, + 'decimal':/^\d+\./, + 'lower-alpha':/^[a-z]+\)/, + 'upper-alpha':/^[A-Z]+\./, + 'cn':/^[\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+[\u3001]/, + 'cn2':/^\([\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+\)/ + }, + unorderlisttype = { + 'square':'n' + }; + function checkListType(content,container){ + var span = container.firstChild(); + if(span && span.type == 'element' && span.tagName == 'span' && /Wingdings|Symbol/.test(span.getStyle('font-family'))){ + for(var p in unorderlisttype){ + if(unorderlisttype[p] == span.data){ + return p + } + } + return 'disc' + } + for(var p in orderlisttype){ + if(orderlisttype[p].test(content)){ + return p; + } + } + + } + utils.each(root.getNodesByTagName('p'),function(node){ + if(node.getAttr('class') != 'MsoListParagraph'){ + return + } + + //word粘贴过来的会带有margin要去掉,但这样也可能会误命中一些央视 + node.setStyle('margin',''); + node.setStyle('margin-left',''); + node.setAttr('class',''); + + function appendLi(list,p,type){ + if(list.tagName == 'ol'){ + if(browser.ie){ + var first = p.firstChild(); + if(first.type =='element' && first.tagName == 'span' && orderlisttype[type].test(first.innerText())){ + p.removeChild(first); + } + }else{ + p.innerHTML(p.innerHTML().replace(orderlisttype[type],'')); + } + }else{ + p.removeChild(p.firstChild()) + } + + var li = UE.uNode.createElement('li'); + li.appendChild(p); + list.appendChild(li); + } + var tmp = node,type,cacheNode = node; + + if(node.parentNode.tagName != 'li' && (type = checkListType(node.innerText(),node))){ + + var list = UE.uNode.createElement(me.options.insertorderedlist.hasOwnProperty(type) ? 'ol' : 'ul'); + if(customStyle[type]){ + list.setAttr('class','custom_'+type) + }else{ + list.setStyle('list-style-type',type) + } + while(node && node.parentNode.tagName != 'li' && checkListType(node.innerText(),node)){ + tmp = node.nextSibling(); + if(!tmp){ + node.parentNode.insertBefore(list,node) + } + appendLi(list,node,type); + node = tmp; + } + if(!list.parentNode && node && node.parentNode){ + node.parentNode.insertBefore(list,node) + } + } + var span = cacheNode.firstChild(); + if(span && span.type == 'element' && span.tagName == 'span' && /^\s*( )+\s*$/.test(span.innerText())){ + span.parentNode.removeChild(span) + } + }) + } + + }); + + //调整索引标签 + me.addListener('contentchange',function(){ + adjustListStyle(me.document) + }); + + function adjustListStyle(doc,ignore){ + utils.each(domUtils.getElementsByTagName(doc,'ol ul'),function(node){ + + if(!domUtils.inDoc(node,doc)) + return; + + var parent = node.parentNode; + if(parent.tagName == node.tagName){ + var nodeStyleType = getStyle(node) || (node.tagName == 'OL' ? 'decimal' : 'disc'), + parentStyleType = getStyle(parent) || (parent.tagName == 'OL' ? 'decimal' : 'disc'); + if(nodeStyleType == parentStyleType){ + var styleIndex = utils.indexOf(listStyle[node.tagName], nodeStyleType); + styleIndex = styleIndex + 1 == listStyle[node.tagName].length ? 0 : styleIndex + 1; + setListStyle(node,listStyle[node.tagName][styleIndex]) + } + + } + var index = 0,type = 2; + if( domUtils.hasClass(node,/custom_/)){ + if(!(/[ou]l/i.test(parent.tagName) && domUtils.hasClass(parent,/custom_/))){ + type = 1; + } + }else{ + if(/[ou]l/i.test(parent.tagName) && domUtils.hasClass(parent,/custom_/)){ + type = 3; + } + } + + var style = domUtils.getStyle(node, 'list-style-type'); + style && (node.style.cssText = 'list-style-type:' + style); + node.className = utils.trim(node.className.replace(/list-paddingleft-\w+/,'')) + ' list-paddingleft-' + type; + utils.each(domUtils.getElementsByTagName(node,'li'),function(li){ + li.style.cssText && (li.style.cssText = ''); + if(!li.firstChild){ + domUtils.remove(li); + return; + } + if(li.parentNode !== node){ + return; + } + index++; + if(domUtils.hasClass(node,/custom_/) ){ + var paddingLeft = 1,currentStyle = getStyle(node); + if(node.tagName == 'OL'){ + if(currentStyle){ + switch(currentStyle){ + case 'cn' : + case 'cn1': + case 'cn2': + if(index > 10 && (index % 10 == 0 || index > 10 && index < 20)){ + paddingLeft = 2 + }else if(index > 20){ + paddingLeft = 3 + } + break; + case 'num2' : + if(index > 9){ + paddingLeft = 2 + } + } + } + li.className = 'list-'+customStyle[currentStyle]+ index + ' ' + 'list-'+currentStyle+'-paddingleft-' + paddingLeft; + }else{ + li.className = 'list-'+customStyle[currentStyle] + ' ' + 'list-'+currentStyle+'-paddingleft'; + } + }else{ + li.className = li.className.replace(/list-[\w\-]+/gi,''); + } + var className = li.getAttribute('class'); + if(className !== null && !className.replace(/\s/g,'')){ + domUtils.removeAttributes(li,'class') + } + }); + !ignore && adjustList(node,node.tagName.toLowerCase(),getStyle(node)||domUtils.getStyle(node, 'list-style-type'),true); + }) + } + function adjustList(list, tag, style,ignoreEmpty) { + var nextList = list.nextSibling; + if (nextList && nextList.nodeType == 1 && nextList.tagName.toLowerCase() == tag && (getStyle(nextList) || domUtils.getStyle(nextList, 'list-style-type') || (tag == 'ol' ? 'decimal' : 'disc')) == style) { + domUtils.moveChild(nextList, list); + if (nextList.childNodes.length == 0) { + domUtils.remove(nextList); + } + } + if(nextList && domUtils.isFillChar(nextList)){ + domUtils.remove(nextList); + } + var preList = list.previousSibling; + if (preList && preList.nodeType == 1 && preList.tagName.toLowerCase() == tag && (getStyle(preList) || domUtils.getStyle(preList, 'list-style-type') || (tag == 'ol' ? 'decimal' : 'disc')) == style) { + domUtils.moveChild(list, preList); + } + if(preList && domUtils.isFillChar(preList)){ + domUtils.remove(preList); + } + !ignoreEmpty && domUtils.isEmptyBlock(list) && domUtils.remove(list); + if(getStyle(list)){ + adjustListStyle(list.ownerDocument,true) + } + } + + function setListStyle(list,style){ + if(customStyle[style]){ + list.className = 'custom_' + style; + } + try{ + domUtils.setStyle(list, 'list-style-type', style); + }catch(e){} + } + function clearEmptySibling(node) { + var tmpNode = node.previousSibling; + if (tmpNode && domUtils.isEmptyBlock(tmpNode)) { + domUtils.remove(tmpNode); + } + tmpNode = node.nextSibling; + if (tmpNode && domUtils.isEmptyBlock(tmpNode)) { + domUtils.remove(tmpNode); + } + } + + me.addListener('keydown', function (type, evt) { + function preventAndSave() { + evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); + me.fireEvent('contentchange'); + me.undoManger && me.undoManger.save(); + } + function findList(node,filterFn){ + while(node && !domUtils.isBody(node)){ + if(filterFn(node)){ + return null + } + if(node.nodeType == 1 && /[ou]l/i.test(node.tagName)){ + return node; + } + node = node.parentNode; + } + return null; + } + var keyCode = evt.keyCode || evt.which; + if (keyCode == 13 && !evt.shiftKey) {//回车 + var rng = me.selection.getRange(), + parent = domUtils.findParent(rng.startContainer,function(node){return domUtils.isBlockElm(node)},true), + li = domUtils.findParentByTagName(rng.startContainer,'li',true); + if(parent && parent.tagName != 'PRE' && !li){ + var html = parent.innerHTML.replace(new RegExp(domUtils.fillChar, 'g'),''); + if(/^\s*1\s*\.[^\d]/.test(html)){ + parent.innerHTML = html.replace(/^\s*1\s*\./,''); + rng.setStartAtLast(parent).collapse(true).select(); + me.__hasEnterExecCommand = true; + me.execCommand('insertorderedlist'); + me.__hasEnterExecCommand = false; + } + } + var range = me.selection.getRange(), + start = findList(range.startContainer,function (node) { + return node.tagName == 'TABLE'; + }), + end = range.collapsed ? start : findList(range.endContainer,function (node) { + return node.tagName == 'TABLE'; + }); + + if (start && end && start === end) { + + if (!range.collapsed) { + start = domUtils.findParentByTagName(range.startContainer, 'li', true); + end = domUtils.findParentByTagName(range.endContainer, 'li', true); + if (start && end && start === end) { + range.deleteContents(); + li = domUtils.findParentByTagName(range.startContainer, 'li', true); + if (li && domUtils.isEmptyBlock(li)) { + + pre = li.previousSibling; + next = li.nextSibling; + p = me.document.createElement('p'); + + domUtils.fillNode(me.document, p); + parentList = li.parentNode; + if (pre && next) { + range.setStart(next, 0).collapse(true).select(true); + domUtils.remove(li); + + } else { + if (!pre && !next || !pre) { + + parentList.parentNode.insertBefore(p, parentList); + + + } else { + li.parentNode.parentNode.insertBefore(p, parentList.nextSibling); + } + domUtils.remove(li); + if (!parentList.firstChild) { + domUtils.remove(parentList); + } + range.setStart(p, 0).setCursor(); + + + } + preventAndSave(); + return; + + } + } else { + var tmpRange = range.cloneRange(), + bk = tmpRange.collapse(false).createBookmark(); + + range.deleteContents(); + tmpRange.moveToBookmark(bk); + var li = domUtils.findParentByTagName(tmpRange.startContainer, 'li', true); + + clearEmptySibling(li); + tmpRange.select(); + preventAndSave(); + return; + } + } + + + li = domUtils.findParentByTagName(range.startContainer, 'li', true); + + if (li) { + if (domUtils.isEmptyBlock(li)) { + bk = range.createBookmark(); + var parentList = li.parentNode; + if (li !== parentList.lastChild) { + domUtils.breakParent(li, parentList); + clearEmptySibling(li); + } else { + + parentList.parentNode.insertBefore(li, parentList.nextSibling); + if (domUtils.isEmptyNode(parentList)) { + domUtils.remove(parentList); + } + } + //嵌套不处理 + if (!dtd.$list[li.parentNode.tagName]) { + + if (!domUtils.isBlockElm(li.firstChild)) { + p = me.document.createElement('p'); + li.parentNode.insertBefore(p, li); + while (li.firstChild) { + p.appendChild(li.firstChild); + } + domUtils.remove(li); + } else { + domUtils.remove(li, true); + } + } + range.moveToBookmark(bk).select(); + + + } else { + var first = li.firstChild; + if (!first || !domUtils.isBlockElm(first)) { + var p = me.document.createElement('p'); + + !li.firstChild && domUtils.fillNode(me.document, p); + while (li.firstChild) { + + p.appendChild(li.firstChild); + } + li.appendChild(p); + first = p; + } + + var span = me.document.createElement('span'); + + range.insertNode(span); + domUtils.breakParent(span, li); + + var nextLi = span.nextSibling; + first = nextLi.firstChild; + + if (!first) { + p = me.document.createElement('p'); + + domUtils.fillNode(me.document, p); + nextLi.appendChild(p); + first = p; + } + if (domUtils.isEmptyNode(first)) { + first.innerHTML = ''; + domUtils.fillNode(me.document, first); + } + + range.setStart(first, 0).collapse(true).shrinkBoundary().select(); + domUtils.remove(span); + var pre = nextLi.previousSibling; + if (pre && domUtils.isEmptyBlock(pre)) { + pre.innerHTML = '

    '; + domUtils.fillNode(me.document, pre.firstChild); + } + + } +// } + preventAndSave(); + } + + + } + + + } + if (keyCode == 8) { + //修中ie中li下的问题 + range = me.selection.getRange(); + if (range.collapsed && domUtils.isStartInblock(range)) { + tmpRange = range.cloneRange().trimBoundary(); + li = domUtils.findParentByTagName(range.startContainer, 'li', true); + //要在li的最左边,才能处理 + if (li && domUtils.isStartInblock(tmpRange)) { + start = domUtils.findParentByTagName(range.startContainer, 'p', true); + if (start && start !== li.firstChild) { + var parentList = domUtils.findParentByTagName(start,['ol','ul']); + domUtils.breakParent(start,parentList); + clearEmptySibling(start); + me.fireEvent('contentchange'); + range.setStart(start,0).setCursor(false,true); + me.fireEvent('saveScene'); + domUtils.preventDefault(evt); + return; + } + + if (li && (pre = li.previousSibling)) { + if (keyCode == 46 && li.childNodes.length) { + return; + } + //有可能上边的兄弟节点是个2级菜单,要追加到2级菜单的最后的li + if (dtd.$list[pre.tagName]) { + pre = pre.lastChild; + } + me.undoManger && me.undoManger.save(); + first = li.firstChild; + if (domUtils.isBlockElm(first)) { + if (domUtils.isEmptyNode(first)) { +// range.setEnd(pre, pre.childNodes.length).shrinkBoundary().collapse().select(true); + pre.appendChild(first); + range.setStart(first, 0).setCursor(false, true); + //first不是唯一的节点 + while (li.firstChild) { + pre.appendChild(li.firstChild); + } + } else { + + span = me.document.createElement('span'); + range.insertNode(span); + //判断pre是否是空的节点,如果是


    类型的空节点,干掉p标签防止它占位 + if (domUtils.isEmptyBlock(pre)) { + pre.innerHTML = ''; + } + domUtils.moveChild(li, pre); + range.setStartBefore(span).collapse(true).select(true); + + domUtils.remove(span); + + } + } else { + if (domUtils.isEmptyNode(li)) { + var p = me.document.createElement('p'); + pre.appendChild(p); + range.setStart(p, 0).setCursor(); +// range.setEnd(pre, pre.childNodes.length).shrinkBoundary().collapse().select(true); + } else { + range.setEnd(pre, pre.childNodes.length).collapse().select(true); + while (li.firstChild) { + pre.appendChild(li.firstChild); + } + } + } + domUtils.remove(li); + me.fireEvent('contentchange'); + me.fireEvent('saveScene'); + domUtils.preventDefault(evt); + return; + + } + //trace:980 + + if (li && !li.previousSibling) { + var parentList = li.parentNode; + var bk = range.createBookmark(); + if(domUtils.isTagNode(parentList.parentNode,'ol ul')){ + parentList.parentNode.insertBefore(li,parentList); + if(domUtils.isEmptyNode(parentList)){ + domUtils.remove(parentList) + } + }else{ + + while(li.firstChild){ + parentList.parentNode.insertBefore(li.firstChild,parentList); + } + + domUtils.remove(li); + if(domUtils.isEmptyNode(parentList)){ + domUtils.remove(parentList) + } + + } + range.moveToBookmark(bk).setCursor(false,true); + me.fireEvent('contentchange'); + me.fireEvent('saveScene'); + domUtils.preventDefault(evt); + return; + + } + + + } + + + } + + } + }); + + me.addListener('keyup',function(type, evt){ + var keyCode = evt.keyCode || evt.which; + if (keyCode == 8) { + var rng = me.selection.getRange(),list; + if(list = domUtils.findParentByTagName(rng.startContainer,['ol', 'ul'],true)){ + adjustList(list,list.tagName.toLowerCase(),getStyle(list)||domUtils.getComputedStyle(list,'list-style-type'),true) + } + } + }); + //处理tab键 + me.addListener('tabkeydown',function(){ + + var range = me.selection.getRange(); + + //控制级数 + function checkLevel(li){ + if(me.options.maxListLevel != -1){ + var level = li.parentNode,levelNum = 0; + while(/[ou]l/i.test(level.tagName)){ + levelNum++; + level = level.parentNode; + } + if(levelNum >= me.options.maxListLevel){ + return true; + } + } + } + //只以开始为准 + //todo 后续改进 + var li = domUtils.findParentByTagName(range.startContainer, 'li', true); + if(li){ + + var bk; + if(range.collapsed){ + if(checkLevel(li)) + return true; + var parentLi = li.parentNode, + list = me.document.createElement(parentLi.tagName), + index = utils.indexOf(listStyle[list.tagName], getStyle(parentLi)||domUtils.getComputedStyle(parentLi, 'list-style-type')); + index = index + 1 == listStyle[list.tagName].length ? 0 : index + 1; + var currentStyle = listStyle[list.tagName][index]; + setListStyle(list,currentStyle); + if(domUtils.isStartInblock(range)){ + me.fireEvent('saveScene'); + bk = range.createBookmark(); + parentLi.insertBefore(list, li); + list.appendChild(li); + adjustList(list,list.tagName.toLowerCase(),currentStyle); + me.fireEvent('contentchange'); + range.moveToBookmark(bk).select(true); + return true; + } + }else{ + me.fireEvent('saveScene'); + bk = range.createBookmark(); + for(var i= 0,closeList,parents = domUtils.findParents(li),ci;ci=parents[i++];){ + if(domUtils.isTagNode(ci,'ol ul')){ + closeList = ci; + break; + } + } + var current = li; + if(bk.end){ + while(current && !(domUtils.getPosition(current, bk.end) & domUtils.POSITION_FOLLOWING)){ + if(checkLevel(current)){ + current = domUtils.getNextDomNode(current,false,null,function(node){return node !== closeList}); + continue; + } + var parentLi = current.parentNode, + list = me.document.createElement(parentLi.tagName), + index = utils.indexOf(listStyle[list.tagName], getStyle(parentLi)||domUtils.getComputedStyle(parentLi, 'list-style-type')); + var currentIndex = index + 1 == listStyle[list.tagName].length ? 0 : index + 1; + var currentStyle = listStyle[list.tagName][currentIndex]; + setListStyle(list,currentStyle); + parentLi.insertBefore(list, current); + while(current && !(domUtils.getPosition(current, bk.end) & domUtils.POSITION_FOLLOWING)){ + li = current.nextSibling; + list.appendChild(current); + if(!li || domUtils.isTagNode(li,'ol ul')){ + if(li){ + while(li = li.firstChild){ + if(li.tagName == 'LI'){ + break; + } + } + }else{ + li = domUtils.getNextDomNode(current,false,null,function(node){return node !== closeList}); + } + break; + } + current = li; + } + adjustList(list,list.tagName.toLowerCase(),currentStyle); + current = li; + } + } + me.fireEvent('contentchange'); + range.moveToBookmark(bk).select(); + return true; + } + } + + }); + function getLi(start){ + while(start && !domUtils.isBody(start)){ + if(start.nodeName == 'TABLE'){ + return null; + } + if(start.nodeName == 'LI'){ + return start + } + start = start.parentNode; + } + } + + /** + * 有序列表,与“insertunorderedlist”命令互斥 + * @command insertorderedlist + * @method execCommand + * @param { String } command 命令字符串 + * @param { String } style 插入的有序列表类型,值为:decimal,lower-alpha,lower-roman,upper-alpha,upper-roman,cn,cn1,cn2,num,num1,num2 + * @example + * ```javascript + * editor.execCommand( 'insertorderedlist','decimal'); + * ``` + */ + /** + * 查询当前选区内容是否有序列表 + * @command insertorderedlist + * @method queryCommandState + * @param { String } cmd 命令字符串 + * @return { int } 如果当前选区是有序列表返回1,否则返回0 + * @example + * ```javascript + * editor.queryCommandState( 'insertorderedlist' ); + * ``` + */ + /** + * 查询当前选区内容是否有序列表 + * @command insertorderedlist + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回当前有序列表的类型,值为null或decimal,lower-alpha,lower-roman,upper-alpha,upper-roman,cn,cn1,cn2,num,num1,num2 + * @example + * ```javascript + * editor.queryCommandValue( 'insertorderedlist' ); + * ``` + */ + + /** + * 无序列表,与“insertorderedlist”命令互斥 + * @command insertunorderedlist + * @method execCommand + * @param { String } command 命令字符串 + * @param { String } style 插入的无序列表类型,值为:circle,disc,square,dash,dot + * @example + * ```javascript + * editor.execCommand( 'insertunorderedlist','circle'); + * ``` + */ + /** + * 查询当前是否有word文档粘贴进来的图片 + * @command insertunorderedlist + * @method insertunorderedlist + * @param { String } command 命令字符串 + * @return { int } 如果当前选区是无序列表返回1,否则返回0 + * @example + * ```javascript + * editor.queryCommandState( 'insertunorderedlist' ); + * ``` + */ + /** + * 查询当前选区内容是否有序列表 + * @command insertunorderedlist + * @method queryCommandValue + * @param { String } command 命令字符串 + * @return { String } 返回当前无序列表的类型,值为null或circle,disc,square,dash,dot + * @example + * ```javascript + * editor.queryCommandValue( 'insertunorderedlist' ); + * ``` + */ + + me.commands['insertorderedlist'] = + me.commands['insertunorderedlist'] = { + execCommand:function (command, style) { + + if (!style) { + style = command.toLowerCase() == 'insertorderedlist' ? 'decimal' : 'disc'; + } + var me = this, + range = this.selection.getRange(), + filterFn = function (node) { + return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' : !domUtils.isWhitespace(node); + }, + tag = command.toLowerCase() == 'insertorderedlist' ? 'ol' : 'ul', + frag = me.document.createDocumentFragment(); + //去掉是因为会出现选到末尾,导致adjustmentBoundary缩到ol/ul的位置 + //range.shrinkBoundary();//.adjustmentBoundary(); + range.adjustmentBoundary().shrinkBoundary(); + var bko = range.createBookmark(true), + start = getLi(me.document.getElementById(bko.start)), + modifyStart = 0, + end = getLi(me.document.getElementById(bko.end)), + modifyEnd = 0, + startParent, endParent, + list, tmp; + + if (start || end) { + start && (startParent = start.parentNode); + if (!bko.end) { + end = start; + } + end && (endParent = end.parentNode); + + if (startParent === endParent) { + while (start !== end) { + tmp = start; + start = start.nextSibling; + if (!domUtils.isBlockElm(tmp.firstChild)) { + var p = me.document.createElement('p'); + while (tmp.firstChild) { + p.appendChild(tmp.firstChild); + } + tmp.appendChild(p); + } + frag.appendChild(tmp); + } + tmp = me.document.createElement('span'); + startParent.insertBefore(tmp, end); + if (!domUtils.isBlockElm(end.firstChild)) { + p = me.document.createElement('p'); + while (end.firstChild) { + p.appendChild(end.firstChild); + } + end.appendChild(p); + } + frag.appendChild(end); + domUtils.breakParent(tmp, startParent); + if (domUtils.isEmptyNode(tmp.previousSibling)) { + domUtils.remove(tmp.previousSibling); + } + if (domUtils.isEmptyNode(tmp.nextSibling)) { + domUtils.remove(tmp.nextSibling) + } + var nodeStyle = getStyle(startParent) || domUtils.getComputedStyle(startParent, 'list-style-type') || (command.toLowerCase() == 'insertorderedlist' ? 'decimal' : 'disc'); + if (startParent.tagName.toLowerCase() == tag && nodeStyle == style) { + for (var i = 0, ci, tmpFrag = me.document.createDocumentFragment(); ci = frag.firstChild;) { + if(domUtils.isTagNode(ci,'ol ul')){ +// 删除时,子列表不处理 +// utils.each(domUtils.getElementsByTagName(ci,'li'),function(li){ +// while(li.firstChild){ +// tmpFrag.appendChild(li.firstChild); +// } +// +// }); + tmpFrag.appendChild(ci); + }else{ + while (ci.firstChild) { + + tmpFrag.appendChild(ci.firstChild); + domUtils.remove(ci); + } + } + + } + tmp.parentNode.insertBefore(tmpFrag, tmp); + } else { + list = me.document.createElement(tag); + setListStyle(list,style); + list.appendChild(frag); + tmp.parentNode.insertBefore(list, tmp); + } + + domUtils.remove(tmp); + list && adjustList(list, tag, style); + range.moveToBookmark(bko).select(); + return; + } + //开始 + if (start) { + while (start) { + tmp = start.nextSibling; + if (domUtils.isTagNode(start, 'ol ul')) { + frag.appendChild(start); + } else { + var tmpfrag = me.document.createDocumentFragment(), + hasBlock = 0; + while (start.firstChild) { + if (domUtils.isBlockElm(start.firstChild)) { + hasBlock = 1; + } + tmpfrag.appendChild(start.firstChild); + } + if (!hasBlock) { + var tmpP = me.document.createElement('p'); + tmpP.appendChild(tmpfrag); + frag.appendChild(tmpP); + } else { + frag.appendChild(tmpfrag); + } + domUtils.remove(start); + } + + start = tmp; + } + startParent.parentNode.insertBefore(frag, startParent.nextSibling); + if (domUtils.isEmptyNode(startParent)) { + range.setStartBefore(startParent); + domUtils.remove(startParent); + } else { + range.setStartAfter(startParent); + } + modifyStart = 1; + } + + if (end && domUtils.inDoc(endParent, me.document)) { + //结束 + start = endParent.firstChild; + while (start && start !== end) { + tmp = start.nextSibling; + if (domUtils.isTagNode(start, 'ol ul')) { + frag.appendChild(start); + } else { + tmpfrag = me.document.createDocumentFragment(); + hasBlock = 0; + while (start.firstChild) { + if (domUtils.isBlockElm(start.firstChild)) { + hasBlock = 1; + } + tmpfrag.appendChild(start.firstChild); + } + if (!hasBlock) { + tmpP = me.document.createElement('p'); + tmpP.appendChild(tmpfrag); + frag.appendChild(tmpP); + } else { + frag.appendChild(tmpfrag); + } + domUtils.remove(start); + } + start = tmp; + } + var tmpDiv = domUtils.createElement(me.document, 'div', { + 'tmpDiv':1 + }); + domUtils.moveChild(end, tmpDiv); + + frag.appendChild(tmpDiv); + domUtils.remove(end); + endParent.parentNode.insertBefore(frag, endParent); + range.setEndBefore(endParent); + if (domUtils.isEmptyNode(endParent)) { + domUtils.remove(endParent); + } + + modifyEnd = 1; + } + + + } + + if (!modifyStart) { + range.setStartBefore(me.document.getElementById(bko.start)); + } + if (bko.end && !modifyEnd) { + range.setEndAfter(me.document.getElementById(bko.end)); + } + range.enlarge(true, function (node) { + return notExchange[node.tagName]; + }); + + frag = me.document.createDocumentFragment(); + + var bk = range.createBookmark(), + current = domUtils.getNextDomNode(bk.start, false, filterFn), + tmpRange = range.cloneRange(), + tmpNode, + block = domUtils.isBlockElm; + + while (current && current !== bk.end && (domUtils.getPosition(current, bk.end) & domUtils.POSITION_PRECEDING)) { + + if (current.nodeType == 3 || dtd.li[current.tagName]) { + if (current.nodeType == 1 && dtd.$list[current.tagName]) { + while (current.firstChild) { + frag.appendChild(current.firstChild); + } + tmpNode = domUtils.getNextDomNode(current, false, filterFn); + domUtils.remove(current); + current = tmpNode; + continue; + + } + tmpNode = current; + tmpRange.setStartBefore(current); + + while (current && current !== bk.end && (!block(current) || domUtils.isBookmarkNode(current) )) { + tmpNode = current; + current = domUtils.getNextDomNode(current, false, null, function (node) { + return !notExchange[node.tagName]; + }); + } + + if (current && block(current)) { + tmp = domUtils.getNextDomNode(tmpNode, false, filterFn); + if (tmp && domUtils.isBookmarkNode(tmp)) { + current = domUtils.getNextDomNode(tmp, false, filterFn); + tmpNode = tmp; + } + } + tmpRange.setEndAfter(tmpNode); + + current = domUtils.getNextDomNode(tmpNode, false, filterFn); + + var li = range.document.createElement('li'); + + li.appendChild(tmpRange.extractContents()); + if(domUtils.isEmptyNode(li)){ + var tmpNode = range.document.createElement('p'); + while(li.firstChild){ + tmpNode.appendChild(li.firstChild) + } + li.appendChild(tmpNode); + } + frag.appendChild(li); + } else { + current = domUtils.getNextDomNode(current, true, filterFn); + } + } + range.moveToBookmark(bk).collapse(true); + list = me.document.createElement(tag); + setListStyle(list,style); + list.appendChild(frag); + range.insertNode(list); + //当前list上下看能否合并 + adjustList(list, tag, style); + //去掉冗余的tmpDiv + for (var i = 0, ci, tmpDivs = domUtils.getElementsByTagName(list, 'div'); ci = tmpDivs[i++];) { + if (ci.getAttribute('tmpDiv')) { + domUtils.remove(ci, true) + } + } + range.moveToBookmark(bko).select(); + + }, + queryCommandState:function (command) { + var tag = command.toLowerCase() == 'insertorderedlist' ? 'ol' : 'ul'; + var path = this.selection.getStartElementPath(); + for(var i= 0,ci;ci = path[i++];){ + if(ci.nodeName == 'TABLE'){ + return 0 + } + if(tag == ci.nodeName.toLowerCase()){ + return 1 + }; + } + return 0; + + }, + queryCommandValue:function (command) { + var tag = command.toLowerCase() == 'insertorderedlist' ? 'ol' : 'ul'; + var path = this.selection.getStartElementPath(), + node; + for(var i= 0,ci;ci = path[i++];){ + if(ci.nodeName == 'TABLE'){ + node = null; + break; + } + if(tag == ci.nodeName.toLowerCase()){ + node = ci; + break; + }; + } + return node ? getStyle(node) || domUtils.getComputedStyle(node, 'list-style-type') : null; + } + }; +}; + + + +// plugins/source.js +/** + * 源码编辑插件 + * @file + * @since 1.2.6.1 + */ + +(function (){ + var sourceEditors = { + textarea: function (editor, holder){ + var textarea = holder.ownerDocument.createElement('textarea'); + textarea.style.cssText = 'position:absolute;resize:none;width:100%;height:100%;border:0;padding:0;margin:0;overflow-y:auto;'; + // todo: IE下只有onresize属性可用... 很纠结 + if (browser.ie && browser.version < 8) { + textarea.style.width = holder.offsetWidth + 'px'; + textarea.style.height = holder.offsetHeight + 'px'; + holder.onresize = function (){ + textarea.style.width = holder.offsetWidth + 'px'; + textarea.style.height = holder.offsetHeight + 'px'; + }; + } + holder.appendChild(textarea); + return { + setContent: function (content){ + textarea.value = content; + }, + getContent: function (){ + return textarea.value; + }, + select: function (){ + var range; + if (browser.ie) { + range = textarea.createTextRange(); + range.collapse(true); + range.select(); + } else { + //todo: chrome下无法设置焦点 + textarea.setSelectionRange(0, 0); + textarea.focus(); + } + }, + dispose: function (){ + holder.removeChild(textarea); + // todo + holder.onresize = null; + textarea = null; + holder = null; + } + }; + }, + codemirror: function (editor, holder){ + + var codeEditor = window.CodeMirror(holder, { + mode: "text/html", + tabMode: "indent", + lineNumbers: true, + lineWrapping:true + }); + var dom = codeEditor.getWrapperElement(); + dom.style.cssText = 'position:absolute;left:0;top:0;width:100%;height:100%;font-family:consolas,"Courier new",monospace;font-size:13px;'; + codeEditor.getScrollerElement().style.cssText = 'position:absolute;left:0;top:0;width:100%;height:100%;'; + codeEditor.refresh(); + return { + getCodeMirror:function(){ + return codeEditor; + }, + setContent: function (content){ + codeEditor.setValue(content); + }, + getContent: function (){ + return codeEditor.getValue(); + }, + select: function (){ + codeEditor.focus(); + }, + dispose: function (){ + holder.removeChild(dom); + dom = null; + codeEditor = null; + } + }; + } + }; + + UE.plugins['source'] = function (){ + var me = this; + var opt = this.options; + var sourceMode = false; + var sourceEditor; + var orgSetContent; + opt.sourceEditor = browser.ie ? 'textarea' : (opt.sourceEditor || 'codemirror'); + + me.setOpt({ + sourceEditorFirst:false + }); + function createSourceEditor(holder){ + return sourceEditors[opt.sourceEditor == 'codemirror' && window.CodeMirror ? 'codemirror' : 'textarea'](me, holder); + } + + var bakCssText; + //解决在源码模式下getContent不能得到最新的内容问题 + var oldGetContent, + bakAddress; + + /** + * 切换源码模式和编辑模式 + * @command source + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'source'); + * ``` + */ + + /** + * 查询当前编辑区域的状态是源码模式还是可视化模式 + * @command source + * @method queryCommandState + * @param { String } cmd 命令字符串 + * @return { int } 如果当前是源码编辑模式,返回1,否则返回0 + * @example + * ```javascript + * editor.queryCommandState( 'source' ); + * ``` + */ + + me.commands['source'] = { + execCommand: function (){ + + sourceMode = !sourceMode; + if (sourceMode) { + bakAddress = me.selection.getRange().createAddress(false,true); + me.undoManger && me.undoManger.save(true); + if(browser.gecko){ + me.body.contentEditable = false; + } + + bakCssText = me.iframe.style.cssText; + me.iframe.style.cssText += 'position:absolute;left:-32768px;top:-32768px;'; + + + me.fireEvent('beforegetcontent'); + var root = UE.htmlparser(me.body.innerHTML); + me.filterOutputRule(root); + root.traversal(function (node) { + if (node.type == 'element') { + switch (node.tagName) { + case 'td': + case 'th': + case 'caption': + if(node.children && node.children.length == 1){ + if(node.firstChild().tagName == 'br' ){ + node.removeChild(node.firstChild()) + } + }; + break; + case 'pre': + node.innerText(node.innerText().replace(/ /g,' ')) + + } + } + }); + + me.fireEvent('aftergetcontent'); + + var content = root.toHtml(true); + + sourceEditor = createSourceEditor(me.iframe.parentNode); + + sourceEditor.setContent(content); + + orgSetContent = me.setContent; + + me.setContent = function(html){ + //这里暂时不触发事件,防止报错 + var root = UE.htmlparser(html); + me.filterInputRule(root); + html = root.toHtml(); + sourceEditor.setContent(html); + }; + + setTimeout(function (){ + sourceEditor.select(); + me.addListener('fullscreenchanged', function(){ + try{ + sourceEditor.getCodeMirror().refresh() + }catch(e){} + }); + }); + + //重置getContent,源码模式下取值也能是最新的数据 + oldGetContent = me.getContent; + me.getContent = function (){ + return sourceEditor.getContent() || '

    ' + (browser.ie ? '' : '
    ')+'

    '; + }; + } else { + me.iframe.style.cssText = bakCssText; + var cont = sourceEditor.getContent() || '

    ' + (browser.ie ? '' : '
    ')+'

    '; + //处理掉block节点前后的空格,有可能会误命中,暂时不考虑 + cont = cont.replace(new RegExp('[\\r\\t\\n ]*<\/?(\\w+)\\s*(?:[^>]*)>','g'), function(a,b){ + if(b && !dtd.$inlineWithA[b.toLowerCase()]){ + return a.replace(/(^[\n\r\t ]*)|([\n\r\t ]*$)/g,''); + } + return a.replace(/(^[\n\r\t]*)|([\n\r\t]*$)/g,'') + }); + + me.setContent = orgSetContent; + + me.setContent(cont); + sourceEditor.dispose(); + sourceEditor = null; + //还原getContent方法 + me.getContent = oldGetContent; + var first = me.body.firstChild; + //trace:1106 都删除空了,下边会报错,所以补充一个p占位 + if(!first){ + me.body.innerHTML = '

    '+(browser.ie?'':'
    ')+'

    '; + first = me.body.firstChild; + } + + + //要在ifm为显示时ff才能取到selection,否则报错 + //这里不能比较位置了 + me.undoManger && me.undoManger.save(true); + + if(browser.gecko){ + + var input = document.createElement('input'); + input.style.cssText = 'position:absolute;left:0;top:-32768px'; + + document.body.appendChild(input); + + me.body.contentEditable = false; + setTimeout(function(){ + domUtils.setViewportOffset(input, { left: -32768, top: 0 }); + input.focus(); + setTimeout(function(){ + me.body.contentEditable = true; + me.selection.getRange().moveToAddress(bakAddress).select(true); + domUtils.remove(input); + }); + + }); + }else{ + //ie下有可能报错,比如在代码顶头的情况 + try{ + me.selection.getRange().moveToAddress(bakAddress).select(true); + }catch(e){} + + } + } + this.fireEvent('sourcemodechanged', sourceMode); + }, + queryCommandState: function (){ + return sourceMode|0; + }, + notNeedUndo : 1 + }; + var oldQueryCommandState = me.queryCommandState; + + me.queryCommandState = function (cmdName){ + cmdName = cmdName.toLowerCase(); + if (sourceMode) { + //源码模式下可以开启的命令 + return cmdName in { + 'source' : 1, + 'fullscreen' : 1 + } ? 1 : -1 + } + return oldQueryCommandState.apply(this, arguments); + }; + + if(opt.sourceEditor == "codemirror"){ + + me.addListener("ready",function(){ + utils.loadFile(document,{ + src : opt.codeMirrorJsUrl || opt.UEDITOR_HOME_URL + "third-party/codemirror/codemirror.js", + tag : "script", + type : "text/javascript", + defer : "defer" + },function(){ + if(opt.sourceEditorFirst){ + setTimeout(function(){ + me.execCommand("source"); + },0); + } + }); + utils.loadFile(document,{ + tag : "link", + rel : "stylesheet", + type : "text/css", + href : opt.codeMirrorCssUrl || opt.UEDITOR_HOME_URL + "third-party/codemirror/codemirror.css" + }); + + }); + } + + }; + +})(); + +// plugins/enterkey.js +///import core +///import plugins/undo.js +///commands 设置回车标签p或br +///commandsName EnterKey +///commandsTitle 设置回车标签p或br +/** + * @description 处理回车 + * @author zhanyi + */ +UE.plugins['enterkey'] = function() { + var hTag, + me = this, + tag = me.options.enterTag; + me.addListener('keyup', function(type, evt) { + + var keyCode = evt.keyCode || evt.which; + if (keyCode == 13) { + var range = me.selection.getRange(), + start = range.startContainer, + doSave; + + //修正在h1-h6里边回车后不能嵌套p的问题 + if (!browser.ie) { + + if (/h\d/i.test(hTag)) { + if (browser.gecko) { + var h = domUtils.findParentByTagName(start, [ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6','blockquote','caption','table'], true); + if (!h) { + me.document.execCommand('formatBlock', false, '

    '); + doSave = 1; + } + } else { + //chrome remove div + if (start.nodeType == 1) { + var tmp = me.document.createTextNode(''),div; + range.insertNode(tmp); + div = domUtils.findParentByTagName(tmp, 'div', true); + if (div) { + var p = me.document.createElement('p'); + while (div.firstChild) { + p.appendChild(div.firstChild); + } + div.parentNode.insertBefore(p, div); + domUtils.remove(div); + range.setStartBefore(tmp).setCursor(); + doSave = 1; + } + domUtils.remove(tmp); + + } + } + + if (me.undoManger && doSave) { + me.undoManger.save(); + } + } + //没有站位符,会出现多行的问题 + browser.opera && range.select(); + }else{ + me.fireEvent('saveScene',true,true) + } + } + }); + + me.addListener('keydown', function(type, evt) { + var keyCode = evt.keyCode || evt.which; + if (keyCode == 13) {//回车 + if(me.fireEvent('beforeenterkeydown')){ + domUtils.preventDefault(evt); + return; + } + me.fireEvent('saveScene',true,true); + hTag = ''; + + + var range = me.selection.getRange(); + + if (!range.collapsed) { + //跨td不能删 + var start = range.startContainer, + end = range.endContainer, + startTd = domUtils.findParentByTagName(start, 'td', true), + endTd = domUtils.findParentByTagName(end, 'td', true); + if (startTd && endTd && startTd !== endTd || !startTd && endTd || startTd && !endTd) { + evt.preventDefault ? evt.preventDefault() : ( evt.returnValue = false); + return; + } + } + if (tag == 'p') { + + + if (!browser.ie) { + + start = domUtils.findParentByTagName(range.startContainer, ['ol','ul','p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6','blockquote','caption'], true); + + //opera下执行formatblock会在table的场景下有问题,回车在opera原生支持很好,所以暂时在opera去掉调用这个原生的command + //trace:2431 + if (!start && !browser.opera) { + + me.document.execCommand('formatBlock', false, '

    '); + + if (browser.gecko) { + range = me.selection.getRange(); + start = domUtils.findParentByTagName(range.startContainer, 'p', true); + start && domUtils.removeDirtyAttr(start); + } + + + } else { + hTag = start.tagName; + start.tagName.toLowerCase() == 'p' && browser.gecko && domUtils.removeDirtyAttr(start); + } + + } + + } else { + evt.preventDefault ? evt.preventDefault() : ( evt.returnValue = false); + + if (!range.collapsed) { + range.deleteContents(); + start = range.startContainer; + if (start.nodeType == 1 && (start = start.childNodes[range.startOffset])) { + while (start.nodeType == 1) { + if (dtd.$empty[start.tagName]) { + range.setStartBefore(start).setCursor(); + if (me.undoManger) { + me.undoManger.save(); + } + return false; + } + if (!start.firstChild) { + var br = range.document.createElement('br'); + start.appendChild(br); + range.setStart(start, 0).setCursor(); + if (me.undoManger) { + me.undoManger.save(); + } + return false; + } + start = start.firstChild; + } + if (start === range.startContainer.childNodes[range.startOffset]) { + br = range.document.createElement('br'); + range.insertNode(br).setCursor(); + + } else { + range.setStart(start, 0).setCursor(); + } + + + } else { + br = range.document.createElement('br'); + range.insertNode(br).setStartAfter(br).setCursor(); + } + + + } else { + br = range.document.createElement('br'); + range.insertNode(br); + var parent = br.parentNode; + if (parent.lastChild === br) { + br.parentNode.insertBefore(br.cloneNode(true), br); + range.setStartBefore(br); + } else { + range.setStartAfter(br); + } + range.setCursor(); + + } + + } + + } + }); +}; + + +// plugins/keystrokes.js +/* 处理特殊键的兼容性问题 */ +UE.plugins['keystrokes'] = function() { + var me = this; + var collapsed = true; + me.addListener('keydown', function(type, evt) { + var keyCode = evt.keyCode || evt.which, + rng = me.selection.getRange(); + + //处理全选的情况 + if(!rng.collapsed && !(evt.ctrlKey || evt.shiftKey || evt.altKey || evt.metaKey) && (keyCode >= 65 && keyCode <=90 + || keyCode >= 48 && keyCode <= 57 || + keyCode >= 96 && keyCode <= 111 || { + 13:1, + 8:1, + 46:1 + }[keyCode]) + ){ + + var tmpNode = rng.startContainer; + if(domUtils.isFillChar(tmpNode)){ + rng.setStartBefore(tmpNode) + } + tmpNode = rng.endContainer; + if(domUtils.isFillChar(tmpNode)){ + rng.setEndAfter(tmpNode) + } + rng.txtToElmBoundary(); + //结束边界可能放到了br的前边,要把br包含进来 + // x[xxx]
    + if(rng.endContainer && rng.endContainer.nodeType == 1){ + tmpNode = rng.endContainer.childNodes[rng.endOffset]; + if(tmpNode && domUtils.isBr(tmpNode)){ + rng.setEndAfter(tmpNode); + } + } + if(rng.startOffset == 0){ + tmpNode = rng.startContainer; + if(domUtils.isBoundaryNode(tmpNode,'firstChild') ){ + tmpNode = rng.endContainer; + if(rng.endOffset == (tmpNode.nodeType == 3 ? tmpNode.nodeValue.length : tmpNode.childNodes.length) && domUtils.isBoundaryNode(tmpNode,'lastChild')){ + me.fireEvent('saveScene'); + me.body.innerHTML = '

    '+(browser.ie ? '' : '
    ')+'

    '; + rng.setStart(me.body.firstChild,0).setCursor(false,true); + me._selectionChange(); + return; + } + } + } + } + + //处理backspace + if (keyCode == keymap.Backspace) { + rng = me.selection.getRange(); + collapsed = rng.collapsed; + if(me.fireEvent('delkeydown',evt)){ + return; + } + var start,end; + //避免按两次删除才能生效的问题 + if(rng.collapsed && rng.inFillChar()){ + start = rng.startContainer; + + if(domUtils.isFillChar(start)){ + rng.setStartBefore(start).shrinkBoundary(true).collapse(true); + domUtils.remove(start) + }else{ + start.nodeValue = start.nodeValue.replace(new RegExp('^' + domUtils.fillChar ),''); + rng.startOffset--; + rng.collapse(true).select(true) + } + } + + //解决选中control元素不能删除的问题 + if (start = rng.getClosedNode()) { + me.fireEvent('saveScene'); + rng.setStartBefore(start); + domUtils.remove(start); + rng.setCursor(); + me.fireEvent('saveScene'); + domUtils.preventDefault(evt); + return; + } + //阻止在table上的删除 + if (!browser.ie) { + start = domUtils.findParentByTagName(rng.startContainer, 'table', true); + end = domUtils.findParentByTagName(rng.endContainer, 'table', true); + if (start && !end || !start && end || start !== end) { + evt.preventDefault(); + return; + } + } + + } + //处理tab键的逻辑 + if (keyCode == keymap.Tab) { + //不处理以下标签 + var excludeTagNameForTabKey = { + 'ol' : 1, + 'ul' : 1, + 'table':1 + }; + //处理组件里的tab按下事件 + if(me.fireEvent('tabkeydown',evt)){ + domUtils.preventDefault(evt); + return; + } + var range = me.selection.getRange(); + me.fireEvent('saveScene'); + for (var i = 0,txt = '',tabSize = me.options.tabSize|| 4,tabNode = me.options.tabNode || ' '; i < tabSize; i++) { + txt += tabNode; + } + var span = me.document.createElement('span'); + span.innerHTML = txt + domUtils.fillChar; + if (range.collapsed) { + range.insertNode(span.cloneNode(true).firstChild).setCursor(true); + } else { + var filterFn = function(node) { + return domUtils.isBlockElm(node) && !excludeTagNameForTabKey[node.tagName.toLowerCase()] + + }; + //普通的情况 + start = domUtils.findParent(range.startContainer, filterFn,true); + end = domUtils.findParent(range.endContainer, filterFn,true); + if (start && end && start === end) { + range.deleteContents(); + range.insertNode(span.cloneNode(true).firstChild).setCursor(true); + } else { + var bookmark = range.createBookmark(); + range.enlarge(true); + var bookmark2 = range.createBookmark(), + current = domUtils.getNextDomNode(bookmark2.start, false, filterFn); + while (current && !(domUtils.getPosition(current, bookmark2.end) & domUtils.POSITION_FOLLOWING)) { + current.insertBefore(span.cloneNode(true).firstChild, current.firstChild); + current = domUtils.getNextDomNode(current, false, filterFn); + } + range.moveToBookmark(bookmark2).moveToBookmark(bookmark).select(); + } + } + domUtils.preventDefault(evt) + } + //trace:1634 + //ff的del键在容器空的时候,也会删除 + if(browser.gecko && keyCode == 46){ + range = me.selection.getRange(); + if(range.collapsed){ + start = range.startContainer; + if(domUtils.isEmptyBlock(start)){ + var parent = start.parentNode; + while(domUtils.getChildCount(parent) == 1 && !domUtils.isBody(parent)){ + start = parent; + parent = parent.parentNode; + } + if(start === parent.lastChild) + evt.preventDefault(); + return; + } + } + } + }); + me.addListener('keyup', function(type, evt) { + var keyCode = evt.keyCode || evt.which, + rng,me = this; + if(keyCode == keymap.Backspace){ + if(me.fireEvent('delkeyup')){ + return; + } + rng = me.selection.getRange(); + if(rng.collapsed){ + var tmpNode, + autoClearTagName = ['h1','h2','h3','h4','h5','h6']; + if(tmpNode = domUtils.findParentByTagName(rng.startContainer,autoClearTagName,true)){ + if(domUtils.isEmptyBlock(tmpNode)){ + var pre = tmpNode.previousSibling; + if(pre && pre.nodeName != 'TABLE'){ + domUtils.remove(tmpNode); + rng.setStartAtLast(pre).setCursor(false,true); + return; + }else{ + var next = tmpNode.nextSibling; + if(next && next.nodeName != 'TABLE'){ + domUtils.remove(tmpNode); + rng.setStartAtFirst(next).setCursor(false,true); + return; + } + } + } + } + //处理当删除到body时,要重新给p标签展位 + if(domUtils.isBody(rng.startContainer)){ + var tmpNode = domUtils.createElement(me.document,'p',{ + 'innerHTML' : browser.ie ? domUtils.fillChar : '
    ' + }); + rng.insertNode(tmpNode).setStart(tmpNode,0).setCursor(false,true); + } + } + + + //chrome下如果删除了inline标签,浏览器会有记忆,在输入文字还是会套上刚才删除的标签,所以这里再选一次就不会了 + if( !collapsed && (rng.startContainer.nodeType == 3 || rng.startContainer.nodeType == 1 && domUtils.isEmptyBlock(rng.startContainer))){ + if(browser.ie){ + var span = rng.document.createElement('span'); + rng.insertNode(span).setStartBefore(span).collapse(true); + rng.select(); + domUtils.remove(span) + }else{ + rng.select() + } + + } + } + + + }) +}; + +// plugins/fiximgclick.js +///import core +///commands 修复chrome下图片不能点击的问题,出现八个角可改变大小 +///commandsName FixImgClick +///commandsTitle 修复chrome下图片不能点击的问题,出现八个角可改变大小 +//修复chrome下图片不能点击的问题,出现八个角可改变大小 + +UE.plugins['fiximgclick'] = (function () { + + var elementUpdated = false; + function Scale() { + this.editor = null; + this.resizer = null; + this.cover = null; + this.doc = document; + this.prePos = {x: 0, y: 0}; + this.startPos = {x: 0, y: 0}; + } + + (function () { + var rect = [ + //[left, top, width, height] + [0, 0, -1, -1], + [0, 0, 0, -1], + [0, 0, 1, -1], + [0, 0, -1, 0], + [0, 0, 1, 0], + [0, 0, -1, 1], + [0, 0, 0, 1], + [0, 0, 1, 1] + ]; + + Scale.prototype = { + init: function (editor) { + var me = this; + me.editor = editor; + me.startPos = this.prePos = {x: 0, y: 0}; + me.dragId = -1; + + var hands = [], + cover = me.cover = document.createElement('div'), + resizer = me.resizer = document.createElement('div'); + + cover.id = me.editor.ui.id + '_imagescale_cover'; + cover.style.cssText = 'position:absolute;display:none;z-index:' + (me.editor.options.zIndex) + ';filter:alpha(opacity=0); opacity:0;background:#CCC;'; + domUtils.on(cover, 'mousedown click', function () { + me.hide(); + }); + + for (i = 0; i < 8; i++) { + hands.push(''); + } + resizer.id = me.editor.ui.id + '_imagescale'; + resizer.className = 'edui-editor-imagescale'; + resizer.innerHTML = hands.join(''); + resizer.style.cssText += ';display:none;border:1px solid #3b77ff;z-index:' + (me.editor.options.zIndex) + ';'; + + me.editor.ui.getDom().appendChild(cover); + me.editor.ui.getDom().appendChild(resizer); + + me.initStyle(); + me.initEvents(); + }, + initStyle: function () { + utils.cssRule('imagescale', '.edui-editor-imagescale{display:none;position:absolute;border:1px solid #38B2CE;cursor:hand;-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}' + + '.edui-editor-imagescale span{position:absolute;width:6px;height:6px;overflow:hidden;font-size:0px;display:block;background-color:#3C9DD0;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand0{cursor:nw-resize;top:0;margin-top:-4px;left:0;margin-left:-4px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand1{cursor:n-resize;top:0;margin-top:-4px;left:50%;margin-left:-4px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand2{cursor:ne-resize;top:0;margin-top:-4px;left:100%;margin-left:-3px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand3{cursor:w-resize;top:50%;margin-top:-4px;left:0;margin-left:-4px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand4{cursor:e-resize;top:50%;margin-top:-4px;left:100%;margin-left:-3px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand5{cursor:sw-resize;top:100%;margin-top:-3px;left:0;margin-left:-4px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand6{cursor:s-resize;top:100%;margin-top:-3px;left:50%;margin-left:-4px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand7{cursor:se-resize;top:100%;margin-top:-3px;left:100%;margin-left:-3px;}'); + }, + initEvents: function () { + var me = this; + + me.startPos.x = me.startPos.y = 0; + me.isDraging = false; + }, + _eventHandler: function (e) { + var me = this; + switch (e.type) { + case 'mousedown': + var hand = e.target || e.srcElement, hand; + if (hand.className.indexOf('edui-editor-imagescale-hand') != -1 && me.dragId == -1) { + me.dragId = hand.className.slice(-1); + me.startPos.x = me.prePos.x = e.clientX; + me.startPos.y = me.prePos.y = e.clientY; + domUtils.on(me.doc,'mousemove', me.proxy(me._eventHandler, me)); + } + break; + case 'mousemove': + if (me.dragId != -1) { + me.updateContainerStyle(me.dragId, {x: e.clientX - me.prePos.x, y: e.clientY - me.prePos.y}); + me.prePos.x = e.clientX; + me.prePos.y = e.clientY; + elementUpdated = true; + me.updateTargetElement(); + + } + break; + case 'mouseup': + if (me.dragId != -1) { + me.updateContainerStyle(me.dragId, {x: e.clientX - me.prePos.x, y: e.clientY - me.prePos.y}); + me.updateTargetElement(); + if (me.target.parentNode) me.attachTo(me.target); + me.dragId = -1; + } + domUtils.un(me.doc,'mousemove', me.proxy(me._eventHandler, me)); + //修复只是点击挪动点,但没有改变大小,不应该触发contentchange + if(elementUpdated){ + elementUpdated = false; + me.editor.fireEvent('contentchange'); + } + + break; + default: + break; + } + }, + updateTargetElement: function () { + var me = this; + domUtils.setStyles(me.target, { + 'width': me.resizer.style.width, + 'height': me.resizer.style.height + }); + me.target.width = parseInt(me.resizer.style.width); + me.target.height = parseInt(me.resizer.style.height); + me.attachTo(me.target); + }, + updateContainerStyle: function (dir, offset) { + var me = this, + dom = me.resizer, tmp; + + if (rect[dir][0] != 0) { + tmp = parseInt(dom.style.left) + offset.x; + dom.style.left = me._validScaledProp('left', tmp) + 'px'; + } + if (rect[dir][1] != 0) { + tmp = parseInt(dom.style.top) + offset.y; + dom.style.top = me._validScaledProp('top', tmp) + 'px'; + } + if (rect[dir][2] != 0) { + tmp = dom.clientWidth + rect[dir][2] * offset.x; + dom.style.width = me._validScaledProp('width', tmp) + 'px'; + } + if (rect[dir][3] != 0) { + tmp = dom.clientHeight + rect[dir][3] * offset.y; + dom.style.height = me._validScaledProp('height', tmp) + 'px'; + } + }, + _validScaledProp: function (prop, value) { + var ele = this.resizer, + wrap = document; + + value = isNaN(value) ? 0 : value; + switch (prop) { + case 'left': + return value < 0 ? 0 : (value + ele.clientWidth) > wrap.clientWidth ? wrap.clientWidth - ele.clientWidth : value; + case 'top': + return value < 0 ? 0 : (value + ele.clientHeight) > wrap.clientHeight ? wrap.clientHeight - ele.clientHeight : value; + case 'width': + return value <= 0 ? 1 : (value + ele.offsetLeft) > wrap.clientWidth ? wrap.clientWidth - ele.offsetLeft : value; + case 'height': + return value <= 0 ? 1 : (value + ele.offsetTop) > wrap.clientHeight ? wrap.clientHeight - ele.offsetTop : value; + } + }, + hideCover: function () { + this.cover.style.display = 'none'; + }, + showCover: function () { + var me = this, + editorPos = domUtils.getXY(me.editor.ui.getDom()), + iframePos = domUtils.getXY(me.editor.iframe); + + domUtils.setStyles(me.cover, { + 'width': me.editor.iframe.offsetWidth + 'px', + 'height': me.editor.iframe.offsetHeight + 'px', + 'top': iframePos.y - editorPos.y + 'px', + 'left': iframePos.x - editorPos.x + 'px', + 'position': 'absolute', + 'display': '' + }) + }, + show: function (targetObj) { + var me = this; + me.resizer.style.display = 'block'; + if(targetObj) me.attachTo(targetObj); + + domUtils.on(this.resizer, 'mousedown', me.proxy(me._eventHandler, me)); + domUtils.on(me.doc, 'mouseup', me.proxy(me._eventHandler, me)); + + me.showCover(); + me.editor.fireEvent('afterscaleshow', me); + me.editor.fireEvent('saveScene'); + }, + hide: function () { + var me = this; + me.hideCover(); + me.resizer.style.display = 'none'; + + domUtils.un(me.resizer, 'mousedown', me.proxy(me._eventHandler, me)); + domUtils.un(me.doc, 'mouseup', me.proxy(me._eventHandler, me)); + me.editor.fireEvent('afterscalehide', me); + }, + proxy: function( fn, context ) { + return function(e) { + return fn.apply( context || this, arguments); + }; + }, + attachTo: function (targetObj) { + var me = this, + target = me.target = targetObj, + resizer = this.resizer, + imgPos = domUtils.getXY(target), + iframePos = domUtils.getXY(me.editor.iframe), + editorPos = domUtils.getXY(resizer.parentNode); + + domUtils.setStyles(resizer, { + 'width': target.width + 'px', + 'height': target.height + 'px', + 'left': iframePos.x + imgPos.x - me.editor.document.body.scrollLeft - editorPos.x - parseInt(resizer.style.borderLeftWidth) + 'px', + 'top': iframePos.y + imgPos.y - me.editor.document.body.scrollTop - editorPos.y - parseInt(resizer.style.borderTopWidth) + 'px' + }); + } + } + })(); + + return function () { + var me = this, + imageScale; + + me.setOpt('imageScaleEnabled', true); + + if ( !browser.ie && me.options.imageScaleEnabled) { + me.addListener('click', function (type, e) { + + var range = me.selection.getRange(), + img = range.getClosedNode(); + + if (img && img.tagName == 'IMG' && me.body.contentEditable!="false") { + + if (img.className.indexOf("edui-faked-music") != -1 || + img.getAttribute("anchorname") || + domUtils.hasClass(img, 'loadingclass') || + domUtils.hasClass(img, 'loaderrorclass')) { return } + + if (!imageScale) { + imageScale = new Scale(); + imageScale.init(me); + me.ui.getDom().appendChild(imageScale.resizer); + + var _keyDownHandler = function (e) { + imageScale.hide(); + if(imageScale.target) me.selection.getRange().selectNode(imageScale.target).select(); + }, _mouseDownHandler = function (e) { + var ele = e.target || e.srcElement; + if (ele && (ele.className===undefined || ele.className.indexOf('edui-editor-imagescale') == -1)) { + _keyDownHandler(e); + } + }, timer; + + me.addListener('afterscaleshow', function (e) { + me.addListener('beforekeydown', _keyDownHandler); + me.addListener('beforemousedown', _mouseDownHandler); + domUtils.on(document, 'keydown', _keyDownHandler); + domUtils.on(document,'mousedown', _mouseDownHandler); + me.selection.getNative().removeAllRanges(); + }); + me.addListener('afterscalehide', function (e) { + me.removeListener('beforekeydown', _keyDownHandler); + me.removeListener('beforemousedown', _mouseDownHandler); + domUtils.un(document, 'keydown', _keyDownHandler); + domUtils.un(document,'mousedown', _mouseDownHandler); + var target = imageScale.target; + if (target.parentNode) { + me.selection.getRange().selectNode(target).select(); + } + }); + //TODO 有iframe的情况,mousedown不能往下传。。 + domUtils.on(imageScale.resizer, 'mousedown', function (e) { + me.selection.getNative().removeAllRanges(); + var ele = e.target || e.srcElement; + if (ele && ele.className.indexOf('edui-editor-imagescale-hand') == -1) { + timer = setTimeout(function () { + imageScale.hide(); + if(imageScale.target) me.selection.getRange().selectNode(ele).select(); + }, 200); + } + }); + domUtils.on(imageScale.resizer, 'mouseup', function (e) { + var ele = e.target || e.srcElement; + if (ele && ele.className.indexOf('edui-editor-imagescale-hand') == -1) { + clearTimeout(timer); + } + }); + } + imageScale.show(img); + } else { + if (imageScale && imageScale.resizer.style.display != 'none') imageScale.hide(); + } + }); + } + + if (browser.webkit) { + me.addListener('click', function (type, e) { + if (e.target.tagName == 'IMG' && me.body.contentEditable!="false") { + var range = new dom.Range(me.document); + range.selectNode(e.target).select(); + } + }); + } + } +})(); + +// plugins/autolink.js +///import core +///commands 为非ie浏览器自动添加a标签 +///commandsName AutoLink +///commandsTitle 自动增加链接 +/** + * @description 为非ie浏览器自动添加a标签 + * @author zhanyi + */ + +UE.plugin.register('autolink',function(){ + var cont = 0; + + return !browser.ie ? { + + bindEvents:{ + 'reset' : function(){ + cont = 0; + }, + 'keydown':function(type, evt) { + var me = this; + var keyCode = evt.keyCode || evt.which; + + if (keyCode == 32 || keyCode == 13) { + + var sel = me.selection.getNative(), + range = sel.getRangeAt(0).cloneRange(), + offset, + charCode; + + var start = range.startContainer; + while (start.nodeType == 1 && range.startOffset > 0) { + start = range.startContainer.childNodes[range.startOffset - 1]; + if (!start){ + break; + } + range.setStart(start, start.nodeType == 1 ? start.childNodes.length : start.nodeValue.length); + range.collapse(true); + start = range.startContainer; + } + + do{ + if (range.startOffset == 0) { + start = range.startContainer.previousSibling; + + while (start && start.nodeType == 1) { + start = start.lastChild; + } + if (!start || domUtils.isFillChar(start)){ + break; + } + offset = start.nodeValue.length; + } else { + start = range.startContainer; + offset = range.startOffset; + } + range.setStart(start, offset - 1); + charCode = range.toString().charCodeAt(0); + } while (charCode != 160 && charCode != 32); + + if (range.toString().replace(new RegExp(domUtils.fillChar, 'g'), '').match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i)) { + while(range.toString().length){ + if(/^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test(range.toString())){ + break; + } + try{ + range.setStart(range.startContainer,range.startOffset+1); + }catch(e){ + //trace:2121 + var start = range.startContainer; + while(!(next = start.nextSibling)){ + if(domUtils.isBody(start)){ + return; + } + start = start.parentNode; + + } + range.setStart(next,0); + + } + + } + //range的开始边界已经在a标签里的不再处理 + if(domUtils.findParentByTagName(range.startContainer,'a',true)){ + return; + } + var a = me.document.createElement('a'),text = me.document.createTextNode(' '),href; + + me.undoManger && me.undoManger.save(); + a.appendChild(range.extractContents()); + a.href = a.innerHTML = a.innerHTML.replace(/<[^>]+>/g,''); + href = a.getAttribute("href").replace(new RegExp(domUtils.fillChar,'g'),''); + href = /^(?:https?:\/\/)/ig.test(href) ? href : "http://"+ href; + a.setAttribute('_src',utils.html(href)); + a.href = utils.html(href); + + range.insertNode(a); + a.parentNode.insertBefore(text, a.nextSibling); + range.setStart(text, 0); + range.collapse(true); + sel.removeAllRanges(); + sel.addRange(range); + me.undoManger && me.undoManger.save(); + } + } + } + } + }:{} + },function(){ + var keyCodes = { + 37:1, 38:1, 39:1, 40:1, + 13:1,32:1 + }; + function checkIsCludeLink(node){ + if(node.nodeType == 3){ + return null + } + if(node.nodeName == 'A'){ + return node; + } + var lastChild = node.lastChild; + + while(lastChild){ + if(lastChild.nodeName == 'A'){ + return lastChild; + } + if(lastChild.nodeType == 3){ + if(domUtils.isWhitespace(lastChild)){ + lastChild = lastChild.previousSibling; + continue; + } + return null + } + lastChild = lastChild.lastChild; + } + } + browser.ie && this.addListener('keyup',function(cmd,evt){ + var me = this,keyCode = evt.keyCode; + if(keyCodes[keyCode]){ + var rng = me.selection.getRange(); + var start = rng.startContainer; + + if(keyCode == 13){ + while(start && !domUtils.isBody(start) && !domUtils.isBlockElm(start)){ + start = start.parentNode; + } + if(start && !domUtils.isBody(start) && start.nodeName == 'P'){ + var pre = start.previousSibling; + if(pre && pre.nodeType == 1){ + var pre = checkIsCludeLink(pre); + if(pre && !pre.getAttribute('_href')){ + domUtils.remove(pre,true); + } + } + } + }else if(keyCode == 32 ){ + if(start.nodeType == 3 && /^\s$/.test(start.nodeValue)){ + start = start.previousSibling; + if(start && start.nodeName == 'A' && !start.getAttribute('_href')){ + domUtils.remove(start,true); + } + } + }else { + start = domUtils.findParentByTagName(start,'a',true); + if(start && !start.getAttribute('_href')){ + var bk = rng.createBookmark(); + + domUtils.remove(start,true); + rng.moveToBookmark(bk).select(true) + } + } + + } + + + }); + } +); + +// plugins/autoheight.js +///import core +///commands 当输入内容超过编辑器高度时,编辑器自动增高 +///commandsName AutoHeight,autoHeightEnabled +///commandsTitle 自动增高 +/** + * @description 自动伸展 + * @author zhanyi + */ +UE.plugins['autoheight'] = function () { + var me = this; + //提供开关,就算加载也可以关闭 + me.autoHeightEnabled = me.options.autoHeightEnabled !== false; + if (!me.autoHeightEnabled) { + return; + } + + var bakOverflow, + lastHeight = 0, + options = me.options, + currentHeight, + timer; + + function adjustHeight() { + var me = this; + clearTimeout(timer); + if(isFullscreen)return; + if (!me.queryCommandState || me.queryCommandState && me.queryCommandState('source') != 1) { + timer = setTimeout(function(){ + + var node = me.body.lastChild; + while(node && node.nodeType != 1){ + node = node.previousSibling; + } + if(node && node.nodeType == 1){ + node.style.clear = 'both'; + currentHeight = Math.max(domUtils.getXY(node).y + node.offsetHeight + 25 ,Math.max(options.minFrameHeight, options.initialFrameHeight)) ; + if (currentHeight != lastHeight) { + if (currentHeight !== parseInt(me.iframe.parentNode.style.height)) { + me.iframe.parentNode.style.height = currentHeight + 'px'; + } + me.body.style.height = currentHeight + 'px'; + lastHeight = currentHeight; + } + domUtils.removeStyle(node,'clear'); + } + + + },50) + } + } + var isFullscreen; + me.addListener('fullscreenchanged',function(cmd,f){ + isFullscreen = f + }); + me.addListener('destroy', function () { + me.removeListener('contentchange afterinserthtml keyup mouseup',adjustHeight) + }); + me.enableAutoHeight = function () { + var me = this; + if (!me.autoHeightEnabled) { + return; + } + var doc = me.document; + me.autoHeightEnabled = true; + bakOverflow = doc.body.style.overflowY; + doc.body.style.overflowY = 'hidden'; + me.addListener('contentchange afterinserthtml keyup mouseup',adjustHeight); + //ff不给事件算得不对 + + setTimeout(function () { + adjustHeight.call(me); + }, browser.gecko ? 100 : 0); + me.fireEvent('autoheightchanged', me.autoHeightEnabled); + }; + me.disableAutoHeight = function () { + + me.body.style.overflowY = bakOverflow || ''; + + me.removeListener('contentchange', adjustHeight); + me.removeListener('keyup', adjustHeight); + me.removeListener('mouseup', adjustHeight); + me.autoHeightEnabled = false; + me.fireEvent('autoheightchanged', me.autoHeightEnabled); + }; + + me.on('setHeight',function(){ + me.disableAutoHeight() + }); + me.addListener('ready', function () { + me.enableAutoHeight(); + //trace:1764 + var timer; + domUtils.on(browser.ie ? me.body : me.document, browser.webkit ? 'dragover' : 'drop', function () { + clearTimeout(timer); + timer = setTimeout(function () { + //trace:3681 + adjustHeight.call(me); + }, 100); + + }); + //修复内容过多时,回到顶部,顶部内容被工具栏遮挡问题 + var lastScrollY; + window.onscroll = function(){ + if(lastScrollY === null){ + lastScrollY = this.scrollY + }else if(this.scrollY == 0 && lastScrollY != 0){ + me.window.scrollTo(0,0); + lastScrollY = null; + } + } + }); + + +}; + + + +// plugins/autofloat.js +///import core +///commands 悬浮工具栏 +///commandsName AutoFloat,autoFloatEnabled +///commandsTitle 悬浮工具栏 +/** + * modified by chengchao01 + * 注意: 引入此功能后,在IE6下会将body的背景图片覆盖掉! + */ +UE.plugins['autofloat'] = function() { + var me = this, + lang = me.getLang(); + me.setOpt({ + topOffset:0 + }); + var optsAutoFloatEnabled = me.options.autoFloatEnabled !== false, + topOffset = me.options.topOffset; + + + //如果不固定toolbar的位置,则直接退出 + if(!optsAutoFloatEnabled){ + return; + } + var uiUtils = UE.ui.uiUtils, + LteIE6 = browser.ie && browser.version <= 6, + quirks = browser.quirks; + + function checkHasUI(){ + if(!UE.ui){ + alert(lang.autofloatMsg); + return 0; + } + return 1; + } + function fixIE6FixedPos(){ + var docStyle = document.body.style; + docStyle.backgroundImage = 'url("about:blank")'; + docStyle.backgroundAttachment = 'fixed'; + } + var bakCssText, + placeHolder = document.createElement('div'), + toolbarBox,orgTop, + getPosition, + flag =true; //ie7模式下需要偏移 + function setFloating(){ + var toobarBoxPos = domUtils.getXY(toolbarBox), + origalFloat = domUtils.getComputedStyle(toolbarBox,'position'), + origalLeft = domUtils.getComputedStyle(toolbarBox,'left'); + toolbarBox.style.width = toolbarBox.offsetWidth + 'px'; + toolbarBox.style.zIndex = me.options.zIndex * 1 + 1; + toolbarBox.parentNode.insertBefore(placeHolder, toolbarBox); + if (LteIE6 || (quirks && browser.ie)) { + if(toolbarBox.style.position != 'absolute'){ + toolbarBox.style.position = 'absolute'; + } + toolbarBox.style.top = (document.body.scrollTop||document.documentElement.scrollTop) - orgTop + topOffset + 'px'; + } else { + if (browser.ie7Compat && flag) { + flag = false; + toolbarBox.style.left = domUtils.getXY(toolbarBox).x - document.documentElement.getBoundingClientRect().left+2 + 'px'; + } + if(toolbarBox.style.position != 'fixed'){ + toolbarBox.style.position = 'fixed'; + toolbarBox.style.top = topOffset +"px"; + ((origalFloat == 'absolute' || origalFloat == 'relative') && parseFloat(origalLeft)) && (toolbarBox.style.left = toobarBoxPos.x + 'px'); + } + } + } + function unsetFloating(){ + flag = true; + if(placeHolder.parentNode){ + placeHolder.parentNode.removeChild(placeHolder); + } + + toolbarBox.style.cssText = bakCssText; + } + + function updateFloating(){ + var rect3 = getPosition(me.container); + var offset=me.options.toolbarTopOffset||0; + if (rect3.top < 0 && rect3.bottom - toolbarBox.offsetHeight > offset) { + setFloating(); + }else{ + unsetFloating(); + } + } + var defer_updateFloating = utils.defer(function(){ + updateFloating(); + },browser.ie ? 200 : 100,true); + + me.addListener('destroy',function(){ + domUtils.un(window, ['scroll','resize'], updateFloating); + me.removeListener('keydown', defer_updateFloating); + }); + + me.addListener('ready', function(){ + if(checkHasUI(me)){ + //加载了ui组件,但在new时,没有加载ui,导致编辑器实例上没有ui类,所以这里做判断 + if(!me.ui){ + return; + } + getPosition = uiUtils.getClientRect; + toolbarBox = me.ui.getDom('toolbarbox'); + orgTop = getPosition(toolbarBox).top; + bakCssText = toolbarBox.style.cssText; + placeHolder.style.height = toolbarBox.offsetHeight + 'px'; + if(LteIE6){ + fixIE6FixedPos(); + } + domUtils.on(window, ['scroll','resize'], updateFloating); + me.addListener('keydown', defer_updateFloating); + + me.addListener('beforefullscreenchange', function (t, enabled){ + if (enabled) { + unsetFloating(); + } + }); + me.addListener('fullscreenchanged', function (t, enabled){ + if (!enabled) { + updateFloating(); + } + }); + me.addListener('sourcemodechanged', function (t, enabled){ + setTimeout(function (){ + updateFloating(); + },0); + }); + me.addListener("clearDoc",function(){ + setTimeout(function(){ + updateFloating(); + },0); + + }) + } + }); +}; + + +// plugins/video.js +/** + * video插件, 为UEditor提供视频插入支持 + * @file + * @since 1.2.6.1 + */ + +UE.plugins['video'] = function (){ + var me =this; + + /** + * 创建插入视频字符窜 + * @param url 视频地址 + * @param width 视频宽度 + * @param height 视频高度 + * @param align 视频对齐 + * @param toEmbed 是否以flash代替显示 + * @param addParagraph 是否需要添加P 标签 + */ + function creatInsertStr(url,width,height,id,align,classname,type){ + + url = utils.unhtmlForUrl(url); + align = utils.unhtml(align); + classname = utils.unhtml(classname); + + width = parseInt(width, 10) || 0; + height = parseInt(height, 10) || 0; + + var str; + switch (type){ + case 'image': + str = '' + break; + case 'embed': + str = ''; + break; + case 'video': + var ext = url.substr(url.lastIndexOf('.') + 1); + if(ext == 'ogv') ext = 'ogg'; + str = '' + + ''; + break; + } + return str; + } + + function switchImgAndVideo(root,img2video){ + utils.each(root.getNodesByTagName(img2video ? 'img' : 'embed video'),function(node){ + var className = node.getAttr('class'); + if(className && className.indexOf('edui-faked-video') != -1){ + var html = creatInsertStr( img2video ? node.getAttr('_url') : node.getAttr('src'),node.getAttr('width'),node.getAttr('height'),null,node.getStyle('float') || '',className,img2video ? 'embed':'image'); + node.parentNode.replaceChild(UE.uNode.createElement(html),node); + } + if(className && className.indexOf('edui-upload-video') != -1){ + var html = creatInsertStr( img2video ? node.getAttr('_url') : node.getAttr('src'),node.getAttr('width'),node.getAttr('height'),null,node.getStyle('float') || '',className,img2video ? 'video':'image'); + node.parentNode.replaceChild(UE.uNode.createElement(html),node); + } + }) + } + + me.addOutputRule(function(root){ + switchImgAndVideo(root,true) + }); + me.addInputRule(function(root){ + switchImgAndVideo(root) + }); + + /** + * 插入视频 + * @command insertvideo + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } videoAttr 键值对对象, 描述一个视频的所有属性 + * @example + * ```javascript + * + * var videoAttr = { + * //视频地址 + * url: 'http://www.youku.com/xxx', + * //视频宽高值, 单位px + * width: 200, + * height: 100 + * }; + * + * //editor 是编辑器实例 + * //向编辑器插入单个视频 + * editor.execCommand( 'insertvideo', videoAttr ); + * ``` + */ + + /** + * 插入视频 + * @command insertvideo + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Array } videoArr 需要插入的视频的数组, 其中的每一个元素都是一个键值对对象, 描述了一个视频的所有属性 + * @example + * ```javascript + * + * var videoAttr1 = { + * //视频地址 + * url: 'http://www.youku.com/xxx', + * //视频宽高值, 单位px + * width: 200, + * height: 100 + * }, + * videoAttr2 = { + * //视频地址 + * url: 'http://www.youku.com/xxx', + * //视频宽高值, 单位px + * width: 200, + * height: 100 + * } + * + * //editor 是编辑器实例 + * //该方法将会向编辑器内插入两个视频 + * editor.execCommand( 'insertvideo', [ videoAttr1, videoAttr2 ] ); + * ``` + */ + + /** + * 查询当前光标所在处是否是一个视频 + * @command insertvideo + * @method queryCommandState + * @param { String } cmd 需要查询的命令字符串 + * @return { int } 如果当前光标所在处的元素是一个视频对象, 则返回1,否则返回0 + * @example + * ```javascript + * + * //editor 是编辑器实例 + * editor.queryCommandState( 'insertvideo' ); + * ``` + */ + me.commands["insertvideo"] = { + execCommand: function (cmd, videoObjs, type){ + videoObjs = utils.isArray(videoObjs)?videoObjs:[videoObjs]; + var html = [],id = 'tmpVedio', cl; + for(var i=0,vi,len = videoObjs.length;i 0) { + return 0; + } + for (var i in dtd.$isNotEmpty) if (dtd.$isNotEmpty.hasOwnProperty(i)) { + if (node.getElementsByTagName(i).length) { + return 0; + } + } + return 1; + }; + UETable.getWidth = function (cell) { + if (!cell)return 0; + return parseInt(domUtils.getComputedStyle(cell, "width"), 10); + }; + + /** + * 获取单元格或者单元格组的“对齐”状态。 如果当前的检测对象是一个单元格组, 只有在满足所有单元格的 水平和竖直 对齐属性都相同的 + * 条件时才会返回其状态值,否则将返回null; 如果当前只检测了一个单元格, 则直接返回当前单元格的对齐状态; + * @param table cell or table cells , 支持单个单元格dom对象 或者 单元格dom对象数组 + * @return { align: 'left' || 'right' || 'center', valign: 'top' || 'middle' || 'bottom' } 或者 null + */ + UETable.getTableCellAlignState = function ( cells ) { + + !utils.isArray( cells ) && ( cells = [cells] ); + + var result = {}, + status = ['align', 'valign'], + tempStatus = null, + isSame = true;//状态是否相同 + + utils.each( cells, function( cellNode ){ + + utils.each( status, function( currentState ){ + + tempStatus = cellNode.getAttribute( currentState ); + + if( !result[ currentState ] && tempStatus ) { + result[ currentState ] = tempStatus; + } else if( !result[ currentState ] || ( tempStatus !== result[ currentState ] ) ) { + isSame = false; + return false; + } + + } ); + + return isSame; + + }); + + return isSame ? result : null; + + }; + + /** + * 根据当前选区获取相关的table信息 + * @return {Object} + */ + UETable.getTableItemsByRange = function (editor) { + var start = editor.selection.getStart(); + + //ff下会选中bookmark + if( start && start.id && start.id.indexOf('_baidu_bookmark_start_') === 0 && start.nextSibling) { + start = start.nextSibling; + } + + //在table或者td边缘有可能存在选中tr的情况 + var cell = start && domUtils.findParentByTagName(start, ["td", "th"], true), + tr = cell && cell.parentNode, + caption = start && domUtils.findParentByTagName(start, 'caption', true), + table = caption ? caption.parentNode : tr && tr.parentNode.parentNode; + + return { + cell:cell, + tr:tr, + table:table, + caption:caption + } + }; + UETable.getUETableBySelected = function (editor) { + var table = UETable.getTableItemsByRange(editor).table; + if (table && table.ueTable && table.ueTable.selectedTds.length) { + return table.ueTable; + } + return null; + }; + + UETable.getDefaultValue = function (editor, table) { + var borderMap = { + thin:'0px', + medium:'1px', + thick:'2px' + }, + tableBorder, tdPadding, tdBorder, tmpValue; + if (!table) { + table = editor.document.createElement('table'); + table.insertRow(0).insertCell(0).innerHTML = 'xxx'; + editor.body.appendChild(table); + var td = table.getElementsByTagName('td')[0]; + tmpValue = domUtils.getComputedStyle(table, 'border-left-width'); + tableBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, 'padding-left'); + tdPadding = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, 'border-left-width'); + tdBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + domUtils.remove(table); + return { + tableBorder:tableBorder, + tdPadding:tdPadding, + tdBorder:tdBorder + }; + } else { + td = table.getElementsByTagName('td')[0]; + tmpValue = domUtils.getComputedStyle(table, 'border-left-width'); + tableBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, 'padding-left'); + tdPadding = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, 'border-left-width'); + tdBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + return { + tableBorder:tableBorder, + tdPadding:tdPadding, + tdBorder:tdBorder + }; + } + }; + /** + * 根据当前点击的td或者table获取索引对象 + * @param tdOrTable + */ + UETable.getUETable = function (tdOrTable) { + var tag = tdOrTable.tagName.toLowerCase(); + tdOrTable = (tag == "td" || tag == "th" || tag == 'caption') ? domUtils.findParentByTagName(tdOrTable, "table", true) : tdOrTable; + if (!tdOrTable.ueTable) { + tdOrTable.ueTable = new UETable(tdOrTable); + } + return tdOrTable.ueTable; + }; + + UETable.cloneCell = function(cell,ignoreMerge,keepPro){ + if (!cell || utils.isString(cell)) { + return this.table.ownerDocument.createElement(cell || 'td'); + } + var flag = domUtils.hasClass(cell, "selectTdClass"); + flag && domUtils.removeClasses(cell, "selectTdClass"); + var tmpCell = cell.cloneNode(true); + if (ignoreMerge) { + tmpCell.rowSpan = tmpCell.colSpan = 1; + } + //去掉宽高 + !keepPro && domUtils.removeAttributes(tmpCell,'width height'); + !keepPro && domUtils.removeAttributes(tmpCell,'style'); + + tmpCell.style.borderLeftStyle = ""; + tmpCell.style.borderTopStyle = ""; + tmpCell.style.borderLeftColor = cell.style.borderRightColor; + tmpCell.style.borderLeftWidth = cell.style.borderRightWidth; + tmpCell.style.borderTopColor = cell.style.borderBottomColor; + tmpCell.style.borderTopWidth = cell.style.borderBottomWidth; + flag && domUtils.addClass(cell, "selectTdClass"); + return tmpCell; + } + + UETable.prototype = { + getMaxRows:function () { + var rows = this.table.rows, maxLen = 1; + for (var i = 0, row; row = rows[i]; i++) { + var currentMax = 1; + for (var j = 0, cj; cj = row.cells[j++];) { + currentMax = Math.max(cj.rowSpan || 1, currentMax); + } + maxLen = Math.max(currentMax + i, maxLen); + } + return maxLen; + }, + /** + * 获取当前表格的最大列数 + */ + getMaxCols:function () { + var rows = this.table.rows, maxLen = 0, cellRows = {}; + for (var i = 0, row; row = rows[i]; i++) { + var cellsNum = 0; + for (var j = 0, cj; cj = row.cells[j++];) { + cellsNum += (cj.colSpan || 1); + if (cj.rowSpan && cj.rowSpan > 1) { + for (var k = 1; k < cj.rowSpan; k++) { + if (!cellRows['row_' + (i + k)]) { + cellRows['row_' + (i + k)] = (cj.colSpan || 1); + } else { + cellRows['row_' + (i + k)]++ + } + } + + } + } + cellsNum += cellRows['row_' + i] || 0; + maxLen = Math.max(cellsNum, maxLen); + } + return maxLen; + }, + getCellColIndex:function (cell) { + + }, + /** + * 获取当前cell旁边的单元格, + * @param cell + * @param right + */ + getHSideCell:function (cell, right) { + try { + var cellInfo = this.getCellInfo(cell), + previewRowIndex, previewColIndex; + var len = this.selectedTds.length, + range = this.cellsRange; + //首行或者首列没有前置单元格 + if ((!right && (!len ? !cellInfo.colIndex : !range.beginColIndex)) || (right && (!len ? (cellInfo.colIndex == (this.colsNum - 1)) : (range.endColIndex == this.colsNum - 1)))) return null; + + previewRowIndex = !len ? cellInfo.rowIndex : range.beginRowIndex; + previewColIndex = !right ? ( !len ? (cellInfo.colIndex < 1 ? 0 : (cellInfo.colIndex - 1)) : range.beginColIndex - 1) + : ( !len ? cellInfo.colIndex + 1 : range.endColIndex + 1); + return this.getCell(this.indexTable[previewRowIndex][previewColIndex].rowIndex, this.indexTable[previewRowIndex][previewColIndex].cellIndex); + } catch (e) { + showError(e); + } + }, + getTabNextCell:function (cell, preRowIndex) { + var cellInfo = this.getCellInfo(cell), + rowIndex = preRowIndex || cellInfo.rowIndex, + colIndex = cellInfo.colIndex + 1 + (cellInfo.colSpan - 1), + nextCell; + try { + nextCell = this.getCell(this.indexTable[rowIndex][colIndex].rowIndex, this.indexTable[rowIndex][colIndex].cellIndex); + } catch (e) { + try { + rowIndex = rowIndex * 1 + 1; + colIndex = 0; + nextCell = this.getCell(this.indexTable[rowIndex][colIndex].rowIndex, this.indexTable[rowIndex][colIndex].cellIndex); + } catch (e) { + } + } + return nextCell; + + }, + /** + * 获取视觉上的后置单元格 + * @param cell + * @param bottom + */ + getVSideCell:function (cell, bottom, ignoreRange) { + try { + var cellInfo = this.getCellInfo(cell), + nextRowIndex, nextColIndex; + var len = this.selectedTds.length && !ignoreRange, + range = this.cellsRange; + //末行或者末列没有后置单元格 + if ((!bottom && (cellInfo.rowIndex == 0)) || (bottom && (!len ? (cellInfo.rowIndex + cellInfo.rowSpan > this.rowsNum - 1) : (range.endRowIndex == this.rowsNum - 1)))) return null; + + nextRowIndex = !bottom ? ( !len ? cellInfo.rowIndex - 1 : range.beginRowIndex - 1) + : ( !len ? (cellInfo.rowIndex + cellInfo.rowSpan) : range.endRowIndex + 1); + nextColIndex = !len ? cellInfo.colIndex : range.beginColIndex; + return this.getCell(this.indexTable[nextRowIndex][nextColIndex].rowIndex, this.indexTable[nextRowIndex][nextColIndex].cellIndex); + } catch (e) { + showError(e); + } + }, + /** + * 获取相同结束位置的单元格,xOrY指代了是获取x轴相同还是y轴相同 + */ + getSameEndPosCells:function (cell, xOrY) { + try { + var flag = (xOrY.toLowerCase() === "x"), + end = domUtils.getXY(cell)[flag ? 'x' : 'y'] + cell["offset" + (flag ? 'Width' : 'Height')], + rows = this.table.rows, + cells = null, returns = []; + for (var i = 0; i < this.rowsNum; i++) { + cells = rows[i].cells; + for (var j = 0, tmpCell; tmpCell = cells[j++];) { + var tmpEnd = domUtils.getXY(tmpCell)[flag ? 'x' : 'y'] + tmpCell["offset" + (flag ? 'Width' : 'Height')]; + //对应行的td已经被上面行rowSpan了 + if (tmpEnd > end && flag) break; + if (cell == tmpCell || end == tmpEnd) { + //只获取单一的单元格 + //todo 仅获取单一单元格在特定情况下会造成returns为空,从而影响后续的拖拽实现,修正这个。需考虑性能 + if (tmpCell[flag ? "colSpan" : "rowSpan"] == 1) { + returns.push(tmpCell); + } + if (flag) break; + } + } + } + return returns; + } catch (e) { + showError(e); + } + }, + setCellContent:function (cell, content) { + cell.innerHTML = content || (browser.ie ? domUtils.fillChar : "
    "); + }, + cloneCell:UETable.cloneCell, + /** + * 获取跟当前单元格的右边竖线为左边的所有未合并单元格 + */ + getSameStartPosXCells:function (cell) { + try { + var start = domUtils.getXY(cell).x + cell.offsetWidth, + rows = this.table.rows, cells , returns = []; + for (var i = 0; i < this.rowsNum; i++) { + cells = rows[i].cells; + for (var j = 0, tmpCell; tmpCell = cells[j++];) { + var tmpStart = domUtils.getXY(tmpCell).x; + if (tmpStart > start) break; + if (tmpStart == start && tmpCell.colSpan == 1) { + returns.push(tmpCell); + break; + } + } + } + return returns; + } catch (e) { + showError(e); + } + }, + /** + * 更新table对应的索引表 + */ + update:function (table) { + this.table = table || this.table; + this.selectedTds = []; + this.cellsRange = {}; + this.indexTable = []; + var rows = this.table.rows, + rowsNum = this.getMaxRows(), + dNum = rowsNum - rows.length, + colsNum = this.getMaxCols(); + while (dNum--) { + this.table.insertRow(rows.length); + } + this.rowsNum = rowsNum; + this.colsNum = colsNum; + for (var i = 0, len = rows.length; i < len; i++) { + this.indexTable[i] = new Array(colsNum); + } + //填充索引表 + for (var rowIndex = 0, row; row = rows[rowIndex]; rowIndex++) { + for (var cellIndex = 0, cell, cells = row.cells; cell = cells[cellIndex]; cellIndex++) { + //修正整行被rowSpan时导致的行数计算错误 + if (cell.rowSpan > rowsNum) { + cell.rowSpan = rowsNum; + } + var colIndex = cellIndex, + rowSpan = cell.rowSpan || 1, + colSpan = cell.colSpan || 1; + //当已经被上一行rowSpan或者被前一列colSpan了,则跳到下一个单元格进行 + while (this.indexTable[rowIndex][colIndex]) colIndex++; + for (var j = 0; j < rowSpan; j++) { + for (var k = 0; k < colSpan; k++) { + this.indexTable[rowIndex + j][colIndex + k] = { + rowIndex:rowIndex, + cellIndex:cellIndex, + colIndex:colIndex, + rowSpan:rowSpan, + colSpan:colSpan + } + } + } + } + } + //修复残缺td + for (j = 0; j < rowsNum; j++) { + for (k = 0; k < colsNum; k++) { + if (this.indexTable[j][k] === undefined) { + row = rows[j]; + cell = row.cells[row.cells.length - 1]; + cell = cell ? cell.cloneNode(true) : this.table.ownerDocument.createElement("td"); + this.setCellContent(cell); + if (cell.colSpan !== 1)cell.colSpan = 1; + if (cell.rowSpan !== 1)cell.rowSpan = 1; + row.appendChild(cell); + this.indexTable[j][k] = { + rowIndex:j, + cellIndex:cell.cellIndex, + colIndex:k, + rowSpan:1, + colSpan:1 + } + } + } + } + //当框选后删除行或者列后撤销,需要重建选区。 + var tds = domUtils.getElementsByTagName(this.table, "td"), + selectTds = []; + utils.each(tds, function (td) { + if (domUtils.hasClass(td, "selectTdClass")) { + selectTds.push(td); + } + }); + if (selectTds.length) { + var start = selectTds[0], + end = selectTds[selectTds.length - 1], + startInfo = this.getCellInfo(start), + endInfo = this.getCellInfo(end); + this.selectedTds = selectTds; + this.cellsRange = { + beginRowIndex:startInfo.rowIndex, + beginColIndex:startInfo.colIndex, + endRowIndex:endInfo.rowIndex + endInfo.rowSpan - 1, + endColIndex:endInfo.colIndex + endInfo.colSpan - 1 + }; + } + //给第一行设置firstRow的样式名称,在排序图标的样式上使用到 + if(!domUtils.hasClass(this.table.rows[0], "firstRow")) { + domUtils.addClass(this.table.rows[0], "firstRow"); + for(var i = 1; i< this.table.rows.length; i++) { + domUtils.removeClasses(this.table.rows[i], "firstRow"); + } + } + }, + /** + * 获取单元格的索引信息 + */ + getCellInfo:function (cell) { + if (!cell) return; + var cellIndex = cell.cellIndex, + rowIndex = cell.parentNode.rowIndex, + rowInfo = this.indexTable[rowIndex], + numCols = this.colsNum; + for (var colIndex = cellIndex; colIndex < numCols; colIndex++) { + var cellInfo = rowInfo[colIndex]; + if (cellInfo.rowIndex === rowIndex && cellInfo.cellIndex === cellIndex) { + return cellInfo; + } + } + }, + /** + * 根据行列号获取单元格 + */ + getCell:function (rowIndex, cellIndex) { + return rowIndex < this.rowsNum && this.table.rows[rowIndex].cells[cellIndex] || null; + }, + /** + * 删除单元格 + */ + deleteCell:function (cell, rowIndex) { + rowIndex = typeof rowIndex == 'number' ? rowIndex : cell.parentNode.rowIndex; + var row = this.table.rows[rowIndex]; + row.deleteCell(cell.cellIndex); + }, + /** + * 根据始末两个单元格获取被框选的所有单元格范围 + */ + getCellsRange:function (cellA, cellB) { + function checkRange(beginRowIndex, beginColIndex, endRowIndex, endColIndex) { + var tmpBeginRowIndex = beginRowIndex, + tmpBeginColIndex = beginColIndex, + tmpEndRowIndex = endRowIndex, + tmpEndColIndex = endColIndex, + cellInfo, colIndex, rowIndex; + // 通过indexTable检查是否存在超出TableRange上边界的情况 + if (beginRowIndex > 0) { + for (colIndex = beginColIndex; colIndex < endColIndex; colIndex++) { + cellInfo = me.indexTable[beginRowIndex][colIndex]; + rowIndex = cellInfo.rowIndex; + if (rowIndex < beginRowIndex) { + tmpBeginRowIndex = Math.min(rowIndex, tmpBeginRowIndex); + } + } + } + // 通过indexTable检查是否存在超出TableRange右边界的情况 + if (endColIndex < me.colsNum) { + for (rowIndex = beginRowIndex; rowIndex < endRowIndex; rowIndex++) { + cellInfo = me.indexTable[rowIndex][endColIndex]; + colIndex = cellInfo.colIndex + cellInfo.colSpan - 1; + if (colIndex > endColIndex) { + tmpEndColIndex = Math.max(colIndex, tmpEndColIndex); + } + } + } + // 检查是否有超出TableRange下边界的情况 + if (endRowIndex < me.rowsNum) { + for (colIndex = beginColIndex; colIndex < endColIndex; colIndex++) { + cellInfo = me.indexTable[endRowIndex][colIndex]; + rowIndex = cellInfo.rowIndex + cellInfo.rowSpan - 1; + if (rowIndex > endRowIndex) { + tmpEndRowIndex = Math.max(rowIndex, tmpEndRowIndex); + } + } + } + // 检查是否有超出TableRange左边界的情况 + if (beginColIndex > 0) { + for (rowIndex = beginRowIndex; rowIndex < endRowIndex; rowIndex++) { + cellInfo = me.indexTable[rowIndex][beginColIndex]; + colIndex = cellInfo.colIndex; + if (colIndex < beginColIndex) { + tmpBeginColIndex = Math.min(cellInfo.colIndex, tmpBeginColIndex); + } + } + } + //递归调用直至所有完成所有框选单元格的扩展 + if (tmpBeginRowIndex != beginRowIndex || tmpBeginColIndex != beginColIndex || tmpEndRowIndex != endRowIndex || tmpEndColIndex != endColIndex) { + return checkRange(tmpBeginRowIndex, tmpBeginColIndex, tmpEndRowIndex, tmpEndColIndex); + } else { + // 不需要扩展TableRange的情况 + return { + beginRowIndex:beginRowIndex, + beginColIndex:beginColIndex, + endRowIndex:endRowIndex, + endColIndex:endColIndex + }; + } + } + + try { + var me = this, + cellAInfo = me.getCellInfo(cellA); + if (cellA === cellB) { + return { + beginRowIndex:cellAInfo.rowIndex, + beginColIndex:cellAInfo.colIndex, + endRowIndex:cellAInfo.rowIndex + cellAInfo.rowSpan - 1, + endColIndex:cellAInfo.colIndex + cellAInfo.colSpan - 1 + }; + } + var cellBInfo = me.getCellInfo(cellB); + // 计算TableRange的四个边 + var beginRowIndex = Math.min(cellAInfo.rowIndex, cellBInfo.rowIndex), + beginColIndex = Math.min(cellAInfo.colIndex, cellBInfo.colIndex), + endRowIndex = Math.max(cellAInfo.rowIndex + cellAInfo.rowSpan - 1, cellBInfo.rowIndex + cellBInfo.rowSpan - 1), + endColIndex = Math.max(cellAInfo.colIndex + cellAInfo.colSpan - 1, cellBInfo.colIndex + cellBInfo.colSpan - 1); + + return checkRange(beginRowIndex, beginColIndex, endRowIndex, endColIndex); + } catch (e) { + //throw e; + } + }, + /** + * 依据cellsRange获取对应的单元格集合 + */ + getCells:function (range) { + //每次获取cells之前必须先清除上次的选择,否则会对后续获取操作造成影响 + this.clearSelected(); + var beginRowIndex = range.beginRowIndex, + beginColIndex = range.beginColIndex, + endRowIndex = range.endRowIndex, + endColIndex = range.endColIndex, + cellInfo, rowIndex, colIndex, tdHash = {}, returnTds = []; + for (var i = beginRowIndex; i <= endRowIndex; i++) { + for (var j = beginColIndex; j <= endColIndex; j++) { + cellInfo = this.indexTable[i][j]; + rowIndex = cellInfo.rowIndex; + colIndex = cellInfo.colIndex; + // 如果Cells里已经包含了此Cell则跳过 + var key = rowIndex + '|' + colIndex; + if (tdHash[key]) continue; + tdHash[key] = 1; + if (rowIndex < i || colIndex < j || rowIndex + cellInfo.rowSpan - 1 > endRowIndex || colIndex + cellInfo.colSpan - 1 > endColIndex) { + return null; + } + returnTds.push(this.getCell(rowIndex, cellInfo.cellIndex)); + } + } + return returnTds; + }, + /** + * 清理已经选中的单元格 + */ + clearSelected:function () { + UETable.removeSelectedClass(this.selectedTds); + this.selectedTds = []; + this.cellsRange = {}; + }, + /** + * 根据range设置已经选中的单元格 + */ + setSelected:function (range) { + var cells = this.getCells(range); + UETable.addSelectedClass(cells); + this.selectedTds = cells; + this.cellsRange = range; + }, + isFullRow:function () { + var range = this.cellsRange; + return (range.endColIndex - range.beginColIndex + 1) == this.colsNum; + }, + isFullCol:function () { + var range = this.cellsRange, + table = this.table, + ths = table.getElementsByTagName("th"), + rows = range.endRowIndex - range.beginRowIndex + 1; + return !ths.length ? rows == this.rowsNum : rows == this.rowsNum || (rows == this.rowsNum - 1); + + }, + /** + * 获取视觉上的前置单元格,默认是左边,top传入时 + * @param cell + * @param top + */ + getNextCell:function (cell, bottom, ignoreRange) { + try { + var cellInfo = this.getCellInfo(cell), + nextRowIndex, nextColIndex; + var len = this.selectedTds.length && !ignoreRange, + range = this.cellsRange; + //末行或者末列没有后置单元格 + if ((!bottom && (cellInfo.rowIndex == 0)) || (bottom && (!len ? (cellInfo.rowIndex + cellInfo.rowSpan > this.rowsNum - 1) : (range.endRowIndex == this.rowsNum - 1)))) return null; + + nextRowIndex = !bottom ? ( !len ? cellInfo.rowIndex - 1 : range.beginRowIndex - 1) + : ( !len ? (cellInfo.rowIndex + cellInfo.rowSpan) : range.endRowIndex + 1); + nextColIndex = !len ? cellInfo.colIndex : range.beginColIndex; + return this.getCell(this.indexTable[nextRowIndex][nextColIndex].rowIndex, this.indexTable[nextRowIndex][nextColIndex].cellIndex); + } catch (e) { + showError(e); + } + }, + getPreviewCell:function (cell, top) { + try { + var cellInfo = this.getCellInfo(cell), + previewRowIndex, previewColIndex; + var len = this.selectedTds.length, + range = this.cellsRange; + //首行或者首列没有前置单元格 + if ((!top && (!len ? !cellInfo.colIndex : !range.beginColIndex)) || (top && (!len ? (cellInfo.rowIndex > (this.colsNum - 1)) : (range.endColIndex == this.colsNum - 1)))) return null; + + previewRowIndex = !top ? ( !len ? cellInfo.rowIndex : range.beginRowIndex ) + : ( !len ? (cellInfo.rowIndex < 1 ? 0 : (cellInfo.rowIndex - 1)) : range.beginRowIndex); + previewColIndex = !top ? ( !len ? (cellInfo.colIndex < 1 ? 0 : (cellInfo.colIndex - 1)) : range.beginColIndex - 1) + : ( !len ? cellInfo.colIndex : range.endColIndex + 1); + return this.getCell(this.indexTable[previewRowIndex][previewColIndex].rowIndex, this.indexTable[previewRowIndex][previewColIndex].cellIndex); + } catch (e) { + showError(e); + } + }, + /** + * 移动单元格中的内容 + */ + moveContent:function (cellTo, cellFrom) { + if (UETable.isEmptyBlock(cellFrom)) return; + if (UETable.isEmptyBlock(cellTo)) { + cellTo.innerHTML = cellFrom.innerHTML; + return; + } + var child = cellTo.lastChild; + if (child.nodeType == 3 || !dtd.$block[child.tagName]) { + cellTo.appendChild(cellTo.ownerDocument.createElement('br')) + } + while (child = cellFrom.firstChild) { + cellTo.appendChild(child); + } + }, + /** + * 向右合并单元格 + */ + mergeRight:function (cell) { + var cellInfo = this.getCellInfo(cell), + rightColIndex = cellInfo.colIndex + cellInfo.colSpan, + rightCellInfo = this.indexTable[cellInfo.rowIndex][rightColIndex], + rightCell = this.getCell(rightCellInfo.rowIndex, rightCellInfo.cellIndex); + //合并 + cell.colSpan = cellInfo.colSpan + rightCellInfo.colSpan; + //被合并的单元格不应存在宽度属性 + cell.removeAttribute("width"); + //移动内容 + this.moveContent(cell, rightCell); + //删掉被合并的Cell + this.deleteCell(rightCell, rightCellInfo.rowIndex); + this.update(); + }, + /** + * 向下合并单元格 + */ + mergeDown:function (cell) { + var cellInfo = this.getCellInfo(cell), + downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan, + downCellInfo = this.indexTable[downRowIndex][cellInfo.colIndex], + downCell = this.getCell(downCellInfo.rowIndex, downCellInfo.cellIndex); + cell.rowSpan = cellInfo.rowSpan + downCellInfo.rowSpan; + cell.removeAttribute("height"); + this.moveContent(cell, downCell); + this.deleteCell(downCell, downCellInfo.rowIndex); + this.update(); + }, + /** + * 合并整个range中的内容 + */ + mergeRange:function () { + //由于合并操作可以在任意时刻进行,所以无法通过鼠标位置等信息实时生成range,只能通过缓存实例中的cellsRange对象来访问 + var range = this.cellsRange, + leftTopCell = this.getCell(range.beginRowIndex, this.indexTable[range.beginRowIndex][range.beginColIndex].cellIndex); + + if (leftTopCell.tagName == "TH" && range.endRowIndex !== range.beginRowIndex) { + var index = this.indexTable, + info = this.getCellInfo(leftTopCell); + leftTopCell = this.getCell(1, index[1][info.colIndex].cellIndex); + range = this.getCellsRange(leftTopCell, this.getCell(index[this.rowsNum - 1][info.colIndex].rowIndex, index[this.rowsNum - 1][info.colIndex].cellIndex)); + } + + // 删除剩余的Cells + var cells = this.getCells(range); + for(var i= 0,ci;ci=cells[i++];){ + if (ci !== leftTopCell) { + this.moveContent(leftTopCell, ci); + this.deleteCell(ci); + } + } + // 修改左上角Cell的rowSpan和colSpan,并调整宽度属性设置 + leftTopCell.rowSpan = range.endRowIndex - range.beginRowIndex + 1; + leftTopCell.rowSpan > 1 && leftTopCell.removeAttribute("height"); + leftTopCell.colSpan = range.endColIndex - range.beginColIndex + 1; + leftTopCell.colSpan > 1 && leftTopCell.removeAttribute("width"); + if (leftTopCell.rowSpan == this.rowsNum && leftTopCell.colSpan != 1) { + leftTopCell.colSpan = 1; + } + + if (leftTopCell.colSpan == this.colsNum && leftTopCell.rowSpan != 1) { + var rowIndex = leftTopCell.parentNode.rowIndex; + //解决IE下的表格操作问题 + if( this.table.deleteRow ) { + for (var i = rowIndex+ 1, curIndex=rowIndex+ 1, len=leftTopCell.rowSpan; i < len; i++) { + this.table.deleteRow(curIndex); + } + } else { + for (var i = 0, len=leftTopCell.rowSpan - 1; i < len; i++) { + var row = this.table.rows[rowIndex + 1]; + row.parentNode.removeChild(row); + } + } + leftTopCell.rowSpan = 1; + } + this.update(); + }, + /** + * 插入一行单元格 + */ + insertRow:function (rowIndex, sourceCell) { + var numCols = this.colsNum, + table = this.table, + row = table.insertRow(rowIndex), cell, + isInsertTitle = typeof sourceCell == 'string' && sourceCell.toUpperCase() == 'TH'; + + function replaceTdToTh(colIndex, cell, tableRow) { + if (colIndex == 0) { + var tr = tableRow.nextSibling || tableRow.previousSibling, + th = tr.cells[colIndex]; + if (th.tagName == 'TH') { + th = cell.ownerDocument.createElement("th"); + th.appendChild(cell.firstChild); + tableRow.insertBefore(th, cell); + domUtils.remove(cell) + } + }else{ + if (cell.tagName == 'TH') { + var td = cell.ownerDocument.createElement("td"); + td.appendChild(cell.firstChild); + tableRow.insertBefore(td, cell); + domUtils.remove(cell) + } + } + } + + //首行直接插入,无需考虑部分单元格被rowspan的情况 + if (rowIndex == 0 || rowIndex == this.rowsNum) { + for (var colIndex = 0; colIndex < numCols; colIndex++) { + cell = this.cloneCell(sourceCell, true); + this.setCellContent(cell); + cell.getAttribute('vAlign') && cell.setAttribute('vAlign', cell.getAttribute('vAlign')); + row.appendChild(cell); + if(!isInsertTitle) replaceTdToTh(colIndex, cell, row); + } + } else { + var infoRow = this.indexTable[rowIndex], + cellIndex = 0; + for (colIndex = 0; colIndex < numCols; colIndex++) { + var cellInfo = infoRow[colIndex]; + //如果存在某个单元格的rowspan穿过待插入行的位置,则修改该单元格的rowspan即可,无需插入单元格 + if (cellInfo.rowIndex < rowIndex) { + cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + cell.rowSpan = cellInfo.rowSpan + 1; + } else { + cell = this.cloneCell(sourceCell, true); + this.setCellContent(cell); + row.appendChild(cell); + } + if(!isInsertTitle) replaceTdToTh(colIndex, cell, row); + } + } + //框选时插入不触发contentchange,需要手动更新索引。 + this.update(); + return row; + }, + /** + * 删除一行单元格 + * @param rowIndex + */ + deleteRow:function (rowIndex) { + var row = this.table.rows[rowIndex], + infoRow = this.indexTable[rowIndex], + colsNum = this.colsNum, + count = 0; //处理计数 + for (var colIndex = 0; colIndex < colsNum;) { + var cellInfo = infoRow[colIndex], + cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + if (cell.rowSpan > 1) { + if (cellInfo.rowIndex == rowIndex) { + var clone = cell.cloneNode(true); + clone.rowSpan = cell.rowSpan - 1; + clone.innerHTML = ""; + cell.rowSpan = 1; + var nextRowIndex = rowIndex + 1, + nextRow = this.table.rows[nextRowIndex], + insertCellIndex, + preMerged = this.getPreviewMergedCellsNum(nextRowIndex, colIndex) - count; + if (preMerged < colIndex) { + insertCellIndex = colIndex - preMerged - 1; + //nextRow.insertCell(insertCellIndex); + domUtils.insertAfter(nextRow.cells[insertCellIndex], clone); + } else { + if (nextRow.cells.length) nextRow.insertBefore(clone, nextRow.cells[0]) + } + count += 1; + //cell.parentNode.removeChild(cell); + } + } + colIndex += cell.colSpan || 1; + } + var deleteTds = [], cacheMap = {}; + for (colIndex = 0; colIndex < colsNum; colIndex++) { + var tmpRowIndex = infoRow[colIndex].rowIndex, + tmpCellIndex = infoRow[colIndex].cellIndex, + key = tmpRowIndex + "_" + tmpCellIndex; + if (cacheMap[key])continue; + cacheMap[key] = 1; + cell = this.getCell(tmpRowIndex, tmpCellIndex); + deleteTds.push(cell); + } + var mergeTds = []; + utils.each(deleteTds, function (td) { + if (td.rowSpan == 1) { + td.parentNode.removeChild(td); + } else { + mergeTds.push(td); + } + }); + utils.each(mergeTds, function (td) { + td.rowSpan--; + }); + row.parentNode.removeChild(row); + //浏览器方法本身存在bug,采用自定义方法删除 + //this.table.deleteRow(rowIndex); + this.update(); + }, + insertCol:function (colIndex, sourceCell, defaultValue) { + var rowsNum = this.rowsNum, + rowIndex = 0, + tableRow, cell, + backWidth = parseInt((this.table.offsetWidth - (this.colsNum + 1) * 20 - (this.colsNum + 1)) / (this.colsNum + 1), 10), + isInsertTitleCol = typeof sourceCell == 'string' && sourceCell.toUpperCase() == 'TH'; + + function replaceTdToTh(rowIndex, cell, tableRow) { + if (rowIndex == 0) { + var th = cell.nextSibling || cell.previousSibling; + if (th.tagName == 'TH') { + th = cell.ownerDocument.createElement("th"); + th.appendChild(cell.firstChild); + tableRow.insertBefore(th, cell); + domUtils.remove(cell) + } + }else{ + if (cell.tagName == 'TH') { + var td = cell.ownerDocument.createElement("td"); + td.appendChild(cell.firstChild); + tableRow.insertBefore(td, cell); + domUtils.remove(cell) + } + } + } + + var preCell; + if (colIndex == 0 || colIndex == this.colsNum) { + for (; rowIndex < rowsNum; rowIndex++) { + tableRow = this.table.rows[rowIndex]; + preCell = tableRow.cells[colIndex == 0 ? colIndex : tableRow.cells.length]; + cell = this.cloneCell(sourceCell, true); //tableRow.insertCell(colIndex == 0 ? colIndex : tableRow.cells.length); + this.setCellContent(cell); + cell.setAttribute('vAlign', cell.getAttribute('vAlign')); + preCell && cell.setAttribute('width', preCell.getAttribute('width')); + if (!colIndex) { + tableRow.insertBefore(cell, tableRow.cells[0]); + } else { + domUtils.insertAfter(tableRow.cells[tableRow.cells.length - 1], cell); + } + if(!isInsertTitleCol) replaceTdToTh(rowIndex, cell, tableRow) + } + } else { + for (; rowIndex < rowsNum; rowIndex++) { + var cellInfo = this.indexTable[rowIndex][colIndex]; + if (cellInfo.colIndex < colIndex) { + cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + cell.colSpan = cellInfo.colSpan + 1; + } else { + tableRow = this.table.rows[rowIndex]; + preCell = tableRow.cells[cellInfo.cellIndex]; + + cell = this.cloneCell(sourceCell, true);//tableRow.insertCell(cellInfo.cellIndex); + this.setCellContent(cell); + cell.setAttribute('vAlign', cell.getAttribute('vAlign')); + preCell && cell.setAttribute('width', preCell.getAttribute('width')); + //防止IE下报错 + preCell ? tableRow.insertBefore(cell, preCell) : tableRow.appendChild(cell); + } + if(!isInsertTitleCol) replaceTdToTh(rowIndex, cell, tableRow); + } + } + //框选时插入不触发contentchange,需要手动更新索引 + this.update(); + this.updateWidth(backWidth, defaultValue || {tdPadding:10, tdBorder:1}); + }, + updateWidth:function (width, defaultValue) { + var table = this.table, + tmpWidth = UETable.getWidth(table) - defaultValue.tdPadding * 2 - defaultValue.tdBorder + width; + if (tmpWidth < table.ownerDocument.body.offsetWidth) { + table.setAttribute("width", tmpWidth); + return; + } + var tds = domUtils.getElementsByTagName(this.table, "td th"); + utils.each(tds, function (td) { + td.setAttribute("width", width); + }) + }, + deleteCol:function (colIndex) { + var indexTable = this.indexTable, + tableRows = this.table.rows, + backTableWidth = this.table.getAttribute("width"), + backTdWidth = 0, + rowsNum = this.rowsNum, + cacheMap = {}; + for (var rowIndex = 0; rowIndex < rowsNum;) { + var infoRow = indexTable[rowIndex], + cellInfo = infoRow[colIndex], + key = cellInfo.rowIndex + '_' + cellInfo.colIndex; + // 跳过已经处理过的Cell + if (cacheMap[key])continue; + cacheMap[key] = 1; + var cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + if (!backTdWidth) backTdWidth = cell && parseInt(cell.offsetWidth / cell.colSpan, 10).toFixed(0); + // 如果Cell的colSpan大于1, 就修改colSpan, 否则就删掉这个Cell + if (cell.colSpan > 1) { + cell.colSpan--; + } else { + tableRows[rowIndex].deleteCell(cellInfo.cellIndex); + } + rowIndex += cellInfo.rowSpan || 1; + } + this.table.setAttribute("width", backTableWidth - backTdWidth); + this.update(); + }, + splitToCells:function (cell) { + var me = this, + cells = this.splitToRows(cell); + utils.each(cells, function (cell) { + me.splitToCols(cell); + }) + }, + splitToRows:function (cell) { + var cellInfo = this.getCellInfo(cell), + rowIndex = cellInfo.rowIndex, + colIndex = cellInfo.colIndex, + results = []; + // 修改Cell的rowSpan + cell.rowSpan = 1; + results.push(cell); + // 补齐单元格 + for (var i = rowIndex, endRow = rowIndex + cellInfo.rowSpan; i < endRow; i++) { + if (i == rowIndex)continue; + var tableRow = this.table.rows[i], + tmpCell = tableRow.insertCell(colIndex - this.getPreviewMergedCellsNum(i, colIndex)); + tmpCell.colSpan = cellInfo.colSpan; + this.setCellContent(tmpCell); + tmpCell.setAttribute('vAlign', cell.getAttribute('vAlign')); + tmpCell.setAttribute('align', cell.getAttribute('align')); + if (cell.style.cssText) { + tmpCell.style.cssText = cell.style.cssText; + } + results.push(tmpCell); + } + this.update(); + return results; + }, + getPreviewMergedCellsNum:function (rowIndex, colIndex) { + var indexRow = this.indexTable[rowIndex], + num = 0; + for (var i = 0; i < colIndex;) { + var colSpan = indexRow[i].colSpan, + tmpRowIndex = indexRow[i].rowIndex; + num += (colSpan - (tmpRowIndex == rowIndex ? 1 : 0)); + i += colSpan; + } + return num; + }, + splitToCols:function (cell) { + var backWidth = (cell.offsetWidth / cell.colSpan - 22).toFixed(0), + + cellInfo = this.getCellInfo(cell), + rowIndex = cellInfo.rowIndex, + colIndex = cellInfo.colIndex, + results = []; + // 修改Cell的rowSpan + cell.colSpan = 1; + cell.setAttribute("width", backWidth); + results.push(cell); + // 补齐单元格 + for (var j = colIndex, endCol = colIndex + cellInfo.colSpan; j < endCol; j++) { + if (j == colIndex)continue; + var tableRow = this.table.rows[rowIndex], + tmpCell = tableRow.insertCell(this.indexTable[rowIndex][j].cellIndex + 1); + tmpCell.rowSpan = cellInfo.rowSpan; + this.setCellContent(tmpCell); + tmpCell.setAttribute('vAlign', cell.getAttribute('vAlign')); + tmpCell.setAttribute('align', cell.getAttribute('align')); + tmpCell.setAttribute('width', backWidth); + if (cell.style.cssText) { + tmpCell.style.cssText = cell.style.cssText; + } + //处理th的情况 + if (cell.tagName == 'TH') { + var th = cell.ownerDocument.createElement('th'); + th.appendChild(tmpCell.firstChild); + th.setAttribute('vAlign', cell.getAttribute('vAlign')); + th.rowSpan = tmpCell.rowSpan; + tableRow.insertBefore(th, tmpCell); + domUtils.remove(tmpCell); + } + results.push(tmpCell); + } + this.update(); + return results; + }, + isLastCell:function (cell, rowsNum, colsNum) { + rowsNum = rowsNum || this.rowsNum; + colsNum = colsNum || this.colsNum; + var cellInfo = this.getCellInfo(cell); + return ((cellInfo.rowIndex + cellInfo.rowSpan) == rowsNum) && + ((cellInfo.colIndex + cellInfo.colSpan) == colsNum); + }, + getLastCell:function (cells) { + cells = cells || this.table.getElementsByTagName("td"); + var firstInfo = this.getCellInfo(cells[0]); + var me = this, last = cells[0], + tr = last.parentNode, + cellsNum = 0, cols = 0, rows; + utils.each(cells, function (cell) { + if (cell.parentNode == tr)cols += cell.colSpan || 1; + cellsNum += cell.rowSpan * cell.colSpan || 1; + }); + rows = cellsNum / cols; + utils.each(cells, function (cell) { + if (me.isLastCell(cell, rows, cols)) { + last = cell; + return false; + } + }); + return last; + + }, + selectRow:function (rowIndex) { + var indexRow = this.indexTable[rowIndex], + start = this.getCell(indexRow[0].rowIndex, indexRow[0].cellIndex), + end = this.getCell(indexRow[this.colsNum - 1].rowIndex, indexRow[this.colsNum - 1].cellIndex), + range = this.getCellsRange(start, end); + this.setSelected(range); + }, + selectTable:function () { + var tds = this.table.getElementsByTagName("td"), + range = this.getCellsRange(tds[0], tds[tds.length - 1]); + this.setSelected(range); + }, + setBackground:function (cells, value) { + if (typeof value === "string") { + utils.each(cells, function (cell) { + cell.style.backgroundColor = value; + }) + } else if (typeof value === "object") { + value = utils.extend({ + repeat:true, + colorList:["#ddd", "#fff"] + }, value); + var rowIndex = this.getCellInfo(cells[0]).rowIndex, + count = 0, + colors = value.colorList, + getColor = function (list, index, repeat) { + return list[index] ? list[index] : repeat ? list[index % list.length] : ""; + }; + for (var i = 0, cell; cell = cells[i++];) { + var cellInfo = this.getCellInfo(cell); + cell.style.backgroundColor = getColor(colors, ((rowIndex + count) == cellInfo.rowIndex) ? count : ++count, value.repeat); + } + } + }, + removeBackground:function (cells) { + utils.each(cells, function (cell) { + cell.style.backgroundColor = ""; + }) + } + + + }; + function showError(e) { + } +})(); + +// plugins/table.cmds.js +/** + * Created with JetBrains PhpStorm. + * User: taoqili + * Date: 13-2-20 + * Time: 下午6:25 + * To change this template use File | Settings | File Templates. + */ +; +(function () { + var UT = UE.UETable, + getTableItemsByRange = function (editor) { + return UT.getTableItemsByRange(editor); + }, + getUETableBySelected = function (editor) { + return UT.getUETableBySelected(editor) + }, + getDefaultValue = function (editor, table) { + return UT.getDefaultValue(editor, table); + }, + getUETable = function (tdOrTable) { + return UT.getUETable(tdOrTable); + }; + + + UE.commands['inserttable'] = { + queryCommandState: function () { + return getTableItemsByRange(this).table ? -1 : 0; + }, + execCommand: function (cmd, opt) { + function createTable(opt, tdWidth) { + var html = [], + rowsNum = opt.numRows, + colsNum = opt.numCols; + for (var r = 0; r < rowsNum; r++) { + html.push(''); + for (var c = 0; c < colsNum; c++) { + html.push('
  • ' + (browser.ie && browser.version < 11 ? domUtils.fillChar : '
    ') + '
    ' + html.join('') + '
    ' + } + + if (!opt) { + opt = utils.extend({}, { + numCols: this.options.defaultCols, + numRows: this.options.defaultRows, + tdvalign: this.options.tdvalign + }) + } + var me = this; + var range = this.selection.getRange(), + start = range.startContainer, + firstParentBlock = domUtils.findParent(start, function (node) { + return domUtils.isBlockElm(node); + }, true) || me.body; + + var defaultValue = getDefaultValue(me), + tableWidth = firstParentBlock.offsetWidth, + tdWidth = Math.floor(tableWidth / opt.numCols - defaultValue.tdPadding * 2 - defaultValue.tdBorder); + + //todo其他属性 + !opt.tdvalign && (opt.tdvalign = me.options.tdvalign); + me.execCommand("inserthtml", createTable(opt, tdWidth)); + } + }; + + UE.commands['insertparagraphbeforetable'] = { + queryCommandState: function () { + return getTableItemsByRange(this).cell ? 0 : -1; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var p = this.document.createElement("p"); + p.innerHTML = browser.ie ? ' ' : '
    '; + table.parentNode.insertBefore(p, table); + this.selection.getRange().setStart(p, 0).setCursor(); + } + } + }; + + UE.commands['deletetable'] = { + queryCommandState: function () { + var rng = this.selection.getRange(); + return domUtils.findParentByTagName(rng.startContainer, 'table', true) ? 0 : -1; + }, + execCommand: function (cmd, table) { + var rng = this.selection.getRange(); + table = table || domUtils.findParentByTagName(rng.startContainer, 'table', true); + if (table) { + var next = table.nextSibling; + if (!next) { + next = domUtils.createElement(this.document, 'p', { + 'innerHTML': browser.ie ? domUtils.fillChar : '
    ' + }); + table.parentNode.insertBefore(next, table); + } + domUtils.remove(table); + rng = this.selection.getRange(); + if (next.nodeType == 3) { + rng.setStartBefore(next) + } else { + rng.setStart(next, 0) + } + rng.setCursor(false, true) + this.fireEvent("tablehasdeleted") + + } + + } + }; + UE.commands['cellalign'] = { + queryCommandState: function () { + return getSelectedArr(this).length ? 0 : -1 + }, + execCommand: function (cmd, align) { + var selectedTds = getSelectedArr(this); + if (selectedTds.length) { + for (var i = 0, ci; ci = selectedTds[i++];) { + ci.setAttribute('align', align); + } + } + } + }; + UE.commands['cellvalign'] = { + queryCommandState: function () { + return getSelectedArr(this).length ? 0 : -1; + }, + execCommand: function (cmd, valign) { + var selectedTds = getSelectedArr(this); + if (selectedTds.length) { + for (var i = 0, ci; ci = selectedTds[i++];) { + ci.setAttribute('vAlign', valign); + } + } + } + }; + UE.commands['insertcaption'] = { + queryCommandState: function () { + var table = getTableItemsByRange(this).table; + if (table) { + return table.getElementsByTagName('caption').length == 0 ? 1 : -1; + } + return -1; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var caption = this.document.createElement('caption'); + caption.innerHTML = browser.ie ? domUtils.fillChar : '
    '; + table.insertBefore(caption, table.firstChild); + var range = this.selection.getRange(); + range.setStart(caption, 0).setCursor(); + } + + } + }; + UE.commands['deletecaption'] = { + queryCommandState: function () { + var rng = this.selection.getRange(), + table = domUtils.findParentByTagName(rng.startContainer, 'table'); + if (table) { + return table.getElementsByTagName('caption').length == 0 ? -1 : 1; + } + return -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + table = domUtils.findParentByTagName(rng.startContainer, 'table'); + if (table) { + domUtils.remove(table.getElementsByTagName('caption')[0]); + var range = this.selection.getRange(); + range.setStart(table.rows[0].cells[0], 0).setCursor(); + } + + } + }; + UE.commands['inserttitle'] = { + queryCommandState: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var firstRow = table.rows[0]; + return firstRow.cells[firstRow.cells.length-1].tagName.toLowerCase() != 'th' ? 0 : -1 + } + return -1; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + if (table) { + getUETable(table).insertRow(0, 'th'); + } + var th = table.getElementsByTagName('th')[0]; + this.selection.getRange().setStart(th, 0).setCursor(false, true); + } + }; + UE.commands['deletetitle'] = { + queryCommandState: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var firstRow = table.rows[0]; + return firstRow.cells[firstRow.cells.length-1].tagName.toLowerCase() == 'th' ? 0 : -1 + } + return -1; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + if (table) { + domUtils.remove(table.rows[0]) + } + var td = table.getElementsByTagName('td')[0]; + this.selection.getRange().setStart(td, 0).setCursor(false, true); + } + }; + UE.commands['inserttitlecol'] = { + queryCommandState: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var lastRow = table.rows[table.rows.length-1]; + return lastRow.getElementsByTagName('th').length ? -1 : 0; + } + return -1; + }, + execCommand: function (cmd) { + var table = getTableItemsByRange(this).table; + if (table) { + getUETable(table).insertCol(0, 'th'); + } + resetTdWidth(table, this); + var th = table.getElementsByTagName('th')[0]; + this.selection.getRange().setStart(th, 0).setCursor(false, true); + } + }; + UE.commands['deletetitlecol'] = { + queryCommandState: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var lastRow = table.rows[table.rows.length-1]; + return lastRow.getElementsByTagName('th').length ? 0 : -1; + } + return -1; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + if (table) { + for(var i = 0; i< table.rows.length; i++ ){ + domUtils.remove(table.rows[i].children[0]) + } + } + resetTdWidth(table, this); + var td = table.getElementsByTagName('td')[0]; + this.selection.getRange().setStart(td, 0).setCursor(false, true); + } + }; + + UE.commands["mergeright"] = { + queryCommandState: function (cmd) { + var tableItems = getTableItemsByRange(this), + table = tableItems.table, + cell = tableItems.cell; + + if (!table || !cell) return -1; + var ut = getUETable(table); + if (ut.selectedTds.length) return -1; + + var cellInfo = ut.getCellInfo(cell), + rightColIndex = cellInfo.colIndex + cellInfo.colSpan; + if (rightColIndex >= ut.colsNum) return -1; // 如果处于最右边则不能向右合并 + + var rightCellInfo = ut.indexTable[cellInfo.rowIndex][rightColIndex], + rightCell = table.rows[rightCellInfo.rowIndex].cells[rightCellInfo.cellIndex]; + if (!rightCell || cell.tagName != rightCell.tagName) return -1; // TH和TD不能相互合并 + + // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并 + return (rightCellInfo.rowIndex == cellInfo.rowIndex && rightCellInfo.rowSpan == cellInfo.rowSpan) ? 0 : -1; + }, + execCommand: function (cmd) { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.mergeRight(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["mergedown"] = { + queryCommandState: function (cmd) { + var tableItems = getTableItemsByRange(this), + table = tableItems.table, + cell = tableItems.cell; + + if (!table || !cell) return -1; + var ut = getUETable(table); + if (ut.selectedTds.length)return -1; + + var cellInfo = ut.getCellInfo(cell), + downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan; + if (downRowIndex >= ut.rowsNum) return -1; // 如果处于最下边则不能向下合并 + + var downCellInfo = ut.indexTable[downRowIndex][cellInfo.colIndex], + downCell = table.rows[downCellInfo.rowIndex].cells[downCellInfo.cellIndex]; + if (!downCell || cell.tagName != downCell.tagName) return -1; // TH和TD不能相互合并 + + // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并 + return (downCellInfo.colIndex == cellInfo.colIndex && downCellInfo.colSpan == cellInfo.colSpan) ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.mergeDown(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["mergecells"] = { + queryCommandState: function () { + return getUETableBySelected(this) ? 0 : -1; + }, + execCommand: function () { + var ut = getUETableBySelected(this); + if (ut && ut.selectedTds.length) { + var cell = ut.selectedTds[0]; + ut.mergeRange(); + var rng = this.selection.getRange(); + if (domUtils.isEmptyBlock(cell)) { + rng.setStart(cell, 0).collapse(true) + } else { + rng.selectNodeContents(cell) + } + rng.select(); + } + + + } + }; + UE.commands["insertrow"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && (cell.tagName == "TD" || (cell.tagName == 'TH' && tableItems.tr !== tableItems.table.rows[0])) && + getUETable(tableItems.table).rowsNum < this.options.maxRowNum ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell, + table = tableItems.table, + ut = getUETable(table), + cellInfo = ut.getCellInfo(cell); + //ut.insertRow(!ut.selectedTds.length ? cellInfo.rowIndex:ut.cellsRange.beginRowIndex,''); + if (!ut.selectedTds.length) { + ut.insertRow(cellInfo.rowIndex, cell); + } else { + var range = ut.cellsRange; + for (var i = 0, len = range.endRowIndex - range.beginRowIndex + 1; i < len; i++) { + ut.insertRow(range.beginRowIndex, cell); + } + } + rng.moveToBookmark(bk).select(); + if (table.getAttribute("interlaced") === "enabled")this.fireEvent("interlacetable", table); + } + }; + //后插入行 + UE.commands["insertrownext"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && (cell.tagName == "TD") && getUETable(tableItems.table).rowsNum < this.options.maxRowNum ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell, + table = tableItems.table, + ut = getUETable(table), + cellInfo = ut.getCellInfo(cell); + //ut.insertRow(!ut.selectedTds.length? cellInfo.rowIndex + cellInfo.rowSpan : ut.cellsRange.endRowIndex + 1,''); + if (!ut.selectedTds.length) { + ut.insertRow(cellInfo.rowIndex + cellInfo.rowSpan, cell); + } else { + var range = ut.cellsRange; + for (var i = 0, len = range.endRowIndex - range.beginRowIndex + 1; i < len; i++) { + ut.insertRow(range.endRowIndex + 1, cell); + } + } + rng.moveToBookmark(bk).select(); + if (table.getAttribute("interlaced") === "enabled")this.fireEvent("interlacetable", table); + } + }; + UE.commands["deleterow"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this); + return tableItems.cell ? 0 : -1; + }, + execCommand: function () { + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + cellsRange = ut.cellsRange, + cellInfo = ut.getCellInfo(cell), + preCell = ut.getVSideCell(cell), + nextCell = ut.getVSideCell(cell, true), + rng = this.selection.getRange(); + if (utils.isEmptyObject(cellsRange)) { + ut.deleteRow(cellInfo.rowIndex); + } else { + for (var i = cellsRange.beginRowIndex; i < cellsRange.endRowIndex + 1; i++) { + ut.deleteRow(cellsRange.beginRowIndex); + } + } + var table = ut.table; + if (!table.getElementsByTagName('td').length) { + var nextSibling = table.nextSibling; + domUtils.remove(table); + if (nextSibling) { + rng.setStart(nextSibling, 0).setCursor(false, true); + } + } else { + if (cellInfo.rowSpan == 1 || cellInfo.rowSpan == cellsRange.endRowIndex - cellsRange.beginRowIndex + 1) { + if (nextCell || preCell) rng.selectNodeContents(nextCell || preCell).setCursor(false, true); + } else { + var newCell = ut.getCell(cellInfo.rowIndex, ut.indexTable[cellInfo.rowIndex][cellInfo.colIndex].cellIndex); + if (newCell) rng.selectNodeContents(newCell).setCursor(false, true); + } + } + if (table.getAttribute("interlaced") === "enabled")this.fireEvent("interlacetable", table); + } + }; + UE.commands["insertcol"] = { + queryCommandState: function (cmd) { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && (cell.tagName == "TD" || (cell.tagName == 'TH' && cell !== tableItems.tr.cells[0])) && + getUETable(tableItems.table).colsNum < this.options.maxColNum ? 0 : -1; + }, + execCommand: function (cmd) { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + if (this.queryCommandState(cmd) == -1)return; + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + cellInfo = ut.getCellInfo(cell); + + //ut.insertCol(!ut.selectedTds.length ? cellInfo.colIndex:ut.cellsRange.beginColIndex); + if (!ut.selectedTds.length) { + ut.insertCol(cellInfo.colIndex, cell); + } else { + var range = ut.cellsRange; + for (var i = 0, len = range.endColIndex - range.beginColIndex + 1; i < len; i++) { + ut.insertCol(range.beginColIndex, cell); + } + } + rng.moveToBookmark(bk).select(true); + } + }; + UE.commands["insertcolnext"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && getUETable(tableItems.table).colsNum < this.options.maxColNum ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + cellInfo = ut.getCellInfo(cell); + //ut.insertCol(!ut.selectedTds.length ? cellInfo.colIndex + cellInfo.colSpan:ut.cellsRange.endColIndex +1); + if (!ut.selectedTds.length) { + ut.insertCol(cellInfo.colIndex + cellInfo.colSpan, cell); + } else { + var range = ut.cellsRange; + for (var i = 0, len = range.endColIndex - range.beginColIndex + 1; i < len; i++) { + ut.insertCol(range.endColIndex + 1, cell); + } + } + rng.moveToBookmark(bk).select(); + } + }; + + UE.commands["deletecol"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this); + return tableItems.cell ? 0 : -1; + }, + execCommand: function () { + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + range = ut.cellsRange, + cellInfo = ut.getCellInfo(cell), + preCell = ut.getHSideCell(cell), + nextCell = ut.getHSideCell(cell, true); + if (utils.isEmptyObject(range)) { + ut.deleteCol(cellInfo.colIndex); + } else { + for (var i = range.beginColIndex; i < range.endColIndex + 1; i++) { + ut.deleteCol(range.beginColIndex); + } + } + var table = ut.table, + rng = this.selection.getRange(); + + if (!table.getElementsByTagName('td').length) { + var nextSibling = table.nextSibling; + domUtils.remove(table); + if (nextSibling) { + rng.setStart(nextSibling, 0).setCursor(false, true); + } + } else { + if (domUtils.inDoc(cell, this.document)) { + rng.setStart(cell, 0).setCursor(false, true); + } else { + if (nextCell && domUtils.inDoc(nextCell, this.document)) { + rng.selectNodeContents(nextCell).setCursor(false, true); + } else { + if (preCell && domUtils.inDoc(preCell, this.document)) { + rng.selectNodeContents(preCell).setCursor(true, true); + } + } + } + } + } + }; + UE.commands["splittocells"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + if (!cell) return -1; + var ut = getUETable(tableItems.table); + if (ut.selectedTds.length > 0) return -1; + return cell && (cell.colSpan > 1 || cell.rowSpan > 1) ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.splitToCells(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["splittorows"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + if (!cell) return -1; + var ut = getUETable(tableItems.table); + if (ut.selectedTds.length > 0) return -1; + return cell && cell.rowSpan > 1 ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.splitToRows(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["splittocols"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + if (!cell) return -1; + var ut = getUETable(tableItems.table); + if (ut.selectedTds.length > 0) return -1; + return cell && cell.colSpan > 1 ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.splitToCols(cell); + rng.moveToBookmark(bk).select(); + + } + }; + + UE.commands["adaptbytext"] = + UE.commands["adaptbywindow"] = { + queryCommandState: function () { + return getTableItemsByRange(this).table ? 0 : -1 + }, + execCommand: function (cmd) { + var tableItems = getTableItemsByRange(this), + table = tableItems.table; + if (table) { + if (cmd == 'adaptbywindow') { + resetTdWidth(table, this); + } else { + var cells = domUtils.getElementsByTagName(table, "td th"); + utils.each(cells, function (cell) { + cell.removeAttribute("width"); + }); + table.removeAttribute("width"); + } + } + } + }; + + //平均分配各列 + UE.commands['averagedistributecol'] = { + queryCommandState: function () { + var ut = getUETableBySelected(this); + if (!ut) return -1; + return ut.isFullRow() || ut.isFullCol() ? 0 : -1; + }, + execCommand: function (cmd) { + var me = this, + ut = getUETableBySelected(me); + + function getAverageWidth() { + var tb = ut.table, + averageWidth, sumWidth = 0, colsNum = 0, + tbAttr = getDefaultValue(me, tb); + + if (ut.isFullRow()) { + sumWidth = tb.offsetWidth; + colsNum = ut.colsNum; + } else { + var begin = ut.cellsRange.beginColIndex, + end = ut.cellsRange.endColIndex, + node; + for (var i = begin; i <= end;) { + node = ut.selectedTds[i]; + sumWidth += node.offsetWidth; + i += node.colSpan; + colsNum += 1; + } + } + averageWidth = Math.ceil(sumWidth / colsNum) - tbAttr.tdBorder * 2 - tbAttr.tdPadding * 2; + return averageWidth; + } + + function setAverageWidth(averageWidth) { + utils.each(domUtils.getElementsByTagName(ut.table, "th"), function (node) { + node.setAttribute("width", ""); + }); + var cells = ut.isFullRow() ? domUtils.getElementsByTagName(ut.table, "td") : ut.selectedTds; + + utils.each(cells, function (node) { + if (node.colSpan == 1) { + node.setAttribute("width", averageWidth); + } + }); + } + + if (ut && ut.selectedTds.length) { + setAverageWidth(getAverageWidth()); + } + } + }; + //平均分配各行 + UE.commands['averagedistributerow'] = { + queryCommandState: function () { + var ut = getUETableBySelected(this); + if (!ut) return -1; + if (ut.selectedTds && /th/ig.test(ut.selectedTds[0].tagName)) return -1; + return ut.isFullRow() || ut.isFullCol() ? 0 : -1; + }, + execCommand: function (cmd) { + var me = this, + ut = getUETableBySelected(me); + + function getAverageHeight() { + var averageHeight, rowNum, sumHeight = 0, + tb = ut.table, + tbAttr = getDefaultValue(me, tb), + tdpadding = parseInt(domUtils.getComputedStyle(tb.getElementsByTagName('td')[0], "padding-top")); + + if (ut.isFullCol()) { + var captionArr = domUtils.getElementsByTagName(tb, "caption"), + thArr = domUtils.getElementsByTagName(tb, "th"), + captionHeight, thHeight; + + if (captionArr.length > 0) { + captionHeight = captionArr[0].offsetHeight; + } + if (thArr.length > 0) { + thHeight = thArr[0].offsetHeight; + } + + sumHeight = tb.offsetHeight - (captionHeight || 0) - (thHeight || 0); + rowNum = thArr.length == 0 ? ut.rowsNum : (ut.rowsNum - 1); + } else { + var begin = ut.cellsRange.beginRowIndex, + end = ut.cellsRange.endRowIndex, + count = 0, + trs = domUtils.getElementsByTagName(tb, "tr"); + for (var i = begin; i <= end; i++) { + sumHeight += trs[i].offsetHeight; + count += 1; + } + rowNum = count; + } + //ie8下是混杂模式 + if (browser.ie && browser.version < 9) { + averageHeight = Math.ceil(sumHeight / rowNum); + } else { + averageHeight = Math.ceil(sumHeight / rowNum) - tbAttr.tdBorder * 2 - tdpadding * 2; + } + return averageHeight; + } + + function setAverageHeight(averageHeight) { + var cells = ut.isFullCol() ? domUtils.getElementsByTagName(ut.table, "td") : ut.selectedTds; + utils.each(cells, function (node) { + if (node.rowSpan == 1) { + node.setAttribute("height", averageHeight); + } + }); + } + + if (ut && ut.selectedTds.length) { + setAverageHeight(getAverageHeight()); + } + } + }; + + //单元格对齐方式 + UE.commands['cellalignment'] = { + queryCommandState: function () { + return getTableItemsByRange(this).table ? 0 : -1 + }, + execCommand: function (cmd, data) { + var me = this, + ut = getUETableBySelected(me); + + if (!ut) { + var start = me.selection.getStart(), + cell = start && domUtils.findParentByTagName(start, ["td", "th", "caption"], true); + if (!/caption/ig.test(cell.tagName)) { + domUtils.setAttributes(cell, data); + } else { + cell.style.textAlign = data.align; + cell.style.verticalAlign = data.vAlign; + } + me.selection.getRange().setCursor(true); + } else { + utils.each(ut.selectedTds, function (cell) { + domUtils.setAttributes(cell, data); + }); + } + }, + /** + * 查询当前点击的单元格的对齐状态, 如果当前已经选择了多个单元格, 则会返回所有单元格经过统一协调过后的状态 + * @see UE.UETable.getTableCellAlignState + */ + queryCommandValue: function (cmd) { + + var activeMenuCell = getTableItemsByRange( this).cell; + + if( !activeMenuCell ) { + activeMenuCell = getSelectedArr(this)[0]; + } + + if (!activeMenuCell) { + + return null; + + } else { + + //获取同时选中的其他单元格 + var cells = UE.UETable.getUETable(activeMenuCell).selectedTds; + + !cells.length && ( cells = activeMenuCell ); + + return UE.UETable.getTableCellAlignState(cells); + + } + + } + }; + //表格对齐方式 + UE.commands['tablealignment'] = { + queryCommandState: function () { + if (browser.ie && browser.version < 8) { + return -1; + } + return getTableItemsByRange(this).table ? 0 : -1 + }, + execCommand: function (cmd, value) { + var me = this, + start = me.selection.getStart(), + table = start && domUtils.findParentByTagName(start, ["table"], true); + + if (table) { + table.setAttribute("align",value); + } + } + }; + + //表格属性 + UE.commands['edittable'] = { + queryCommandState: function () { + return getTableItemsByRange(this).table ? 0 : -1 + }, + execCommand: function (cmd, color) { + var rng = this.selection.getRange(), + table = domUtils.findParentByTagName(rng.startContainer, 'table'); + if (table) { + var arr = domUtils.getElementsByTagName(table, "td").concat( + domUtils.getElementsByTagName(table, "th"), + domUtils.getElementsByTagName(table, "caption") + ); + utils.each(arr, function (node) { + node.style.borderColor = color; + }); + } + } + }; + //单元格属性 + UE.commands['edittd'] = { + queryCommandState: function () { + return getTableItemsByRange(this).table ? 0 : -1 + }, + execCommand: function (cmd, bkColor) { + var me = this, + ut = getUETableBySelected(me); + + if (!ut) { + var start = me.selection.getStart(), + cell = start && domUtils.findParentByTagName(start, ["td", "th", "caption"], true); + if (cell) { + cell.style.backgroundColor = bkColor; + } + } else { + utils.each(ut.selectedTds, function (cell) { + cell.style.backgroundColor = bkColor; + }); + } + } + }; + + UE.commands["settablebackground"] = { + queryCommandState: function () { + return getSelectedArr(this).length > 1 ? 0 : -1; + }, + execCommand: function (cmd, value) { + var cells, ut; + cells = getSelectedArr(this); + ut = getUETable(cells[0]); + ut.setBackground(cells, value); + } + }; + + UE.commands["cleartablebackground"] = { + queryCommandState: function () { + var cells = getSelectedArr(this); + if (!cells.length)return -1; + for (var i = 0, cell; cell = cells[i++];) { + if (cell.style.backgroundColor !== "") return 0; + } + return -1; + }, + execCommand: function () { + var cells = getSelectedArr(this), + ut = getUETable(cells[0]); + ut.removeBackground(cells); + } + }; + + UE.commands["interlacetable"] = UE.commands["uninterlacetable"] = { + queryCommandState: function (cmd) { + var table = getTableItemsByRange(this).table; + if (!table) return -1; + var interlaced = table.getAttribute("interlaced"); + if (cmd == "interlacetable") { + //TODO 待定 + //是否需要待定,如果设置,则命令只能单次执行成功,但反射具备toggle效果;否则可以覆盖前次命令,但反射将不存在toggle效果 + return (interlaced === "enabled") ? -1 : 0; + } else { + return (!interlaced || interlaced === "disabled") ? -1 : 0; + } + }, + execCommand: function (cmd, classList) { + var table = getTableItemsByRange(this).table; + if (cmd == "interlacetable") { + table.setAttribute("interlaced", "enabled"); + this.fireEvent("interlacetable", table, classList); + } else { + table.setAttribute("interlaced", "disabled"); + this.fireEvent("uninterlacetable", table); + } + } + }; + UE.commands["setbordervisible"] = { + queryCommandState: function (cmd) { + var table = getTableItemsByRange(this).table; + if (!table) return -1; + return 0; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + utils.each(domUtils.getElementsByTagName(table,'td'),function(td){ + td.style.borderWidth = '1px'; + td.style.borderStyle = 'solid'; + }) + } + }; + function resetTdWidth(table, editor) { + var tds = domUtils.getElementsByTagName(table,'td th'); + utils.each(tds, function (td) { + td.removeAttribute("width"); + }); + table.setAttribute('width', getTableWidth(editor, true, getDefaultValue(editor, table))); + var tdsWidths = []; + setTimeout(function () { + utils.each(tds, function (td) { + (td.colSpan == 1) && tdsWidths.push(td.offsetWidth) + }) + utils.each(tds, function (td,i) { + (td.colSpan == 1) && td.setAttribute("width", tdsWidths[i] + ""); + }) + }, 0); + } + + function getTableWidth(editor, needIEHack, defaultValue) { + var body = editor.body; + return body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (editor.options.offsetWidth || 0); + } + + function getSelectedArr(editor) { + var cell = getTableItemsByRange(editor).cell; + if (cell) { + var ut = getUETable(cell); + return ut.selectedTds.length ? ut.selectedTds : [cell]; + } else { + return []; + } + } +})(); + + +// plugins/table.action.js +/** + * Created with JetBrains PhpStorm. + * User: taoqili + * Date: 12-10-12 + * Time: 上午10:05 + * To change this template use File | Settings | File Templates. + */ +UE.plugins['table'] = function () { + var me = this, + tabTimer = null, + //拖动计时器 + tableDragTimer = null, + //双击计时器 + tableResizeTimer = null, + //单元格最小宽度 + cellMinWidth = 5, + isInResizeBuffer = false, + //单元格边框大小 + cellBorderWidth = 5, + //鼠标偏移距离 + offsetOfTableCell = 10, + //记录在有限时间内的点击状态, 共有3个取值, 0, 1, 2。 0代表未初始化, 1代表单击了1次,2代表2次 + singleClickState = 0, + userActionStatus = null, + //双击允许的时间范围 + dblclickTime = 360, + UT = UE.UETable, + getUETable = function (tdOrTable) { + return UT.getUETable(tdOrTable); + }, + getUETableBySelected = function (editor) { + return UT.getUETableBySelected(editor); + }, + getDefaultValue = function (editor, table) { + return UT.getDefaultValue(editor, table); + }, + removeSelectedClass = function (cells) { + return UT.removeSelectedClass(cells); + }; + + function showError(e) { +// throw e; + } + me.ready(function(){ + var me = this; + var orgGetText = me.selection.getText; + me.selection.getText = function(){ + var table = getUETableBySelected(me); + if(table){ + var str = ''; + utils.each(table.selectedTds,function(td){ + str += td[browser.ie?'innerText':'textContent']; + }) + return str; + }else{ + return orgGetText.call(me.selection) + } + + } + }) + + //处理拖动及框选相关方法 + var startTd = null, //鼠标按下时的锚点td + currentTd = null, //当前鼠标经过时的td + onDrag = "", //指示当前拖动状态,其值可为"","h","v" ,分别表示未拖动状态,横向拖动状态,纵向拖动状态,用于鼠标移动过程中的判断 + onBorder = false, //检测鼠标按下时是否处在单元格边缘位置 + dragButton = null, + dragOver = false, + dragLine = null, //模拟的拖动线 + dragTd = null; //发生拖动的目标td + + var mousedown = false, + //todo 判断混乱模式 + needIEHack = true; + + me.setOpt({ + 'maxColNum':20, + 'maxRowNum':100, + 'defaultCols':5, + 'defaultRows':5, + 'tdvalign':'top', + 'cursorpath':me.options.UEDITOR_HOME_URL + "themes/default/images/cursor_", + 'tableDragable':false, + 'classList':["ue-table-interlace-color-single","ue-table-interlace-color-double"] + }); + me.getUETable = getUETable; + var commands = { + 'deletetable':1, + 'inserttable':1, + 'cellvalign':1, + 'insertcaption':1, + 'deletecaption':1, + 'inserttitle':1, + 'deletetitle':1, + "mergeright":1, + "mergedown":1, + "mergecells":1, + "insertrow":1, + "insertrownext":1, + "deleterow":1, + "insertcol":1, + "insertcolnext":1, + "deletecol":1, + "splittocells":1, + "splittorows":1, + "splittocols":1, + "adaptbytext":1, + "adaptbywindow":1, + "adaptbycustomer":1, + "insertparagraph":1, + "insertparagraphbeforetable":1, + "averagedistributecol":1, + "averagedistributerow":1 + }; + me.ready(function () { + utils.cssRule('table', + //选中的td上的样式 + '.selectTdClass{background-color:#edf5fa !important}' + + 'table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}' + + //插入的表格的默认样式 + 'table{margin-bottom:10px;border-collapse:collapse;display:table;}' + + 'td,th{padding: 5px 10px;border: 1px solid #DDD;}' + + 'caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}' + + 'th{border-top:1px solid #BBB;background-color:#F7F7F7;}' + + 'table tr.firstRow th{border-top-width:2px;}' + + '.ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }' + + 'td p{margin:0;padding:0;}', me.document); + + var tableCopyList, isFullCol, isFullRow; + //注册del/backspace事件 + me.addListener('keydown', function (cmd, evt) { + var me = this; + var keyCode = evt.keyCode || evt.which; + + if (keyCode == 8) { + + var ut = getUETableBySelected(me); + if (ut && ut.selectedTds.length) { + + if (ut.isFullCol()) { + me.execCommand('deletecol') + } else if (ut.isFullRow()) { + me.execCommand('deleterow') + } else { + me.fireEvent('delcells'); + } + domUtils.preventDefault(evt); + } + + var caption = domUtils.findParentByTagName(me.selection.getStart(), 'caption', true), + range = me.selection.getRange(); + if (range.collapsed && caption && isEmptyBlock(caption)) { + me.fireEvent('saveScene'); + var table = caption.parentNode; + domUtils.remove(caption); + if (table) { + range.setStart(table.rows[0].cells[0], 0).setCursor(false, true); + } + me.fireEvent('saveScene'); + } + + } + + if (keyCode == 46) { + + ut = getUETableBySelected(me); + if (ut) { + me.fireEvent('saveScene'); + for (var i = 0, ci; ci = ut.selectedTds[i++];) { + domUtils.fillNode(me.document, ci) + } + me.fireEvent('saveScene'); + domUtils.preventDefault(evt); + + } + + } + if (keyCode == 13) { + + var rng = me.selection.getRange(), + caption = domUtils.findParentByTagName(rng.startContainer, 'caption', true); + if (caption) { + var table = domUtils.findParentByTagName(caption, 'table'); + if (!rng.collapsed) { + + rng.deleteContents(); + me.fireEvent('saveScene'); + } else { + if (caption) { + rng.setStart(table.rows[0].cells[0], 0).setCursor(false, true); + } + } + domUtils.preventDefault(evt); + return; + } + if (rng.collapsed) { + var table = domUtils.findParentByTagName(rng.startContainer, 'table'); + if (table) { + var cell = table.rows[0].cells[0], + start = domUtils.findParentByTagName(me.selection.getStart(), ['td', 'th'], true), + preNode = table.previousSibling; + if (cell === start && (!preNode || preNode.nodeType == 1 && preNode.tagName == 'TABLE' ) && domUtils.isStartInblock(rng)) { + var first = domUtils.findParent(me.selection.getStart(), function(n){return domUtils.isBlockElm(n)}, true); + if(first && ( /t(h|d)/i.test(first.tagName) || first === start.firstChild )){ + me.execCommand('insertparagraphbeforetable'); + domUtils.preventDefault(evt); + } + + } + } + } + } + + if ((evt.ctrlKey || evt.metaKey) && evt.keyCode == '67') { + tableCopyList = null; + var ut = getUETableBySelected(me); + if (ut) { + var tds = ut.selectedTds; + isFullCol = ut.isFullCol(); + isFullRow = ut.isFullRow(); + tableCopyList = [ + [ut.cloneCell(tds[0],null,true)] + ]; + for (var i = 1, ci; ci = tds[i]; i++) { + if (ci.parentNode !== tds[i - 1].parentNode) { + tableCopyList.push([ut.cloneCell(ci,null,true)]); + } else { + tableCopyList[tableCopyList.length - 1].push(ut.cloneCell(ci,null,true)); + } + + } + } + } + }); + me.addListener("tablehasdeleted",function(){ + toggleDraggableState(this, false, "", null); + if (dragButton)domUtils.remove(dragButton); + }); + + me.addListener('beforepaste', function (cmd, html) { + var me = this; + var rng = me.selection.getRange(); + if (domUtils.findParentByTagName(rng.startContainer, 'caption', true)) { + var div = me.document.createElement("div"); + div.innerHTML = html.html; + //trace:3729 + html.html = div[browser.ie9below ? 'innerText' : 'textContent']; + return; + } + var table = getUETableBySelected(me); + if (tableCopyList) { + me.fireEvent('saveScene'); + var rng = me.selection.getRange(); + var td = domUtils.findParentByTagName(rng.startContainer, ['td', 'th'], true), tmpNode, preNode; + if (td) { + var ut = getUETable(td); + if (isFullRow) { + var rowIndex = ut.getCellInfo(td).rowIndex; + if (td.tagName == 'TH') { + rowIndex++; + } + for (var i = 0, ci; ci = tableCopyList[i++];) { + var tr = ut.insertRow(rowIndex++, "td"); + for (var j = 0, cj; cj = ci[j]; j++) { + var cell = tr.cells[j]; + if (!cell) { + cell = tr.insertCell(j) + } + cell.innerHTML = cj.innerHTML; + cj.getAttribute('width') && cell.setAttribute('width', cj.getAttribute('width')); + cj.getAttribute('vAlign') && cell.setAttribute('vAlign', cj.getAttribute('vAlign')); + cj.getAttribute('align') && cell.setAttribute('align', cj.getAttribute('align')); + cj.style.cssText && (cell.style.cssText = cj.style.cssText) + } + for (var j = 0, cj; cj = tr.cells[j]; j++) { + if (!ci[j]) + break; + cj.innerHTML = ci[j].innerHTML; + ci[j].getAttribute('width') && cj.setAttribute('width', ci[j].getAttribute('width')); + ci[j].getAttribute('vAlign') && cj.setAttribute('vAlign', ci[j].getAttribute('vAlign')); + ci[j].getAttribute('align') && cj.setAttribute('align', ci[j].getAttribute('align')); + ci[j].style.cssText && (cj.style.cssText = ci[j].style.cssText) + } + } + } else { + if (isFullCol) { + cellInfo = ut.getCellInfo(td); + var maxColNum = 0; + for (var j = 0, ci = tableCopyList[0], cj; cj = ci[j++];) { + maxColNum += cj.colSpan || 1; + } + me.__hasEnterExecCommand = true; + for (i = 0; i < maxColNum; i++) { + me.execCommand('insertcol'); + } + me.__hasEnterExecCommand = false; + td = ut.table.rows[0].cells[cellInfo.cellIndex]; + if (td.tagName == 'TH') { + td = ut.table.rows[1].cells[cellInfo.cellIndex]; + } + } + for (var i = 0, ci; ci = tableCopyList[i++];) { + tmpNode = td; + for (var j = 0, cj; cj = ci[j++];) { + if (td) { + td.innerHTML = cj.innerHTML; + //todo 定制处理 + cj.getAttribute('width') && td.setAttribute('width', cj.getAttribute('width')); + cj.getAttribute('vAlign') && td.setAttribute('vAlign', cj.getAttribute('vAlign')); + cj.getAttribute('align') && td.setAttribute('align', cj.getAttribute('align')); + cj.style.cssText && (td.style.cssText = cj.style.cssText); + preNode = td; + td = td.nextSibling; + } else { + var cloneTd = cj.cloneNode(true); + domUtils.removeAttributes(cloneTd, ['class', 'rowSpan', 'colSpan']); + + preNode.parentNode.appendChild(cloneTd) + } + } + td = ut.getNextCell(tmpNode, true, true); + if (!tableCopyList[i]) + break; + if (!td) { + var cellInfo = ut.getCellInfo(tmpNode); + ut.table.insertRow(ut.table.rows.length); + ut.update(); + td = ut.getVSideCell(tmpNode, true); + } + } + } + ut.update(); + } else { + table = me.document.createElement('table'); + for (var i = 0, ci; ci = tableCopyList[i++];) { + var tr = table.insertRow(table.rows.length); + for (var j = 0, cj; cj = ci[j++];) { + cloneTd = UT.cloneCell(cj,null,true); + domUtils.removeAttributes(cloneTd, ['class']); + tr.appendChild(cloneTd) + } + if (j == 2 && cloneTd.rowSpan > 1) { + cloneTd.rowSpan = 1; + } + } + + var defaultValue = getDefaultValue(me), + width = me.body.offsetWidth - + (needIEHack ? parseInt(domUtils.getComputedStyle(me.body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (me.options.offsetWidth || 0); + me.execCommand('insertHTML', '' + table.innerHTML.replace(/>\s*<').replace(/\bth\b/gi, "td") + '
    ') + } + me.fireEvent('contentchange'); + me.fireEvent('saveScene'); + html.html = ''; + return true; + } else { + var div = me.document.createElement("div"), tables; + div.innerHTML = html.html; + tables = div.getElementsByTagName("table"); + if (domUtils.findParentByTagName(me.selection.getStart(), 'table')) { + utils.each(tables, function (t) { + domUtils.remove(t) + }); + if (domUtils.findParentByTagName(me.selection.getStart(), 'caption', true)) { + div.innerHTML = div[browser.ie ? 'innerText' : 'textContent']; + } + } else { + utils.each(tables, function (table) { + removeStyleSize(table, true); + domUtils.removeAttributes(table, ['style', 'border']); + utils.each(domUtils.getElementsByTagName(table, "td"), function (td) { + if (isEmptyBlock(td)) { + domUtils.fillNode(me.document, td); + } + removeStyleSize(td, true); +// domUtils.removeAttributes(td, ['style']) + }); + }); + } + html.html = div.innerHTML; + } + }); + + me.addListener('afterpaste', function () { + utils.each(domUtils.getElementsByTagName(me.body, "table"), function (table) { + if (table.offsetWidth > me.body.offsetWidth) { + var defaultValue = getDefaultValue(me, table); + table.style.width = me.body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(me.body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (me.options.offsetWidth || 0) + 'px' + } + }) + }); + me.addListener('blur', function () { + tableCopyList = null; + }); + var timer; + me.addListener('keydown', function () { + clearTimeout(timer); + timer = setTimeout(function () { + var rng = me.selection.getRange(), + cell = domUtils.findParentByTagName(rng.startContainer, ['th', 'td'], true); + if (cell) { + var table = cell.parentNode.parentNode.parentNode; + if (table.offsetWidth > table.getAttribute("width")) { + cell.style.wordBreak = "break-all"; + } + } + + }, 100); + }); + me.addListener("selectionchange", function () { + toggleDraggableState(me, false, "", null); + }); + + + //内容变化时触发索引更新 + //todo 可否考虑标记检测,如果不涉及表格的变化就不进行索引重建和更新 + me.addListener("contentchange", function () { + var me = this; + //尽可能排除一些不需要更新的状况 + hideDragLine(me); + if (getUETableBySelected(me))return; + var rng = me.selection.getRange(); + var start = rng.startContainer; + start = domUtils.findParentByTagName(start, ['td', 'th'], true); + utils.each(domUtils.getElementsByTagName(me.document, 'table'), function (table) { + if (me.fireEvent("excludetable", table) === true) return; + table.ueTable = new UT(table); + //trace:3742 +// utils.each(domUtils.getElementsByTagName(me.document, 'td'), function (td) { +// +// if (domUtils.isEmptyBlock(td) && td !== start) { +// domUtils.fillNode(me.document, td); +// if (browser.ie && browser.version == 6) { +// td.innerHTML = ' ' +// } +// } +// }); +// utils.each(domUtils.getElementsByTagName(me.document, 'th'), function (th) { +// if (domUtils.isEmptyBlock(th) && th !== start) { +// domUtils.fillNode(me.document, th); +// if (browser.ie && browser.version == 6) { +// th.innerHTML = ' ' +// } +// } +// }); + table.onmouseover = function () { + me.fireEvent('tablemouseover', table); + }; + table.onmousemove = function () { + me.fireEvent('tablemousemove', table); + me.options.tableDragable && toggleDragButton(true, this, me); + utils.defer(function(){ + me.fireEvent('contentchange',50) + },true) + }; + table.onmouseout = function () { + me.fireEvent('tablemouseout', table); + toggleDraggableState(me, false, "", null); + hideDragLine(me); + }; + table.onclick = function (evt) { + evt = me.window.event || evt; + var target = getParentTdOrTh(evt.target || evt.srcElement); + if (!target)return; + var ut = getUETable(target), + table = ut.table, + cellInfo = ut.getCellInfo(target), + cellsRange, + rng = me.selection.getRange(); +// if ("topLeft" == inPosition(table, mouseCoords(evt))) { +// cellsRange = ut.getCellsRange(ut.table.rows[0].cells[0], ut.getLastCell()); +// ut.setSelected(cellsRange); +// return; +// } +// if ("bottomRight" == inPosition(table, mouseCoords(evt))) { +// +// return; +// } + if (inTableSide(table, target, evt, true)) { + var endTdCol = ut.getCell(ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].rowIndex, ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].cellIndex); + if (evt.shiftKey && ut.selectedTds.length) { + if (ut.selectedTds[0] !== endTdCol) { + cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdCol); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdCol).select(); + } + } else { + if (target !== endTdCol) { + cellsRange = ut.getCellsRange(target, endTdCol); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdCol).select(); + } + } + return; + } + if (inTableSide(table, target, evt)) { + var endTdRow = ut.getCell(ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].rowIndex, ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].cellIndex); + if (evt.shiftKey && ut.selectedTds.length) { + if (ut.selectedTds[0] !== endTdRow) { + cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdRow); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdRow).select(); + } + } else { + if (target !== endTdRow) { + cellsRange = ut.getCellsRange(target, endTdRow); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdRow).select(); + } + } + } + }; + }); + + switchBorderColor(me, true); + }); + + domUtils.on(me.document, "mousemove", mouseMoveEvent); + + domUtils.on(me.document, "mouseout", function (evt) { + var target = evt.target || evt.srcElement; + if (target.tagName == "TABLE") { + toggleDraggableState(me, false, "", null); + } + }); + /** + * 表格隔行变色 + */ + me.addListener("interlacetable",function(type,table,classList){ + if(!table) return; + var me = this, + rows = table.rows, + len = rows.length, + getClass = function(list,index,repeat){ + return list[index] ? list[index] : repeat ? list[index % list.length]: ""; + }; + for(var i = 0;i 1 ? currentRowIndex : ua.getCellInfo(cell).rowIndex; + var nextCell = ua.getTabNextCell(cell, currentRowIndex); + if (nextCell) { + if (isEmptyBlock(nextCell)) { + range.setStart(nextCell, 0).setCursor(false, true) + } else { + range.selectNodeContents(nextCell).select() + } + } else { + me.fireEvent('saveScene'); + me.__hasEnterExecCommand = true; + this.execCommand('insertrownext'); + me.__hasEnterExecCommand = false; + range = this.selection.getRange(); + range.setStart(table.rows[table.rows.length - 1].cells[0], 0).setCursor(); + me.fireEvent('saveScene'); + } + } + return true; + } + + }); + browser.ie && me.addListener('selectionchange', function () { + toggleDraggableState(this, false, "", null); + }); + me.addListener("keydown", function (type, evt) { + var me = this; + //处理在表格的最后一个输入tab产生新的表格 + var keyCode = evt.keyCode || evt.which; + if (keyCode == 8 || keyCode == 46) { + return; + } + var notCtrlKey = !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey; + notCtrlKey && removeSelectedClass(domUtils.getElementsByTagName(me.body, "td")); + var ut = getUETableBySelected(me); + if (!ut) return; + notCtrlKey && ut.clearSelected(); + }); + + me.addListener("beforegetcontent", function () { + switchBorderColor(this, false); + browser.ie && utils.each(this.document.getElementsByTagName('caption'), function (ci) { + if (domUtils.isEmptyNode(ci)) { + ci.innerHTML = ' ' + } + }); + }); + me.addListener("aftergetcontent", function () { + switchBorderColor(this, true); + }); + me.addListener("getAllHtml", function () { + removeSelectedClass(me.document.getElementsByTagName("td")); + }); + //修正全屏状态下插入的表格宽度在非全屏状态下撑开编辑器的情况 + me.addListener("fullscreenchanged", function (type, fullscreen) { + if (!fullscreen) { + var ratio = this.body.offsetWidth / document.body.offsetWidth, + tables = domUtils.getElementsByTagName(this.body, "table"); + utils.each(tables, function (table) { + if (table.offsetWidth < me.body.offsetWidth) return false; + var tds = domUtils.getElementsByTagName(table, "td"), + backWidths = []; + utils.each(tds, function (td) { + backWidths.push(td.offsetWidth); + }); + for (var i = 0, td; td = tds[i]; i++) { + td.setAttribute("width", Math.floor(backWidths[i] * ratio)); + } + table.setAttribute("width", Math.floor(getTableWidth(me, needIEHack, getDefaultValue(me)))) + }); + } + }); + + //重写execCommand命令,用于处理框选时的处理 + var oldExecCommand = me.execCommand; + me.execCommand = function (cmd, datatat) { + + var me = this, + args = arguments; + + cmd = cmd.toLowerCase(); + var ut = getUETableBySelected(me), tds, + range = new dom.Range(me.document), + cmdFun = me.commands[cmd] || UE.commands[cmd], + result; + if (!cmdFun) return; + if (ut && !commands[cmd] && !cmdFun.notNeedUndo && !me.__hasEnterExecCommand) { + me.__hasEnterExecCommand = true; + me.fireEvent("beforeexeccommand", cmd); + tds = ut.selectedTds; + var lastState = -2, lastValue = -2, value, state; + for (var i = 0, td; td = tds[i]; i++) { + if (isEmptyBlock(td)) { + range.setStart(td, 0).setCursor(false, true) + } else { + range.selectNode(td).select(true); + } + state = me.queryCommandState(cmd); + value = me.queryCommandValue(cmd); + if (state != -1) { + if (lastState !== state || lastValue !== value) { + me._ignoreContentChange = true; + result = oldExecCommand.apply(me, arguments); + me._ignoreContentChange = false; + + } + lastState = me.queryCommandState(cmd); + lastValue = me.queryCommandValue(cmd); + if (domUtils.isEmptyBlock(td)) { + domUtils.fillNode(me.document, td) + } + } + } + range.setStart(tds[0], 0).shrinkBoundary(true).setCursor(false, true); + me.fireEvent('contentchange'); + me.fireEvent("afterexeccommand", cmd); + me.__hasEnterExecCommand = false; + me._selectionChange(); + } else { + result = oldExecCommand.apply(me, arguments); + } + return result; + }; + + + }); + /** + * 删除obj的宽高style,改成属性宽高 + * @param obj + * @param replaceToProperty + */ + function removeStyleSize(obj, replaceToProperty) { + removeStyle(obj, "width", true); + removeStyle(obj, "height", true); + } + + function removeStyle(obj, styleName, replaceToProperty) { + if (obj.style[styleName]) { + replaceToProperty && obj.setAttribute(styleName, parseInt(obj.style[styleName], 10)); + obj.style[styleName] = ""; + } + } + + function getParentTdOrTh(ele) { + if (ele.tagName == "TD" || ele.tagName == "TH") return ele; + var td; + if (td = domUtils.findParentByTagName(ele, "td", true) || domUtils.findParentByTagName(ele, "th", true)) return td; + return null; + } + + function isEmptyBlock(node) { + var reg = new RegExp(domUtils.fillChar, 'g'); + if (node[browser.ie ? 'innerText' : 'textContent'].replace(/^\s*$/, '').replace(reg, '').length > 0) { + return 0; + } + for (var n in dtd.$isNotEmpty) { + if (node.getElementsByTagName(n).length) { + return 0; + } + } + return 1; + } + + + function mouseCoords(evt) { + if (evt.pageX || evt.pageY) { + return { x:evt.pageX, y:evt.pageY }; + } + return { + x:evt.clientX + me.document.body.scrollLeft - me.document.body.clientLeft, + y:evt.clientY + me.document.body.scrollTop - me.document.body.clientTop + }; + } + + function mouseMoveEvent(evt) { + + if( isEditorDisabled() ) { + return; + } + + try { + + //普通状态下鼠标移动 + var target = getParentTdOrTh(evt.target || evt.srcElement), + pos; + + //区分用户的行为是拖动还是双击 + if( isInResizeBuffer ) { + + me.body.style.webkitUserSelect = 'none'; + + if( Math.abs( userActionStatus.x - evt.clientX ) > offsetOfTableCell || Math.abs( userActionStatus.y - evt.clientY ) > offsetOfTableCell ) { + clearTableDragTimer(); + isInResizeBuffer = false; + singleClickState = 0; + //drag action + tableBorderDrag(evt); + } + } + + //修改单元格大小时的鼠标移动 + if (onDrag && dragTd) { + singleClickState = 0; + me.body.style.webkitUserSelect = 'none'; + me.selection.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges'](); + pos = mouseCoords(evt); + toggleDraggableState(me, true, onDrag, pos, target); + if (onDrag == "h") { + dragLine.style.left = getPermissionX(dragTd, evt) + "px"; + } else if (onDrag == "v") { + dragLine.style.top = getPermissionY(dragTd, evt) + "px"; + } + return; + } + //当鼠标处于table上时,修改移动过程中的光标状态 + if (target) { + //针对使用table作为容器的组件不触发拖拽效果 + if (me.fireEvent('excludetable', target) === true) + return; + pos = mouseCoords(evt); + var state = getRelation(target, pos), + table = domUtils.findParentByTagName(target, "table", true); + + if (inTableSide(table, target, evt, true)) { + if (me.fireEvent("excludetable", table) === true) return; + me.body.style.cursor = "url(" + me.options.cursorpath + "h.png),pointer"; + } else if (inTableSide(table, target, evt)) { + if (me.fireEvent("excludetable", table) === true) return; + me.body.style.cursor = "url(" + me.options.cursorpath + "v.png),pointer"; + } else { + me.body.style.cursor = "text"; + var curCell = target; + if (/\d/.test(state)) { + state = state.replace(/\d/, ''); + target = getUETable(target).getPreviewCell(target, state == "v"); + } + //位于第一行的顶部或者第一列的左边时不可拖动 + toggleDraggableState(me, target ? !!state : false, target ? state : '', pos, target); + + } + } else { + toggleDragButton(false, table, me); + } + + } catch (e) { + showError(e); + } + } + + var dragButtonTimer; + + function toggleDragButton(show, table, editor) { + if (!show) { + if (dragOver)return; + dragButtonTimer = setTimeout(function () { + !dragOver && dragButton && dragButton.parentNode && dragButton.parentNode.removeChild(dragButton); + }, 2000); + } else { + createDragButton(table, editor); + } + } + + function createDragButton(table, editor) { + var pos = domUtils.getXY(table), + doc = table.ownerDocument; + if (dragButton && dragButton.parentNode)return dragButton; + dragButton = doc.createElement("div"); + dragButton.contentEditable = false; + dragButton.innerHTML = ""; + dragButton.style.cssText = "width:15px;height:15px;background-image:url(" + editor.options.UEDITOR_HOME_URL + "dialogs/table/dragicon.png);position: absolute;cursor:move;top:" + (pos.y - 15) + "px;left:" + (pos.x) + "px;"; + domUtils.unSelectable(dragButton); + dragButton.onmouseover = function (evt) { + dragOver = true; + }; + dragButton.onmouseout = function (evt) { + dragOver = false; + }; + domUtils.on(dragButton, 'click', function (type, evt) { + doClick(evt, this); + }); + domUtils.on(dragButton, 'dblclick', function (type, evt) { + doDblClick(evt); + }); + domUtils.on(dragButton, 'dragstart', function (type, evt) { + domUtils.preventDefault(evt); + }); + var timer; + + function doClick(evt, button) { + // 部分浏览器下需要清理 + clearTimeout(timer); + timer = setTimeout(function () { + editor.fireEvent("tableClicked", table, button); + }, 300); + } + + function doDblClick(evt) { + clearTimeout(timer); + var ut = getUETable(table), + start = table.rows[0].cells[0], + end = ut.getLastCell(), + range = ut.getCellsRange(start, end); + editor.selection.getRange().setStart(start, 0).setCursor(false, true); + ut.setSelected(range); + } + + doc.body.appendChild(dragButton); + } + + +// function inPosition(table, pos) { +// var tablePos = domUtils.getXY(table), +// width = table.offsetWidth, +// height = table.offsetHeight; +// if (pos.x - tablePos.x < 5 && pos.y - tablePos.y < 5) { +// return "topLeft"; +// } else if (tablePos.x + width - pos.x < 5 && tablePos.y + height - pos.y < 5) { +// return "bottomRight"; +// } +// } + + function inTableSide(table, cell, evt, top) { + var pos = mouseCoords(evt), + state = getRelation(cell, pos); + + if (top) { + var caption = table.getElementsByTagName("caption")[0], + capHeight = caption ? caption.offsetHeight : 0; + return (state == "v1") && ((pos.y - domUtils.getXY(table).y - capHeight) < 8); + } else { + return (state == "h1") && ((pos.x - domUtils.getXY(table).x) < 8); + } + } + + /** + * 获取拖动时允许的X轴坐标 + * @param dragTd + * @param evt + */ + function getPermissionX(dragTd, evt) { + var ut = getUETable(dragTd); + if (ut) { + var preTd = ut.getSameEndPosCells(dragTd, "x")[0], + nextTd = ut.getSameStartPosXCells(dragTd)[0], + mouseX = mouseCoords(evt).x, + left = (preTd ? domUtils.getXY(preTd).x : domUtils.getXY(ut.table).x) + 20 , + right = nextTd ? domUtils.getXY(nextTd).x + nextTd.offsetWidth - 20 : (me.body.offsetWidth + 5 || parseInt(domUtils.getComputedStyle(me.body, "width"), 10)); + + left += cellMinWidth; + right -= cellMinWidth; + + return mouseX < left ? left : mouseX > right ? right : mouseX; + } + } + + /** + * 获取拖动时允许的Y轴坐标 + */ + function getPermissionY(dragTd, evt) { + try { + var top = domUtils.getXY(dragTd).y, + mousePosY = mouseCoords(evt).y; + return mousePosY < top ? top : mousePosY; + } catch (e) { + showError(e); + } + } + + /** + * 移动状态切换 + */ + function toggleDraggableState(editor, draggable, dir, mousePos, cell) { + try { + editor.body.style.cursor = dir == "h" ? "col-resize" : dir == "v" ? "row-resize" : "text"; + if (browser.ie) { + if (dir && !mousedown && !getUETableBySelected(editor)) { + getDragLine(editor, editor.document); + showDragLineAt(dir, cell); + } else { + hideDragLine(editor) + } + } + onBorder = draggable; + } catch (e) { + showError(e); + } + } + + /** + * 获取与UETable相关的resize line + * @param uetable UETable对象 + */ + function getResizeLineByUETable() { + + var lineId = '_UETableResizeLine', + line = this.document.getElementById( lineId ); + + if( !line ) { + line = this.document.createElement("div"); + line.id = lineId; + line.contnetEditable = false; + line.setAttribute("unselectable", "on"); + + var styles = { + width: 2*cellBorderWidth + 1 + 'px', + position: 'absolute', + 'z-index': 100000, + cursor: 'col-resize', + background: 'red', + display: 'none' + }; + + //切换状态 + line.onmouseout = function(){ + this.style.display = 'none'; + }; + + utils.extend( line.style, styles ); + + this.document.body.appendChild( line ); + + } + + return line; + + } + + /** + * 更新resize-line + */ + function updateResizeLine( cell, uetable ) { + + var line = getResizeLineByUETable.call( this ), + table = uetable.table, + styles = { + top: domUtils.getXY( table ).y + 'px', + left: domUtils.getXY( cell).x + cell.offsetWidth - cellBorderWidth + 'px', + display: 'block', + height: table.offsetHeight + 'px' + }; + + utils.extend( line.style, styles ); + + } + + /** + * 显示resize-line + */ + function showResizeLine( cell ) { + + var uetable = getUETable( cell ); + + updateResizeLine.call( this, cell, uetable ); + + } + + /** + * 获取鼠标与当前单元格的相对位置 + * @param ele + * @param mousePos + */ + function getRelation(ele, mousePos) { + var elePos = domUtils.getXY(ele); + + if( !elePos ) { + return ''; + } + + if (elePos.x + ele.offsetWidth - mousePos.x < cellBorderWidth) { + return "h"; + } + if (mousePos.x - elePos.x < cellBorderWidth) { + return 'h1' + } + if (elePos.y + ele.offsetHeight - mousePos.y < cellBorderWidth) { + return "v"; + } + if (mousePos.y - elePos.y < cellBorderWidth) { + return 'v1' + } + return ''; + } + + function mouseDownEvent(type, evt) { + + if( isEditorDisabled() ) { + return ; + } + + userActionStatus = { + x: evt.clientX, + y: evt.clientY + }; + + //右键菜单单独处理 + if (evt.button == 2) { + var ut = getUETableBySelected(me), + flag = false; + + if (ut) { + var td = getTargetTd(me, evt); + utils.each(ut.selectedTds, function (ti) { + if (ti === td) { + flag = true; + } + }); + if (!flag) { + removeSelectedClass(domUtils.getElementsByTagName(me.body, "th td")); + ut.clearSelected() + } else { + td = ut.selectedTds[0]; + setTimeout(function () { + me.selection.getRange().setStart(td, 0).setCursor(false, true); + }, 0); + + } + } + } else { + tableClickHander( evt ); + } + + } + + //清除表格的计时器 + function clearTableTimer() { + tabTimer && clearTimeout( tabTimer ); + tabTimer = null; + } + + //双击收缩 + function tableDbclickHandler(evt) { + singleClickState = 0; + evt = evt || me.window.event; + var target = getParentTdOrTh(evt.target || evt.srcElement); + if (target) { + var h; + if (h = getRelation(target, mouseCoords(evt))) { + + hideDragLine( me ); + + if (h == 'h1') { + h = 'h'; + if (inTableSide(domUtils.findParentByTagName(target, "table"), target, evt)) { + me.execCommand('adaptbywindow'); + } else { + target = getUETable(target).getPreviewCell(target); + if (target) { + var rng = me.selection.getRange(); + rng.selectNodeContents(target).setCursor(true, true) + } + } + } + if (h == 'h') { + var ut = getUETable(target), + table = ut.table, + cells = getCellsByMoveBorder( target, table, true ); + + cells = extractArray( cells, 'left' ); + + ut.width = ut.offsetWidth; + + var oldWidth = [], + newWidth = []; + + utils.each( cells, function( cell ){ + + oldWidth.push( cell.offsetWidth ); + + } ); + + utils.each( cells, function( cell ){ + + cell.removeAttribute("width"); + + } ); + + window.setTimeout( function(){ + + //是否允许改变 + var changeable = true; + + utils.each( cells, function( cell, index ){ + + var width = cell.offsetWidth; + + if( width > oldWidth[index] ) { + changeable = false; + return false; + } + + newWidth.push( width ); + + } ); + + var change = changeable ? newWidth : oldWidth; + + utils.each( cells, function( cell, index ){ + + cell.width = change[index] - getTabcellSpace(); + + } ); + + + }, 0 ); + +// minWidth -= cellMinWidth; +// +// table.removeAttribute("width"); +// utils.each(cells, function (cell) { +// cell.style.width = ""; +// cell.width -= minWidth; +// }); + + } + } + } + } + + function tableClickHander( evt ) { + + removeSelectedClass(domUtils.getElementsByTagName(me.body, "td th")); + //trace:3113 + //选中单元格,点击table外部,不会清掉table上挂的ueTable,会引起getUETableBySelected方法返回值 + utils.each(me.document.getElementsByTagName('table'), function (t) { + t.ueTable = null; + }); + startTd = getTargetTd(me, evt); + if( !startTd ) return; + var table = domUtils.findParentByTagName(startTd, "table", true); + ut = getUETable(table); + ut && ut.clearSelected(); + + //判断当前鼠标状态 + if (!onBorder) { + me.document.body.style.webkitUserSelect = ''; + mousedown = true; + me.addListener('mouseover', mouseOverEvent); + } else { + //边框上的动作处理 + borderActionHandler( evt ); + } + + + } + + //处理表格边框上的动作, 这里做延时处理,避免两种动作互相影响 + function borderActionHandler( evt ) { + + if ( browser.ie ) { + evt = reconstruct(evt ); + } + + clearTableDragTimer(); + + //是否正在等待resize的缓冲中 + isInResizeBuffer = true; + + tableDragTimer = setTimeout(function(){ + tableBorderDrag( evt ); + }, dblclickTime); + + } + + function extractArray( originArr, key ) { + + var result = [], + tmp = null; + + for( var i = 0, len = originArr.length; i 0 && singleClickState--; + }, dblclickTime ); + + if( singleClickState === 2 ) { + + singleClickState = 0; + tableDbclickHandler(evt); + return; + + } + + } + + if (evt.button == 2)return; + var me = this; + //清除表格上原生跨选问题 + var range = me.selection.getRange(), + start = domUtils.findParentByTagName(range.startContainer, 'table', true), + end = domUtils.findParentByTagName(range.endContainer, 'table', true); + + if (start || end) { + if (start === end) { + start = domUtils.findParentByTagName(range.startContainer, ['td', 'th', 'caption'], true); + end = domUtils.findParentByTagName(range.endContainer, ['td', 'th', 'caption'], true); + if (start !== end) { + me.selection.clearRange() + } + } else { + me.selection.clearRange() + } + } + mousedown = false; + me.document.body.style.webkitUserSelect = ''; + //拖拽状态下的mouseUP + if ( onDrag && dragTd ) { + + me.selection.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges'](); + + singleClickState = 0; + dragLine = me.document.getElementById('ue_tableDragLine'); + + // trace 3973 + if (dragLine) { + var dragTdPos = domUtils.getXY(dragTd), + dragLinePos = domUtils.getXY(dragLine); + + switch (onDrag) { + case "h": + changeColWidth(dragTd, dragLinePos.x - dragTdPos.x); + break; + case "v": + changeRowHeight(dragTd, dragLinePos.y - dragTdPos.y - dragTd.offsetHeight); + break; + default: + } + onDrag = ""; + dragTd = null; + + hideDragLine(me); + me.fireEvent('saveScene'); + return; + } + } + //正常状态下的mouseup + if (!startTd) { + var target = domUtils.findParentByTagName(evt.target || evt.srcElement, "td", true); + if (!target) target = domUtils.findParentByTagName(evt.target || evt.srcElement, "th", true); + if (target && (target.tagName == "TD" || target.tagName == "TH")) { + if (me.fireEvent("excludetable", target) === true) return; + range = new dom.Range(me.document); + range.setStart(target, 0).setCursor(false, true); + } + } else { + var ut = getUETable(startTd), + cell = ut ? ut.selectedTds[0] : null; + if (cell) { + range = new dom.Range(me.document); + if (domUtils.isEmptyBlock(cell)) { + range.setStart(cell, 0).setCursor(false, true); + } else { + range.selectNodeContents(cell).shrinkBoundary().setCursor(false, true); + } + } else { + range = me.selection.getRange().shrinkBoundary(); + if (!range.collapsed) { + var start = domUtils.findParentByTagName(range.startContainer, ['td', 'th'], true), + end = domUtils.findParentByTagName(range.endContainer, ['td', 'th'], true); + //在table里边的不能清除 + if (start && !end || !start && end || start && end && start !== end) { + range.setCursor(false, true); + } + } + } + startTd = null; + me.removeListener('mouseover', mouseOverEvent); + } + me._selectionChange(250, evt); + } + + function mouseOverEvent(type, evt) { + + if( isEditorDisabled() ) { + return; + } + + var me = this, + tar = evt.target || evt.srcElement; + currentTd = domUtils.findParentByTagName(tar, "td", true) || domUtils.findParentByTagName(tar, "th", true); + //需要判断两个TD是否位于同一个表格内 + if (startTd && currentTd && + ((startTd.tagName == "TD" && currentTd.tagName == "TD") || (startTd.tagName == "TH" && currentTd.tagName == "TH")) && + domUtils.findParentByTagName(startTd, 'table') == domUtils.findParentByTagName(currentTd, 'table')) { + var ut = getUETable(currentTd); + if (startTd != currentTd) { + me.document.body.style.webkitUserSelect = 'none'; + me.selection.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges'](); + var range = ut.getCellsRange(startTd, currentTd); + ut.setSelected(range); + } else { + me.document.body.style.webkitUserSelect = ''; + ut.clearSelected(); + } + + } + evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); + } + + function setCellHeight(cell, height, backHeight) { + var lineHight = parseInt(domUtils.getComputedStyle(cell, "line-height"), 10), + tmpHeight = backHeight + height; + height = tmpHeight < lineHight ? lineHight : tmpHeight; + if (cell.style.height) cell.style.height = ""; + cell.rowSpan == 1 ? cell.setAttribute("height", height) : (cell.removeAttribute && cell.removeAttribute("height")); + } + + function getWidth(cell) { + if (!cell)return 0; + return parseInt(domUtils.getComputedStyle(cell, "width"), 10); + } + + function changeColWidth(cell, changeValue) { + + var ut = getUETable(cell); + if (ut) { + + //根据当前移动的边框获取相关的单元格 + var table = ut.table, + cells = getCellsByMoveBorder( cell, table ); + + table.style.width = ""; + table.removeAttribute("width"); + + //修正改变量 + changeValue = correctChangeValue( changeValue, cell, cells ); + + if (cell.nextSibling) { + + var i=0; + + utils.each( cells, function( cellGroup ){ + + cellGroup.left.width = (+cellGroup.left.width)+changeValue; + cellGroup.right && ( cellGroup.right.width = (+cellGroup.right.width)-changeValue ); + + } ); + + } else { + + utils.each( cells, function( cellGroup ){ + cellGroup.left.width -= -changeValue; + } ); + + } + } + + } + + function isEditorDisabled() { + return me.body.contentEditable === "false"; + } + + function changeRowHeight(td, changeValue) { + if (Math.abs(changeValue) < 10) return; + var ut = getUETable(td); + if (ut) { + var cells = ut.getSameEndPosCells(td, "y"), + //备份需要连带变化的td的原始高度,否则后期无法获取正确的值 + backHeight = cells[0] ? cells[0].offsetHeight : 0; + for (var i = 0, cell; cell = cells[i++];) { + setCellHeight(cell, changeValue, backHeight); + } + } + + } + + /** + * 获取调整单元格大小的相关单元格 + * @isContainMergeCell 返回的结果中是否包含发生合并后的单元格 + */ + function getCellsByMoveBorder( cell, table, isContainMergeCell ) { + + if( !table ) { + table = domUtils.findParentByTagName( cell, 'table' ); + } + + if( !table ) { + return null; + } + + //获取到该单元格所在行的序列号 + var index = domUtils.getNodeIndex( cell ), + temp = cell, + rows = table.rows, + colIndex = 0; + + while( temp ) { + //获取到当前单元格在未发生单元格合并时的序列 + if( temp.nodeType === 1 ) { + colIndex += (temp.colSpan || 1); + } + temp = temp.previousSibling; + } + + temp = null; + + //记录想关的单元格 + var borderCells = []; + + utils.each(rows, function( tabRow ){ + + var cells = tabRow.cells, + currIndex = 0; + + utils.each( cells, function( tabCell ){ + + currIndex += (tabCell.colSpan || 1); + + if( currIndex === colIndex ) { + + borderCells.push({ + left: tabCell, + right: tabCell.nextSibling || null + }); + + return false; + + } else if( currIndex > colIndex ) { + + if( isContainMergeCell ) { + borderCells.push({ + left: tabCell + }); + } + + return false; + } + + + } ); + + }); + + return borderCells; + + } + + + /** + * 通过给定的单元格集合获取最小的单元格width + */ + function getMinWidthByTableCells( cells ) { + + var minWidth = Number.MAX_VALUE; + + for( var i = 0, curCell; curCell = cells[ i ] ; i++ ) { + + minWidth = Math.min( minWidth, curCell.width || getTableCellWidth( curCell ) ); + + } + + return minWidth; + + } + + function correctChangeValue( changeValue, relatedCell, cells ) { + + //为单元格的paading预留空间 + changeValue -= getTabcellSpace(); + + if( changeValue < 0 ) { + return 0; + } + + changeValue -= getTableCellWidth( relatedCell ); + + //确定方向 + var direction = changeValue < 0 ? 'left':'right'; + + changeValue = Math.abs(changeValue); + + //只关心非最后一个单元格就可以 + utils.each( cells, function( cellGroup ){ + + var curCell = cellGroup[direction]; + + //为单元格保留最小空间 + if( curCell ) { + changeValue = Math.min( changeValue, getTableCellWidth( curCell )-cellMinWidth ); + } + + + } ); + + + //修正越界 + changeValue = changeValue < 0 ? 0 : changeValue; + + return direction === 'left' ? -changeValue : changeValue; + + } + + function getTableCellWidth( cell ) { + + var width = 0, + //偏移纠正量 + offset = 0, + width = cell.offsetWidth - getTabcellSpace(); + + //最后一个节点纠正一下 + if( !cell.nextSibling ) { + + width -= getTableCellOffset( cell ); + + } + + width = width < 0 ? 0 : width; + + try { + cell.width = width; + } catch(e) { + } + + return width; + + } + + /** + * 获取单元格所在表格的最末单元格的偏移量 + */ + function getTableCellOffset( cell ) { + + tab = domUtils.findParentByTagName( cell, "table", false); + + if( tab.offsetVal === undefined ) { + + var prev = cell.previousSibling; + + if( prev ) { + + //最后一个单元格和前一个单元格的width diff结果 如果恰好为一个border width, 则条件成立 + tab.offsetVal = cell.offsetWidth - prev.offsetWidth === UT.borderWidth ? UT.borderWidth : 0; + + } else { + tab.offsetVal = 0; + } + + } + + return tab.offsetVal; + + } + + function getTabcellSpace() { + + if( UT.tabcellSpace === undefined ) { + + var cell = null, + tab = me.document.createElement("table"), + tbody = me.document.createElement("tbody"), + trow = me.document.createElement("tr"), + tabcell = me.document.createElement("td"), + mirror = null; + + tabcell.style.cssText = 'border: 0;'; + tabcell.width = 1; + + trow.appendChild( tabcell ); + trow.appendChild( mirror = tabcell.cloneNode( false ) ); + + tbody.appendChild( trow ); + + tab.appendChild( tbody ); + + tab.style.cssText = "visibility: hidden;"; + + me.body.appendChild( tab ); + + UT.paddingSpace = tabcell.offsetWidth - 1; + + var tmpTabWidth = tab.offsetWidth; + + tabcell.style.cssText = ''; + mirror.style.cssText = ''; + + UT.borderWidth = ( tab.offsetWidth - tmpTabWidth ) / 3; + + UT.tabcellSpace = UT.paddingSpace + UT.borderWidth; + + me.body.removeChild( tab ); + + } + + getTabcellSpace = function(){ return UT.tabcellSpace; }; + + return UT.tabcellSpace; + + } + + function getDragLine(editor, doc) { + if (mousedown)return; + dragLine = editor.document.createElement("div"); + domUtils.setAttributes(dragLine, { + id:"ue_tableDragLine", + unselectable:'on', + contenteditable:false, + 'onresizestart':'return false', + 'ondragstart':'return false', + 'onselectstart':'return false', + style:"background-color:blue;position:absolute;padding:0;margin:0;background-image:none;border:0px none;opacity:0;filter:alpha(opacity=0)" + }); + editor.body.appendChild(dragLine); + } + + function hideDragLine(editor) { + if (mousedown)return; + var line; + while (line = editor.document.getElementById('ue_tableDragLine')) { + domUtils.remove(line) + } + } + + /** + * 依据state(v|h)在cell位置显示横线 + * @param state + * @param cell + */ + function showDragLineAt(state, cell) { + if (!cell) return; + var table = domUtils.findParentByTagName(cell, "table"), + caption = table.getElementsByTagName('caption'), + width = table.offsetWidth, + height = table.offsetHeight - (caption.length > 0 ? caption[0].offsetHeight : 0), + tablePos = domUtils.getXY(table), + cellPos = domUtils.getXY(cell), css; + switch (state) { + case "h": + css = 'height:' + height + 'px;top:' + (tablePos.y + (caption.length > 0 ? caption[0].offsetHeight : 0)) + 'px;left:' + (cellPos.x + cell.offsetWidth); + dragLine.style.cssText = css + 'px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)'; + break; + case "v": + css = 'width:' + width + 'px;left:' + tablePos.x + 'px;top:' + (cellPos.y + cell.offsetHeight ); + //必须加上border:0和color:blue,否则低版ie不支持背景色显示 + dragLine.style.cssText = css + 'px;overflow:hidden;position: absolute;display:block;background-color:blue;height:1px;border:0;color:blue;opacity:.2;filter:alpha(opacity=20)'; + break; + default: + } + } + + /** + * 当表格边框颜色为白色时设置为虚线,true为添加虚线 + * @param editor + * @param flag + */ + function switchBorderColor(editor, flag) { + var tableArr = domUtils.getElementsByTagName(editor.body, "table"), color; + for (var i = 0, node; node = tableArr[i++];) { + var td = domUtils.getElementsByTagName(node, "td"); + if (td[0]) { + if (flag) { + color = (td[0].style.borderColor).replace(/\s/g, ""); + if (/(#ffffff)|(rgb\(255,255,255\))/ig.test(color)) + domUtils.addClass(node, "noBorderTable") + } else { + domUtils.removeClasses(node, "noBorderTable") + } + } + + } + } + + function getTableWidth(editor, needIEHack, defaultValue) { + var body = editor.body; + return body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (editor.options.offsetWidth || 0); + } + + /** + * 获取当前拖动的单元格 + */ + function getTargetTd(editor, evt) { + + var target = domUtils.findParentByTagName(evt.target || evt.srcElement, ["td", "th"], true), + dir = null; + + if( !target ) { + return null; + } + + dir = getRelation( target, mouseCoords( evt ) ); + + //如果有前一个节点, 需要做一个修正, 否则可能会得到一个错误的td + + if( !target ) { + return null; + } + + if( dir === 'h1' && target.previousSibling ) { + + var position = domUtils.getXY( target), + cellWidth = target.offsetWidth; + + if( Math.abs( position.x + cellWidth - evt.clientX ) > cellWidth / 3 ) { + target = target.previousSibling; + } + + } else if( dir === 'v1' && target.parentNode.previousSibling ) { + + var position = domUtils.getXY( target), + cellHeight = target.offsetHeight; + + if( Math.abs( position.y + cellHeight - evt.clientY ) > cellHeight / 3 ) { + target = target.parentNode.previousSibling.firstChild; + } + + } + + + //排除了非td内部以及用于代码高亮部分的td + return target && !(editor.fireEvent("excludetable", target) === true) ? target : null; + } + +}; + + +// plugins/table.sort.js +/** + * Created with JetBrains PhpStorm. + * User: Jinqn + * Date: 13-10-12 + * Time: 上午10:20 + * To change this template use File | Settings | File Templates. + */ + +UE.UETable.prototype.sortTable = function (sortByCellIndex, compareFn) { + var table = this.table, + rows = table.rows, + trArray = [], + flag = rows[0].cells[0].tagName === "TH", + lastRowIndex = 0; + if(this.selectedTds.length){ + var range = this.cellsRange, + len = range.endRowIndex + 1; + for (var i = range.beginRowIndex; i < len; i++) { + trArray[i] = rows[i]; + } + trArray.splice(0,range.beginRowIndex); + lastRowIndex = (range.endRowIndex +1) === this.rowsNum ? 0 : range.endRowIndex +1; + }else{ + for (var i = 0,len = rows.length; i < len; i++) { + trArray[i] = rows[i]; + } + } + + var Fn = { + 'reversecurrent': function(td1,td2){ + return 1; + }, + 'orderbyasc': function(td1,td2){ + var value1 = td1.innerText||td1.textContent, + value2 = td2.innerText||td2.textContent; + return value1.localeCompare(value2); + }, + 'reversebyasc': function(td1,td2){ + var value1 = td1.innerHTML, + value2 = td2.innerHTML; + return value2.localeCompare(value1); + }, + 'orderbynum': function(td1,td2){ + var value1 = td1[browser.ie ? 'innerText':'textContent'].match(/\d+/), + value2 = td2[browser.ie ? 'innerText':'textContent'].match(/\d+/); + if(value1) value1 = +value1[0]; + if(value2) value2 = +value2[0]; + return (value1||0) - (value2||0); + }, + 'reversebynum': function(td1,td2){ + var value1 = td1[browser.ie ? 'innerText':'textContent'].match(/\d+/), + value2 = td2[browser.ie ? 'innerText':'textContent'].match(/\d+/); + if(value1) value1 = +value1[0]; + if(value2) value2 = +value2[0]; + return (value2||0) - (value1||0); + } + }; + + //对表格设置排序的标记data-sort-type + table.setAttribute('data-sort-type', compareFn && typeof compareFn === "string" && Fn[compareFn] ? compareFn:''); + + //th不参与排序 + flag && trArray.splice(0, 1); + trArray = utils.sort(trArray,function (tr1, tr2) { + var result; + if (compareFn && typeof compareFn === "function") { + result = compareFn.call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } else if (compareFn && typeof compareFn === "number") { + result = 1; + } else if (compareFn && typeof compareFn === "string" && Fn[compareFn]) { + result = Fn[compareFn].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } else { + result = Fn['orderbyasc'].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } + return result; + }); + var fragment = table.ownerDocument.createDocumentFragment(); + for (var j = 0, len = trArray.length; j < len; j++) { + fragment.appendChild(trArray[j]); + } + var tbody = table.getElementsByTagName("tbody")[0]; + if(!lastRowIndex){ + tbody.appendChild(fragment); + }else{ + tbody.insertBefore(fragment,rows[lastRowIndex- range.endRowIndex + range.beginRowIndex - 1]) + } +}; + +UE.plugins['tablesort'] = function () { + var me = this, + UT = UE.UETable, + getUETable = function (tdOrTable) { + return UT.getUETable(tdOrTable); + }, + getTableItemsByRange = function (editor) { + return UT.getTableItemsByRange(editor); + }; + + + me.ready(function () { + //添加表格可排序的样式 + utils.cssRule('tablesort', + 'table.sortEnabled tr.firstRow th,table.sortEnabled tr.firstRow td{padding-right:20px;background-repeat: no-repeat;background-position: center right;' + + ' background-image:url(' + me.options.themePath + me.options.theme + '/images/sortable.png);}', + me.document); + + //做单元格合并操作时,清除可排序标识 + me.addListener("afterexeccommand", function (type, cmd) { + if( cmd == 'mergeright' || cmd == 'mergedown' || cmd == 'mergecells') { + this.execCommand('disablesort'); + } + }); + }); + + + + //表格排序 + UE.commands['sorttable'] = { + queryCommandState: function () { + var me = this, + tableItems = getTableItemsByRange(me); + if (!tableItems.cell) return -1; + var table = tableItems.table, + cells = table.getElementsByTagName("td"); + for (var i = 0, cell; cell = cells[i++];) { + if (cell.rowSpan != 1 || cell.colSpan != 1) return -1; + } + return 0; + }, + execCommand: function (cmd, fn) { + var me = this, + range = me.selection.getRange(), + bk = range.createBookmark(true), + tableItems = getTableItemsByRange(me), + cell = tableItems.cell, + ut = getUETable(tableItems.table), + cellInfo = ut.getCellInfo(cell); + ut.sortTable(cellInfo.cellIndex, fn); + range.moveToBookmark(bk); + try{ + range.select(); + }catch(e){} + } + }; + + //设置表格可排序,清除表格可排序 + UE.commands["enablesort"] = UE.commands["disablesort"] = { + queryCommandState: function (cmd) { + var table = getTableItemsByRange(this).table; + if(table && cmd=='enablesort') { + var cells = domUtils.getElementsByTagName(table, 'th td'); + for(var i = 0; i1 || cells[i].getAttribute('rowspan')>1) return -1; + } + } + + return !table ? -1: cmd=='enablesort' ^ table.getAttribute('data-sort')!='sortEnabled' ? -1:0; + }, + execCommand: function (cmd) { + var table = getTableItemsByRange(this).table; + table.setAttribute("data-sort", cmd == "enablesort" ? "sortEnabled" : "sortDisabled"); + cmd == "enablesort" ? domUtils.addClass(table,"sortEnabled"):domUtils.removeClasses(table,"sortEnabled"); + } + }; +}; + + +// plugins/contextmenu.js +///import core +///commands 右键菜单 +///commandsName ContextMenu +///commandsTitle 右键菜单 +/** + * 右键菜单 + * @function + * @name baidu.editor.plugins.contextmenu + * @author zhanyi + */ + +UE.plugins['contextmenu'] = function () { + var me = this; + me.setOpt('enableContextMenu',true); + if(me.getOpt('enableContextMenu') === false){ + return; + } + var lang = me.getLang( "contextMenu" ), + menu, + items = me.options.contextMenu || [ + {label:lang['selectall'], cmdName:'selectall'}, + { + label:lang.cleardoc, + cmdName:'cleardoc', + exec:function () { + if ( confirm( lang.confirmclear ) ) { + this.execCommand( 'cleardoc' ); + } + } + }, + '-', + { + label:lang.unlink, + cmdName:'unlink' + }, + '-', + { + group:lang.paragraph, + icon:'justifyjustify', + subMenu:[ + { + label:lang.justifyleft, + cmdName:'justify', + value:'left' + }, + { + label:lang.justifyright, + cmdName:'justify', + value:'right' + }, + { + label:lang.justifycenter, + cmdName:'justify', + value:'center' + }, + { + label:lang.justifyjustify, + cmdName:'justify', + value:'justify' + } + ] + }, + '-', + { + group:lang.table, + icon:'table', + subMenu:[ + { + label:lang.inserttable, + cmdName:'inserttable' + }, + { + label:lang.deletetable, + cmdName:'deletetable' + }, + '-', + { + label:lang.deleterow, + cmdName:'deleterow' + }, + { + label:lang.deletecol, + cmdName:'deletecol' + }, + { + label:lang.insertcol, + cmdName:'insertcol' + }, + { + label:lang.insertcolnext, + cmdName:'insertcolnext' + }, + { + label:lang.insertrow, + cmdName:'insertrow' + }, + { + label:lang.insertrownext, + cmdName:'insertrownext' + }, + '-', + { + label:lang.insertcaption, + cmdName:'insertcaption' + }, + { + label:lang.deletecaption, + cmdName:'deletecaption' + }, + { + label:lang.inserttitle, + cmdName:'inserttitle' + }, + { + label:lang.deletetitle, + cmdName:'deletetitle' + }, + { + label:lang.inserttitlecol, + cmdName:'inserttitlecol' + }, + { + label:lang.deletetitlecol, + cmdName:'deletetitlecol' + }, + '-', + { + label:lang.mergecells, + cmdName:'mergecells' + }, + { + label:lang.mergeright, + cmdName:'mergeright' + }, + { + label:lang.mergedown, + cmdName:'mergedown' + }, + '-', + { + label:lang.splittorows, + cmdName:'splittorows' + }, + { + label:lang.splittocols, + cmdName:'splittocols' + }, + { + label:lang.splittocells, + cmdName:'splittocells' + }, + '-', + { + label:lang.averageDiseRow, + cmdName:'averagedistributerow' + }, + { + label:lang.averageDisCol, + cmdName:'averagedistributecol' + }, + '-', + { + label:lang.edittd, + cmdName:'edittd', + exec:function () { + if ( UE.ui['edittd'] ) { + new UE.ui['edittd']( this ); + } + this.getDialog('edittd').open(); + } + }, + { + label:lang.edittable, + cmdName:'edittable', + exec:function () { + if ( UE.ui['edittable'] ) { + new UE.ui['edittable']( this ); + } + this.getDialog('edittable').open(); + } + }, + { + label:lang.setbordervisible, + cmdName:'setbordervisible' + } + ] + }, + { + group:lang.tablesort, + icon:'tablesort', + subMenu:[ + { + label:lang.enablesort, + cmdName:'enablesort' + }, + { + label:lang.disablesort, + cmdName:'disablesort' + }, + '-', + { + label:lang.reversecurrent, + cmdName:'sorttable', + value:'reversecurrent' + }, + { + label:lang.orderbyasc, + cmdName:'sorttable', + value:'orderbyasc' + }, + { + label:lang.reversebyasc, + cmdName:'sorttable', + value:'reversebyasc' + }, + { + label:lang.orderbynum, + cmdName:'sorttable', + value:'orderbynum' + }, + { + label:lang.reversebynum, + cmdName:'sorttable', + value:'reversebynum' + } + ] + }, + { + group:lang.borderbk, + icon:'borderBack', + subMenu:[ + { + label:lang.setcolor, + cmdName:"interlacetable", + exec:function(){ + this.execCommand("interlacetable"); + } + }, + { + label:lang.unsetcolor, + cmdName:"uninterlacetable", + exec:function(){ + this.execCommand("uninterlacetable"); + } + }, + { + label:lang.setbackground, + cmdName:"settablebackground", + exec:function(){ + this.execCommand("settablebackground",{repeat:true,colorList:["#bbb","#ccc"]}); + } + }, + { + label:lang.unsetbackground, + cmdName:"cleartablebackground", + exec:function(){ + this.execCommand("cleartablebackground"); + } + }, + { + label:lang.redandblue, + cmdName:"settablebackground", + exec:function(){ + this.execCommand("settablebackground",{repeat:true,colorList:["red","blue"]}); + } + }, + { + label:lang.threecolorgradient, + cmdName:"settablebackground", + exec:function(){ + this.execCommand("settablebackground",{repeat:true,colorList:["#aaa","#bbb","#ccc"]}); + } + } + ] + }, + { + group:lang.aligntd, + icon:'aligntd', + subMenu:[ + { + cmdName:'cellalignment', + value:{align:'left',vAlign:'top'} + }, + { + cmdName:'cellalignment', + value:{align:'center',vAlign:'top'} + }, + { + cmdName:'cellalignment', + value:{align:'right',vAlign:'top'} + }, + { + cmdName:'cellalignment', + value:{align:'left',vAlign:'middle'} + }, + { + cmdName:'cellalignment', + value:{align:'center',vAlign:'middle'} + }, + { + cmdName:'cellalignment', + value:{align:'right',vAlign:'middle'} + }, + { + cmdName:'cellalignment', + value:{align:'left',vAlign:'bottom'} + }, + { + cmdName:'cellalignment', + value:{align:'center',vAlign:'bottom'} + }, + { + cmdName:'cellalignment', + value:{align:'right',vAlign:'bottom'} + } + ] + }, + { + group:lang.aligntable, + icon:'aligntable', + subMenu:[ + { + cmdName:'tablealignment', + className: 'left', + label:lang.tableleft, + value:"left" + }, + { + cmdName:'tablealignment', + className: 'center', + label:lang.tablecenter, + value:"center" + }, + { + cmdName:'tablealignment', + className: 'right', + label:lang.tableright, + value:"right" + } + ] + }, + '-', + { + label:lang.insertparagraphbefore, + cmdName:'insertparagraph', + value:true + }, + { + label:lang.insertparagraphafter, + cmdName:'insertparagraph' + }, + { + label:lang['copy'], + cmdName:'copy' + }, + { + label:lang['paste'], + cmdName:'paste' + } + ]; + if ( !items.length ) { + return; + } + var uiUtils = UE.ui.uiUtils; + + me.addListener( 'contextmenu', function ( type, evt ) { + + var offset = uiUtils.getViewportOffsetByEvent( evt ); + me.fireEvent( 'beforeselectionchange' ); + if ( menu ) { + menu.destroy(); + } + for ( var i = 0, ti, contextItems = []; ti = items[i]; i++ ) { + var last; + (function ( item ) { + if ( item == '-' ) { + if ( (last = contextItems[contextItems.length - 1 ] ) && last !== '-' ) { + contextItems.push( '-' ); + } + } else if ( item.hasOwnProperty( "group" ) ) { + for ( var j = 0, cj, subMenu = []; cj = item.subMenu[j]; j++ ) { + (function ( subItem ) { + if ( subItem == '-' ) { + if ( (last = subMenu[subMenu.length - 1 ] ) && last !== '-' ) { + subMenu.push( '-' ); + }else{ + subMenu.splice(subMenu.length-1); + } + } else { + if ( (me.commands[subItem.cmdName] || UE.commands[subItem.cmdName] || subItem.query) && + (subItem.query ? subItem.query() : me.queryCommandState( subItem.cmdName )) > -1 ) { + subMenu.push( { + 'label':subItem.label || me.getLang( "contextMenu." + subItem.cmdName + (subItem.value || '') )||"", + 'className':'edui-for-' +subItem.cmdName + ( subItem.className ? ( ' edui-for-' + subItem.cmdName + '-' + subItem.className ) : '' ), + onclick:subItem.exec ? function () { + subItem.exec.call( me ); + } : function () { + me.execCommand( subItem.cmdName, subItem.value ); + } + } ); + } + } + })( cj ); + } + if ( subMenu.length ) { + function getLabel(){ + switch (item.icon){ + case "table": + return me.getLang( "contextMenu.table" ); + case "justifyjustify": + return me.getLang( "contextMenu.paragraph" ); + case "aligntd": + return me.getLang("contextMenu.aligntd"); + case "aligntable": + return me.getLang("contextMenu.aligntable"); + case "tablesort": + return lang.tablesort; + case "borderBack": + return lang.borderbk; + default : + return ''; + } + } + contextItems.push( { + //todo 修正成自动获取方式 + 'label':getLabel(), + className:'edui-for-' + item.icon, + 'subMenu':{ + items:subMenu, + editor:me + } + } ); + } + + } else { + //有可能commmand没有加载右键不能出来,或者没有command也想能展示出来添加query方法 + if ( (me.commands[item.cmdName] || UE.commands[item.cmdName] || item.query) && + (item.query ? item.query.call(me) : me.queryCommandState( item.cmdName )) > -1 ) { + + contextItems.push( { + 'label':item.label || me.getLang( "contextMenu." + item.cmdName ), + className:'edui-for-' + (item.icon ? item.icon : item.cmdName + (item.value || '')), + onclick:item.exec ? function () { + item.exec.call( me ); + } : function () { + me.execCommand( item.cmdName, item.value ); + } + } ); + } + + } + + })( ti ); + } + if ( contextItems[contextItems.length - 1] == '-' ) { + contextItems.pop(); + } + + menu = new UE.ui.Menu( { + items:contextItems, + className:"edui-contextmenu", + editor:me + } ); + menu.render(); + menu.showAt( offset ); + + me.fireEvent("aftershowcontextmenu",menu); + + domUtils.preventDefault( evt ); + if ( browser.ie ) { + var ieRange; + try { + ieRange = me.selection.getNative().createRange(); + } catch ( e ) { + return; + } + if ( ieRange.item ) { + var range = new dom.Range( me.document ); + range.selectNode( ieRange.item( 0 ) ).select( true, true ); + } + } + }); + + // 添加复制的flash按钮 + me.addListener('aftershowcontextmenu', function(type, menu) { + if (me.zeroclipboard) { + var items = menu.items; + for (var key in items) { + if (items[key].className == 'edui-for-copy') { + me.zeroclipboard.clip(items[key].getDom()); + } + } + } + }); + +}; + + +// plugins/shortcutmenu.js +///import core +///commands 弹出菜单 +// commandsName popupmenu +///commandsTitle 弹出菜单 +/** + * 弹出菜单 + * @function + * @name baidu.editor.plugins.popupmenu + * @author xuheng + */ + +UE.plugins['shortcutmenu'] = function () { + var me = this, + menu, + items = me.options.shortcutMenu || []; + + if (!items.length) { + return; + } + + me.addListener ('contextmenu mouseup' , function (type , e) { + var me = this, + customEvt = { + type : type , + target : e.target || e.srcElement , + screenX : e.screenX , + screenY : e.screenY , + clientX : e.clientX , + clientY : e.clientY + }; + + setTimeout (function () { + var rng = me.selection.getRange (); + if (rng.collapsed === false || type == "contextmenu") { + + if (!menu) { + menu = new baidu.editor.ui.ShortCutMenu ({ + editor : me , + items : items , + theme : me.options.theme , + className : 'edui-shortcutmenu' + }); + + menu.render (); + me.fireEvent ("afterrendershortcutmenu" , menu); + } + + menu.show (customEvt , !!UE.plugins['contextmenu']); + } + }); + + if (type == 'contextmenu') { + domUtils.preventDefault (e); + if (browser.ie9below) { + var ieRange; + try { + ieRange = me.selection.getNative().createRange(); + } catch (e) { + return; + } + if (ieRange.item) { + var range = new dom.Range (me.document); + range.selectNode (ieRange.item (0)).select (true , true); + + } + } + } + }); + + me.addListener ('keydown' , function (type) { + if (type == "keydown") { + menu && !menu.isHidden && menu.hide (); + } + + }); + +}; + + + + +// plugins/basestyle.js +/** + * B、I、sub、super命令支持 + * @file + * @since 1.2.6.1 + */ + +UE.plugins['basestyle'] = function(){ + + /** + * 字体加粗 + * @command bold + * @param { String } cmd 命令字符串 + * @remind 对已加粗的文本内容执行该命令, 将取消加粗 + * @method execCommand + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行加粗操作 + * //第一次执行, 文本内容加粗 + * editor.execCommand( 'bold' ); + * + * //第二次执行, 文本内容取消加粗 + * editor.execCommand( 'bold' ); + * ``` + */ + + + /** + * 字体倾斜 + * @command italic + * @method execCommand + * @param { String } cmd 命令字符串 + * @remind 对已倾斜的文本内容执行该命令, 将取消倾斜 + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行斜体操作 + * //第一次操作, 文本内容将变成斜体 + * editor.execCommand( 'italic' ); + * + * //再次对同一文本内容执行, 则文本内容将恢复正常 + * editor.execCommand( 'italic' ); + * ``` + */ + + /** + * 下标文本,与“superscript”命令互斥 + * @command subscript + * @method execCommand + * @remind 把选中的文本内容切换成下标文本, 如果当前选中的文本已经是下标, 则该操作会把文本内容还原成正常文本 + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行下标操作 + * //第一次操作, 文本内容将变成下标文本 + * editor.execCommand( 'subscript' ); + * + * //再次对同一文本内容执行, 则文本内容将恢复正常 + * editor.execCommand( 'subscript' ); + * ``` + */ + + /** + * 上标文本,与“subscript”命令互斥 + * @command superscript + * @method execCommand + * @remind 把选中的文本内容切换成上标文本, 如果当前选中的文本已经是上标, 则该操作会把文本内容还原成正常文本 + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行上标操作 + * //第一次操作, 文本内容将变成上标文本 + * editor.execCommand( 'superscript' ); + * + * //再次对同一文本内容执行, 则文本内容将恢复正常 + * editor.execCommand( 'superscript' ); + * ``` + */ + var basestyles = { + 'bold':['strong','b'], + 'italic':['em','i'], + 'subscript':['sub'], + 'superscript':['sup'] + }, + getObj = function(editor,tagNames){ + return domUtils.filterNodeList(editor.selection.getStartElementPath(),tagNames); + }, + me = this; + //添加快捷键 + me.addshortcutkey({ + "Bold" : "ctrl+66",//^B + "Italic" : "ctrl+73", //^I + "Underline" : "ctrl+85"//^U + }); + me.addInputRule(function(root){ + utils.each(root.getNodesByTagName('b i'),function(node){ + switch (node.tagName){ + case 'b': + node.tagName = 'strong'; + break; + case 'i': + node.tagName = 'em'; + } + }); + }); + for ( var style in basestyles ) { + (function( cmd, tagNames ) { + me.commands[cmd] = { + execCommand : function( cmdName ) { + var range = me.selection.getRange(),obj = getObj(this,tagNames); + if ( range.collapsed ) { + if ( obj ) { + var tmpText = me.document.createTextNode(''); + range.insertNode( tmpText ).removeInlineStyle( tagNames ); + range.setStartBefore(tmpText); + domUtils.remove(tmpText); + } else { + var tmpNode = range.document.createElement( tagNames[0] ); + if(cmdName == 'superscript' || cmdName == 'subscript'){ + tmpText = me.document.createTextNode(''); + range.insertNode(tmpText) + .removeInlineStyle(['sub','sup']) + .setStartBefore(tmpText) + .collapse(true); + } + range.insertNode( tmpNode ).setStart( tmpNode, 0 ); + } + range.collapse( true ); + } else { + if(cmdName == 'superscript' || cmdName == 'subscript'){ + if(!obj || obj.tagName.toLowerCase() != cmdName){ + range.removeInlineStyle(['sub','sup']); + } + } + obj ? range.removeInlineStyle( tagNames ) : range.applyInlineStyle( tagNames[0] ); + } + range.select(); + }, + queryCommandState : function() { + return getObj(this,tagNames) ? 1 : 0; + } + }; + })( style, basestyles[style] ); + } +}; + + + +// plugins/elementpath.js +/** + * 选取路径命令 + * @file + */ +UE.plugins['elementpath'] = function(){ + var currentLevel, + tagNames, + me = this; + me.setOpt('elementPathEnabled',true); + if(!me.options.elementPathEnabled){ + return; + } + me.commands['elementpath'] = { + execCommand : function( cmdName, level ) { + var start = tagNames[level], + range = me.selection.getRange(); + currentLevel = level*1; + range.selectNode(start).select(); + }, + queryCommandValue : function() { + //产生一个副本,不能修改原来的startElementPath; + var parents = [].concat(this.selection.getStartElementPath()).reverse(), + names = []; + tagNames = parents; + for(var i=0,ci;ci=parents[i];i++){ + if(ci.nodeType == 3) { + continue; + } + var name = ci.tagName.toLowerCase(); + if(name == 'img' && ci.getAttribute('anchorname')){ + name = 'anchor'; + } + names[i] = name; + if(currentLevel == i){ + currentLevel = -1; + break; + } + } + return names; + } + }; +}; + + + +// plugins/formatmatch.js +/** + * 格式刷,只格式inline的 + * @file + * @since 1.2.6.1 + */ + +/** + * 格式刷 + * @command formatmatch + * @method execCommand + * @remind 该操作不能复制段落格式 + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * //获取格式刷 + * editor.execCommand( 'formatmatch' ); + * ``` + */ +UE.plugins['formatmatch'] = function(){ + + var me = this, + list = [],img, + flag = 0; + + me.addListener('reset',function(){ + list = []; + flag = 0; + }); + + function addList(type,evt){ + + if(browser.webkit){ + var target = evt.target.tagName == 'IMG' ? evt.target : null; + } + + function addFormat(range){ + + if(text){ + range.selectNode(text); + } + return range.applyInlineStyle(list[list.length-1].tagName,null,list); + + } + + me.undoManger && me.undoManger.save(); + + var range = me.selection.getRange(), + imgT = target || range.getClosedNode(); + if(img && imgT && imgT.tagName == 'IMG'){ + //trace:964 + + imgT.style.cssText += ';float:' + (img.style.cssFloat || img.style.styleFloat ||'none') + ';display:' + (img.style.display||'inline'); + + img = null; + }else{ + if(!img){ + var collapsed = range.collapsed; + if(collapsed){ + var text = me.document.createTextNode('match'); + range.insertNode(text).select(); + + + } + me.__hasEnterExecCommand = true; + //不能把block上的属性干掉 + //trace:1553 + var removeFormatAttributes = me.options.removeFormatAttributes; + me.options.removeFormatAttributes = ''; + me.execCommand('removeformat'); + me.options.removeFormatAttributes = removeFormatAttributes; + me.__hasEnterExecCommand = false; + //trace:969 + range = me.selection.getRange(); + if(list.length){ + addFormat(range); + } + if(text){ + range.setStartBefore(text).collapse(true); + + } + range.select(); + text && domUtils.remove(text); + } + + } + + + + + me.undoManger && me.undoManger.save(); + me.removeListener('mouseup',addList); + flag = 0; + } + + me.commands['formatmatch'] = { + execCommand : function( cmdName ) { + + if(flag){ + flag = 0; + list = []; + me.removeListener('mouseup',addList); + return; + } + + + + var range = me.selection.getRange(); + img = range.getClosedNode(); + if(!img || img.tagName != 'IMG'){ + range.collapse(true).shrinkBoundary(); + var start = range.startContainer; + list = domUtils.findParents(start,true,function(node){ + return !domUtils.isBlockElm(node) && node.nodeType == 1; + }); + //a不能加入格式刷, 并且克隆节点 + for(var i=0,ci;ci=list[i];i++){ + if(ci.tagName == 'A'){ + list.splice(i,1); + break; + } + } + + } + + me.addListener('mouseup',addList); + flag = 1; + + + }, + queryCommandState : function() { + return flag; + }, + notNeedUndo : 1 + }; +}; + + + +// plugins/searchreplace.js +///import core +///commands 查找替换 +///commandsName SearchReplace +///commandsTitle 查询替换 +///commandsDialog dialogs\searchreplace +/** + * @description 查找替换 + * @author zhanyi + */ + +UE.plugin.register('searchreplace',function(){ + var me = this; + + var _blockElm = {'table':1,'tbody':1,'tr':1,'ol':1,'ul':1}; + + function findTextInString(textContent,opt,currentIndex){ + var str = opt.searchStr; + if(opt.dir == -1){ + textContent = textContent.split('').reverse().join(''); + str = str.split('').reverse().join(''); + currentIndex = textContent.length - currentIndex; + + } + var reg = new RegExp(str,'g' + (opt.casesensitive ? '' : 'i')),match; + + while(match = reg.exec(textContent)){ + if(match.index >= currentIndex){ + return opt.dir == -1 ? textContent.length - match.index - opt.searchStr.length : match.index; + } + } + return -1 + } + function findTextBlockElm(node,currentIndex,opt){ + var textContent,index,methodName = opt.all || opt.dir == 1 ? 'getNextDomNode' : 'getPreDomNode'; + if(domUtils.isBody(node)){ + node = node.firstChild; + } + var first = 1; + while(node){ + textContent = node.nodeType == 3 ? node.nodeValue : node[browser.ie ? 'innerText' : 'textContent']; + index = findTextInString(textContent,opt,currentIndex ); + first = 0; + if(index!=-1){ + return { + 'node':node, + 'index':index + } + } + node = domUtils[methodName](node); + while(node && _blockElm[node.nodeName.toLowerCase()]){ + node = domUtils[methodName](node,true); + } + if(node){ + currentIndex = opt.dir == -1 ? (node.nodeType == 3 ? node.nodeValue : node[browser.ie ? 'innerText' : 'textContent']).length : 0; + } + + } + } + function findNTextInBlockElm(node,index,str){ + var currentIndex = 0, + currentNode = node.firstChild, + currentNodeLength = 0, + result; + while(currentNode){ + if(currentNode.nodeType == 3){ + currentNodeLength = currentNode.nodeValue.replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,'').length; + currentIndex += currentNodeLength; + if(currentIndex >= index){ + return { + 'node':currentNode, + 'index': currentNodeLength - (currentIndex - index) + } + } + }else if(!dtd.$empty[currentNode.tagName]){ + currentNodeLength = currentNode[browser.ie ? 'innerText' : 'textContent'].replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,'').length + currentIndex += currentNodeLength; + if(currentIndex >= index){ + result = findNTextInBlockElm(currentNode,currentNodeLength - (currentIndex - index),str); + if(result){ + return result; + } + } + } + currentNode = domUtils.getNextDomNode(currentNode); + + } + } + + function searchReplace(me,opt){ + + var rng = me.selection.getRange(), + startBlockNode, + searchStr = opt.searchStr, + span = me.document.createElement('span'); + span.innerHTML = '$$ueditor_searchreplace_key$$'; + + rng.shrinkBoundary(true); + + //判断是不是第一次选中 + if(!rng.collapsed){ + rng.select(); + var rngText = me.selection.getText(); + if(new RegExp('^' + opt.searchStr + '$',(opt.casesensitive ? '' : 'i')).test(rngText)){ + if(opt.replaceStr != undefined){ + replaceText(rng,opt.replaceStr); + rng.select(); + return true; + }else{ + rng.collapse(opt.dir == -1) + } + + } + } + + + rng.insertNode(span); + rng.enlargeToBlockElm(true); + startBlockNode = rng.startContainer; + var currentIndex = startBlockNode[browser.ie ? 'innerText' : 'textContent'].indexOf('$$ueditor_searchreplace_key$$'); + rng.setStartBefore(span); + domUtils.remove(span); + var result = findTextBlockElm(startBlockNode,currentIndex,opt); + if(result){ + var rngStart = findNTextInBlockElm(result.node,result.index,searchStr); + var rngEnd = findNTextInBlockElm(result.node,result.index + searchStr.length,searchStr); + rng.setStart(rngStart.node,rngStart.index).setEnd(rngEnd.node,rngEnd.index); + + if(opt.replaceStr !== undefined){ + replaceText(rng,opt.replaceStr) + } + rng.select(); + return true; + }else{ + rng.setCursor() + } + + } + function replaceText(rng,str){ + + str = me.document.createTextNode(str); + rng.deleteContents().insertNode(str); + + } + return { + commands:{ + 'searchreplace':{ + execCommand:function(cmdName,opt){ + utils.extend(opt,{ + all : false, + casesensitive : false, + dir : 1 + },true); + var num = 0; + if(opt.all){ + + var rng = me.selection.getRange(), + first = me.body.firstChild; + if(first && first.nodeType == 1){ + rng.setStart(first,0); + rng.shrinkBoundary(true); + }else if(first.nodeType == 3){ + rng.setStartBefore(first) + } + rng.collapse(true).select(true); + if(opt.replaceStr !== undefined){ + me.fireEvent('saveScene'); + } + while(searchReplace(this,opt)){ + num++; + } + if(num){ + me.fireEvent('saveScene'); + } + }else{ + if(opt.replaceStr !== undefined){ + me.fireEvent('saveScene'); + } + if(searchReplace(this,opt)){ + num++ + } + if(num){ + me.fireEvent('saveScene'); + } + + } + + return num; + }, + notNeedUndo:1 + } + } + } +}); + +// plugins/customstyle.js +/** + * 自定义样式 + * @file + * @since 1.2.6.1 + */ + +/** + * 根据config配置文件里“customstyle”选项的值对匹配的标签执行样式替换。 + * @command customstyle + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'customstyle' ); + * ``` + */ +UE.plugins['customstyle'] = function() { + var me = this; + me.setOpt({ 'customstyle':[ + {tag:'h1',name:'tc', style:'font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;'}, + {tag:'h1',name:'tl', style:'font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:left;margin:0 0 10px 0;'}, + {tag:'span',name:'im', style:'font-size:16px;font-style:italic;font-weight:bold;line-height:18px;'}, + {tag:'span',name:'hi', style:'font-size:16px;font-style:italic;font-weight:bold;color:rgb(51, 153, 204);line-height:18px;'} + ]}); + me.commands['customstyle'] = { + execCommand : function(cmdName, obj) { + var me = this, + tagName = obj.tag, + node = domUtils.findParent(me.selection.getStart(), function(node) { + return node.getAttribute('label'); + }, true), + range,bk,tmpObj = {}; + for (var p in obj) { + if(obj[p]!==undefined) + tmpObj[p] = obj[p]; + } + delete tmpObj.tag; + if (node && node.getAttribute('label') == obj.label) { + range = this.selection.getRange(); + bk = range.createBookmark(); + if (range.collapsed) { + //trace:1732 删掉自定义标签,要有p来回填站位 + if(dtd.$block[node.tagName]){ + var fillNode = me.document.createElement('p'); + domUtils.moveChild(node, fillNode); + node.parentNode.insertBefore(fillNode, node); + domUtils.remove(node); + }else{ + domUtils.remove(node,true); + } + + } else { + + var common = domUtils.getCommonAncestor(bk.start, bk.end), + nodes = domUtils.getElementsByTagName(common, tagName); + if(new RegExp(tagName,'i').test(common.tagName)){ + nodes.push(common); + } + for (var i = 0,ni; ni = nodes[i++];) { + if (ni.getAttribute('label') == obj.label) { + var ps = domUtils.getPosition(ni, bk.start),pe = domUtils.getPosition(ni, bk.end); + if ((ps & domUtils.POSITION_FOLLOWING || ps & domUtils.POSITION_CONTAINS) + && + (pe & domUtils.POSITION_PRECEDING || pe & domUtils.POSITION_CONTAINS) + ) + if (dtd.$block[tagName]) { + var fillNode = me.document.createElement('p'); + domUtils.moveChild(ni, fillNode); + ni.parentNode.insertBefore(fillNode, ni); + } + domUtils.remove(ni, true); + } + } + node = domUtils.findParent(common, function(node) { + return node.getAttribute('label') == obj.label; + }, true); + if (node) { + + domUtils.remove(node, true); + + } + + } + range.moveToBookmark(bk).select(); + } else { + if (dtd.$block[tagName]) { + this.execCommand('paragraph', tagName, tmpObj,'customstyle'); + range = me.selection.getRange(); + if (!range.collapsed) { + range.collapse(); + node = domUtils.findParent(me.selection.getStart(), function(node) { + return node.getAttribute('label') == obj.label; + }, true); + var pNode = me.document.createElement('p'); + domUtils.insertAfter(node, pNode); + domUtils.fillNode(me.document, pNode); + range.setStart(pNode, 0).setCursor(); + } + } else { + + range = me.selection.getRange(); + if (range.collapsed) { + node = me.document.createElement(tagName); + domUtils.setAttributes(node, tmpObj); + range.insertNode(node).setStart(node, 0).setCursor(); + + return; + } + + bk = range.createBookmark(); + range.applyInlineStyle(tagName, tmpObj).moveToBookmark(bk).select(); + } + } + + }, + queryCommandValue : function() { + var parent = domUtils.filterNodeList( + this.selection.getStartElementPath(), + function(node){return node.getAttribute('label')} + ); + return parent ? parent.getAttribute('label') : ''; + } + }; + //当去掉customstyle是,如果是块元素,用p代替 + me.addListener('keyup', function(type, evt) { + var keyCode = evt.keyCode || evt.which; + + if (keyCode == 32 || keyCode == 13) { + var range = me.selection.getRange(); + if (range.collapsed) { + var node = domUtils.findParent(me.selection.getStart(), function(node) { + return node.getAttribute('label'); + }, true); + if (node && dtd.$block[node.tagName] && domUtils.isEmptyNode(node)) { + var p = me.document.createElement('p'); + domUtils.insertAfter(node, p); + domUtils.fillNode(me.document, p); + domUtils.remove(node); + range.setStart(p, 0).setCursor(); + + + } + } + } + }); +}; + +// plugins/catchremoteimage.js +///import core +///commands 远程图片抓取 +///commandsName catchRemoteImage,catchremoteimageenable +///commandsTitle 远程图片抓取 +/** + * 远程图片抓取,当开启本插件时所有不符合本地域名的图片都将被抓取成为本地服务器上的图片 + */ +UE.plugins['catchremoteimage'] = function () { + var me = this, + ajax = UE.ajax; + + /* 设置默认值 */ + if (me.options.catchRemoteImageEnable === false) return; + me.setOpt({ + catchRemoteImageEnable: false + }); + + me.addListener("afterpaste", function () { + me.fireEvent("catchRemoteImage"); + }); + + me.addListener("catchRemoteImage", function () { + + var catcherLocalDomain = me.getOpt('catcherLocalDomain'), + catcherActionUrl = me.getActionUrl(me.getOpt('catcherActionName')), + catcherUrlPrefix = me.getOpt('catcherUrlPrefix'), + catcherFieldName = me.getOpt('catcherFieldName'); + + var remoteImages = [], + imgs = domUtils.getElementsByTagName(me.document, "img"), + test = function (src, urls) { + if (src.indexOf(location.host) != -1 || /(^\.)|(^\/)/.test(src)) { + return true; + } + if (urls) { + for (var j = 0, url; url = urls[j++];) { + if (src.indexOf(url) !== -1) { + return true; + } + } + } + return false; + }; + + for (var i = 0, ci; ci = imgs[i++];) { + if (ci.getAttribute("word_img")) { + continue; + } + var src = ci.getAttribute("_src") || ci.src || ""; + if (/^(https?|ftp):/i.test(src) && !test(src, catcherLocalDomain)) { + remoteImages.push(src); + } + } + + if (remoteImages.length) { + catchremoteimage(remoteImages, { + //成功抓取 + success: function (r) { + try { + var info = r.state !== undefined ? r:eval("(" + r.responseText + ")"); + } catch (e) { + return; + } + + /* 获取源路径和新路径 */ + var i, j, ci, cj, oldSrc, newSrc, list = info.list; + + for (i = 0; ci = imgs[i++];) { + oldSrc = ci.getAttribute("_src") || ci.src || ""; + for (j = 0; cj = list[j++];) { + if (oldSrc == cj.source && cj.state == "SUCCESS") { //抓取失败时不做替换处理 + newSrc = catcherUrlPrefix + cj.url; + domUtils.setAttributes(ci, { + "src": newSrc, + "_src": newSrc + }); + break; + } + } + } + me.fireEvent('catchremotesuccess') + }, + //回调失败,本次请求超时 + error: function () { + me.fireEvent("catchremoteerror"); + } + }); + } + + function catchremoteimage(imgs, callbacks) { + var params = utils.serializeParam(me.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(catcherActionUrl + (catcherActionUrl.indexOf('?') == -1 ? '?':'&') + params), + isJsonp = utils.isCrossDomainUrl(url), + opt = { + 'method': 'POST', + 'dataType': isJsonp ? 'jsonp':'', + 'timeout': 60000, //单位:毫秒,回调请求超时设置。目标用户如果网速不是很快的话此处建议设置一个较大的数值 + 'onsuccess': callbacks["success"], + 'onerror': callbacks["error"] + }; + opt[catcherFieldName] = imgs; + ajax.request(url, opt); + } + + }); +}; + +// plugins/snapscreen.js +/** + * 截屏插件,为UEditor提供插入支持 + * @file + * @since 1.4.2 + */ +UE.plugin.register('snapscreen', function (){ + + var me = this; + var snapplugin; + + function getLocation(url){ + var search, + a = document.createElement('a'), + params = utils.serializeParam(me.queryCommandValue('serverparam')) || ''; + + a.href = url; + if (browser.ie) { + a.href = a.href; + } + + + search = a.search; + if (params) { + search = search + (search.indexOf('?') == -1 ? '?':'&')+ params; + search = search.replace(/[&]+/ig, '&'); + } + return { + 'port': a.port, + 'hostname': a.hostname, + 'path': a.pathname + search || + a.hash + } + } + + return { + commands:{ + /** + * 字体背景颜色 + * @command snapscreen + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand('snapscreen'); + * ``` + */ + 'snapscreen':{ + execCommand:function (cmd) { + var url, local, res; + var lang = me.getLang("snapScreen_plugin"); + + if(!snapplugin){ + var container = me.container; + var doc = me.container.ownerDocument || me.container.document; + snapplugin = doc.createElement("object"); + try{snapplugin.type = "application/x-pluginbaidusnap";}catch(e){ + return; + } + snapplugin.style.cssText = "position:absolute;left:-9999px;width:0;height:0;"; + snapplugin.setAttribute("width","0"); + snapplugin.setAttribute("height","0"); + container.appendChild(snapplugin); + } + + function onSuccess(rs){ + try{ + rs = eval("("+ rs +")"); + if(rs.state == 'SUCCESS'){ + var opt = me.options; + me.execCommand('insertimage', { + src: opt.snapscreenUrlPrefix + rs.url, + _src: opt.snapscreenUrlPrefix + rs.url, + alt: rs.title || '', + floatStyle: opt.snapscreenImgAlign + }); + } else { + alert(rs.state); + } + }catch(e){ + alert(lang.callBackErrorMsg); + } + } + url = me.getActionUrl(me.getOpt('snapscreenActionName')); + local = getLocation(url); + setTimeout(function () { + try{ + res =snapplugin.saveSnapshot(local.hostname, local.path, local.port); + }catch(e){ + me.ui._dialogs['snapscreenDialog'].open(); + return; + } + + onSuccess(res); + }, 50); + }, + queryCommandState: function(){ + return (navigator.userAgent.indexOf("Windows",0) != -1) ? 0:-1; + } + } + } + } +}); + + +// plugins/insertparagraph.js +/** + * 插入段落 + * @file + * @since 1.2.6.1 + */ + + +/** + * 插入段落 + * @command insertparagraph + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * editor.execCommand( 'insertparagraph' ); + * ``` + */ + +UE.commands['insertparagraph'] = { + execCommand : function( cmdName,front) { + var me = this, + range = me.selection.getRange(), + start = range.startContainer,tmpNode; + while(start ){ + if(domUtils.isBody(start)){ + break; + } + tmpNode = start; + start = start.parentNode; + } + if(tmpNode){ + var p = me.document.createElement('p'); + if(front){ + tmpNode.parentNode.insertBefore(p,tmpNode) + }else{ + tmpNode.parentNode.insertBefore(p,tmpNode.nextSibling) + } + domUtils.fillNode(me.document,p); + range.setStart(p,0).setCursor(false,true); + } + } +}; + + + +// plugins/webapp.js +/** + * 百度应用 + * @file + * @since 1.2.6.1 + */ + + +/** + * 插入百度应用 + * @command webapp + * @method execCommand + * @remind 需要百度APPKey + * @remind 百度应用主页: http://app.baidu.com/ + * @param { Object } appOptions 应用所需的参数项, 支持的key有: title=>应用标题, width=>应用容器宽度, + * height=>应用容器高度,logo=>应用logo,url=>应用地址 + * @example + * ```javascript + * //editor是编辑器实例 + * //在编辑器里插入一个“植物大战僵尸”的APP + * editor.execCommand( 'webapp' , { + * title: '植物大战僵尸', + * width: 560, + * height: 465, + * logo: '应用展示的图片', + * url: '百度应用的地址' + * } ); + * ``` + */ + +//UE.plugins['webapp'] = function () { +// var me = this; +// function createInsertStr( obj, toIframe, addParagraph ) { +// return !toIframe ? +// (addParagraph ? '

    ' : '') + '' + +// (addParagraph ? '

    ' : '') +// : +// ''; +// } +// +// function switchImgAndIframe( img2frame ) { +// var tmpdiv, +// nodes = domUtils.getElementsByTagName( me.document, !img2frame ? "iframe" : "img" ); +// for ( var i = 0, node; node = nodes[i++]; ) { +// if ( node.className != "edui-faked-webapp" ){ +// continue; +// } +// tmpdiv = me.document.createElement( "div" ); +// tmpdiv.innerHTML = createInsertStr( img2frame ? {url:node.getAttribute( "_url" ), width:node.width, height:node.height,title:node.title,logo:node.style.backgroundImage.replace("url(","").replace(")","")} : {url:node.getAttribute( "src", 2 ),title:node.title, width:node.width, height:node.height,logo:node.getAttribute("logo_url")}, img2frame ? true : false,false ); +// node.parentNode.replaceChild( tmpdiv.firstChild, node ); +// } +// } +// +// me.addListener( "beforegetcontent", function () { +// switchImgAndIframe( true ); +// } ); +// me.addListener( 'aftersetcontent', function () { +// switchImgAndIframe( false ); +// } ); +// me.addListener( 'aftergetcontent', function ( cmdName ) { +// if ( cmdName == 'aftergetcontent' && me.queryCommandState( 'source' ) ){ +// return; +// } +// switchImgAndIframe( false ); +// } ); +// +// me.commands['webapp'] = { +// execCommand:function ( cmd, obj ) { +// me.execCommand( "inserthtml", createInsertStr( obj, false,true ) ); +// } +// }; +//}; + +UE.plugin.register('webapp', function (){ + var me = this; + function createInsertStr(obj,toEmbed){ + return !toEmbed ? + '' + : + '' + + } + return { + outputRule: function(root){ + utils.each(root.getNodesByTagName('img'),function(node){ + var html; + if(node.getAttr('class') == 'edui-faked-webapp'){ + html = createInsertStr({ + title:node.getAttr('title'), + 'width':node.getAttr('width'), + 'height':node.getAttr('height'), + 'align':node.getAttr('align'), + 'cssfloat':node.getStyle('float'), + 'url':node.getAttr("_url"), + 'logo':node.getAttr('_logo_url') + },true); + var embed = UE.uNode.createElement(html); + node.parentNode.replaceChild(embed,node); + } + }) + }, + inputRule:function(root){ + utils.each(root.getNodesByTagName('iframe'),function(node){ + if(node.getAttr('class') == 'edui-faked-webapp'){ + var img = UE.uNode.createElement(createInsertStr({ + title:node.getAttr('title'), + 'width':node.getAttr('width'), + 'height':node.getAttr('height'), + 'align':node.getAttr('align'), + 'cssfloat':node.getStyle('float'), + 'url':node.getAttr("src"), + 'logo':node.getAttr('logo_url') + })); + node.parentNode.replaceChild(img,node); + } + }) + + }, + commands:{ + /** + * 插入百度应用 + * @command webapp + * @method execCommand + * @remind 需要百度APPKey + * @remind 百度应用主页: http://app.baidu.com/ + * @param { Object } appOptions 应用所需的参数项, 支持的key有: title=>应用标题, width=>应用容器宽度, + * height=>应用容器高度,logo=>应用logo,url=>应用地址 + * @example + * ```javascript + * //editor是编辑器实例 + * //在编辑器里插入一个“植物大战僵尸”的APP + * editor.execCommand( 'webapp' , { + * title: '植物大战僵尸', + * width: 560, + * height: 465, + * logo: '应用展示的图片', + * url: '百度应用的地址' + * } ); + * ``` + */ + 'webapp':{ + execCommand:function (cmd, obj) { + + var me = this, + str = createInsertStr(utils.extend(obj,{ + align:'none' + }), false); + me.execCommand("inserthtml",str); + }, + queryCommandState:function () { + var me = this, + img = me.selection.getRange().getClosedNode(), + flag = img && (img.className == "edui-faked-webapp"); + return flag ? 1 : 0; + } + } + } + } +}); + +// plugins/template.js +///import core +///import plugins\inserthtml.js +///import plugins\cleardoc.js +///commands 模板 +///commandsName template +///commandsTitle 模板 +///commandsDialog dialogs\template +UE.plugins['template'] = function () { + UE.commands['template'] = { + execCommand:function (cmd, obj) { + obj.html && this.execCommand("inserthtml", obj.html); + } + }; + this.addListener("click", function (type, evt) { + var el = evt.target || evt.srcElement, + range = this.selection.getRange(); + var tnode = domUtils.findParent(el, function (node) { + if (node.className && domUtils.hasClass(node, "ue_t")) { + return node; + } + }, true); + tnode && range.selectNode(tnode).shrinkBoundary().select(); + }); + this.addListener("keydown", function (type, evt) { + var range = this.selection.getRange(); + if (!range.collapsed) { + if (!evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) { + var tnode = domUtils.findParent(range.startContainer, function (node) { + if (node.className && domUtils.hasClass(node, "ue_t")) { + return node; + } + }, true); + if (tnode) { + domUtils.removeClasses(tnode, ["ue_t"]); + } + } + } + }); +}; + + +// plugins/music.js +/** + * 插入音乐命令 + * @file + */ +UE.plugin.register('music', function (){ + var me = this; + function creatInsertStr(url,width,height,align,cssfloat,toEmbed){ + return !toEmbed ? + '' + : + ''; + } + return { + outputRule: function(root){ + utils.each(root.getNodesByTagName('img'),function(node){ + var html; + if(node.getAttr('class') == 'edui-faked-music'){ + var cssfloat = node.getStyle('float'); + var align = node.getAttr('align'); + html = creatInsertStr(node.getAttr("_url"), node.getAttr('width'), node.getAttr('height'), align, cssfloat, true); + var embed = UE.uNode.createElement(html); + node.parentNode.replaceChild(embed,node); + } + }) + }, + inputRule:function(root){ + utils.each(root.getNodesByTagName('embed'),function(node){ + if(node.getAttr('class') == 'edui-faked-music'){ + var cssfloat = node.getStyle('float'); + var align = node.getAttr('align'); + html = creatInsertStr(node.getAttr("src"), node.getAttr('width'), node.getAttr('height'), align, cssfloat,false); + var img = UE.uNode.createElement(html); + node.parentNode.replaceChild(img,node); + } + }) + + }, + commands:{ + /** + * 插入音乐 + * @command music + * @method execCommand + * @param { Object } musicOptions 插入音乐的参数项, 支持的key有: url=>音乐地址; + * width=>音乐容器宽度;height=>音乐容器高度;align=>音乐文件的对齐方式, 可选值有: left, center, right, none + * @example + * ```javascript + * //editor是编辑器实例 + * //在编辑器里插入一个“植物大战僵尸”的APP + * editor.execCommand( 'music' , { + * width: 400, + * height: 95, + * align: "center", + * url: "音乐地址" + * } ); + * ``` + */ + 'music':{ + execCommand:function (cmd, musicObj) { + var me = this, + str = creatInsertStr(musicObj.url, musicObj.width || 400, musicObj.height || 95, "none", false); + me.execCommand("inserthtml",str); + }, + queryCommandState:function () { + var me = this, + img = me.selection.getRange().getClosedNode(), + flag = img && (img.className == "edui-faked-music"); + return flag ? 1 : 0; + } + } + } + } +}); + +// plugins/autoupload.js +/** + * @description + * 1.拖放文件到编辑区域,自动上传并插入到选区 + * 2.插入粘贴板的图片,自动上传并插入到选区 + * @author Jinqn + * @date 2013-10-14 + */ +UE.plugin.register('autoupload', function (){ + + function sendAndInsertFile(file, editor) { + var me = editor; + //模拟数据 + var fieldName, urlPrefix, maxSize, allowFiles, actionUrl, + loadingHtml, errorHandler, successHandler, + filetype = /image\/\w+/i.test(file.type) ? 'image':'file', + loadingId = 'loading_' + (+new Date()).toString(36); + + fieldName = me.getOpt(filetype + 'FieldName'); + urlPrefix = me.getOpt(filetype + 'UrlPrefix'); + maxSize = me.getOpt(filetype + 'MaxSize'); + allowFiles = me.getOpt(filetype + 'AllowFiles'); + actionUrl = me.getActionUrl(me.getOpt(filetype + 'ActionName')); + errorHandler = function(title) { + var loader = me.document.getElementById(loadingId); + loader && domUtils.remove(loader); + me.fireEvent('showmessage', { + 'id': loadingId, + 'content': title, + 'type': 'error', + 'timeout': 4000 + }); + }; + + if (filetype == 'image') { + loadingHtml = ''; + successHandler = function(data) { + var link = urlPrefix + data.url, + loader = me.document.getElementById(loadingId); + if (loader) { + loader.setAttribute('src', link); + loader.setAttribute('_src', link); + loader.setAttribute('title', data.title || ''); + loader.setAttribute('alt', data.original || ''); + loader.removeAttribute('id'); + domUtils.removeClasses(loader, 'loadingclass'); + } + }; + } else { + loadingHtml = '

    ' + + '' + + '

    '; + successHandler = function(data) { + var link = urlPrefix + data.url, + loader = me.document.getElementById(loadingId); + + var rng = me.selection.getRange(), + bk = rng.createBookmark(); + rng.selectNode(loader).select(); + me.execCommand('insertfile', {'url': link}); + rng.moveToBookmark(bk).select(); + }; + } + + /* 插入loading的占位符 */ + me.execCommand('inserthtml', loadingHtml); + + /* 判断后端配置是否没有加载成功 */ + if (!me.getOpt(filetype + 'ActionName')) { + errorHandler(me.getLang('autoupload.errorLoadConfig')); + return; + } + /* 判断文件大小是否超出限制 */ + if(file.size > maxSize) { + errorHandler(me.getLang('autoupload.exceedSizeError')); + return; + } + /* 判断文件格式是否超出允许 */ + var fileext = file.name ? file.name.substr(file.name.lastIndexOf('.')):''; + if ((fileext && filetype != 'image') || (allowFiles && (allowFiles.join('') + '.').indexOf(fileext.toLowerCase() + '.') == -1)) { + errorHandler(me.getLang('autoupload.exceedTypeError')); + return; + } + + /* 创建Ajax并提交 */ + var xhr = new XMLHttpRequest(), + fd = new FormData(), + params = utils.serializeParam(me.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + params); + + fd.append(fieldName, file, file.name || ('blob.' + file.type.substr('image/'.length))); + fd.append('type', 'ajax'); + xhr.open("post", url, true); + xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + xhr.addEventListener('load', function (e) { + try{ + var json = (new Function("return " + utils.trim(e.target.response)))(); + if (json.state == 'SUCCESS' && json.url) { + successHandler(json); + } else { + errorHandler(json.state); + } + }catch(er){ + errorHandler(me.getLang('autoupload.loadError')); + } + }); + xhr.send(fd); + } + + function getPasteImage(e){ + return e.clipboardData && e.clipboardData.items && e.clipboardData.items.length == 1 && /^image\//.test(e.clipboardData.items[0].type) ? e.clipboardData.items:null; + } + function getDropImage(e){ + return e.dataTransfer && e.dataTransfer.files ? e.dataTransfer.files:null; + } + + return { + outputRule: function(root){ + utils.each(root.getNodesByTagName('img'),function(n){ + if (/\b(loaderrorclass)|(bloaderrorclass)\b/.test(n.getAttr('class'))) { + n.parentNode.removeChild(n); + } + }); + utils.each(root.getNodesByTagName('p'),function(n){ + if (/\bloadpara\b/.test(n.getAttr('class'))) { + n.parentNode.removeChild(n); + } + }); + }, + bindEvents:{ + //插入粘贴板的图片,拖放插入图片 + 'ready':function(e){ + var me = this; + if(window.FormData && window.FileReader) { + domUtils.on(me.body, 'paste drop', function(e){ + var hasImg = false, + items; + //获取粘贴板文件列表或者拖放文件列表 + items = e.type == 'paste' ? getPasteImage(e):getDropImage(e); + if(items){ + var len = items.length, + file; + while (len--){ + file = items[len]; + if(file.getAsFile) file = file.getAsFile(); + if(file && file.size > 0) { + sendAndInsertFile(file, me); + hasImg = true; + } + } + hasImg && e.preventDefault(); + } + + }); + //取消拖放图片时出现的文字光标位置提示 + domUtils.on(me.body, 'dragover', function (e) { + if(e.dataTransfer.types[0] == 'Files') { + e.preventDefault(); + } + }); + + //设置loading的样式 + utils.cssRule('loading', + '.loadingclass{display:inline-block;cursor:default;background: url(\'' + + this.options.themePath + + this.options.theme +'/images/loading.gif\') no-repeat center center transparent;border:1px solid #cccccc;margin-left:1px;height: 22px;width: 22px;}\n' + + '.loaderrorclass{display:inline-block;cursor:default;background: url(\'' + + this.options.themePath + + this.options.theme +'/images/loaderror.png\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;' + + '}', + this.document); + } + } + } + } +}); + +// plugins/autosave.js +UE.plugin.register('autosave', function (){ + + var me = this, + //无限循环保护 + lastSaveTime = new Date(), + //最小保存间隔时间 + MIN_TIME = 20, + //auto save key + saveKey = null; + + function save ( editor ) { + + var saveData; + + if ( new Date() - lastSaveTime < MIN_TIME ) { + return; + } + + if ( !editor.hasContents() ) { + //这里不能调用命令来删除, 会造成事件死循环 + saveKey && me.removePreferences( saveKey ); + return; + } + + lastSaveTime = new Date(); + + editor._saveFlag = null; + + saveData = me.body.innerHTML; + + if ( editor.fireEvent( "beforeautosave", { + content: saveData + } ) === false ) { + return; + } + + me.setPreferences( saveKey, saveData ); + + editor.fireEvent( "afterautosave", { + content: saveData + } ); + + } + + return { + defaultOptions: { + //默认间隔时间 + saveInterval: 500 + }, + bindEvents:{ + 'ready':function(){ + + var _suffix = "-drafts-data", + key = null; + + if ( me.key ) { + key = me.key + _suffix; + } else { + key = ( me.container.parentNode.id || 'ue-common' ) + _suffix; + } + + //页面地址+编辑器ID 保持唯一 + saveKey = ( location.protocol + location.host + location.pathname ).replace( /[.:\/]/g, '_' ) + key; + + }, + + 'contentchange': function () { + + if ( !saveKey ) { + return; + } + + if ( me._saveFlag ) { + window.clearTimeout( me._saveFlag ); + } + + if ( me.options.saveInterval > 0 ) { + + me._saveFlag = window.setTimeout( function () { + + save( me ); + + }, me.options.saveInterval ); + + } else { + + save(me); + + } + + + } + }, + commands:{ + 'clearlocaldata':{ + execCommand:function (cmd, name) { + if ( saveKey && me.getPreferences( saveKey ) ) { + me.removePreferences( saveKey ) + } + }, + notNeedUndo: true, + ignoreContentChange:true + }, + + 'getlocaldata':{ + execCommand:function (cmd, name) { + return saveKey ? me.getPreferences( saveKey ) || '' : ''; + }, + notNeedUndo: true, + ignoreContentChange:true + }, + + 'drafts':{ + execCommand:function (cmd, name) { + if ( saveKey ) { + me.body.innerHTML = me.getPreferences( saveKey ) || '

    '+domUtils.fillHtml+'

    '; + me.focus(true); + } + }, + queryCommandState: function () { + return saveKey ? ( me.getPreferences( saveKey ) === null ? -1 : 0 ) : -1; + }, + notNeedUndo: true, + ignoreContentChange:true + } + } + } + +}); + +// plugins/charts.js +UE.plugin.register('charts', function (){ + + var me = this; + + return { + bindEvents: { + 'chartserror': function () { + } + }, + commands:{ + 'charts': { + execCommand: function ( cmd, data ) { + + var tableNode = domUtils.findParentByTagName(this.selection.getRange().startContainer, 'table', true), + flagText = [], + config = {}; + + if ( !tableNode ) { + return false; + } + + if ( !validData( tableNode ) ) { + me.fireEvent( "chartserror" ); + return false; + } + + config.title = data.title || ''; + config.subTitle = data.subTitle || ''; + config.xTitle = data.xTitle || ''; + config.yTitle = data.yTitle || ''; + config.suffix = data.suffix || ''; + config.tip = data.tip || ''; + //数据对齐方式 + config.dataFormat = data.tableDataFormat || ''; + //图表类型 + config.chartType = data.chartType || 0; + + for ( var key in config ) { + + if ( !config.hasOwnProperty( key ) ) { + continue; + } + + flagText.push( key+":"+config[ key ] ); + + } + + tableNode.setAttribute( "data-chart", flagText.join( ";" ) ); + domUtils.addClass( tableNode, "edui-charts-table" ); + + + + }, + queryCommandState: function ( cmd, name ) { + + var tableNode = domUtils.findParentByTagName(this.selection.getRange().startContainer, 'table', true); + return tableNode && validData( tableNode ) ? 0 : -1; + + } + } + }, + inputRule:function(root){ + utils.each(root.getNodesByTagName('table'),function( tableNode ){ + + if ( tableNode.getAttr("data-chart") !== undefined ) { + tableNode.setAttr("style"); + } + + }) + + }, + outputRule:function(root){ + utils.each(root.getNodesByTagName('table'),function( tableNode ){ + + if ( tableNode.getAttr("data-chart") !== undefined ) { + tableNode.setAttr("style", "display: none;"); + } + + }) + + } + } + + function validData ( table ) { + + var firstRows = null, + cellCount = 0; + + //行数不够 + if ( table.rows.length < 2 ) { + return false; + } + + //列数不够 + if ( table.rows[0].cells.length < 2 ) { + return false; + } + + //第一行所有cell必须是th + firstRows = table.rows[ 0 ].cells; + cellCount = firstRows.length; + + for ( var i = 0, cell; cell = firstRows[ i ]; i++ ) { + + if ( cell.tagName.toLowerCase() !== 'th' ) { + return false; + } + + } + + for ( var i = 1, row; row = table.rows[ i ]; i++ ) { + + //每行单元格数不匹配, 返回false + if ( row.cells.length != cellCount ) { + return false; + } + + //第一列不是th也返回false + if ( row.cells[0].tagName.toLowerCase() !== 'th' ) { + return false; + } + + for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) { + + var value = utils.trim( ( cell.innerText || cell.textContent || '' ) ); + + value = value.replace( new RegExp( UE.dom.domUtils.fillChar, 'g' ), '' ).replace( /^\s+|\s+$/g, '' ); + + //必须是数字 + if ( !/^\d*\.?\d+$/.test( value ) ) { + return false; + } + + } + + } + + return true; + + } + +}); + +// plugins/section.js +/** + * 目录大纲支持插件 + * @file + * @since 1.3.0 + */ +UE.plugin.register('section', function (){ + /* 目录节点对象 */ + function Section(option){ + this.tag = ''; + this.level = -1, + this.dom = null; + this.nextSection = null; + this.previousSection = null; + this.parentSection = null; + this.startAddress = []; + this.endAddress = []; + this.children = []; + } + function getSection(option) { + var section = new Section(); + return utils.extend(section, option); + } + function getNodeFromAddress(startAddress, root) { + var current = root; + for(var i = 0;i < startAddress.length; i++) { + if(!current.childNodes) return null; + current = current.childNodes[startAddress[i]]; + } + return current; + } + + var me = this; + + return { + bindMultiEvents:{ + type: 'aftersetcontent afterscencerestore', + handler: function(){ + me.fireEvent('updateSections'); + } + }, + bindEvents:{ + /* 初始化、拖拽、粘贴、执行setcontent之后 */ + 'ready': function (){ + me.fireEvent('updateSections'); + domUtils.on(me.body, 'drop paste', function(){ + me.fireEvent('updateSections'); + }); + }, + /* 执行paragraph命令之后 */ + 'afterexeccommand': function (type, cmd) { + if(cmd == 'paragraph') { + me.fireEvent('updateSections'); + } + }, + /* 部分键盘操作,触发updateSections事件 */ + 'keyup': function (type, e) { + var me = this, + range = me.selection.getRange(); + if(range.collapsed != true) { + me.fireEvent('updateSections'); + } else { + var keyCode = e.keyCode || e.which; + if(keyCode == 13 || keyCode == 8 || keyCode == 46) { + me.fireEvent('updateSections'); + } + } + } + }, + commands:{ + 'getsections': { + execCommand: function (cmd, levels) { + var levelFn = levels || ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']; + + for (var i = 0; i < levelFn.length; i++) { + if (typeof levelFn[i] == 'string') { + levelFn[i] = function(fn){ + return function(node){ + return node.tagName == fn.toUpperCase() + }; + }(levelFn[i]); + } else if (typeof levelFn[i] != 'function') { + levelFn[i] = function (node) { + return null; + } + } + } + function getSectionLevel(node) { + for (var i = 0; i < levelFn.length; i++) { + if (levelFn[i](node)) return i; + } + return -1; + } + + var me = this, + Directory = getSection({'level':-1, 'title':'root'}), + previous = Directory; + + function traversal(node, Directory) { + var level, + tmpSection = null, + parent, + child, + children = node.childNodes; + for (var i = 0, len = children.length; i < len; i++) { + child = children[i]; + level = getSectionLevel(child); + if (level >= 0) { + var address = me.selection.getRange().selectNode(child).createAddress(true).startAddress, + current = getSection({ + 'tag': child.tagName, + 'title': child.innerText || child.textContent || '', + 'level': level, + 'dom': child, + 'startAddress': utils.clone(address, []), + 'endAddress': utils.clone(address, []), + 'children': [] + }); + previous.nextSection = current; + current.previousSection = previous; + parent = previous; + while(level <= parent.level){ + parent = parent.parentSection; + } + current.parentSection = parent; + parent.children.push(current); + tmpSection = previous = current; + } else { + child.nodeType === 1 && traversal(child, Directory); + tmpSection && tmpSection.endAddress[tmpSection.endAddress.length - 1] ++; + } + } + } + traversal(me.body, Directory); + return Directory; + }, + notNeedUndo: true + }, + 'movesection': { + execCommand: function (cmd, sourceSection, targetSection, isAfter) { + + var me = this, + targetAddress, + target; + + if(!sourceSection || !targetSection || targetSection.level == -1) return; + + targetAddress = isAfter ? targetSection.endAddress:targetSection.startAddress; + target = getNodeFromAddress(targetAddress, me.body); + + /* 判断目标地址是否被源章节包含 */ + if(!targetAddress || !target || isContainsAddress(sourceSection.startAddress, sourceSection.endAddress, targetAddress)) return; + + var startNode = getNodeFromAddress(sourceSection.startAddress, me.body), + endNode = getNodeFromAddress(sourceSection.endAddress, me.body), + current, + nextNode; + + if(isAfter) { + current = endNode; + while ( current && !(domUtils.getPosition( startNode, current ) & domUtils.POSITION_FOLLOWING) ) { + nextNode = current.previousSibling; + domUtils.insertAfter(target, current); + if(current == startNode) break; + current = nextNode; + } + } else { + current = startNode; + while ( current && !(domUtils.getPosition( current, endNode ) & domUtils.POSITION_FOLLOWING) ) { + nextNode = current.nextSibling; + target.parentNode.insertBefore(current, target); + if(current == endNode) break; + current = nextNode; + } + } + + me.fireEvent('updateSections'); + + /* 获取地址的包含关系 */ + function isContainsAddress(startAddress, endAddress, addressTarget){ + var isAfterStartAddress = false, + isBeforeEndAddress = false; + for(var i = 0; i< startAddress.length; i++){ + if(i >= addressTarget.length) break; + if(addressTarget[i] > startAddress[i]) { + isAfterStartAddress = true; + break; + } else if(addressTarget[i] < startAddress[i]) { + break; + } + } + for(var i = 0; i< endAddress.length; i++){ + if(i >= addressTarget.length) break; + if(addressTarget[i] < startAddress[i]) { + isBeforeEndAddress = true; + break; + } else if(addressTarget[i] > startAddress[i]) { + break; + } + } + return isAfterStartAddress && isBeforeEndAddress; + } + } + }, + 'deletesection': { + execCommand: function (cmd, section, keepChildren) { + var me = this; + + if(!section) return; + + function getNodeFromAddress(startAddress) { + var current = me.body; + for(var i = 0;i < startAddress.length; i++) { + if(!current.childNodes) return null; + current = current.childNodes[startAddress[i]]; + } + return current; + } + + var startNode = getNodeFromAddress(section.startAddress), + endNode = getNodeFromAddress(section.endAddress), + current = startNode, + nextNode; + + if(!keepChildren) { + while ( current && domUtils.inDoc(endNode, me.document) && !(domUtils.getPosition( current, endNode ) & domUtils.POSITION_FOLLOWING) ) { + nextNode = current.nextSibling; + domUtils.remove(current); + current = nextNode; + } + } else { + domUtils.remove(current); + } + + me.fireEvent('updateSections'); + } + }, + 'selectsection': { + execCommand: function (cmd, section) { + if(!section && !section.dom) return false; + var me = this, + range = me.selection.getRange(), + address = { + 'startAddress':utils.clone(section.startAddress, []), + 'endAddress':utils.clone(section.endAddress, []) + }; + address.endAddress[address.endAddress.length - 1]++; + range.moveToAddress(address).select().scrollToView(); + return true; + }, + notNeedUndo: true + }, + 'scrolltosection': { + execCommand: function (cmd, section) { + if(!section && !section.dom) return false; + var me = this, + range = me.selection.getRange(), + address = { + 'startAddress':section.startAddress, + 'endAddress':section.endAddress + }; + address.endAddress[address.endAddress.length - 1]++; + range.moveToAddress(address).scrollToView(); + return true; + }, + notNeedUndo: true + } + } + } +}); + +// plugins/simpleupload.js +/** + * @description + * 简单上传:点击按钮,直接选择文件上传 + * @author Jinqn + * @date 2014-03-31 + */ +UE.plugin.register('simpleupload', function (){ + var me = this, + isLoaded = false, + containerBtn; + + function initUploadBtn(){ + var w = containerBtn.offsetWidth || 20, + h = containerBtn.offsetHeight || 20, + btnIframe = document.createElement('iframe'), + btnStyle = 'display:block;width:' + w + 'px;height:' + h + 'px;overflow:hidden;border:0;margin:0;padding:0;position:absolute;top:0;left:0;filter:alpha(opacity=0);-moz-opacity:0;-khtml-opacity: 0;opacity: 0;cursor:pointer;'; + + domUtils.on(btnIframe, 'load', function(){ + + var timestrap = (+new Date()).toString(36), + wrapper, + btnIframeDoc, + btnIframeBody; + + btnIframeDoc = (btnIframe.contentDocument || btnIframe.contentWindow.document); + btnIframeBody = btnIframeDoc.body; + wrapper = btnIframeDoc.createElement('div'); + + wrapper.innerHTML = '
    ' + + '' + + '
    ' + + ''; + + wrapper.className = 'edui-' + me.options.theme; + wrapper.id = me.ui.id + '_iframeupload'; + btnIframeBody.style.cssText = btnStyle; + btnIframeBody.style.width = w + 'px'; + btnIframeBody.style.height = h + 'px'; + btnIframeBody.appendChild(wrapper); + + if (btnIframeBody.parentNode) { + btnIframeBody.parentNode.style.width = w + 'px'; + btnIframeBody.parentNode.style.height = w + 'px'; + } + + var form = btnIframeDoc.getElementById('edui_form_' + timestrap); + var input = btnIframeDoc.getElementById('edui_input_' + timestrap); + var iframe = btnIframeDoc.getElementById('edui_iframe_' + timestrap); + + domUtils.on(input, 'change', function(){ + if(!input.value) return; + var loadingId = 'loading_' + (+new Date()).toString(36); + var params = utils.serializeParam(me.queryCommandValue('serverparam')) || ''; + + var imageActionUrl = me.getActionUrl(me.getOpt('imageActionName')); + var allowFiles = me.getOpt('imageAllowFiles'); + + me.focus(); + me.execCommand('inserthtml', ''); + + function callback(){ + try{ + var link, json, loader, + body = (iframe.contentDocument || iframe.contentWindow.document).body, + result = body.innerText || body.textContent || ''; + json = (new Function("return " + result))(); + link = me.options.imageUrlPrefix + json.url; + if(json.state == 'SUCCESS' && json.url) { + loader = me.document.getElementById(loadingId); + loader.setAttribute('src', link); + loader.setAttribute('_src', link); + loader.setAttribute('title', json.title || ''); + loader.setAttribute('alt', json.original || ''); + loader.removeAttribute('id'); + domUtils.removeClasses(loader, 'loadingclass'); + } else { + showErrorLoader && showErrorLoader(json.state); + } + }catch(er){ + showErrorLoader && showErrorLoader(me.getLang('simpleupload.loadError')); + } + form.reset(); + domUtils.un(iframe, 'load', callback); + } + function showErrorLoader(title){ + if(loadingId) { + var loader = me.document.getElementById(loadingId); + loader && domUtils.remove(loader); + me.fireEvent('showmessage', { + 'id': loadingId, + 'content': title, + 'type': 'error', + 'timeout': 4000 + }); + } + } + + /* 判断后端配置是否没有加载成功 */ + if (!me.getOpt('imageActionName')) { + errorHandler(me.getLang('autoupload.errorLoadConfig')); + return; + } + // 判断文件格式是否错误 + var filename = input.value, + fileext = filename ? filename.substr(filename.lastIndexOf('.')):''; + if (!fileext || (allowFiles && (allowFiles.join('') + '.').indexOf(fileext.toLowerCase() + '.') == -1)) { + showErrorLoader(me.getLang('simpleupload.exceedTypeError')); + return; + } + + domUtils.on(iframe, 'load', callback); + form.action = utils.formatUrl(imageActionUrl + (imageActionUrl.indexOf('?') == -1 ? '?':'&') + params); + form.submit(); + }); + + var stateTimer; + me.addListener('selectionchange', function () { + clearTimeout(stateTimer); + stateTimer = setTimeout(function() { + var state = me.queryCommandState('simpleupload'); + if (state == -1) { + input.disabled = 'disabled'; + } else { + input.disabled = false; + } + }, 400); + }); + isLoaded = true; + }); + + btnIframe.style.cssText = btnStyle; + containerBtn.appendChild(btnIframe); + } + + return { + bindEvents:{ + 'ready': function() { + //设置loading的样式 + utils.cssRule('loading', + '.loadingclass{display:inline-block;cursor:default;background: url(\'' + + this.options.themePath + + this.options.theme +'/images/loading.gif\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}\n' + + '.loaderrorclass{display:inline-block;cursor:default;background: url(\'' + + this.options.themePath + + this.options.theme +'/images/loaderror.png\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;' + + '}', + this.document); + }, + /* 初始化简单上传按钮 */ + 'simpleuploadbtnready': function(type, container) { + containerBtn = container; + me.afterConfigReady(initUploadBtn); + } + }, + outputRule: function(root){ + utils.each(root.getNodesByTagName('img'),function(n){ + if (/\b(loaderrorclass)|(bloaderrorclass)\b/.test(n.getAttr('class'))) { + n.parentNode.removeChild(n); + } + }); + }, + commands: { + 'simpleupload': { + queryCommandState: function () { + return isLoaded ? 0:-1; + } + } + } + } +}); + +// plugins/serverparam.js +/** + * 服务器提交的额外参数列表设置插件 + * @file + * @since 1.2.6.1 + */ +UE.plugin.register('serverparam', function (){ + + var me = this, + serverParam = {}; + + return { + commands:{ + /** + * 修改服务器提交的额外参数列表,清除所有项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand('serverparam'); + * editor.queryCommandValue('serverparam'); //返回空 + * ``` + */ + /** + * 修改服务器提交的额外参数列表,删除指定项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } key 要清除的属性 + * @example + * ```javascript + * editor.execCommand('serverparam', 'name'); //删除属性name + * ``` + */ + /** + * 修改服务器提交的额外参数列表,使用键值添加项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } key 要添加的属性 + * @param { String } value 要添加属性的值 + * @example + * ```javascript + * editor.execCommand('serverparam', 'name', 'hello'); + * editor.queryCommandValue('serverparam'); //返回对象 {'name': 'hello'} + * ``` + */ + /** + * 修改服务器提交的额外参数列表,传入键值对对象添加多项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } key 传入的键值对对象 + * @example + * ```javascript + * editor.execCommand('serverparam', {'name': 'hello'}); + * editor.queryCommandValue('serverparam'); //返回对象 {'name': 'hello'} + * ``` + */ + /** + * 修改服务器提交的额外参数列表,使用自定义函数添加多项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Function } key 自定义获取参数的函数 + * @example + * ```javascript + * editor.execCommand('serverparam', function(editor){ + * return {'key': 'value'}; + * }); + * editor.queryCommandValue('serverparam'); //返回对象 {'key': 'value'} + * ``` + */ + + /** + * 获取服务器提交的额外参数列表 + * @command serverparam + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.queryCommandValue( 'serverparam' ); //返回对象 {'key': 'value'} + * ``` + */ + 'serverparam':{ + execCommand:function (cmd, key, value) { + if (key === undefined || key === null) { //不传参数,清空列表 + serverParam = {}; + } else if (utils.isString(key)) { //传入键值 + if(value === undefined || value === null) { + delete serverParam[key]; + } else { + serverParam[key] = value; + } + } else if (utils.isObject(key)) { //传入对象,覆盖列表项 + utils.extend(serverParam, key, true); + } else if (utils.isFunction(key)){ //传入函数,添加列表项 + utils.extend(serverParam, key(), true); + } + }, + queryCommandValue: function(){ + return serverParam || {}; + } + } + } + } +}); + + +// plugins/insertfile.js +/** + * 插入附件 + */ +UE.plugin.register('insertfile', function (){ + + var me = this; + + function getFileIcon(url){ + var ext = url.substr(url.lastIndexOf('.') + 1).toLowerCase(), + maps = { + "rar":"icon_rar.gif", + "zip":"icon_rar.gif", + "tar":"icon_rar.gif", + "gz":"icon_rar.gif", + "bz2":"icon_rar.gif", + "doc":"icon_doc.gif", + "docx":"icon_doc.gif", + "pdf":"icon_pdf.gif", + "mp3":"icon_mp3.gif", + "xls":"icon_xls.gif", + "chm":"icon_chm.gif", + "ppt":"icon_ppt.gif", + "pptx":"icon_ppt.gif", + "avi":"icon_mv.gif", + "rmvb":"icon_mv.gif", + "wmv":"icon_mv.gif", + "flv":"icon_mv.gif", + "swf":"icon_mv.gif", + "rm":"icon_mv.gif", + "exe":"icon_exe.gif", + "psd":"icon_psd.gif", + "txt":"icon_txt.gif", + "jpg":"icon_jpg.gif", + "png":"icon_jpg.gif", + "jpeg":"icon_jpg.gif", + "gif":"icon_jpg.gif", + "ico":"icon_jpg.gif", + "bmp":"icon_jpg.gif" + }; + return maps[ext] ? maps[ext]:maps['txt']; + } + + return { + commands:{ + 'insertfile': { + execCommand: function (command, filelist){ + filelist = utils.isArray(filelist) ? filelist : [filelist]; + + var i, item, icon, title, + html = '', + URL = me.getOpt('UEDITOR_HOME_URL'), + iconDir = URL + (URL.substr(URL.length - 1) == '/' ? '':'/') + 'dialogs/attachment/fileTypeImages/'; + for (i = 0; i < filelist.length; i++) { + item = filelist[i]; + icon = iconDir + getFileIcon(item.url); + title = item.title || item.url.substr(item.url.lastIndexOf('/') + 1); + html += '

    ' + + '' + + '' + title + '' + + '

    '; + } + me.execCommand('insertHtml', html); + } + } + } + } +}); + + + + +// plugins/xssFilter.js +/** + * @file xssFilter.js + * @desc xss过滤器 + * @author robbenmu + */ + +UE.plugins.xssFilter = function() { + + var config = UEDITOR_CONFIG; + var whitList = config.whitList; + + function filter(node) { + + var tagName = node.tagName; + var attrs = node.attrs; + + if (!whitList.hasOwnProperty(tagName)) { + node.parentNode.removeChild(node); + return false; + } + + UE.utils.each(attrs, function (val, key) { + + if (whitList[tagName].indexOf(key) === -1) { + node.setAttr(key); + } + }); + } + + // 添加inserthtml\paste等操作用的过滤规则 + if (whitList && config.xssFilterRules) { + this.options.filterRules = function () { + + var result = {}; + + UE.utils.each(whitList, function(val, key) { + result[key] = function (node) { + return filter(node); + }; + }); + + return result; + }(); + } + + var tagList = []; + + UE.utils.each(whitList, function (val, key) { + tagList.push(key); + }); + + // 添加input过滤规则 + // + if (whitList && config.inputXssFilter) { + this.addInputRule(function (root) { + + root.traversal(function(node) { + if (node.type !== 'element') { + return false; + } + filter(node); + }); + }); + } + // 添加output过滤规则 + // + if (whitList && config.outputXssFilter) { + this.addOutputRule(function (root) { + + root.traversal(function(node) { + if (node.type !== 'element') { + return false; + } + filter(node); + }); + }); + } + +}; + + +// ui/ui.js +var baidu = baidu || {}; +baidu.editor = baidu.editor || {}; +UE.ui = baidu.editor.ui = {}; + +// ui/uiutils.js +(function (){ + var browser = baidu.editor.browser, + domUtils = baidu.editor.dom.domUtils; + + var magic = '$EDITORUI'; + var root = window[magic] = {}; + var uidMagic = 'ID' + magic; + var uidCount = 0; + + var uiUtils = baidu.editor.ui.uiUtils = { + uid: function (obj){ + return (obj ? obj[uidMagic] || (obj[uidMagic] = ++ uidCount) : ++ uidCount); + }, + hook: function ( fn, callback ) { + var dg; + if (fn && fn._callbacks) { + dg = fn; + } else { + dg = function (){ + var q; + if (fn) { + q = fn.apply(this, arguments); + } + var callbacks = dg._callbacks; + var k = callbacks.length; + while (k --) { + var r = callbacks[k].apply(this, arguments); + if (q === undefined) { + q = r; + } + } + return q; + }; + dg._callbacks = []; + } + dg._callbacks.push(callback); + return dg; + }, + createElementByHtml: function (html){ + var el = document.createElement('div'); + el.innerHTML = html; + el = el.firstChild; + el.parentNode.removeChild(el); + return el; + }, + getViewportElement: function (){ + return (browser.ie && browser.quirks) ? + document.body : document.documentElement; + }, + getClientRect: function (element){ + var bcr; + //trace IE6下在控制编辑器显隐时可能会报错,catch一下 + try{ + bcr = element.getBoundingClientRect(); + }catch(e){ + bcr={left:0,top:0,height:0,width:0} + } + var rect = { + left: Math.round(bcr.left), + top: Math.round(bcr.top), + height: Math.round(bcr.bottom - bcr.top), + width: Math.round(bcr.right - bcr.left) + }; + var doc; + while ((doc = element.ownerDocument) !== document && + (element = domUtils.getWindow(doc).frameElement)) { + bcr = element.getBoundingClientRect(); + rect.left += bcr.left; + rect.top += bcr.top; + } + rect.bottom = rect.top + rect.height; + rect.right = rect.left + rect.width; + return rect; + }, + getViewportRect: function (){ + var viewportEl = uiUtils.getViewportElement(); + var width = (window.innerWidth || viewportEl.clientWidth) | 0; + var height = (window.innerHeight ||viewportEl.clientHeight) | 0; + return { + left: 0, + top: 0, + height: height, + width: width, + bottom: height, + right: width + }; + }, + setViewportOffset: function (element, offset){ + var rect; + var fixedLayer = uiUtils.getFixedLayer(); + if (element.parentNode === fixedLayer) { + element.style.left = offset.left + 'px'; + element.style.top = offset.top + 'px'; + } else { + domUtils.setViewportOffset(element, offset); + } + }, + getEventOffset: function (evt){ + var el = evt.target || evt.srcElement; + var rect = uiUtils.getClientRect(el); + var offset = uiUtils.getViewportOffsetByEvent(evt); + return { + left: offset.left - rect.left, + top: offset.top - rect.top + }; + }, + getViewportOffsetByEvent: function (evt){ + var el = evt.target || evt.srcElement; + var frameEl = domUtils.getWindow(el).frameElement; + var offset = { + left: evt.clientX, + top: evt.clientY + }; + if (frameEl && el.ownerDocument !== document) { + var rect = uiUtils.getClientRect(frameEl); + offset.left += rect.left; + offset.top += rect.top; + } + return offset; + }, + setGlobal: function (id, obj){ + root[id] = obj; + return magic + '["' + id + '"]'; + }, + unsetGlobal: function (id){ + delete root[id]; + }, + copyAttributes: function (tgt, src){ + var attributes = src.attributes; + var k = attributes.length; + while (k --) { + var attrNode = attributes[k]; + if ( attrNode.nodeName != 'style' && attrNode.nodeName != 'class' && (!browser.ie || attrNode.specified) ) { + tgt.setAttribute(attrNode.nodeName, attrNode.nodeValue); + } + } + if (src.className) { + domUtils.addClass(tgt,src.className); + } + if (src.style.cssText) { + tgt.style.cssText += ';' + src.style.cssText; + } + }, + removeStyle: function (el, styleName){ + if (el.style.removeProperty) { + el.style.removeProperty(styleName); + } else if (el.style.removeAttribute) { + el.style.removeAttribute(styleName); + } else throw ''; + }, + contains: function (elA, elB){ + return elA && elB && (elA === elB ? false : ( + elA.contains ? elA.contains(elB) : + elA.compareDocumentPosition(elB) & 16 + )); + }, + startDrag: function (evt, callbacks,doc){ + var doc = doc || document; + var startX = evt.clientX; + var startY = evt.clientY; + function handleMouseMove(evt){ + var x = evt.clientX - startX; + var y = evt.clientY - startY; + callbacks.ondragmove(x, y,evt); + if (evt.stopPropagation) { + evt.stopPropagation(); + } else { + evt.cancelBubble = true; + } + } + if (doc.addEventListener) { + function handleMouseUp(evt){ + doc.removeEventListener('mousemove', handleMouseMove, true); + doc.removeEventListener('mouseup', handleMouseUp, true); + window.removeEventListener('mouseup', handleMouseUp, true); + callbacks.ondragstop(); + } + doc.addEventListener('mousemove', handleMouseMove, true); + doc.addEventListener('mouseup', handleMouseUp, true); + window.addEventListener('mouseup', handleMouseUp, true); + + evt.preventDefault(); + } else { + var elm = evt.srcElement; + elm.setCapture(); + function releaseCaptrue(){ + elm.releaseCapture(); + elm.detachEvent('onmousemove', handleMouseMove); + elm.detachEvent('onmouseup', releaseCaptrue); + elm.detachEvent('onlosecaptrue', releaseCaptrue); + callbacks.ondragstop(); + } + elm.attachEvent('onmousemove', handleMouseMove); + elm.attachEvent('onmouseup', releaseCaptrue); + elm.attachEvent('onlosecaptrue', releaseCaptrue); + evt.returnValue = false; + } + callbacks.ondragstart(); + }, + getFixedLayer: function (){ + var layer = document.getElementById('edui_fixedlayer'); + if (layer == null) { + layer = document.createElement('div'); + layer.id = 'edui_fixedlayer'; + document.body.appendChild(layer); + if (browser.ie && browser.version <= 8) { + layer.style.position = 'absolute'; + bindFixedLayer(); + setTimeout(updateFixedOffset); + } else { + layer.style.position = 'fixed'; + } + layer.style.left = '0'; + layer.style.top = '0'; + layer.style.width = '0'; + layer.style.height = '0'; + } + return layer; + }, + makeUnselectable: function (element){ + if (browser.opera || (browser.ie && browser.version < 9)) { + element.unselectable = 'on'; + if (element.hasChildNodes()) { + for (var i=0; i'; + } + }; + utils.inherits(Separator, UIBase); + +})(); + + +// ui/mask.js +///import core +///import uicore +(function (){ + var utils = baidu.editor.utils, + domUtils = baidu.editor.dom.domUtils, + UIBase = baidu.editor.ui.UIBase, + uiUtils = baidu.editor.ui.uiUtils; + + var Mask = baidu.editor.ui.Mask = function (options){ + this.initOptions(options); + this.initUIBase(); + }; + Mask.prototype = { + getHtmlTpl: function (){ + return '
    '; + }, + postRender: function (){ + var me = this; + domUtils.on(window, 'resize', function (){ + setTimeout(function (){ + if (!me.isHidden()) { + me._fill(); + } + }); + }); + }, + show: function (zIndex){ + this._fill(); + this.getDom().style.display = ''; + this.getDom().style.zIndex = zIndex; + }, + hide: function (){ + this.getDom().style.display = 'none'; + this.getDom().style.zIndex = ''; + }, + isHidden: function (){ + return this.getDom().style.display == 'none'; + }, + _onMouseDown: function (){ + return false; + }, + _onClick: function (e, target){ + this.fireEvent('click', e, target); + }, + _fill: function (){ + var el = this.getDom(); + var vpRect = uiUtils.getViewportRect(); + el.style.width = vpRect.width + 'px'; + el.style.height = vpRect.height + 'px'; + } + }; + utils.inherits(Mask, UIBase); +})(); + + +// ui/popup.js +///import core +///import uicore +(function () { + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + domUtils = baidu.editor.dom.domUtils, + UIBase = baidu.editor.ui.UIBase, + Popup = baidu.editor.ui.Popup = function (options){ + this.initOptions(options); + this.initPopup(); + }; + + var allPopups = []; + function closeAllPopup( evt,el ){ + for ( var i = 0; i < allPopups.length; i++ ) { + var pop = allPopups[i]; + if (!pop.isHidden()) { + if (pop.queryAutoHide(el) !== false) { + if(evt&&/scroll/ig.test(evt.type)&&pop.className=="edui-wordpastepop") return; + pop.hide(); + } + } + } + + if(allPopups.length) + pop.editor.fireEvent("afterhidepop"); + } + + Popup.postHide = closeAllPopup; + + var ANCHOR_CLASSES = ['edui-anchor-topleft','edui-anchor-topright', + 'edui-anchor-bottomleft','edui-anchor-bottomright']; + Popup.prototype = { + SHADOW_RADIUS: 5, + content: null, + _hidden: false, + autoRender: true, + canSideLeft: true, + canSideUp: true, + initPopup: function (){ + this.initUIBase(); + allPopups.push( this ); + }, + getHtmlTpl: function (){ + return '
    ' + + '
    ' + + ' ' + + '
    ' + + '
    ' + + this.getContentHtmlTpl() + + '
    ' + + '
    ' + + '
    '; + }, + getContentHtmlTpl: function (){ + if(this.content){ + if (typeof this.content == 'string') { + return this.content; + } + return this.content.renderHtml(); + }else{ + return '' + } + + }, + _UIBase_postRender: UIBase.prototype.postRender, + postRender: function (){ + + + if (this.content instanceof UIBase) { + this.content.postRender(); + } + + //捕获鼠标滚轮 + if( this.captureWheel && !this.captured ) { + + this.captured = true; + + var winHeight = ( document.documentElement.clientHeight || document.body.clientHeight ) - 80, + _height = this.getDom().offsetHeight, + _top = uiUtils.getClientRect( this.combox.getDom() ).top, + content = this.getDom('content'), + ifr = this.getDom('body').getElementsByTagName('iframe'), + me = this; + + ifr.length && ( ifr = ifr[0] ); + + while( _top + _height > winHeight ) { + _height -= 30; + } + content.style.height = _height + 'px'; + //同步更改iframe高度 + ifr && ( ifr.style.height = _height + 'px' ); + + //阻止在combox上的鼠标滚轮事件, 防止用户的正常操作被误解 + if( window.XMLHttpRequest ) { + + domUtils.on( content, ( 'onmousewheel' in document.body ) ? 'mousewheel' :'DOMMouseScroll' , function(e){ + + if(e.preventDefault) { + e.preventDefault(); + } else { + e.returnValue = false; + } + + if( e.wheelDelta ) { + + content.scrollTop -= ( e.wheelDelta / 120 )*60; + + } else { + + content.scrollTop -= ( e.detail / -3 )*60; + + } + + }); + + } else { + + //ie6 + domUtils.on( this.getDom(), 'mousewheel' , function(e){ + + e.returnValue = false; + + me.getDom('content').scrollTop -= ( e.wheelDelta / 120 )*60; + + }); + + } + + } + this.fireEvent('postRenderAfter'); + this.hide(true); + this._UIBase_postRender(); + }, + _doAutoRender: function (){ + if (!this.getDom() && this.autoRender) { + this.render(); + } + }, + mesureSize: function (){ + var box = this.getDom('content'); + return uiUtils.getClientRect(box); + }, + fitSize: function (){ + if( this.captureWheel && this.sized ) { + return this.__size; + } + this.sized = true; + var popBodyEl = this.getDom('body'); + popBodyEl.style.width = ''; + popBodyEl.style.height = ''; + var size = this.mesureSize(); + if( this.captureWheel ) { + popBodyEl.style.width = -(-20 -size.width) + 'px'; + var height = parseInt( this.getDom('content').style.height, 10 ); + !window.isNaN( height ) && ( size.height = height ); + } else { + popBodyEl.style.width = size.width + 'px'; + } + popBodyEl.style.height = size.height + 'px'; + this.__size = size; + this.captureWheel && (this.getDom('content').style.overflow = 'auto'); + return size; + }, + showAnchor: function ( element, hoz ){ + this.showAnchorRect( uiUtils.getClientRect( element ), hoz ); + }, + showAnchorRect: function ( rect, hoz, adj ){ + this._doAutoRender(); + var vpRect = uiUtils.getViewportRect(); + this.getDom().style.visibility = 'hidden'; + this._show(); + var popSize = this.fitSize(); + + var sideLeft, sideUp, left, top; + if (hoz) { + sideLeft = this.canSideLeft && (rect.right + popSize.width > vpRect.right && rect.left > popSize.width); + sideUp = this.canSideUp && (rect.top + popSize.height > vpRect.bottom && rect.bottom > popSize.height); + left = (sideLeft ? rect.left - popSize.width : rect.right); + top = (sideUp ? rect.bottom - popSize.height : rect.top); + } else { + sideLeft = this.canSideLeft && (rect.right + popSize.width > vpRect.right && rect.left > popSize.width); + sideUp = this.canSideUp && (rect.top + popSize.height > vpRect.bottom && rect.bottom > popSize.height); + left = (sideLeft ? rect.right - popSize.width : rect.left); + top = (sideUp ? rect.top - popSize.height : rect.bottom); + } + + var popEl = this.getDom(); + uiUtils.setViewportOffset(popEl, { + left: left, + top: top + }); + domUtils.removeClasses(popEl, ANCHOR_CLASSES); + popEl.className += ' ' + ANCHOR_CLASSES[(sideUp ? 1 : 0) * 2 + (sideLeft ? 1 : 0)]; + if(this.editor){ + popEl.style.zIndex = this.editor.container.style.zIndex * 1 + 10; + baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex = popEl.style.zIndex - 1; + } + this.getDom().style.visibility = 'visible'; + + }, + showAt: function (offset) { + var left = offset.left; + var top = offset.top; + var rect = { + left: left, + top: top, + right: left, + bottom: top, + height: 0, + width: 0 + }; + this.showAnchorRect(rect, false, true); + }, + _show: function (){ + if (this._hidden) { + var box = this.getDom(); + box.style.display = ''; + this._hidden = false; +// if (box.setActive) { +// box.setActive(); +// } + this.fireEvent('show'); + } + }, + isHidden: function (){ + return this._hidden; + }, + show: function (){ + this._doAutoRender(); + this._show(); + }, + hide: function (notNofity){ + if (!this._hidden && this.getDom()) { + this.getDom().style.display = 'none'; + this._hidden = true; + if (!notNofity) { + this.fireEvent('hide'); + } + } + }, + queryAutoHide: function (el){ + return !el || !uiUtils.contains(this.getDom(), el); + } + }; + utils.inherits(Popup, UIBase); + + domUtils.on( document, 'mousedown', function ( evt ) { + var el = evt.target || evt.srcElement; + closeAllPopup( evt,el ); + } ); + domUtils.on( window, 'scroll', function (evt,el) { + closeAllPopup( evt,el ); + } ); + +})(); + + +// ui/colorpicker.js +///import core +///import uicore +(function (){ + var utils = baidu.editor.utils, + UIBase = baidu.editor.ui.UIBase, + ColorPicker = baidu.editor.ui.ColorPicker = function (options){ + this.initOptions(options); + this.noColorText = this.noColorText || this.editor.getLang("clearColor"); + this.initUIBase(); + }; + + ColorPicker.prototype = { + getHtmlTpl: function (){ + return genColorPicker(this.noColorText,this.editor); + }, + _onTableClick: function (evt){ + var tgt = evt.target || evt.srcElement; + var color = tgt.getAttribute('data-color'); + if (color) { + this.fireEvent('pickcolor', color); + } + }, + _onTableOver: function (evt){ + var tgt = evt.target || evt.srcElement; + var color = tgt.getAttribute('data-color'); + if (color) { + this.getDom('preview').style.backgroundColor = color; + } + }, + _onTableOut: function (){ + this.getDom('preview').style.backgroundColor = ''; + }, + _onPickNoColor: function (){ + this.fireEvent('picknocolor'); + } + }; + utils.inherits(ColorPicker, UIBase); + + var COLORS = ( + 'ffffff,000000,eeece1,1f497d,4f81bd,c0504d,9bbb59,8064a2,4bacc6,f79646,' + + 'f2f2f2,7f7f7f,ddd9c3,c6d9f0,dbe5f1,f2dcdb,ebf1dd,e5e0ec,dbeef3,fdeada,' + + 'd8d8d8,595959,c4bd97,8db3e2,b8cce4,e5b9b7,d7e3bc,ccc1d9,b7dde8,fbd5b5,' + + 'bfbfbf,3f3f3f,938953,548dd4,95b3d7,d99694,c3d69b,b2a2c7,92cddc,fac08f,' + + 'a5a5a5,262626,494429,17365d,366092,953734,76923c,5f497a,31859b,e36c09,' + + '7f7f7f,0c0c0c,1d1b10,0f243e,244061,632423,4f6128,3f3151,205867,974806,' + + 'c00000,ff0000,ffc000,ffff00,92d050,00b050,00b0f0,0070c0,002060,7030a0,').split(','); + + function genColorPicker(noColorText,editor){ + var html = '
    ' + + '
    ' + + '
    ' + + '
    '+ noColorText +'
    ' + + '
    ' + + '' + + ''+ + ''; + for (var i=0; i':'')+''; + } + html += i<70 ? '':''; + } + html += '
    '+editor.getLang("themeColor")+'
    '+editor.getLang("standardColor")+'
    '; + return html; + } +})(); + + +// ui/tablepicker.js +///import core +///import uicore +(function (){ + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase; + + var TablePicker = baidu.editor.ui.TablePicker = function (options){ + this.initOptions(options); + this.initTablePicker(); + }; + TablePicker.prototype = { + defaultNumRows: 10, + defaultNumCols: 10, + maxNumRows: 20, + maxNumCols: 20, + numRows: 10, + numCols: 10, + lengthOfCellSide: 22, + initTablePicker: function (){ + this.initUIBase(); + }, + getHtmlTpl: function (){ + var me = this; + return '
    ' + + '
    ' + + '
    ' + + '' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    '; + }, + _UIBase_render: UIBase.prototype.render, + render: function (holder){ + this._UIBase_render(holder); + this.getDom('label').innerHTML = '0'+this.editor.getLang("t_row")+' x 0'+this.editor.getLang("t_col"); + }, + _track: function (numCols, numRows){ + var style = this.getDom('overlay').style; + var sideLen = this.lengthOfCellSide; + style.width = numCols * sideLen + 'px'; + style.height = numRows * sideLen + 'px'; + var label = this.getDom('label'); + label.innerHTML = numCols +this.editor.getLang("t_col")+' x ' + numRows + this.editor.getLang("t_row"); + this.numCols = numCols; + this.numRows = numRows; + }, + _onMouseOver: function (evt, el){ + var rel = evt.relatedTarget || evt.fromElement; + if (!uiUtils.contains(el, rel) && el !== rel) { + this.getDom('label').innerHTML = '0'+this.editor.getLang("t_col")+' x 0'+this.editor.getLang("t_row"); + this.getDom('overlay').style.visibility = ''; + } + }, + _onMouseOut: function (evt, el){ + var rel = evt.relatedTarget || evt.toElement; + if (!uiUtils.contains(el, rel) && el !== rel) { + this.getDom('label').innerHTML = '0'+this.editor.getLang("t_col")+' x 0'+this.editor.getLang("t_row"); + this.getDom('overlay').style.visibility = 'hidden'; + } + }, + _onMouseMove: function (evt, el){ + var style = this.getDom('overlay').style; + var offset = uiUtils.getEventOffset(evt); + var sideLen = this.lengthOfCellSide; + var numCols = Math.ceil(offset.left / sideLen); + var numRows = Math.ceil(offset.top / sideLen); + this._track(numCols, numRows); + }, + _onClick: function (){ + this.fireEvent('picktable', this.numCols, this.numRows); + } + }; + utils.inherits(TablePicker, UIBase); +})(); + + +// ui/stateful.js +(function (){ + var browser = baidu.editor.browser, + domUtils = baidu.editor.dom.domUtils, + uiUtils = baidu.editor.ui.uiUtils; + + var TPL_STATEFUL = 'onmousedown="$$.Stateful_onMouseDown(event, this);"' + + ' onmouseup="$$.Stateful_onMouseUp(event, this);"' + + ( browser.ie ? ( + ' onmouseenter="$$.Stateful_onMouseEnter(event, this);"' + + ' onmouseleave="$$.Stateful_onMouseLeave(event, this);"' ) + : ( + ' onmouseover="$$.Stateful_onMouseOver(event, this);"' + + ' onmouseout="$$.Stateful_onMouseOut(event, this);"' )); + + baidu.editor.ui.Stateful = { + alwalysHoverable: false, + target:null,//目标元素和this指向dom不一样 + Stateful_init: function (){ + this._Stateful_dGetHtmlTpl = this.getHtmlTpl; + this.getHtmlTpl = this.Stateful_getHtmlTpl; + }, + Stateful_getHtmlTpl: function (){ + var tpl = this._Stateful_dGetHtmlTpl(); + // 使用function避免$转义 + return tpl.replace(/stateful/g, function (){ return TPL_STATEFUL; }); + }, + Stateful_onMouseEnter: function (evt, el){ + this.target=el; + if (!this.isDisabled() || this.alwalysHoverable) { + this.addState('hover'); + this.fireEvent('over'); + } + }, + Stateful_onMouseLeave: function (evt, el){ + if (!this.isDisabled() || this.alwalysHoverable) { + this.removeState('hover'); + this.removeState('active'); + this.fireEvent('out'); + } + }, + Stateful_onMouseOver: function (evt, el){ + var rel = evt.relatedTarget; + if (!uiUtils.contains(el, rel) && el !== rel) { + this.Stateful_onMouseEnter(evt, el); + } + }, + Stateful_onMouseOut: function (evt, el){ + var rel = evt.relatedTarget; + if (!uiUtils.contains(el, rel) && el !== rel) { + this.Stateful_onMouseLeave(evt, el); + } + }, + Stateful_onMouseDown: function (evt, el){ + if (!this.isDisabled()) { + this.addState('active'); + } + }, + Stateful_onMouseUp: function (evt, el){ + if (!this.isDisabled()) { + this.removeState('active'); + } + }, + Stateful_postRender: function (){ + if (this.disabled && !this.hasState('disabled')) { + this.addState('disabled'); + } + }, + hasState: function (state){ + return domUtils.hasClass(this.getStateDom(), 'edui-state-' + state); + }, + addState: function (state){ + if (!this.hasState(state)) { + this.getStateDom().className += ' edui-state-' + state; + } + }, + removeState: function (state){ + if (this.hasState(state)) { + domUtils.removeClasses(this.getStateDom(), ['edui-state-' + state]); + } + }, + getStateDom: function (){ + return this.getDom('state'); + }, + isChecked: function (){ + return this.hasState('checked'); + }, + setChecked: function (checked){ + if (!this.isDisabled() && checked) { + this.addState('checked'); + } else { + this.removeState('checked'); + } + }, + isDisabled: function (){ + return this.hasState('disabled'); + }, + setDisabled: function (disabled){ + if (disabled) { + this.removeState('hover'); + this.removeState('checked'); + this.removeState('active'); + this.addState('disabled'); + } else { + this.removeState('disabled'); + } + } + }; +})(); + + +// ui/button.js +///import core +///import uicore +///import ui/stateful.js +(function (){ + var utils = baidu.editor.utils, + UIBase = baidu.editor.ui.UIBase, + Stateful = baidu.editor.ui.Stateful, + Button = baidu.editor.ui.Button = function (options){ + if(options.name){ + var btnName = options.name; + var cssRules = options.cssRules; + if(!options.className){ + options.className = 'edui-for-' + btnName; + } + options.cssRules = '.edui-default .edui-for-'+ btnName +' .edui-icon {'+ cssRules +'}' + } + this.initOptions(options); + this.initButton(); + }; + Button.prototype = { + uiName: 'button', + label: '', + title: '', + showIcon: true, + showText: true, + cssRules:'', + initButton: function (){ + this.initUIBase(); + this.Stateful_init(); + if(this.cssRules){ + utils.cssRule('edui-customize-'+this.name+'-style',this.cssRules); + } + }, + getHtmlTpl: function (){ + return '
    ' + + '
    ' + + '
    ' + + (this.showIcon ? '
    ' : '') + + (this.showText ? '
    ' + this.label + '
    ' : '') + + '
    ' + + '
    ' + + '
    '; + }, + postRender: function (){ + this.Stateful_postRender(); + this.setDisabled(this.disabled) + }, + _onMouseDown: function (e){ + var target = e.target || e.srcElement, + tagName = target && target.tagName && target.tagName.toLowerCase(); + if (tagName == 'input' || tagName == 'object' || tagName == 'object') { + return false; + } + }, + _onClick: function (){ + if (!this.isDisabled()) { + this.fireEvent('click'); + } + }, + setTitle: function(text){ + var label = this.getDom('label'); + label.innerHTML = text; + } + }; + utils.inherits(Button, UIBase); + utils.extend(Button.prototype, Stateful); + +})(); + + +// ui/splitbutton.js +///import core +///import uicore +///import ui/stateful.js +(function (){ + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + domUtils = baidu.editor.dom.domUtils, + UIBase = baidu.editor.ui.UIBase, + Stateful = baidu.editor.ui.Stateful, + SplitButton = baidu.editor.ui.SplitButton = function (options){ + this.initOptions(options); + this.initSplitButton(); + }; + SplitButton.prototype = { + popup: null, + uiName: 'splitbutton', + title: '', + initSplitButton: function (){ + this.initUIBase(); + this.Stateful_init(); + var me = this; + if (this.popup != null) { + var popup = this.popup; + this.popup = null; + this.setPopup(popup); + } + }, + _UIBase_postRender: UIBase.prototype.postRender, + postRender: function (){ + this.Stateful_postRender(); + this._UIBase_postRender(); + }, + setPopup: function (popup){ + if (this.popup === popup) return; + if (this.popup != null) { + this.popup.dispose(); + } + popup.addListener('show', utils.bind(this._onPopupShow, this)); + popup.addListener('hide', utils.bind(this._onPopupHide, this)); + popup.addListener('postrender', utils.bind(function (){ + popup.getDom('body').appendChild( + uiUtils.createElementByHtml('
    ') + ); + popup.getDom().className += ' ' + this.className; + }, this)); + this.popup = popup; + }, + _onPopupShow: function (){ + this.addState('opened'); + }, + _onPopupHide: function (){ + this.removeState('opened'); + }, + getHtmlTpl: function (){ + return '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    '; + }, + showPopup: function (){ + // 当popup往上弹出的时候,做特殊处理 + var rect = uiUtils.getClientRect(this.getDom()); + rect.top -= this.popup.SHADOW_RADIUS; + rect.height += this.popup.SHADOW_RADIUS; + this.popup.showAnchorRect(rect); + }, + _onArrowClick: function (event, el){ + if (!this.isDisabled()) { + this.showPopup(); + } + }, + _onButtonClick: function (){ + if (!this.isDisabled()) { + this.fireEvent('buttonclick'); + } + } + }; + utils.inherits(SplitButton, UIBase); + utils.extend(SplitButton.prototype, Stateful, true); + +})(); + + +// ui/colorbutton.js +///import core +///import uicore +///import ui/colorpicker.js +///import ui/popup.js +///import ui/splitbutton.js +(function (){ + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + ColorPicker = baidu.editor.ui.ColorPicker, + Popup = baidu.editor.ui.Popup, + SplitButton = baidu.editor.ui.SplitButton, + ColorButton = baidu.editor.ui.ColorButton = function (options){ + this.initOptions(options); + this.initColorButton(); + }; + ColorButton.prototype = { + initColorButton: function (){ + var me = this; + this.popup = new Popup({ + content: new ColorPicker({ + noColorText: me.editor.getLang("clearColor"), + editor:me.editor, + onpickcolor: function (t, color){ + me._onPickColor(color); + }, + onpicknocolor: function (t, color){ + me._onPickNoColor(color); + } + }), + editor:me.editor + }); + this.initSplitButton(); + }, + _SplitButton_postRender: SplitButton.prototype.postRender, + postRender: function (){ + this._SplitButton_postRender(); + this.getDom('button_body').appendChild( + uiUtils.createElementByHtml('
    ') + ); + this.getDom().className += ' edui-colorbutton'; + }, + setColor: function (color){ + this.getDom('colorlump').style.backgroundColor = color; + this.color = color; + }, + _onPickColor: function (color){ + if (this.fireEvent('pickcolor', color) !== false) { + this.setColor(color); + this.popup.hide(); + } + }, + _onPickNoColor: function (color){ + if (this.fireEvent('picknocolor') !== false) { + this.popup.hide(); + } + } + }; + utils.inherits(ColorButton, SplitButton); + +})(); + + +// ui/tablebutton.js +///import core +///import uicore +///import ui/popup.js +///import ui/tablepicker.js +///import ui/splitbutton.js +(function (){ + var utils = baidu.editor.utils, + Popup = baidu.editor.ui.Popup, + TablePicker = baidu.editor.ui.TablePicker, + SplitButton = baidu.editor.ui.SplitButton, + TableButton = baidu.editor.ui.TableButton = function (options){ + this.initOptions(options); + this.initTableButton(); + }; + TableButton.prototype = { + initTableButton: function (){ + var me = this; + this.popup = new Popup({ + content: new TablePicker({ + editor:me.editor, + onpicktable: function (t, numCols, numRows){ + me._onPickTable(numCols, numRows); + } + }), + 'editor':me.editor + }); + this.initSplitButton(); + }, + _onPickTable: function (numCols, numRows){ + if (this.fireEvent('picktable', numCols, numRows) !== false) { + this.popup.hide(); + } + } + }; + utils.inherits(TableButton, SplitButton); + +})(); + + +// ui/autotypesetpicker.js +///import core +///import uicore +(function () { + var utils = baidu.editor.utils, + UIBase = baidu.editor.ui.UIBase; + + var AutoTypeSetPicker = baidu.editor.ui.AutoTypeSetPicker = function (options) { + this.initOptions(options); + this.initAutoTypeSetPicker(); + }; + AutoTypeSetPicker.prototype = { + initAutoTypeSetPicker:function () { + this.initUIBase(); + }, + getHtmlTpl:function () { + var me = this.editor, + opt = me.options.autotypeset, + lang = me.getLang("autoTypeSet"); + + var textAlignInputName = 'textAlignValue' + me.uid, + imageBlockInputName = 'imageBlockLineValue' + me.uid, + symbolConverInputName = 'symbolConverValue' + me.uid; + + return '
    ' + + '
    ' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
    ' + lang.mergeLine + '' + lang.delLine + '
    ' + lang.removeFormat + '' + lang.indent + '
    ' + lang.alignment + '' + + '' + me.getLang("justifyleft") + + '' + me.getLang("justifycenter") + + '' + me.getLang("justifyright") + + '
    ' + lang.imageFloat + '' + + '' + me.getLang("default") + + '' + me.getLang("justifyleft") + + '' + me.getLang("justifycenter") + + '' + me.getLang("justifyright") + + '
    ' + lang.removeFontsize + '' + lang.removeFontFamily + '
    ' + lang.removeHtml + '
    ' + lang.pasteFilter + '
    ' + lang.symbol + '' + + '' + lang.bdc2sb + + '' + lang.tobdc + '' + + '
    ' + + '
    ' + + '
    '; + + + }, + _UIBase_render:UIBase.prototype.render + }; + utils.inherits(AutoTypeSetPicker, UIBase); +})(); + + +// ui/autotypesetbutton.js +///import core +///import uicore +///import ui/popup.js +///import ui/autotypesetpicker.js +///import ui/splitbutton.js +(function (){ + var utils = baidu.editor.utils, + Popup = baidu.editor.ui.Popup, + AutoTypeSetPicker = baidu.editor.ui.AutoTypeSetPicker, + SplitButton = baidu.editor.ui.SplitButton, + AutoTypeSetButton = baidu.editor.ui.AutoTypeSetButton = function (options){ + this.initOptions(options); + this.initAutoTypeSetButton(); + }; + function getPara(me){ + + var opt = {}, + cont = me.getDom(), + editorId = me.editor.uid, + inputType = null, + attrName = null, + ipts = domUtils.getElementsByTagName(cont,"input"); + for(var i=ipts.length-1,ipt;ipt=ipts[i--];){ + inputType = ipt.getAttribute("type"); + if(inputType=="checkbox"){ + attrName = ipt.getAttribute("name"); + opt[attrName] && delete opt[attrName]; + if(ipt.checked){ + var attrValue = document.getElementById( attrName + "Value" + editorId ); + if(attrValue){ + if(/input/ig.test(attrValue.tagName)){ + opt[attrName] = attrValue.value; + } else { + var iptChilds = attrValue.getElementsByTagName("input"); + for(var j=iptChilds.length-1,iptchild;iptchild=iptChilds[j--];){ + if(iptchild.checked){ + opt[attrName] = iptchild.value; + break; + } + } + } + } else { + opt[attrName] = true; + } + } else { + opt[attrName] = false; + } + } else { + opt[ipt.getAttribute("value")] = ipt.checked; + } + + } + + var selects = domUtils.getElementsByTagName(cont,"select"); + for(var i=0,si;si=selects[i++];){ + var attr = si.getAttribute('name'); + opt[attr] = opt[attr] ? si.value : ''; + } + + utils.extend(me.editor.options.autotypeset,opt); + + me.editor.setPreferences('autotypeset', opt); + } + + AutoTypeSetButton.prototype = { + initAutoTypeSetButton: function (){ + + var me = this; + this.popup = new Popup({ + //传入配置参数 + content: new AutoTypeSetPicker({editor:me.editor}), + 'editor':me.editor, + hide : function(){ + if (!this._hidden && this.getDom()) { + getPara(this); + this.getDom().style.display = 'none'; + this._hidden = true; + this.fireEvent('hide'); + } + } + }); + var flag = 0; + this.popup.addListener('postRenderAfter',function(){ + var popupUI = this; + if(flag)return; + var cont = this.getDom(), + btn = cont.getElementsByTagName('button')[0]; + + btn.onclick = function(){ + getPara(popupUI); + me.editor.execCommand('autotypeset'); + popupUI.hide() + }; + + domUtils.on(cont, 'click', function(e) { + var target = e.target || e.srcElement, + editorId = me.editor.uid; + if (target && target.tagName == 'INPUT') { + + // 点击图片浮动的checkbox,去除对应的radio + if (target.name == 'imageBlockLine' || target.name == 'textAlign' || target.name == 'symbolConver') { + var checked = target.checked, + radioTd = document.getElementById( target.name + 'Value' + editorId), + radios = radioTd.getElementsByTagName('input'), + defalutSelect = { + 'imageBlockLine': 'none', + 'textAlign': 'left', + 'symbolConver': 'tobdc' + }; + + for (var i = 0; i < radios.length; i++) { + if (checked) { + if (radios[i].value == defalutSelect[target.name]) { + radios[i].checked = 'checked'; + } + } else { + radios[i].checked = false; + } + } + } + // 点击radio,选中对应的checkbox + if (target.name == ('imageBlockLineValue' + editorId) || target.name == ('textAlignValue' + editorId) || target.name == 'bdc') { + var checkboxs = target.parentNode.previousSibling.getElementsByTagName('input'); + checkboxs && (checkboxs[0].checked = true); + } + + getPara(popupUI); + } + }); + + flag = 1; + }); + this.initSplitButton(); + } + }; + utils.inherits(AutoTypeSetButton, SplitButton); + +})(); + + +// ui/cellalignpicker.js +///import core +///import uicore +(function () { + var utils = baidu.editor.utils, + Popup = baidu.editor.ui.Popup, + Stateful = baidu.editor.ui.Stateful, + UIBase = baidu.editor.ui.UIBase; + + /** + * 该参数将新增一个参数: selected, 参数类型为一个Object, 形如{ 'align': 'center', 'valign': 'top' }, 表示单元格的初始 + * 对齐状态为: 竖直居上,水平居中; 其中 align的取值为:'center', 'left', 'right'; valign的取值为: 'top', 'middle', 'bottom' + * @update 2013/4/2 hancong03@baidu.com + */ + var CellAlignPicker = baidu.editor.ui.CellAlignPicker = function (options) { + this.initOptions(options); + this.initSelected(); + this.initCellAlignPicker(); + }; + CellAlignPicker.prototype = { + //初始化选中状态, 该方法将根据传递进来的参数获取到应该选中的对齐方式图标的索引 + initSelected: function(){ + + var status = { + + valign: { + top: 0, + middle: 1, + bottom: 2 + }, + align: { + left: 0, + center: 1, + right: 2 + }, + count: 3 + + }, + result = -1; + + if( this.selected ) { + this.selectedIndex = status.valign[ this.selected.valign ] * status.count + status.align[ this.selected.align ]; + } + + }, + initCellAlignPicker:function () { + this.initUIBase(); + this.Stateful_init(); + }, + getHtmlTpl:function () { + + var alignType = [ 'left', 'center', 'right' ], + COUNT = 9, + tempClassName = null, + tempIndex = -1, + tmpl = []; + + + for( var i= 0; i'); + + tmpl.push( '
    ' ); + + tempIndex === 2 && tmpl.push(''); + + } + + return '
    ' + + '
    ' + + '' + + tmpl.join('') + + '
    ' + + '
    ' + + '
    '; + }, + getStateDom: function (){ + return this.target; + }, + _onClick: function (evt){ + var target= evt.target || evt.srcElement; + if(/icon/.test(target.className)){ + this.items[target.parentNode.getAttribute("index")].onclick(); + Popup.postHide(evt); + } + }, + _UIBase_render:UIBase.prototype.render + }; + utils.inherits(CellAlignPicker, UIBase); + utils.extend(CellAlignPicker.prototype, Stateful,true); +})(); + + + + + +// ui/pastepicker.js +///import core +///import uicore +(function () { + var utils = baidu.editor.utils, + Stateful = baidu.editor.ui.Stateful, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase; + + var PastePicker = baidu.editor.ui.PastePicker = function (options) { + this.initOptions(options); + this.initPastePicker(); + }; + PastePicker.prototype = { + initPastePicker:function () { + this.initUIBase(); + this.Stateful_init(); + }, + getHtmlTpl:function () { + return '
    ' + + '
    ' + + '
    ' + this.editor.getLang("pasteOpt") + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '' + }, + getStateDom:function () { + return this.target; + }, + format:function (param) { + this.editor.ui._isTransfer = true; + this.editor.fireEvent('pasteTransfer', param); + }, + _onClick:function (cur) { + var node = domUtils.getNextDomNode(cur), + screenHt = uiUtils.getViewportRect().height, + subPop = uiUtils.getClientRect(node); + + if ((subPop.top + subPop.height) > screenHt) + node.style.top = (-subPop.height - cur.offsetHeight) + "px"; + else + node.style.top = ""; + + if (/hidden/ig.test(domUtils.getComputedStyle(node, "visibility"))) { + node.style.visibility = "visible"; + domUtils.addClass(cur, "edui-state-opened"); + } else { + node.style.visibility = "hidden"; + domUtils.removeClasses(cur, "edui-state-opened") + } + }, + _UIBase_render:UIBase.prototype.render + }; + utils.inherits(PastePicker, UIBase); + utils.extend(PastePicker.prototype, Stateful, true); +})(); + + + + + + +// ui/toolbar.js +(function (){ + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase, + Toolbar = baidu.editor.ui.Toolbar = function (options){ + this.initOptions(options); + this.initToolbar(); + }; + Toolbar.prototype = { + items: null, + initToolbar: function (){ + this.items = this.items || []; + this.initUIBase(); + }, + add: function (item,index){ + if(index === undefined){ + this.items.push(item); + }else{ + this.items.splice(index,0,item) + } + + }, + getHtmlTpl: function (){ + var buff = []; + for (var i=0; i' + + buff.join('') + + '' + }, + postRender: function (){ + var box = this.getDom(); + for (var i=0; i
    '; + }, + postRender:function () { + }, + queryAutoHide:function () { + return true; + } + }; + Menu.prototype = { + items:null, + uiName:'menu', + initMenu:function () { + this.items = this.items || []; + this.initPopup(); + this.initItems(); + }, + initItems:function () { + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + if (item == '-') { + this.items[i] = this.getSeparator(); + } else if (!(item instanceof MenuItem)) { + item.editor = this.editor; + item.theme = this.editor.options.theme; + this.items[i] = this.createItem(item); + } + } + }, + getSeparator:function () { + return menuSeparator; + }, + createItem:function (item) { + //新增一个参数menu, 该参数存储了menuItem所对应的menu引用 + item.menu = this; + return new MenuItem(item); + }, + _Popup_getContentHtmlTpl:Popup.prototype.getContentHtmlTpl, + getContentHtmlTpl:function () { + if (this.items.length == 0) { + return this._Popup_getContentHtmlTpl(); + } + var buff = []; + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + buff[i] = item.renderHtml(); + } + return ('
    ' + buff.join('') + '
    '); + }, + _Popup_postRender:Popup.prototype.postRender, + postRender:function () { + var me = this; + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + item.ownerMenu = this; + item.postRender(); + } + domUtils.on(this.getDom(), 'mouseover', function (evt) { + evt = evt || event; + var rel = evt.relatedTarget || evt.fromElement; + var el = me.getDom(); + if (!uiUtils.contains(el, rel) && el !== rel) { + me.fireEvent('over'); + } + }); + this._Popup_postRender(); + }, + queryAutoHide:function (el) { + if (el) { + if (uiUtils.contains(this.getDom(), el)) { + return false; + } + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + if (item.queryAutoHide(el) === false) { + return false; + } + } + } + }, + clearItems:function () { + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + clearTimeout(item._showingTimer); + clearTimeout(item._closingTimer); + if (item.subMenu) { + item.subMenu.destroy(); + } + } + this.items = []; + }, + destroy:function () { + if (this.getDom()) { + domUtils.remove(this.getDom()); + } + this.clearItems(); + }, + dispose:function () { + this.destroy(); + } + }; + utils.inherits(Menu, Popup); + + /** + * @update 2013/04/03 hancong03 新增一个参数menu, 该参数存储了menuItem所对应的menu引用 + * @type {Function} + */ + var MenuItem = baidu.editor.ui.MenuItem = function (options) { + this.initOptions(options); + this.initUIBase(); + this.Stateful_init(); + if (this.subMenu && !(this.subMenu instanceof Menu)) { + if (options.className && options.className.indexOf("aligntd") != -1) { + var me = this; + + //获取单元格对齐初始状态 + this.subMenu.selected = this.editor.queryCommandValue( 'cellalignment' ); + + this.subMenu = new Popup({ + content:new CellAlignPicker(this.subMenu), + parentMenu:me, + editor:me.editor, + destroy:function () { + if (this.getDom()) { + domUtils.remove(this.getDom()); + } + } + }); + this.subMenu.addListener("postRenderAfter", function () { + domUtils.on(this.getDom(), "mouseover", function () { + me.addState('opened'); + }); + }); + } else { + this.subMenu = new Menu(this.subMenu); + } + } + }; + MenuItem.prototype = { + label:'', + subMenu:null, + ownerMenu:null, + uiName:'menuitem', + alwalysHoverable:true, + getHtmlTpl:function () { + return '
    ' + + '
    ' + + this.renderLabelHtml() + + '
    ' + + '
    '; + }, + postRender:function () { + var me = this; + this.addListener('over', function () { + me.ownerMenu.fireEvent('submenuover', me); + if (me.subMenu) { + me.delayShowSubMenu(); + } + }); + if (this.subMenu) { + this.getDom().className += ' edui-hassubmenu'; + this.subMenu.render(); + this.addListener('out', function () { + me.delayHideSubMenu(); + }); + this.subMenu.addListener('over', function () { + clearTimeout(me._closingTimer); + me._closingTimer = null; + me.addState('opened'); + }); + this.ownerMenu.addListener('hide', function () { + me.hideSubMenu(); + }); + this.ownerMenu.addListener('submenuover', function (t, subMenu) { + if (subMenu !== me) { + me.delayHideSubMenu(); + } + }); + this.subMenu._bakQueryAutoHide = this.subMenu.queryAutoHide; + this.subMenu.queryAutoHide = function (el) { + if (el && uiUtils.contains(me.getDom(), el)) { + return false; + } + return this._bakQueryAutoHide(el); + }; + } + this.getDom().style.tabIndex = '-1'; + uiUtils.makeUnselectable(this.getDom()); + this.Stateful_postRender(); + }, + delayShowSubMenu:function () { + var me = this; + if (!me.isDisabled()) { + me.addState('opened'); + clearTimeout(me._showingTimer); + clearTimeout(me._closingTimer); + me._closingTimer = null; + me._showingTimer = setTimeout(function () { + me.showSubMenu(); + }, 250); + } + }, + delayHideSubMenu:function () { + var me = this; + if (!me.isDisabled()) { + me.removeState('opened'); + clearTimeout(me._showingTimer); + if (!me._closingTimer) { + me._closingTimer = setTimeout(function () { + if (!me.hasState('opened')) { + me.hideSubMenu(); + } + me._closingTimer = null; + }, 400); + } + } + }, + renderLabelHtml:function () { + return '
    ' + + '
    ' + + '
    ' + (this.label || '') + '
    '; + }, + getStateDom:function () { + return this.getDom(); + }, + queryAutoHide:function (el) { + if (this.subMenu && this.hasState('opened')) { + return this.subMenu.queryAutoHide(el); + } + }, + _onClick:function (event, this_) { + if (this.hasState('disabled')) return; + if (this.fireEvent('click', event, this_) !== false) { + if (this.subMenu) { + this.showSubMenu(); + } else { + Popup.postHide(event); + } + } + }, + showSubMenu:function () { + var rect = uiUtils.getClientRect(this.getDom()); + rect.right -= 5; + rect.left += 2; + rect.width -= 7; + rect.top -= 4; + rect.bottom += 4; + rect.height += 8; + this.subMenu.showAnchorRect(rect, true, true); + }, + hideSubMenu:function () { + this.subMenu.hide(); + } + }; + utils.inherits(MenuItem, UIBase); + utils.extend(MenuItem.prototype, Stateful, true); +})(); + + +// ui/combox.js +///import core +///import uicore +///import ui/menu.js +///import ui/splitbutton.js +(function (){ + // todo: menu和item提成通用list + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + Menu = baidu.editor.ui.Menu, + SplitButton = baidu.editor.ui.SplitButton, + Combox = baidu.editor.ui.Combox = function (options){ + this.initOptions(options); + this.initCombox(); + }; + Combox.prototype = { + uiName: 'combox', + onbuttonclick:function () { + this.showPopup(); + }, + initCombox: function (){ + var me = this; + this.items = this.items || []; + for (var i=0; i vpRect.right) { + left = vpRect.right - rect.width; + } + var top = offset.top; + if (top + rect.height > vpRect.bottom) { + top = vpRect.bottom - rect.height; + } + el.style.left = Math.max(left, 0) + 'px'; + el.style.top = Math.max(top, 0) + 'px'; + }, + showAtCenter: function (){ + + var vpRect = uiUtils.getViewportRect(); + + if ( !this.fullscreen ) { + this.getDom().style.display = ''; + var popSize = this.fitSize(); + var titleHeight = this.getDom('titlebar').offsetHeight | 0; + var left = vpRect.width / 2 - popSize.width / 2; + var top = vpRect.height / 2 - (popSize.height - titleHeight) / 2 - titleHeight; + var popEl = this.getDom(); + this.safeSetOffset({ + left: Math.max(left | 0, 0), + top: Math.max(top | 0, 0) + }); + if (!domUtils.hasClass(popEl, 'edui-state-centered')) { + popEl.className += ' edui-state-centered'; + } + } else { + var dialogWrapNode = this.getDom(), + contentNode = this.getDom('content'); + + dialogWrapNode.style.display = "block"; + + var wrapRect = UE.ui.uiUtils.getClientRect( dialogWrapNode ), + contentRect = UE.ui.uiUtils.getClientRect( contentNode ); + dialogWrapNode.style.left = "-100000px"; + + contentNode.style.width = ( vpRect.width - wrapRect.width + contentRect.width ) + "px"; + contentNode.style.height = ( vpRect.height - wrapRect.height + contentRect.height ) + "px"; + + dialogWrapNode.style.width = vpRect.width + "px"; + dialogWrapNode.style.height = vpRect.height + "px"; + dialogWrapNode.style.left = 0; + + //保存环境的overflow值 + this._originalContext = { + html: { + overflowX: document.documentElement.style.overflowX, + overflowY: document.documentElement.style.overflowY + }, + body: { + overflowX: document.body.style.overflowX, + overflowY: document.body.style.overflowY + } + }; + + document.documentElement.style.overflowX = 'hidden'; + document.documentElement.style.overflowY = 'hidden'; + document.body.style.overflowX = 'hidden'; + document.body.style.overflowY = 'hidden'; + + } + + this._show(); + }, + getContentHtml: function (){ + var contentHtml = ''; + if (typeof this.content == 'string') { + contentHtml = this.content; + } else if (this.iframeUrl) { + contentHtml = ''; + } + return contentHtml; + }, + getHtmlTpl: function (){ + var footHtml = ''; + + if (this.buttons) { + var buff = []; + for (var i=0; i' + buff.join('') + '' + + ''; + } + + return '
    ' + + '
    ' + + '
    ' + + '
    ' + + '' + (this.title || '') + '' + + '
    ' + + this.closeButton.renderHtml() + + '
    ' + + '
    '+ ( this.autoReset ? '' : this.getContentHtml()) +'
    ' + + footHtml + + '
    '; + }, + postRender: function (){ + // todo: 保持居中/记住上次关闭位置选项 + if (!this.modalMask.getDom()) { + this.modalMask.render(); + this.modalMask.hide(); + } + if (!this.dragMask.getDom()) { + this.dragMask.render(); + this.dragMask.hide(); + } + var me = this; + this.addListener('show', function (){ + me.modalMask.show(this.getDom().style.zIndex - 2); + }); + this.addListener('hide', function (){ + me.modalMask.hide(); + }); + if (this.buttons) { + for (var i=0; i'; + me.editor.container.style.zIndex && (this.getDom().style.zIndex = me.editor.container.style.zIndex * 1 + 1); + } + } + // canSideUp:false, + // canSideLeft:false + }); + this.onbuttonclick = function(){ + this.showPopup(); + }; + this.initSplitButton(); + } + + }; + + utils.inherits(MultiMenuPop, SplitButton); +})(); + + +// ui/shortcutmenu.js +(function () { + var UI = baidu.editor.ui, + UIBase = UI.UIBase, + uiUtils = UI.uiUtils, + utils = baidu.editor.utils, + domUtils = baidu.editor.dom.domUtils; + + var allMenus = [],//存储所有快捷菜单 + timeID, + isSubMenuShow = false;//是否有子pop显示 + + var ShortCutMenu = UI.ShortCutMenu = function (options) { + this.initOptions (options); + this.initShortCutMenu (); + }; + + ShortCutMenu.postHide = hideAllMenu; + + ShortCutMenu.prototype = { + isHidden : true , + SPACE : 5 , + initShortCutMenu : function () { + this.items = this.items || []; + this.initUIBase (); + this.initItems (); + this.initEvent (); + allMenus.push (this); + } , + initEvent : function () { + var me = this, + doc = me.editor.document; + + domUtils.on (doc , "mousemove" , function (e) { + if (me.isHidden === false) { + //有pop显示就不隐藏快捷菜单 + if (me.getSubMenuMark () || me.eventType == "contextmenu") return; + + + var flag = true, + el = me.getDom (), + wt = el.offsetWidth, + ht = el.offsetHeight, + distanceX = wt / 2 + me.SPACE,//距离中心X标准 + distanceY = ht / 2,//距离中心Y标准 + x = Math.abs (e.screenX - me.left),//离中心距离横坐标 + y = Math.abs (e.screenY - me.top);//离中心距离纵坐标 + + clearTimeout (timeID); + timeID = setTimeout (function () { + if (y > 0 && y < distanceY) { + me.setOpacity (el , "1"); + } else if (y > distanceY && y < distanceY + 70) { + me.setOpacity (el , "0.5"); + flag = false; + } else if (y > distanceY + 70 && y < distanceY + 140) { + me.hide (); + } + + if (flag && x > 0 && x < distanceX) { + me.setOpacity (el , "1") + } else if (x > distanceX && x < distanceX + 70) { + me.setOpacity (el , "0.5") + } else if (x > distanceX + 70 && x < distanceX + 140) { + me.hide (); + } + }); + } + }); + + //ie\ff下 mouseout不准 + if (browser.chrome) { + domUtils.on (doc , "mouseout" , function (e) { + var relatedTgt = e.relatedTarget || e.toElement; + + if (relatedTgt == null || relatedTgt.tagName == "HTML") { + me.hide (); + } + }); + } + + me.editor.addListener ("afterhidepop" , function () { + if (!me.isHidden) { + isSubMenuShow = true; + } + }); + + } , + initItems : function () { + if (utils.isArray (this.items)) { + for (var i = 0, len = this.items.length ; i < len ; i++) { + var item = this.items[i].toLowerCase (); + + if (UI[item]) { + this.items[i] = new UI[item] (this.editor); + this.items[i].className += " edui-shortcutsubmenu "; + } + } + } + } , + setOpacity : function (el , value) { + if (browser.ie && browser.version < 9) { + el.style.filter = "alpha(opacity = " + parseFloat (value) * 100 + ");" + } else { + el.style.opacity = value; + } + } , + getSubMenuMark : function () { + isSubMenuShow = false; + var layerEle = uiUtils.getFixedLayer (); + var list = domUtils.getElementsByTagName (layerEle , "div" , function (node) { + return domUtils.hasClass (node , "edui-shortcutsubmenu edui-popup") + }); + + for (var i = 0, node ; node = list[i++] ;) { + if (node.style.display != "none") { + isSubMenuShow = true; + } + } + return isSubMenuShow; + } , + show : function (e , hasContextmenu) { + var me = this, + offset = {}, + el = this.getDom (), + fixedlayer = uiUtils.getFixedLayer (); + + function setPos (offset) { + if (offset.left < 0) { + offset.left = 0; + } + if (offset.top < 0) { + offset.top = 0; + } + el.style.cssText = "position:absolute;left:" + offset.left + "px;top:" + offset.top + "px;"; + } + + function setPosByCxtMenu (menu) { + if (!menu.tagName) { + menu = menu.getDom (); + } + offset.left = parseInt (menu.style.left); + offset.top = parseInt (menu.style.top); + offset.top -= el.offsetHeight + 15; + setPos (offset); + } + + + me.eventType = e.type; + el.style.cssText = "display:block;left:-9999px"; + + if (e.type == "contextmenu" && hasContextmenu) { + var menu = domUtils.getElementsByTagName (fixedlayer , "div" , "edui-contextmenu")[0]; + if (menu) { + setPosByCxtMenu (menu) + } else { + me.editor.addListener ("aftershowcontextmenu" , function (type , menu) { + setPosByCxtMenu (menu); + }); + } + } else { + offset = uiUtils.getViewportOffsetByEvent (e); + offset.top -= el.offsetHeight + me.SPACE; + offset.left += me.SPACE + 20; + setPos (offset); + me.setOpacity (el , 0.2); + } + + + me.isHidden = false; + me.left = e.screenX + el.offsetWidth / 2 - me.SPACE; + me.top = e.screenY - (el.offsetHeight / 2) - me.SPACE; + + if (me.editor) { + el.style.zIndex = me.editor.container.style.zIndex * 1 + 10; + fixedlayer.style.zIndex = el.style.zIndex - 1; + } + } , + hide : function () { + if (this.getDom ()) { + this.getDom ().style.display = "none"; + } + this.isHidden = true; + } , + postRender : function () { + if (utils.isArray (this.items)) { + for (var i = 0, item ; item = this.items[i++] ;) { + item.postRender (); + } + } + } , + getHtmlTpl : function () { + var buff; + if (utils.isArray (this.items)) { + buff = []; + for (var i = 0 ; i < this.items.length ; i++) { + buff[i] = this.items[i].renderHtml (); + } + buff = buff.join (""); + } else { + buff = this.items; + } + + return '
    ' + + buff + + '
    '; + } + }; + + utils.inherits (ShortCutMenu , UIBase); + + function hideAllMenu (e) { + var tgt = e.target || e.srcElement, + cur = domUtils.findParent (tgt , function (node) { + return domUtils.hasClass (node , "edui-shortcutmenu") || domUtils.hasClass (node , "edui-popup"); + } , true); + + if (!cur) { + for (var i = 0, menu ; menu = allMenus[i++] ;) { + menu.hide () + } + } + } + + domUtils.on (document , 'mousedown' , function (e) { + hideAllMenu (e); + }); + + domUtils.on (window , 'scroll' , function (e) { + hideAllMenu (e); + }); + +}) (); + + +// ui/breakline.js +(function (){ + var utils = baidu.editor.utils, + UIBase = baidu.editor.ui.UIBase, + Breakline = baidu.editor.ui.Breakline = function (options){ + this.initOptions(options); + this.initSeparator(); + }; + Breakline.prototype = { + uiName: 'Breakline', + initSeparator: function (){ + this.initUIBase(); + }, + getHtmlTpl: function (){ + return '
    '; + } + }; + utils.inherits(Breakline, UIBase); + +})(); + + +// ui/message.js +///import core +///import uicore +(function () { + var utils = baidu.editor.utils, + domUtils = baidu.editor.dom.domUtils, + UIBase = baidu.editor.ui.UIBase, + Message = baidu.editor.ui.Message = function (options){ + this.initOptions(options); + this.initMessage(); + }; + + Message.prototype = { + initMessage: function (){ + this.initUIBase(); + }, + getHtmlTpl: function (){ + return '
    ' + + '
    ×
    ' + + '
    ' + + ' ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    '; + }, + reset: function(opt){ + var me = this; + if (!opt.keepshow) { + clearTimeout(this.timer); + me.timer = setTimeout(function(){ + me.hide(); + }, opt.timeout || 4000); + } + + opt.content !== undefined && me.setContent(opt.content); + opt.type !== undefined && me.setType(opt.type); + + me.show(); + }, + postRender: function(){ + var me = this, + closer = this.getDom('closer'); + closer && domUtils.on(closer, 'click', function(){ + me.hide(); + }); + }, + setContent: function(content){ + this.getDom('content').innerHTML = content; + }, + setType: function(type){ + type = type || 'info'; + var body = this.getDom('body'); + body.className = body.className.replace(/edui-message-type-[\w-]+/, 'edui-message-type-' + type); + }, + getContent: function(){ + return this.getDom('content').innerHTML; + }, + getType: function(){ + var arr = this.getDom('body').match(/edui-message-type-([\w-]+)/); + return arr ? arr[1]:''; + }, + show: function (){ + this.getDom().style.display = 'block'; + }, + hide: function (){ + var dom = this.getDom(); + if (dom) { + dom.style.display = 'none'; + dom.parentNode && dom.parentNode.removeChild(dom); + } + } + }; + + utils.inherits(Message, UIBase); + +})(); + + +// adapter/editorui.js +//ui跟编辑器的适配層 +//那个按钮弹出是dialog,是下拉筐等都是在这个js中配置 +//自己写的ui也要在这里配置,放到baidu.editor.ui下边,当编辑器实例化的时候会根据ueditor.config中的toolbars找到相应的进行实例化 +(function () { + var utils = baidu.editor.utils; + var editorui = baidu.editor.ui; + var _Dialog = editorui.Dialog; + editorui.buttons = {}; + + editorui.Dialog = function (options) { + var dialog = new _Dialog(options); + dialog.addListener('hide', function () { + + if (dialog.editor) { + var editor = dialog.editor; + try { + if (browser.gecko) { + var y = editor.window.scrollY, + x = editor.window.scrollX; + editor.body.focus(); + editor.window.scrollTo(x, y); + } else { + editor.focus(); + } + + + } catch (ex) { + } + } + }); + return dialog; + }; + + var iframeUrlMap = { + 'anchor':'~/dialogs/anchor/anchor.html', + 'insertimage':'~/dialogs/image/image.html', + 'link':'~/dialogs/link/link.html', + 'spechars':'~/dialogs/spechars/spechars.html', + 'searchreplace':'~/dialogs/searchreplace/searchreplace.html', + 'map':'~/dialogs/map/map.html', + 'gmap':'~/dialogs/gmap/gmap.html', + 'insertvideo':'~/dialogs/video/video.html', + 'help':'~/dialogs/help/help.html', + 'preview':'~/dialogs/preview/preview.html', + 'emotion':'~/dialogs/emotion/emotion.html', + 'wordimage':'~/dialogs/wordimage/wordimage.html', + 'attachment':'~/dialogs/attachment/attachment.html', + 'insertframe':'~/dialogs/insertframe/insertframe.html', + 'edittip':'~/dialogs/table/edittip.html', + 'edittable':'~/dialogs/table/edittable.html', + 'edittd':'~/dialogs/table/edittd.html', + 'webapp':'~/dialogs/webapp/webapp.html', + 'snapscreen':'~/dialogs/snapscreen/snapscreen.html', + 'scrawl':'~/dialogs/scrawl/scrawl.html', + 'music':'~/dialogs/music/music.html', + 'template':'~/dialogs/template/template.html', + 'background':'~/dialogs/background/background.html', + 'charts': '~/dialogs/charts/charts.html' + }; + //为工具栏添加按钮,以下都是统一的按钮触发命令,所以写在一起 + var btnCmds = ['undo', 'redo', 'formatmatch', + 'bold', 'italic', 'underline', 'fontborder', 'touppercase', 'tolowercase', + 'strikethrough', 'subscript', 'superscript', 'source', 'indent', 'outdent', + 'blockquote', 'pasteplain', 'pagebreak', + 'selectall', 'print','horizontal', 'removeformat', 'time', 'date', 'unlink', + 'insertparagraphbeforetable', 'insertrow', 'insertcol', 'mergeright', 'mergedown', 'deleterow', + 'deletecol', 'splittorows', 'splittocols', 'splittocells', 'mergecells', 'deletetable', 'drafts']; + + for (var i = 0, ci; ci = btnCmds[i++];) { + ci = ci.toLowerCase(); + editorui[ci] = function (cmd) { + return function (editor) { + var ui = new editorui.Button({ + className:'edui-for-' + cmd, + title:editor.options.labelMap[cmd] || editor.getLang("labelMap." + cmd) || '', + onclick:function () { + editor.execCommand(cmd); + }, + theme:editor.options.theme, + showText:false + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + var state = editor.queryCommandState(cmd); + if (state == -1) { + ui.setDisabled(true); + ui.setChecked(false); + } else { + if (!uiReady) { + ui.setDisabled(false); + ui.setChecked(state); + } + } + }); + return ui; + }; + }(ci); + } + + //清除文档 + editorui.cleardoc = function (editor) { + var ui = new editorui.Button({ + className:'edui-for-cleardoc', + title:editor.options.labelMap.cleardoc || editor.getLang("labelMap.cleardoc") || '', + theme:editor.options.theme, + onclick:function () { + if (confirm(editor.getLang("confirmClear"))) { + editor.execCommand('cleardoc'); + } + } + }); + editorui.buttons["cleardoc"] = ui; + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState('cleardoc') == -1); + }); + return ui; + }; + + //排版,图片排版,文字方向 + var typeset = { + 'justify':['left', 'right', 'center', 'justify'], + 'imagefloat':['none', 'left', 'center', 'right'], + 'directionality':['ltr', 'rtl'] + }; + + for (var p in typeset) { + + (function (cmd, val) { + for (var i = 0, ci; ci = val[i++];) { + (function (cmd2) { + editorui[cmd.replace('float', '') + cmd2] = function (editor) { + var ui = new editorui.Button({ + className:'edui-for-' + cmd.replace('float', '') + cmd2, + title:editor.options.labelMap[cmd.replace('float', '') + cmd2] || editor.getLang("labelMap." + cmd.replace('float', '') + cmd2) || '', + theme:editor.options.theme, + onclick:function () { + editor.execCommand(cmd, cmd2); + } + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + ui.setDisabled(editor.queryCommandState(cmd) == -1); + ui.setChecked(editor.queryCommandValue(cmd) == cmd2 && !uiReady); + }); + return ui; + }; + })(ci) + } + })(p, typeset[p]) + } + + //字体颜色和背景颜色 + for (var i = 0, ci; ci = ['backcolor', 'forecolor'][i++];) { + editorui[ci] = function (cmd) { + return function (editor) { + var ui = new editorui.ColorButton({ + className:'edui-for-' + cmd, + color:'default', + title:editor.options.labelMap[cmd] || editor.getLang("labelMap." + cmd) || '', + editor:editor, + onpickcolor:function (t, color) { + editor.execCommand(cmd, color); + }, + onpicknocolor:function () { + editor.execCommand(cmd, 'default'); + this.setColor('transparent'); + this.color = 'default'; + }, + onbuttonclick:function () { + editor.execCommand(cmd, this.color); + } + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState(cmd) == -1); + }); + return ui; + }; + }(ci); + } + + + var dialogBtns = { + noOk:['searchreplace', 'help', 'spechars', 'webapp','preview'], + ok:['attachment', 'anchor', 'link', 'insertimage', 'map', 'gmap', 'insertframe', 'wordimage', + 'insertvideo', 'insertframe', 'edittip', 'edittable', 'edittd', 'scrawl', 'template', 'music', 'background', 'charts'] + }; + + for (var p in dialogBtns) { + (function (type, vals) { + for (var i = 0, ci; ci = vals[i++];) { + //todo opera下存在问题 + if (browser.opera && ci === "searchreplace") { + continue; + } + (function (cmd) { + editorui[cmd] = function (editor, iframeUrl, title) { + iframeUrl = iframeUrl || (editor.options.iframeUrlMap || {})[cmd] || iframeUrlMap[cmd]; + title = editor.options.labelMap[cmd] || editor.getLang("labelMap." + cmd) || ''; + + var dialog; + //没有iframeUrl不创建dialog + if (iframeUrl) { + dialog = new editorui.Dialog(utils.extend({ + iframeUrl:editor.ui.mapUrl(iframeUrl), + editor:editor, + className:'edui-for-' + cmd, + title:title, + holdScroll: cmd === 'insertimage', + fullscreen: /charts|preview/.test(cmd), + closeDialog:editor.getLang("closeDialog") + }, type == 'ok' ? { + buttons:[ + { + className:'edui-okbutton', + label:editor.getLang("ok"), + editor:editor, + onclick:function () { + dialog.close(true); + } + }, + { + className:'edui-cancelbutton', + label:editor.getLang("cancel"), + editor:editor, + onclick:function () { + dialog.close(false); + } + } + ] + } : {})); + + editor.ui._dialogs[cmd + "Dialog"] = dialog; + } + + var ui = new editorui.Button({ + className:'edui-for-' + cmd, + title:title, + onclick:function () { + if (dialog) { + switch (cmd) { + case "wordimage": + var images = editor.execCommand("wordimage"); + if (images && images.length) { + dialog.render(); + dialog.open(); + } + break; + case "scrawl": + if (editor.queryCommandState("scrawl") != -1) { + dialog.render(); + dialog.open(); + } + + break; + default: + dialog.render(); + dialog.open(); + } + } + }, + theme:editor.options.theme, + disabled:(cmd == 'scrawl' && editor.queryCommandState("scrawl") == -1) || ( cmd == 'charts' ) + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function () { + //只存在于右键菜单而无工具栏按钮的ui不需要检测状态 + var unNeedCheckState = {'edittable':1}; + if (cmd in unNeedCheckState)return; + + var state = editor.queryCommandState(cmd); + if (ui.getDom()) { + ui.setDisabled(state == -1); + ui.setChecked(state); + } + + }); + + return ui; + }; + })(ci.toLowerCase()) + } + })(p, dialogBtns[p]); + } + + editorui.snapscreen = function (editor, iframeUrl, title) { + title = editor.options.labelMap['snapscreen'] || editor.getLang("labelMap.snapscreen") || ''; + var ui = new editorui.Button({ + className:'edui-for-snapscreen', + title:title, + onclick:function () { + editor.execCommand("snapscreen"); + }, + theme:editor.options.theme + + }); + editorui.buttons['snapscreen'] = ui; + iframeUrl = iframeUrl || (editor.options.iframeUrlMap || {})["snapscreen"] || iframeUrlMap["snapscreen"]; + if (iframeUrl) { + var dialog = new editorui.Dialog({ + iframeUrl:editor.ui.mapUrl(iframeUrl), + editor:editor, + className:'edui-for-snapscreen', + title:title, + buttons:[ + { + className:'edui-okbutton', + label:editor.getLang("ok"), + editor:editor, + onclick:function () { + dialog.close(true); + } + }, + { + className:'edui-cancelbutton', + label:editor.getLang("cancel"), + editor:editor, + onclick:function () { + dialog.close(false); + } + } + ] + + }); + dialog.render(); + editor.ui._dialogs["snapscreenDialog"] = dialog; + } + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState('snapscreen') == -1); + }); + return ui; + }; + + editorui.insertcode = function (editor, list, title) { + list = editor.options['insertcode'] || []; + title = editor.options.labelMap['insertcode'] || editor.getLang("labelMap.insertcode") || ''; + // if (!list.length) return; + var items = []; + utils.each(list,function(key,val){ + items.push({ + label:key, + value:val, + theme:editor.options.theme, + renderLabelHtml:function () { + return '
    ' + (this.label || '') + '
    '; + } + }); + }); + + var ui = new editorui.Combox({ + editor:editor, + items:items, + onselect:function (t, index) { + editor.execCommand('insertcode', this.items[index].value); + }, + onbuttonclick:function () { + this.showPopup(); + }, + title:title, + initValue:title, + className:'edui-for-insertcode', + indexByValue:function (value) { + if (value) { + for (var i = 0, ci; ci = this.items[i]; i++) { + if (ci.value.indexOf(value) != -1) + return i; + } + } + + return -1; + } + }); + editorui.buttons['insertcode'] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState('insertcode'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('insertcode'); + if(!value){ + ui.setValue(title); + return; + } + //trace:1871 ie下从源码模式切换回来时,字体会带单引号,而且会有逗号 + value && (value = value.replace(/['"]/g, '').split(',')[0]); + ui.setValue(value); + + } + } + + }); + return ui; + }; + editorui.fontfamily = function (editor, list, title) { + + list = editor.options['fontfamily'] || []; + title = editor.options.labelMap['fontfamily'] || editor.getLang("labelMap.fontfamily") || ''; + if (!list.length) return; + for (var i = 0, ci, items = []; ci = list[i]; i++) { + var langLabel = editor.getLang('fontfamily')[ci.name] || ""; + (function (key, val) { + items.push({ + label:key, + value:val, + theme:editor.options.theme, + renderLabelHtml:function () { + return '
    ' + (this.label || '') + '
    '; + } + }); + })(ci.label || langLabel, ci.val) + } + var ui = new editorui.Combox({ + editor:editor, + items:items, + onselect:function (t, index) { + editor.execCommand('FontFamily', this.items[index].value); + }, + onbuttonclick:function () { + this.showPopup(); + }, + title:title, + initValue:title, + className:'edui-for-fontfamily', + indexByValue:function (value) { + if (value) { + for (var i = 0, ci; ci = this.items[i]; i++) { + if (ci.value.indexOf(value) != -1) + return i; + } + } + + return -1; + } + }); + editorui.buttons['fontfamily'] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState('FontFamily'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('FontFamily'); + //trace:1871 ie下从源码模式切换回来时,字体会带单引号,而且会有逗号 + value && (value = value.replace(/['"]/g, '').split(',')[0]); + ui.setValue(value); + + } + } + + }); + return ui; + }; + + editorui.fontsize = function (editor, list, title) { + title = editor.options.labelMap['fontsize'] || editor.getLang("labelMap.fontsize") || ''; + list = list || editor.options['fontsize'] || []; + if (!list.length) return; + var items = []; + for (var i = 0; i < list.length; i++) { + var size = list[i] + 'px'; + items.push({ + label:size, + value:size, + theme:editor.options.theme, + renderLabelHtml:function () { + return '
    ' + (this.label || '') + '
    '; + } + }); + } + var ui = new editorui.Combox({ + editor:editor, + items:items, + title:title, + initValue:title, + onselect:function (t, index) { + editor.execCommand('FontSize', this.items[index].value); + }, + onbuttonclick:function () { + this.showPopup(); + }, + className:'edui-for-fontsize' + }); + editorui.buttons['fontsize'] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState('FontSize'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + ui.setValue(editor.queryCommandValue('FontSize')); + } + } + + }); + return ui; + }; + + editorui.paragraph = function (editor, list, title) { + title = editor.options.labelMap['paragraph'] || editor.getLang("labelMap.paragraph") || ''; + list = editor.options['paragraph'] || []; + if (utils.isEmptyObject(list)) return; + var items = []; + for (var i in list) { + items.push({ + value:i, + label:list[i] || editor.getLang("paragraph")[i], + theme:editor.options.theme, + renderLabelHtml:function () { + return '
    ' + (this.label || '') + '
    '; + } + }) + } + var ui = new editorui.Combox({ + editor:editor, + items:items, + title:title, + initValue:title, + className:'edui-for-paragraph', + onselect:function (t, index) { + editor.execCommand('Paragraph', this.items[index].value); + }, + onbuttonclick:function () { + this.showPopup(); + } + }); + editorui.buttons['paragraph'] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState('Paragraph'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('Paragraph'); + var index = ui.indexByValue(value); + if (index != -1) { + ui.setValue(value); + } else { + ui.setValue(ui.initValue); + } + } + } + + }); + return ui; + }; + + + //自定义标题 + editorui.customstyle = function (editor) { + var list = editor.options['customstyle'] || [], + title = editor.options.labelMap['customstyle'] || editor.getLang("labelMap.customstyle") || ''; + if (!list.length)return; + var langCs = editor.getLang('customstyle'); + for (var i = 0, items = [], t; t = list[i++];) { + (function (t) { + var ck = {}; + ck.label = t.label ? t.label : langCs[t.name]; + ck.style = t.style; + ck.className = t.className; + ck.tag = t.tag; + items.push({ + label:ck.label, + value:ck, + theme:editor.options.theme, + renderLabelHtml:function () { + return '
    ' + '<' + ck.tag + ' ' + (ck.className ? ' class="' + ck.className + '"' : "") + + (ck.style ? ' style="' + ck.style + '"' : "") + '>' + ck.label + "<\/" + ck.tag + ">" + + '
    '; + } + }); + })(t); + } + + var ui = new editorui.Combox({ + editor:editor, + items:items, + title:title, + initValue:title, + className:'edui-for-customstyle', + onselect:function (t, index) { + editor.execCommand('customstyle', this.items[index].value); + }, + onbuttonclick:function () { + this.showPopup(); + }, + indexByValue:function (value) { + for (var i = 0, ti; ti = this.items[i++];) { + if (ti.label == value) { + return i - 1 + } + } + return -1; + } + }); + editorui.buttons['customstyle'] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState('customstyle'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('customstyle'); + var index = ui.indexByValue(value); + if (index != -1) { + ui.setValue(value); + } else { + ui.setValue(ui.initValue); + } + } + } + + }); + return ui; + }; + editorui.inserttable = function (editor, iframeUrl, title) { + title = editor.options.labelMap['inserttable'] || editor.getLang("labelMap.inserttable") || ''; + var ui = new editorui.TableButton({ + editor:editor, + title:title, + className:'edui-for-inserttable', + onpicktable:function (t, numCols, numRows) { + editor.execCommand('InsertTable', {numRows:numRows, numCols:numCols, border:1}); + }, + onbuttonclick:function () { + this.showPopup(); + } + }); + editorui.buttons['inserttable'] = ui; + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState('inserttable') == -1); + }); + return ui; + }; + + editorui.lineheight = function (editor) { + var val = editor.options.lineheight || []; + if (!val.length)return; + for (var i = 0, ci, items = []; ci = val[i++];) { + items.push({ + //todo:写死了 + label:ci, + value:ci, + theme:editor.options.theme, + onclick:function () { + editor.execCommand("lineheight", this.value); + } + }) + } + var ui = new editorui.MenuButton({ + editor:editor, + className:'edui-for-lineheight', + title:editor.options.labelMap['lineheight'] || editor.getLang("labelMap.lineheight") || '', + items:items, + onbuttonclick:function () { + var value = editor.queryCommandValue('LineHeight') || this.value; + editor.execCommand("LineHeight", value); + } + }); + editorui.buttons['lineheight'] = ui; + editor.addListener('selectionchange', function () { + var state = editor.queryCommandState('LineHeight'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('LineHeight'); + value && ui.setValue((value + '').replace(/cm/, '')); + ui.setChecked(state) + } + }); + return ui; + }; + + var rowspacings = ['top', 'bottom']; + for (var r = 0, ri; ri = rowspacings[r++];) { + (function (cmd) { + editorui['rowspacing' + cmd] = function (editor) { + var val = editor.options['rowspacing' + cmd] || []; + if (!val.length) return null; + for (var i = 0, ci, items = []; ci = val[i++];) { + items.push({ + label:ci, + value:ci, + theme:editor.options.theme, + onclick:function () { + editor.execCommand("rowspacing", this.value, cmd); + } + }) + } + var ui = new editorui.MenuButton({ + editor:editor, + className:'edui-for-rowspacing' + cmd, + title:editor.options.labelMap['rowspacing' + cmd] || editor.getLang("labelMap.rowspacing" + cmd) || '', + items:items, + onbuttonclick:function () { + var value = editor.queryCommandValue('rowspacing', cmd) || this.value; + editor.execCommand("rowspacing", value, cmd); + } + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function () { + var state = editor.queryCommandState('rowspacing', cmd); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('rowspacing', cmd); + value && ui.setValue((value + '').replace(/%/, '')); + ui.setChecked(state) + } + }); + return ui; + } + })(ri) + } + //有序,无序列表 + var lists = ['insertorderedlist', 'insertunorderedlist']; + for (var l = 0, cl; cl = lists[l++];) { + (function (cmd) { + editorui[cmd] = function (editor) { + var vals = editor.options[cmd], + _onMenuClick = function () { + editor.execCommand(cmd, this.value); + }, items = []; + for (var i in vals) { + items.push({ + label:vals[i] || editor.getLang()[cmd][i] || "", + value:i, + theme:editor.options.theme, + onclick:_onMenuClick + }) + } + var ui = new editorui.MenuButton({ + editor:editor, + className:'edui-for-' + cmd, + title:editor.getLang("labelMap." + cmd) || '', + 'items':items, + onbuttonclick:function () { + var value = editor.queryCommandValue(cmd) || this.value; + editor.execCommand(cmd, value); + } + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function () { + var state = editor.queryCommandState(cmd); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue(cmd); + ui.setValue(value); + ui.setChecked(state) + } + }); + return ui; + }; + })(cl) + } + + editorui.fullscreen = function (editor, title) { + title = editor.options.labelMap['fullscreen'] || editor.getLang("labelMap.fullscreen") || ''; + var ui = new editorui.Button({ + className:'edui-for-fullscreen', + title:title, + theme:editor.options.theme, + onclick:function () { + if (editor.ui) { + editor.ui.setFullScreen(!editor.ui.isFullScreen()); + } + this.setChecked(editor.ui.isFullScreen()); + } + }); + editorui.buttons['fullscreen'] = ui; + editor.addListener('selectionchange', function () { + var state = editor.queryCommandState('fullscreen'); + ui.setDisabled(state == -1); + ui.setChecked(editor.ui.isFullScreen()); + }); + return ui; + }; + + // 表情 + editorui["emotion"] = function (editor, iframeUrl) { + var cmd = "emotion"; + var ui = new editorui.MultiMenuPop({ + title:editor.options.labelMap[cmd] || editor.getLang("labelMap." + cmd + "") || '', + editor:editor, + className:'edui-for-' + cmd, + iframeUrl:editor.ui.mapUrl(iframeUrl || (editor.options.iframeUrlMap || {})[cmd] || iframeUrlMap[cmd]) + }); + editorui.buttons[cmd] = ui; + + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState(cmd) == -1) + }); + return ui; + }; + + editorui.autotypeset = function (editor) { + var ui = new editorui.AutoTypeSetButton({ + editor:editor, + title:editor.options.labelMap['autotypeset'] || editor.getLang("labelMap.autotypeset") || '', + className:'edui-for-autotypeset', + onbuttonclick:function () { + editor.execCommand('autotypeset') + } + }); + editorui.buttons['autotypeset'] = ui; + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState('autotypeset') == -1); + }); + return ui; + }; + + /* 简单上传插件 */ + editorui["simpleupload"] = function (editor) { + var name = 'simpleupload', + ui = new editorui.Button({ + className:'edui-for-' + name, + title:editor.options.labelMap[name] || editor.getLang("labelMap." + name) || '', + onclick:function () {}, + theme:editor.options.theme, + showText:false + }); + editorui.buttons[name] = ui; + editor.addListener('ready', function() { + var b = ui.getDom('body'), + iconSpan = b.children[0]; + editor.fireEvent('simpleuploadbtnready', iconSpan); + }); + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + var state = editor.queryCommandState(name); + if (state == -1) { + ui.setDisabled(true); + ui.setChecked(false); + } else { + if (!uiReady) { + ui.setDisabled(false); + ui.setChecked(state); + } + } + }); + return ui; + }; + +})(); + + +// adapter/editor.js +///import core +///commands 全屏 +///commandsName FullScreen +///commandsTitle 全屏 +(function () { + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase, + domUtils = baidu.editor.dom.domUtils; + var nodeStack = []; + + function EditorUI(options) { + this.initOptions(options); + this.initEditorUI(); + } + + EditorUI.prototype = { + uiName:'editor', + initEditorUI:function () { + this.editor.ui = this; + this._dialogs = {}; + this.initUIBase(); + this._initToolbars(); + var editor = this.editor, + me = this; + + editor.addListener('ready', function () { + //提供getDialog方法 + editor.getDialog = function (name) { + return editor.ui._dialogs[name + "Dialog"]; + }; + domUtils.on(editor.window, 'scroll', function (evt) { + baidu.editor.ui.Popup.postHide(evt); + }); + //提供编辑器实时宽高(全屏时宽高不变化) + editor.ui._actualFrameWidth = editor.options.initialFrameWidth; + + UE.browser.ie && UE.browser.version === 6 && editor.container.ownerDocument.execCommand("BackgroundImageCache", false, true); + + //display bottom-bar label based on config + if (editor.options.elementPathEnabled) { + editor.ui.getDom('elementpath').innerHTML = '
    ' + editor.getLang("elementPathTip") + ':
    '; + } + if (editor.options.wordCount) { + function countFn() { + setCount(editor,me); + domUtils.un(editor.document, "click", arguments.callee); + } + domUtils.on(editor.document, "click", countFn); + editor.ui.getDom('wordcount').innerHTML = editor.getLang("wordCountTip"); + } + editor.ui._scale(); + if (editor.options.scaleEnabled) { + if (editor.autoHeightEnabled) { + editor.disableAutoHeight(); + } + me.enableScale(); + } else { + me.disableScale(); + } + if (!editor.options.elementPathEnabled && !editor.options.wordCount && !editor.options.scaleEnabled) { + editor.ui.getDom('elementpath').style.display = "none"; + editor.ui.getDom('wordcount').style.display = "none"; + editor.ui.getDom('scale').style.display = "none"; + } + + if (!editor.selection.isFocus())return; + editor.fireEvent('selectionchange', false, true); + + + }); + + editor.addListener('mousedown', function (t, evt) { + var el = evt.target || evt.srcElement; + baidu.editor.ui.Popup.postHide(evt, el); + baidu.editor.ui.ShortCutMenu.postHide(evt); + + }); + editor.addListener("delcells", function () { + if (UE.ui['edittip']) { + new UE.ui['edittip'](editor); + } + editor.getDialog('edittip').open(); + }); + + var pastePop, isPaste = false, timer; + editor.addListener("afterpaste", function () { + if(editor.queryCommandState('pasteplain')) + return; + if(baidu.editor.ui.PastePicker){ + pastePop = new baidu.editor.ui.Popup({ + content:new baidu.editor.ui.PastePicker({editor:editor}), + editor:editor, + className:'edui-wordpastepop' + }); + pastePop.render(); + } + isPaste = true; + }); + + editor.addListener("afterinserthtml", function () { + clearTimeout(timer); + timer = setTimeout(function () { + if (pastePop && (isPaste || editor.ui._isTransfer)) { + if(pastePop.isHidden()){ + var span = domUtils.createElement(editor.document, 'span', { + 'style':"line-height:0px;", + 'innerHTML':'\ufeff' + }), + range = editor.selection.getRange(); + range.insertNode(span); + var tmp= getDomNode(span, 'firstChild', 'previousSibling'); + tmp && pastePop.showAnchor(tmp.nodeType == 3 ? tmp.parentNode : tmp); + domUtils.remove(span); + }else{ + pastePop.show(); + } + delete editor.ui._isTransfer; + isPaste = false; + } + }, 200) + }); + editor.addListener('contextmenu', function (t, evt) { + baidu.editor.ui.Popup.postHide(evt); + }); + editor.addListener('keydown', function (t, evt) { + if (pastePop) pastePop.dispose(evt); + var keyCode = evt.keyCode || evt.which; + if(evt.altKey&&keyCode==90){ + UE.ui.buttons['fullscreen'].onclick(); + } + }); + editor.addListener('wordcount', function (type) { + setCount(this,me); + }); + function setCount(editor,ui) { + editor.setOpt({ + wordCount:true, + maximumWords:10000, + wordCountMsg:editor.options.wordCountMsg || editor.getLang("wordCountMsg"), + wordOverFlowMsg:editor.options.wordOverFlowMsg || editor.getLang("wordOverFlowMsg") + }); + var opt = editor.options, + max = opt.maximumWords, + msg = opt.wordCountMsg , + errMsg = opt.wordOverFlowMsg, + countDom = ui.getDom('wordcount'); + if (!opt.wordCount) { + return; + } + var count = editor.getContentLength(true); + if (count > max) { + countDom.innerHTML = errMsg; + editor.fireEvent("wordcountoverflow"); + } else { + countDom.innerHTML = msg.replace("{#leave}", max - count).replace("{#count}", count); + } + } + + editor.addListener('selectionchange', function () { + if (editor.options.elementPathEnabled) { + me[(editor.queryCommandState('elementpath') == -1 ? 'dis' : 'en') + 'ableElementPath']() + } + if (editor.options.scaleEnabled) { + me[(editor.queryCommandState('scale') == -1 ? 'dis' : 'en') + 'ableScale'](); + + } + }); + var popup = new baidu.editor.ui.Popup({ + editor:editor, + content:'', + className:'edui-bubble', + _onEditButtonClick:function () { + this.hide(); + editor.ui._dialogs.linkDialog.open(); + }, + _onImgEditButtonClick:function (name) { + this.hide(); + editor.ui._dialogs[name] && editor.ui._dialogs[name].open(); + + }, + _onImgSetFloat:function (value) { + this.hide(); + editor.execCommand("imagefloat", value); + + }, + _setIframeAlign:function (value) { + var frame = popup.anchorEl; + var newFrame = frame.cloneNode(true); + switch (value) { + case -2: + newFrame.setAttribute("align", ""); + break; + case -1: + newFrame.setAttribute("align", "left"); + break; + case 1: + newFrame.setAttribute("align", "right"); + break; + } + frame.parentNode.insertBefore(newFrame, frame); + domUtils.remove(frame); + popup.anchorEl = newFrame; + popup.showAnchor(popup.anchorEl); + }, + _updateIframe:function () { + var frame = editor._iframe = popup.anchorEl; + if(domUtils.hasClass(frame, 'ueditor_baidumap')) { + editor.selection.getRange().selectNode(frame).select(); + editor.ui._dialogs.mapDialog.open(); + popup.hide(); + } else { + editor.ui._dialogs.insertframeDialog.open(); + popup.hide(); + } + }, + _onRemoveButtonClick:function (cmdName) { + editor.execCommand(cmdName); + this.hide(); + }, + queryAutoHide:function (el) { + if (el && el.ownerDocument == editor.document) { + if (el.tagName.toLowerCase() == 'img' || domUtils.findParentByTagName(el, 'a', true)) { + return el !== popup.anchorEl; + } + } + return baidu.editor.ui.Popup.prototype.queryAutoHide.call(this, el); + } + }); + popup.render(); + if (editor.options.imagePopup) { + editor.addListener('mouseover', function (t, evt) { + evt = evt || window.event; + var el = evt.target || evt.srcElement; + if (editor.ui._dialogs.insertframeDialog && /iframe/ig.test(el.tagName)) { + var html = popup.formatHtml( + '' + editor.getLang("property") + ': ' + editor.getLang("default") + '  ' + editor.getLang("justifyleft") + '  ' + editor.getLang("justifyright") + '  ' + + ' ' + editor.getLang("modify") + ''); + if (html) { + popup.getDom('content').innerHTML = html; + popup.anchorEl = el; + popup.showAnchor(popup.anchorEl); + } else { + popup.hide(); + } + } + }); + editor.addListener('selectionchange', function (t, causeByUi) { + if (!causeByUi) return; + var html = '', str = "", + img = editor.selection.getRange().getClosedNode(), + dialogs = editor.ui._dialogs; + if (img && img.tagName == 'IMG') { + var dialogName = 'insertimageDialog'; + if (img.className.indexOf("edui-faked-video") != -1 || img.className.indexOf("edui-upload-video") != -1) { + dialogName = "insertvideoDialog" + } + if (img.className.indexOf("edui-faked-webapp") != -1) { + dialogName = "webappDialog" + } + if (img.src.indexOf("http://api.map.baidu.com") != -1) { + dialogName = "mapDialog" + } + if (img.className.indexOf("edui-faked-music") != -1) { + dialogName = "musicDialog" + } + if (img.src.indexOf("http://maps.google.com/maps/api/staticmap") != -1) { + dialogName = "gmapDialog" + } + if (img.getAttribute("anchorname")) { + dialogName = "anchorDialog"; + html = popup.formatHtml( + '' + editor.getLang("property") + ': ' + editor.getLang("modify") + '  ' + + '' + editor.getLang("delete") + ''); + } + if (img.getAttribute("word_img")) { + //todo 放到dialog去做查询 + editor.word_img = [img.getAttribute("word_img")]; + dialogName = "wordimageDialog" + } + if(domUtils.hasClass(img, 'loadingclass') || domUtils.hasClass(img, 'loaderrorclass')) { + dialogName = ""; + } + if (!dialogs[dialogName]) { + return; + } + str = '' + editor.getLang("property") + ': '+ + '' + editor.getLang("default") + '  ' + + '' + editor.getLang("justifyleft") + '  ' + + '' + editor.getLang("justifyright") + '  ' + + '' + editor.getLang("justifycenter") + '  '+ + '' + editor.getLang("modify") + ''; + + !html && (html = popup.formatHtml(str)) + + } + if (editor.ui._dialogs.linkDialog) { + var link = editor.queryCommandValue('link'); + var url; + if (link && (url = (link.getAttribute('_href') || link.getAttribute('href', 2)))) { + var txt = url; + if (url.length > 30) { + txt = url.substring(0, 20) + "..."; + } + if (html) { + html += '
    ' + } + html += popup.formatHtml( + '' + editor.getLang("anthorMsg") + ': ' + txt + '' + + ' ' + editor.getLang("modify") + '' + + ' ' + editor.getLang("clear") + ''); + popup.showAnchor(link); + } + } + + if (html) { + popup.getDom('content').innerHTML = html; + popup.anchorEl = img || link; + popup.showAnchor(popup.anchorEl); + } else { + popup.hide(); + } + }); + } + + }, + _initToolbars:function () { + var editor = this.editor; + var toolbars = this.toolbars || []; + var toolbarUis = []; + for (var i = 0; i < toolbars.length; i++) { + var toolbar = toolbars[i]; + var toolbarUi = new baidu.editor.ui.Toolbar({theme:editor.options.theme}); + for (var j = 0; j < toolbar.length; j++) { + var toolbarItem = toolbar[j]; + var toolbarItemUi = null; + if (typeof toolbarItem == 'string') { + toolbarItem = toolbarItem.toLowerCase(); + if (toolbarItem == '|') { + toolbarItem = 'Separator'; + } + if(toolbarItem == '||'){ + toolbarItem = 'Breakline'; + } + if (baidu.editor.ui[toolbarItem]) { + toolbarItemUi = new baidu.editor.ui[toolbarItem](editor); + } + + //fullscreen这里单独处理一下,放到首行去 + if (toolbarItem == 'fullscreen') { + if (toolbarUis && toolbarUis[0]) { + toolbarUis[0].items.splice(0, 0, toolbarItemUi); + } else { + toolbarItemUi && toolbarUi.items.splice(0, 0, toolbarItemUi); + } + + continue; + + + } + } else { + toolbarItemUi = toolbarItem; + } + if (toolbarItemUi && toolbarItemUi.id) { + + toolbarUi.add(toolbarItemUi); + } + } + toolbarUis[i] = toolbarUi; + } + + //接受外部定制的UI + + utils.each(UE._customizeUI,function(obj,key){ + var itemUI,index; + if(obj.id && obj.id != editor.key){ + return false; + } + itemUI = obj.execFn.call(editor,editor,key); + if(itemUI){ + index = obj.index; + if(index === undefined){ + index = toolbarUi.items.length; + } + toolbarUi.add(itemUI,index) + } + }); + + this.toolbars = toolbarUis; + }, + getHtmlTpl:function () { + return '
    ' + + '
    ' + + (this.toolbars.length ? + '
    ' + + this.renderToolbarBoxHtml() + + '
    ' : '') + + '' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + //modify wdcount by matao + '
    ' + + '' + + '' + + '' + + '
    ' + + '
    ' + + '
    '; + }, + showWordImageDialog:function () { + this._dialogs['wordimageDialog'].open(); + }, + renderToolbarBoxHtml:function () { + var buff = []; + for (var i = 0; i < this.toolbars.length; i++) { + buff.push(this.toolbars[i].renderHtml()); + } + return buff.join(''); + }, + setFullScreen:function (fullscreen) { + + var editor = this.editor, + container = editor.container.parentNode.parentNode; + if (this._fullscreen != fullscreen) { + this._fullscreen = fullscreen; + this.editor.fireEvent('beforefullscreenchange', fullscreen); + if (baidu.editor.browser.gecko) { + var bk = editor.selection.getRange().createBookmark(); + } + if (fullscreen) { + while (container.tagName != "BODY") { + var position = baidu.editor.dom.domUtils.getComputedStyle(container, "position"); + nodeStack.push(position); + container.style.position = "static"; + container = container.parentNode; + } + this._bakHtmlOverflow = document.documentElement.style.overflow; + this._bakBodyOverflow = document.body.style.overflow; + this._bakAutoHeight = this.editor.autoHeightEnabled; + this._bakScrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop); + + this._bakEditorContaninerWidth = editor.iframe.parentNode.offsetWidth; + if (this._bakAutoHeight) { + //当全屏时不能执行自动长高 + editor.autoHeightEnabled = false; + this.editor.disableAutoHeight(); + } + + document.documentElement.style.overflow = 'hidden'; + //修复,滚动条不收起的问题 + + window.scrollTo(0,window.scrollY); + this._bakCssText = this.getDom().style.cssText; + this._bakCssText1 = this.getDom('iframeholder').style.cssText; + editor.iframe.parentNode.style.width = ''; + this._updateFullScreen(); + } else { + while (container.tagName != "BODY") { + container.style.position = nodeStack.shift(); + container = container.parentNode; + } + this.getDom().style.cssText = this._bakCssText; + this.getDom('iframeholder').style.cssText = this._bakCssText1; + if (this._bakAutoHeight) { + editor.autoHeightEnabled = true; + this.editor.enableAutoHeight(); + } + + document.documentElement.style.overflow = this._bakHtmlOverflow; + document.body.style.overflow = this._bakBodyOverflow; + editor.iframe.parentNode.style.width = this._bakEditorContaninerWidth + 'px'; + window.scrollTo(0, this._bakScrollTop); + } + if (browser.gecko && editor.body.contentEditable === 'true') { + var input = document.createElement('input'); + document.body.appendChild(input); + editor.body.contentEditable = false; + setTimeout(function () { + input.focus(); + setTimeout(function () { + editor.body.contentEditable = true; + editor.fireEvent('fullscreenchanged', fullscreen); + editor.selection.getRange().moveToBookmark(bk).select(true); + baidu.editor.dom.domUtils.remove(input); + fullscreen && window.scroll(0, 0); + }, 0) + }, 0) + } + + if(editor.body.contentEditable === 'true'){ + this.editor.fireEvent('fullscreenchanged', fullscreen); + this.triggerLayout(); + } + + } + }, + _updateFullScreen:function () { + if (this._fullscreen) { + var vpRect = uiUtils.getViewportRect(); + this.getDom().style.cssText = 'border:0;position:absolute;left:0;top:' + (this.editor.options.topOffset || 0) + 'px;width:' + vpRect.width + 'px;height:' + vpRect.height + 'px;z-index:' + (this.getDom().style.zIndex * 1 + 100); + uiUtils.setViewportOffset(this.getDom(), { left:0, top:this.editor.options.topOffset || 0 }); + this.editor.setHeight(vpRect.height - this.getDom('toolbarbox').offsetHeight - this.getDom('bottombar').offsetHeight - (this.editor.options.topOffset || 0),true); + //不手动调一下,会导致全屏失效 + if(browser.gecko){ + try{ + window.onresize(); + }catch(e){ + + } + + } + } + }, + _updateElementPath:function () { + var bottom = this.getDom('elementpath'), list; + if (this.elementPathEnabled && (list = this.editor.queryCommandValue('elementpath'))) { + + var buff = []; + for (var i = 0, ci; ci = list[i]; i++) { + buff[i] = this.formatHtml('' + ci + ''); + } + bottom.innerHTML = '
    ' + this.editor.getLang("elementPathTip") + ': ' + buff.join(' > ') + '
    '; + + } else { + bottom.style.display = 'none' + } + }, + disableElementPath:function () { + var bottom = this.getDom('elementpath'); + bottom.innerHTML = ''; + bottom.style.display = 'none'; + this.elementPathEnabled = false; + + }, + enableElementPath:function () { + var bottom = this.getDom('elementpath'); + bottom.style.display = ''; + this.elementPathEnabled = true; + this._updateElementPath(); + }, + _scale:function () { + var doc = document, + editor = this.editor, + editorHolder = editor.container, + editorDocument = editor.document, + toolbarBox = this.getDom("toolbarbox"), + bottombar = this.getDom("bottombar"), + scale = this.getDom("scale"), + scalelayer = this.getDom("scalelayer"); + + var isMouseMove = false, + position = null, + minEditorHeight = 0, + minEditorWidth = editor.options.minFrameWidth, + pageX = 0, + pageY = 0, + scaleWidth = 0, + scaleHeight = 0; + + function down() { + position = domUtils.getXY(editorHolder); + + if (!minEditorHeight) { + minEditorHeight = editor.options.minFrameHeight + toolbarBox.offsetHeight + bottombar.offsetHeight; + } + + scalelayer.style.cssText = "position:absolute;left:0;display:;top:0;background-color:#41ABFF;opacity:0.4;filter: Alpha(opacity=40);width:" + editorHolder.offsetWidth + "px;height:" + + editorHolder.offsetHeight + "px;z-index:" + (editor.options.zIndex + 1); + + domUtils.on(doc, "mousemove", move); + domUtils.on(editorDocument, "mouseup", up); + domUtils.on(doc, "mouseup", up); + } + + var me = this; + //by xuheng 全屏时关掉缩放 + this.editor.addListener('fullscreenchanged', function (e, fullScreen) { + if (fullScreen) { + me.disableScale(); + + } else { + if (me.editor.options.scaleEnabled) { + me.enableScale(); + var tmpNode = me.editor.document.createElement('span'); + me.editor.body.appendChild(tmpNode); + me.editor.body.style.height = Math.max(domUtils.getXY(tmpNode).y, me.editor.iframe.offsetHeight - 20) + 'px'; + domUtils.remove(tmpNode) + } + } + }); + function move(event) { + clearSelection(); + var e = event || window.event; + pageX = e.pageX || (doc.documentElement.scrollLeft + e.clientX); + pageY = e.pageY || (doc.documentElement.scrollTop + e.clientY); + scaleWidth = pageX - position.x; + scaleHeight = pageY - position.y; + + if (scaleWidth >= minEditorWidth) { + isMouseMove = true; + scalelayer.style.width = scaleWidth + 'px'; + } + if (scaleHeight >= minEditorHeight) { + isMouseMove = true; + scalelayer.style.height = scaleHeight + "px"; + } + } + + function up() { + if (isMouseMove) { + isMouseMove = false; + editor.ui._actualFrameWidth = scalelayer.offsetWidth - 2; + editorHolder.style.width = editor.ui._actualFrameWidth + 'px'; + + editor.setHeight(scalelayer.offsetHeight - bottombar.offsetHeight - toolbarBox.offsetHeight - 2,true); + } + if (scalelayer) { + scalelayer.style.display = "none"; + } + clearSelection(); + domUtils.un(doc, "mousemove", move); + domUtils.un(editorDocument, "mouseup", up); + domUtils.un(doc, "mouseup", up); + } + + function clearSelection() { + if (browser.ie) + doc.selection.clear(); + else + window.getSelection().removeAllRanges(); + } + + this.enableScale = function () { + //trace:2868 + if (editor.queryCommandState("source") == 1) return; + scale.style.display = ""; + this.scaleEnabled = true; + domUtils.on(scale, "mousedown", down); + }; + this.disableScale = function () { + scale.style.display = "none"; + this.scaleEnabled = false; + domUtils.un(scale, "mousedown", down); + }; + }, + isFullScreen:function () { + return this._fullscreen; + }, + postRender:function () { + UIBase.prototype.postRender.call(this); + for (var i = 0; i < this.toolbars.length; i++) { + this.toolbars[i].postRender(); + } + var me = this; + var timerId, + domUtils = baidu.editor.dom.domUtils, + updateFullScreenTime = function () { + clearTimeout(timerId); + timerId = setTimeout(function () { + me._updateFullScreen(); + }); + }; + domUtils.on(window, 'resize', updateFullScreenTime); + + me.addListener('destroy', function () { + domUtils.un(window, 'resize', updateFullScreenTime); + clearTimeout(timerId); + }) + }, + showToolbarMsg:function (msg, flag) { + this.getDom('toolbarmsg_label').innerHTML = msg; + this.getDom('toolbarmsg').style.display = ''; + // + if (!flag) { + var w = this.getDom('upload_dialog'); + w.style.display = 'none'; + } + }, + hideToolbarMsg:function () { + this.getDom('toolbarmsg').style.display = 'none'; + }, + mapUrl:function (url) { + return url ? url.replace('~/', this.editor.options.UEDITOR_HOME_URL || '') : '' + }, + triggerLayout:function () { + var dom = this.getDom(); + if (dom.style.zoom == '1') { + dom.style.zoom = '100%'; + } else { + dom.style.zoom = '1'; + } + } + }; + utils.inherits(EditorUI, baidu.editor.ui.UIBase); + + + var instances = {}; + + + UE.ui.Editor = function (options) { + var editor = new UE.Editor(options); + editor.options.editor = editor; + utils.loadFile(document, { + href:editor.options.themePath + editor.options.theme + "/css/ueditor.css", + tag:"link", + type:"text/css", + rel:"stylesheet" + }); + + var oldRender = editor.render; + editor.render = function (holder) { + if (holder.constructor === String) { + editor.key = holder; + instances[holder] = editor; + } + utils.domReady(function () { + editor.langIsReady ? renderUI() : editor.addListener("langReady", renderUI); + function renderUI() { + editor.setOpt({ + labelMap:editor.options.labelMap || editor.getLang('labelMap') + }); + new EditorUI(editor.options); + if (holder) { + if (holder.constructor === String) { + holder = document.getElementById(holder); + } + holder && holder.getAttribute('name') && ( editor.options.textarea = holder.getAttribute('name')); + if (holder && /script|textarea/ig.test(holder.tagName)) { + var newDiv = document.createElement('div'); + holder.parentNode.insertBefore(newDiv, holder); + var cont = holder.value || holder.innerHTML; + editor.options.initialContent = /^[\t\r\n ]*$/.test(cont) ? editor.options.initialContent : + cont.replace(/>[\n\r\t]+([ ]{4})+/g, '>') + .replace(/[\n\r\t]+([ ]{4})+[\n\r\t]+<'); + holder.className && (newDiv.className = holder.className); + holder.style.cssText && (newDiv.style.cssText = holder.style.cssText); + if (/textarea/i.test(holder.tagName)) { + editor.textarea = holder; + editor.textarea.style.display = 'none'; + + + } else { + holder.parentNode.removeChild(holder); + + + } + if(holder.id){ + newDiv.id = holder.id; + domUtils.removeAttributes(holder,'id'); + } + holder = newDiv; + holder.innerHTML = ''; + } + + } + domUtils.addClass(holder, "edui-" + editor.options.theme); + editor.ui.render(holder); + var opt = editor.options; + //给实例添加一个编辑器的容器引用 + editor.container = editor.ui.getDom(); + var parents = domUtils.findParents(holder,true); + var displays = []; + for(var i = 0 ,ci;ci=parents[i];i++){ + displays[i] = ci.style.display; + ci.style.display = 'block' + } + if (opt.initialFrameWidth) { + opt.minFrameWidth = opt.initialFrameWidth; + } else { + opt.minFrameWidth = opt.initialFrameWidth = holder.offsetWidth; + var styleWidth = holder.style.width; + if(/%$/.test(styleWidth)) { + opt.initialFrameWidth = styleWidth; + } + } + if (opt.initialFrameHeight) { + opt.minFrameHeight = opt.initialFrameHeight; + } else { + opt.initialFrameHeight = opt.minFrameHeight = holder.offsetHeight; + } + for(var i = 0 ,ci;ci=parents[i];i++){ + ci.style.display = displays[i] + } + //编辑器最外容器设置了高度,会导致,编辑器不占位 + //todo 先去掉,没有找到原因 + if(holder.style.height){ + holder.style.height = '' + } + editor.container.style.width = opt.initialFrameWidth + (/%$/.test(opt.initialFrameWidth) ? '' : 'px'); + editor.container.style.zIndex = opt.zIndex; + oldRender.call(editor, editor.ui.getDom('iframeholder')); + editor.fireEvent("afteruiready"); + } + }) + }; + return editor; + }; + + + /** + * @file + * @name UE + * @short UE + * @desc UEditor的顶部命名空间 + */ + /** + * @name getEditor + * @since 1.2.4+ + * @grammar UE.getEditor(id,[opt]) => Editor实例 + * @desc 提供一个全局的方法得到编辑器实例 + * + * * ''id'' 放置编辑器的容器id, 如果容器下的编辑器已经存在,就直接返回 + * * ''opt'' 编辑器的可选参数 + * @example + * UE.getEditor('containerId',{onready:function(){//创建一个编辑器实例 + * this.setContent('hello') + * }}); + * UE.getEditor('containerId'); //返回刚创建的实例 + * + */ + UE.getEditor = function (id, opt) { + var editor = instances[id]; + if (!editor) { + editor = instances[id] = new UE.ui.Editor(opt); + editor.render(id); + } + return editor; + }; + + + UE.delEditor = function (id) { + var editor; + if (editor = instances[id]) { + editor.key && editor.destroy(); + delete instances[id] + } + }; + + UE.registerUI = function(uiName,fn,index,editorId){ + utils.each(uiName.split(/\s+/), function (name) { + UE._customizeUI[name] = { + id : editorId, + execFn:fn, + index:index + }; + }) + + } + +})(); + +// adapter/message.js +UE.registerUI('message', function(editor) { + + var editorui = baidu.editor.ui; + var Message = editorui.Message; + var holder; + var _messageItems = []; + var me = editor; + + me.addListener('ready', function(){ + holder = document.getElementById(me.ui.id + '_message_holder'); + updateHolderPos(); + setTimeout(function(){ + updateHolderPos(); + }, 500); + }); + + me.addListener('showmessage', function(type, opt){ + opt = utils.isString(opt) ? { + 'content': opt + } : opt; + var message = new Message({ + 'timeout': opt.timeout, + 'type': opt.type, + 'content': opt.content, + 'keepshow': opt.keepshow, + 'editor': me + }), + mid = opt.id || ('msg_' + (+new Date()).toString(36)); + message.render(holder); + _messageItems[mid] = message; + message.reset(opt); + updateHolderPos(); + return mid; + }); + + me.addListener('updatemessage',function(type, id, opt){ + opt = utils.isString(opt) ? { + 'content': opt + } : opt; + var message = _messageItems[id]; + message.render(holder); + message && message.reset(opt); + }); + + me.addListener('hidemessage',function(type, id){ + var message = _messageItems[id]; + message && message.hide(); + }); + + function updateHolderPos(){ + var toolbarbox = me.ui.getDom('toolbarbox'); + if (toolbarbox) { + holder.style.top = toolbarbox.offsetHeight + 3 + 'px'; + } + holder.style.zIndex = Math.max(me.options.zIndex, me.iframe.style.zIndex) + 1; + } + +}); + + +// adapter/autosave.js +UE.registerUI('autosave', function(editor) { + var timer = null,uid = null; + editor.on('afterautosave',function(){ + clearTimeout(timer); + + timer = setTimeout(function(){ + if(uid){ + editor.trigger('hidemessage',uid); + } + uid = editor.trigger('showmessage',{ + content : editor.getLang('autosave.success'), + timeout : 2000 + }); + + },2000) + }) + +}); + + + +})(); diff --git a/src/main/webapp/js/ue/ueditor.all.min.js b/src/main/webapp/js/ue/ueditor.all.min.js new file mode 100644 index 0000000..b21a66c --- /dev/null +++ b/src/main/webapp/js/ue/ueditor.all.min.js @@ -0,0 +1,18 @@ +/*! + * UEditor + * version: ueditor + * build: Mon Jul 25 2016 13:58:39 GMT+0800 (中国标准时间) + */ + +!function(){function getListener(a,b,c){var d;return b=b.toLowerCase(),(d=a.__allListeners||c&&(a.__allListeners={}))&&(d[b]||c&&(d[b]=[]))}function getDomNode(a,b,c,d,e,f){var g,h=d&&a[b];for(!h&&(h=a[c]);!h&&(g=(g||a).parentNode);){if("BODY"==g.tagName||f&&!f(g))return null;h=g[c]}return h&&e&&!e(h)?getDomNode(h,b,c,!1,e):h}UEDITOR_CONFIG=window.UEDITOR_CONFIG||{};var baidu=window.baidu||{};window.baidu=baidu,window.UE=baidu.editor=window.UE||{},UE.plugins={},UE.commands={},UE.instants={},UE.I18N={},UE._customizeUI={},UE.version="1.4.3";var dom=UE.dom={},browser=UE.browser=function(){var a=navigator.userAgent.toLowerCase(),b=window.opera,c={ie:/(msie\s|trident.*rv:)([\w.]+)/.test(a),opera:!!b&&b.version,webkit:a.indexOf(" applewebkit/")>-1,mac:a.indexOf("macintosh")>-1,quirks:"BackCompat"==document.compatMode};c.gecko="Gecko"==navigator.product&&!c.webkit&&!c.opera&&!c.ie;var d=0;if(c.ie){var e=a.match(/(?:msie\s([\w.]+))/),f=a.match(/(?:trident.*rv:([\w.]+))/);d=e&&f&&e[1]&&f[1]?Math.max(1*e[1],1*f[1]):e&&e[1]?1*e[1]:f&&f[1]?1*f[1]:0,c.ie11Compat=11==document.documentMode,c.ie9Compat=9==document.documentMode,c.ie8=!!document.documentMode,c.ie8Compat=8==document.documentMode,c.ie7Compat=7==d&&!document.documentMode||7==document.documentMode,c.ie6Compat=d<7||c.quirks,c.ie9above=d>8,c.ie9below=d<9,c.ie11above=d>10,c.ie11below=d<11}if(c.gecko){var g=a.match(/rv:([\d\.]+)/);g&&(g=g[1].split("."),d=1e4*g[0]+100*(g[1]||0)+1*(g[2]||0))}return/chrome\/(\d+\.\d)/i.test(a)&&(c.chrome=+RegExp.$1),/(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(a)&&!/chrome/i.test(a)&&(c.safari=+(RegExp.$1||RegExp.$2)),c.opera&&(d=parseFloat(b.version())),c.webkit&&(d=parseFloat(a.match(/ applewebkit\/(\d+)/)[1])),c.version=d,c.isCompatible=!c.mobile&&(c.ie&&d>=6||c.gecko&&d>=10801||c.opera&&d>=9.5||c.air&&d>=1||c.webkit&&d>=522||!1),c}(),ie=browser.ie,webkit=browser.webkit,gecko=browser.gecko,opera=browser.opera,utils=UE.utils={each:function(a,b,c){if(null!=a)if(a.length===+a.length){for(var d=0,e=a.length;d=c&&a===b)return d=e,!1}),d},removeItem:function(a,b){for(var c=0,d=a.length;c'](?:(amp|lt|quot|gt|#39|nbsp|#\d+);)?/g,function(a,b){return b?a:{"<":"<","&":"&",'"':""",">":">","'":"'"}[a]}):""},unhtmlForUrl:function(a,b){return a?a.replace(b||/[<">']/g,function(a){return{"<":"<","&":"&",'"':""",">":">","'":"'"}[a]}):""},html:function(a){return a?a.replace(/&((g|l|quo)t|amp|#39|nbsp);/g,function(a){return{"<":"<","&":"&",""":'"',">":">","'":"'"," ":" "}[a]}):""},cssStyleToDomStyle:function(){var a=document.createElement("div").style,b={"float":void 0!=a.cssFloat?"cssFloat":void 0!=a.styleFloat?"styleFloat":"float"};return function(a){return b[a]||(b[a]=a.toLowerCase().replace(/-./g,function(a){return a.charAt(1).toUpperCase()}))}}(),loadFile:function(){function a(a,c){try{for(var d,e=0;d=b[e++];)if(d.doc===a&&d.url==(c.src||c.href))return d}catch(f){return null}}var b=[];return function(c,d,e){var f=a(c,d);if(f)return void(f.ready?e&&e():f.funs.push(e));if(b.push({doc:c,url:d.src||d.href,funs:[e]}),!c.body){var g=[];for(var h in d)"tag"!=h&&g.push(h+'="'+d[h]+'"');return void c.write("<"+d.tag+" "+g.join(" ")+" >")}if(!d.id||!c.getElementById(d.id)){var i=c.createElement(d.tag);delete d.tag;for(var h in d)i.setAttribute(h,d[h]);i.onload=i.onreadystatechange=function(){if(!this.readyState||/loaded|complete/.test(this.readyState)){if(f=a(c,d),f.funs.length>0){f.ready=1;for(var b;b=f.funs.pop();)b()}i.onload=i.onreadystatechange=null}},i.onerror=function(){throw Error("The load "+(d.href||d.src)+" fails,check the url settings of file ueditor.config.js ")},c.getElementsByTagName("head")[0].appendChild(i)}}}(),isEmptyObject:function(a){if(null==a)return!0;if(this.isArray(a)||this.isString(a))return 0===a.length;for(var b in a)if(a.hasOwnProperty(b))return!1;return!0},fixColor:function(a,b){if(/color/i.test(a)&&/rgba?/.test(b)){var c=b.split(",");if(c.length>3)return"";b="#";for(var d,e=0;d=c[e++];)d=parseInt(d.replace(/[^\d]/gi,""),10).toString(16),b+=1==d.length?"0"+d:d;b=b.toUpperCase()}return b},optCss:function(a){function b(a,b){if(!a)return"";var c=a.top,d=a.bottom,e=a.left,f=a.right,g="";if(c&&e&&d&&f)g+=";"+b+":"+(c==d&&d==e&&e==f?c:c==d&&e==f?c+" "+e:e==f?c+" "+e+" "+d:c+" "+f+" "+d+" "+e)+";";else for(var h in a)g+=";"+b+"-"+h+":"+a[h]+";";return g}var c,d;return a=a.replace(/(padding|margin|border)\-([^:]+):([^;]+);?/gi,function(a,b,e,f){if(1==f.split(" ").length)switch(b){case"padding":return!c&&(c={}),c[e]=f,"";case"margin":return!d&&(d={}),d[e]=f,"";case"border":return"initial"==f?"":a}return a}),a+=b(c,"padding")+b(d,"margin"),a.replace(/^[ \n\r\t;]*|[ \n\r\t]*$/,"").replace(/;([ \n\r\t]+)|\1;/g,";").replace(/(&((l|g)t|quot|#39))?;{2,}/g,function(a,b){return b?b+";;":";"})},clone:function(a,b){var c;b=b||{};for(var d in a)a.hasOwnProperty(d)&&(c=a[d],"object"==typeof c?(b[d]=utils.isArray(c)?[]:{},utils.clone(a[d],b[d])):b[d]=c);return b},transUnitToPx:function(a){if(!/(pt|cm)/.test(a))return a;var b;switch(a.replace(/([\d.]+)(\w+)/,function(c,d,e){a=d,b=e}),b){case"cm":a=25*parseFloat(a);break;case"pt":a=Math.round(96*parseFloat(a)/72)}return a+(a?"px":"")},domReady:function(){function a(a){a.isReady=!0;for(var c;c=b.pop();c());}var b=[];return function(c,d){d=d||window;var e=d.document;c&&b.push(c),"complete"===e.readyState?a(e):(e.isReady&&a(e),browser.ie&&11!=browser.version?(!function(){if(!e.isReady){try{e.documentElement.doScroll("left")}catch(b){return void setTimeout(arguments.callee,0)}a(e)}}(),d.attachEvent("onload",function(){a(e)})):(e.addEventListener("DOMContentLoaded",function(){e.removeEventListener("DOMContentLoaded",arguments.callee,!1),a(e)},!1),d.addEventListener("load",function(){a(e)},!1)))}}(),cssRule:browser.ie&&11!=browser.version?function(a,b,c){var d,e;if(void 0===b||b&&b.nodeType&&9==b.nodeType){if(c=b&&b.nodeType&&9==b.nodeType?b:c||document,d=c.indexList||(c.indexList={}),e=d[a],void 0!==e)return c.styleSheets[e].cssText}else{if(c=c||document,d=c.indexList||(c.indexList={}),e=d[a],""===b)return void 0!==e&&(c.styleSheets[e].cssText="",delete d[a],!0);void 0!==e?sheetStyle=c.styleSheets[e]:(sheetStyle=c.createStyleSheet("",e=c.styleSheets.length),d[a]=e),sheetStyle.cssText=b}}:function(a,b,c){var d;return void 0===b||b&&b.nodeType&&9==b.nodeType?(c=b&&b.nodeType&&9==b.nodeType?b:c||document,d=c.getElementById(a),d?d.innerHTML:void 0):(c=c||document,d=c.getElementById(a),""===b?!!d&&(d.parentNode.removeChild(d),!0):void(d?d.innerHTML=b:(d=c.createElement("style"),d.id=a,d.innerHTML=b,c.getElementsByTagName("head")[0].appendChild(d))))},sort:function(a,b){b=b||function(a,b){return a.localeCompare(b)};for(var c=0,d=a.length;c0){var g=a[c];a[c]=a[e],a[e]=g}return a},serializeParam:function(a){var b=[];for(var c in a)if("method"!=c&&"timeout"!=c&&"async"!=c)if("function"!=(typeof a[c]).toLowerCase()&&"object"!=(typeof a[c]).toLowerCase())b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));else if(utils.isArray(a[c]))for(var d=0;d1||b!==a.parentNode){a.style.cssText=b.style.cssText+";"+a.style.cssText,b=b.parentNode;continue}b.style.cssText+=";"+a.style.cssText,"A"==b.tagName&&(b.style.textDecoration="underline")}if("A"!=b.tagName){b===a.parentNode&&domUtils.remove(a,!0);break}}b=b.parentNode}},mergeSibling:function(a,b,c){function d(a,b,c){var d;if((d=c[a])&&!domUtils.isBookmarkNode(d)&&1==d.nodeType&&domUtils.isSameElement(c,d)){for(;d.firstChild;)"firstChild"==b?c.insertBefore(d.lastChild,c.firstChild):c.appendChild(d.firstChild);domUtils.remove(d)}}!b&&d("previousSibling","firstChild",a),!c&&d("nextSibling","lastChild",a)},unSelectable:ie&&browser.ie9below||browser.opera?function(a){a.onselectstart=function(){return!1},a.onclick=a.onkeyup=a.onkeydown=function(){return!1},a.unselectable="on",a.setAttribute("unselectable","on");for(var b,c=0;b=a.all[c++];)switch(b.tagName.toLowerCase()){case"iframe":case"textarea":case"input":case"select":break;default:b.unselectable="on",a.setAttribute("unselectable","on")}}:function(a){a.style.MozUserSelect=a.style.webkitUserSelect=a.style.msUserSelect=a.style.KhtmlUserSelect="none"},removeAttributes:function(a,b){b=utils.isArray(b)?b:utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0;c=b[d++];){switch(c=attrFix[c]||c){case"className":a[c]="";break;case"style":a.style.cssText="";var e=a.getAttributeNode("style");!browser.ie&&e&&a.removeAttributeNode(e)}a.removeAttribute(c)}},createElement:function(a,b,c){return domUtils.setAttributes(a.createElement(b),c)},setAttributes:function(a,b){for(var c in b)if(b.hasOwnProperty(c)){var d=b[c];switch(c){case"class":a.className=d;break;case"style":a.style.cssText=a.style.cssText+";"+d;break;case"innerHTML":a[c]=d;break;case"value":a.value=d;break;default:a.setAttribute(attrFix[c]||c,d)}}return a},getComputedStyle:function(a,b){var c="width height top left";if(c.indexOf(b)>-1)return a["offset"+b.replace(/^\w/,function(a){return a.toUpperCase()})]+"px";if(3==a.nodeType&&(a=a.parentNode),browser.ie&&browser.version<9&&"font-size"==b&&!a.style.fontSize&&!dtd.$empty[a.tagName]&&!dtd.$nonChild[a.tagName]){var d=a.ownerDocument.createElement("span");d.style.cssText="padding:0;border:0;font-family:simsun;",d.innerHTML=".",a.appendChild(d);var e=d.offsetHeight;return a.removeChild(d),d=null,e+"px"}try{var f=domUtils.getStyle(a,b)||(window.getComputedStyle?domUtils.getWindow(a).getComputedStyle(a,"").getPropertyValue(b):(a.currentStyle||a.style)[utils.cssStyleToDomStyle(b)])}catch(g){return""}return utils.transUnitToPx(utils.fixColor(b,f))},removeClasses:function(a,b){b=utils.isArray(b)?b:utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)e=e.replace(new RegExp("\\b"+c+"\\b"),"");e=utils.trim(e).replace(/[ ]{2,}/g," "),e?a.className=e:domUtils.removeAttributes(a,["class"])},addClass:function(a,b){if(a){b=utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)new RegExp("\\b"+c+"\\b").test(e)||(e+=" "+c);a.className=utils.trim(e)}},hasClass:function(a,b){if(utils.isRegExp(b))return b.test(a.className);b=utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)if(!new RegExp("\\b"+c+"\\b","i").test(e))return!1;return d-1==b.length},preventDefault:function(a){a.preventDefault?a.preventDefault():a.returnValue=!1},removeStyle:function(a,b){browser.ie?("color"==b&&(b="(^|;)"+b),a.style.cssText=a.style.cssText.replace(new RegExp(b+"[^:]*:[^;]+;?","ig"),"")):a.style.removeProperty?a.style.removeProperty(b):a.style.removeAttribute(utils.cssStyleToDomStyle(b)),a.style.cssText||domUtils.removeAttributes(a,["style"])},getStyle:function(a,b){var c=a.style[utils.cssStyleToDomStyle(b)];return utils.fixColor(b,c)},setStyle:function(a,b,c){a.style[utils.cssStyleToDomStyle(b)]=c,utils.trim(a.style.cssText)||this.removeAttributes(a,"style")},setStyles:function(a,b){for(var c in b)b.hasOwnProperty(c)&&domUtils.setStyle(a,c,b[c])},removeDirtyAttr:function(a){for(var b,c=0,d=a.getElementsByTagName("*");b=d[c++];)b.removeAttribute("_moz_dirty");a.removeAttribute("_moz_dirty")},getChildCount:function(a,b){var c=0,d=a.firstChild;for(b=b||function(){return 1};d;)b(d)&&c++,d=d.nextSibling;return c},isEmptyNode:function(a){return!a.firstChild||0==domUtils.getChildCount(a,function(a){return!domUtils.isBr(a)&&!domUtils.isBookmarkNode(a)&&!domUtils.isWhitespace(a)})},clearSelectedArr:function(a){for(var b;b=a.pop();)domUtils.removeAttributes(b,["class"])},scrollToView:function(a,b,c){var d=function(){var a=b.document,c="CSS1Compat"==a.compatMode;return{width:(c?a.documentElement.clientWidth:a.body.clientWidth)||0,height:(c?a.documentElement.clientHeight:a.body.clientHeight)||0}},e=function(a){if("pageXOffset"in a)return{x:a.pageXOffset||0,y:a.pageYOffset||0};var b=a.document;return{x:b.documentElement.scrollLeft||b.body.scrollLeft||0,y:b.documentElement.scrollTop||b.body.scrollTop||0}},f=d().height,g=f*-1+c;g+=a.offsetHeight||0;var h=domUtils.getXY(a);g+=h.y;var i=e(b).y;(g>i||g0)return 0;for(var c in dtd.$isNotEmpty)if(a.getElementsByTagName(c).length)return 0;return 1},setViewportOffset:function(a,b){var c=0|parseInt(a.style.left),d=0|parseInt(a.style.top),e=a.getBoundingClientRect(),f=b.left-e.left,g=b.top-e.top;f&&(a.style.left=c+f+"px"),g&&(a.style.top=d+g+"px")},fillNode:function(a,b){var c=browser.ie?a.createTextNode(domUtils.fillChar):a.createElement("br");b.innerHTML="",b.appendChild(c)},moveChild:function(a,b,c){for(;a.firstChild;)c&&b.firstChild?b.insertBefore(a.lastChild,b.firstChild):b.appendChild(a.firstChild)},hasNoAttributes:function(a){return browser.ie?/^<\w+\s*?>/.test(a.outerHTML):0==a.attributes.length},isCustomeNode:function(a){return 1==a.nodeType&&a.getAttribute("_ue_custom_node_")},isTagNode:function(a,b){return 1==a.nodeType&&new RegExp("\\b"+a.tagName+"\\b","i").test(b)},filterNodeList:function(a,b,c){var d=[];if(!utils.isFunction(b)){var e=b;b=function(a){return utils.indexOf(utils.isArray(e)?e:e.split(" "),a.tagName.toLowerCase())!=-1}}return utils.each(a,function(a){b(a)&&d.push(a)}),0==d.length?null:1!=d.length&&c?d:d[0]},isInNodeEndBoundary:function(a,b){var c=a.startContainer;if(3==c.nodeType&&a.startOffset!=c.nodeValue.length)return 0;if(1==c.nodeType&&a.startOffset!=c.childNodes.length)return 0;for(;c!==b;){if(c.nextSibling)return 0;c=c.parentNode}return 1},isBoundaryNode:function(a,b){for(var c;!domUtils.isBody(a);)if(c=a,a=a.parentNode,c!==a[b])return!1;return!0},fillHtml:browser.ie11below?" ":"
    "},fillCharReg=new RegExp(domUtils.fillChar,"g");!function(){function a(a){a.collapsed=a.startContainer&&a.endContainer&&a.startContainer===a.endContainer&&a.startOffset==a.endOffset}function b(a){return!a.collapsed&&1==a.startContainer.nodeType&&a.startContainer===a.endContainer&&a.endOffset-a.startOffset==1}function c(b,c,d,e){return 1==c.nodeType&&(dtd.$empty[c.tagName]||dtd.$nonChild[c.tagName])&&(d=domUtils.getNodeIndex(c)+(b?0:1),c=c.parentNode),b?(e.startContainer=c,e.startOffset=d,e.endContainer||e.collapse(!0)):(e.endContainer=c,e.endOffset=d,e.startContainer||e.collapse(!1)),a(e),e}function d(a,b){var c,d,e=a.startContainer,f=a.endContainer,g=a.startOffset,h=a.endOffset,i=a.document,j=i.createDocumentFragment();if(1==e.nodeType&&(e=e.childNodes[g]||(c=e.appendChild(i.createTextNode("")))),1==f.nodeType&&(f=f.childNodes[h]||(d=f.appendChild(i.createTextNode("")))),e===f&&3==e.nodeType)return j.appendChild(i.createTextNode(e.substringData(g,h-g))),b&&(e.deleteData(g,h-g),a.collapse(!0)),j;for(var k,l,m=j,n=domUtils.findParents(e,!0),o=domUtils.findParents(f,!0),p=0;n[p]==o[p];)p++;for(var q,r=p;q=n[r];r++){for(k=q.nextSibling,q==e?c||(3==a.startContainer.nodeType?(m.appendChild(i.createTextNode(e.nodeValue.slice(g))),b&&e.deleteData(g,e.nodeValue.length-g)):m.appendChild(b?e:e.cloneNode(!0))):(l=q.cloneNode(!1),m.appendChild(l));k&&k!==f&&k!==o[r];)q=k.nextSibling,m.appendChild(b?k:k.cloneNode(!0)),k=q;m=l}m=j,n[p]||(m.appendChild(n[p-1].cloneNode(!1)),m=m.firstChild);for(var s,r=p;s=o[r];r++){if(k=s.previousSibling,s==f?d||3!=a.endContainer.nodeType||(m.appendChild(i.createTextNode(f.substringData(0,h))),b&&f.deleteData(0,h)):(l=s.cloneNode(!1),m.appendChild(l)),r!=p||!n[p])for(;k&&k!==e;)s=k.previousSibling,m.insertBefore(b?k:k.cloneNode(!0),m.firstChild),k=s;m=l}return b&&a.setStartBefore(o[p]?n[p]?o[p]:n[p-1]:o[p-1]).collapse(!0),c&&domUtils.remove(c),d&&domUtils.remove(d),j}function e(a,b){try{if(g&&domUtils.inDoc(g,a))if(g.nodeValue.replace(fillCharReg,"").length)g.nodeValue=g.nodeValue.replace(fillCharReg,"");else{var c=g.parentNode;for(domUtils.remove(g);c&&domUtils.isEmptyInlineElement(c)&&(browser.safari?!(domUtils.getPosition(c,b)&domUtils.POSITION_CONTAINS):!c.contains(b));)g=c.parentNode,domUtils.remove(c),c=g}}catch(d){} +}function f(a,b){var c;for(a=a[b];a&&domUtils.isFillChar(a);)c=a[b],domUtils.remove(a),a=c}var g,h=0,i=domUtils.fillChar,j=dom.Range=function(a){var b=this;b.startContainer=b.startOffset=b.endContainer=b.endOffset=null,b.document=a,b.collapsed=!0};j.prototype={cloneContents:function(){return this.collapsed?null:d(this,0)},deleteContents:function(){var a;return this.collapsed||d(this,1),browser.webkit&&(a=this.startContainer,3!=a.nodeType||a.nodeValue.length||(this.setStartBefore(a).collapse(!0),domUtils.remove(a))),this},extractContents:function(){return this.collapsed?null:d(this,2)},setStart:function(a,b){return c(!0,a,b,this)},setEnd:function(a,b){return c(!1,a,b,this)},setStartAfter:function(a){return this.setStart(a.parentNode,domUtils.getNodeIndex(a)+1)},setStartBefore:function(a){return this.setStart(a.parentNode,domUtils.getNodeIndex(a))},setEndAfter:function(a){return this.setEnd(a.parentNode,domUtils.getNodeIndex(a)+1)},setEndBefore:function(a){return this.setEnd(a.parentNode,domUtils.getNodeIndex(a))},setStartAtFirst:function(a){return this.setStart(a,0)},setStartAtLast:function(a){return this.setStart(a,3==a.nodeType?a.nodeValue.length:a.childNodes.length)},setEndAtFirst:function(a){return this.setEnd(a,0)},setEndAtLast:function(a){return this.setEnd(a,3==a.nodeType?a.nodeValue.length:a.childNodes.length)},selectNode:function(a){return this.setStartBefore(a).setEndAfter(a)},selectNodeContents:function(a){return this.setStart(a,0).setEndAtLast(a)},cloneRange:function(){var a=this;return new j(a.document).setStart(a.startContainer,a.startOffset).setEnd(a.endContainer,a.endOffset)},collapse:function(a){var b=this;return a?(b.endContainer=b.startContainer,b.endOffset=b.startOffset):(b.startContainer=b.endContainer,b.startOffset=b.endOffset),b.collapsed=!0,b},shrinkBoundary:function(a){function b(a){return 1==a.nodeType&&!domUtils.isBookmarkNode(a)&&!dtd.$empty[a.tagName]&&!dtd.$nonChild[a.tagName]}for(var c,d=this,e=d.collapsed;1==d.startContainer.nodeType&&(c=d.startContainer.childNodes[d.startOffset])&&b(c);)d.setStart(c,0);if(e)return d.collapse(!0);if(!a)for(;1==d.endContainer.nodeType&&d.endOffset>0&&(c=d.endContainer.childNodes[d.endOffset-1])&&b(c);)d.setEnd(c,c.childNodes.length);return d},getCommonAncestor:function(a,c){var d=this,e=d.startContainer,f=d.endContainer;return e===f?a&&b(this)&&(e=e.childNodes[d.startOffset],1==e.nodeType)?e:c&&3==e.nodeType?e.parentNode:e:domUtils.getCommonAncestor(e,f)},trimBoundary:function(a){this.txtToElmBoundary();var b=this.startContainer,c=this.startOffset,d=this.collapsed,e=this.endContainer;if(3==b.nodeType){if(0==c)this.setStartBefore(b);else if(c>=b.nodeValue.length)this.setStartAfter(b);else{var f=domUtils.split(b,c);b===e?this.setEnd(f,this.endOffset-c):b.parentNode===e&&(this.endOffset+=1),this.setStartBefore(f)}if(d)return this.collapse(!0)}return a||(c=this.endOffset,e=this.endContainer,3==e.nodeType&&(0==c?this.setEndBefore(e):(c=c.nodeValue.length&&a["set"+b.replace(/(\w)/,function(a){return a.toUpperCase()})+"After"](c):a["set"+b.replace(/(\w)/,function(a){return a.toUpperCase()})+"Before"](c))}return!a&&this.collapsed||(b(this,"start"),b(this,"end")),this},insertNode:function(a){var b=a,c=1;11==a.nodeType&&(b=a.firstChild,c=a.childNodes.length),this.trimBoundary(!0);var d=this.startContainer,e=this.startOffset,f=d.childNodes[e];return f?d.insertBefore(a,f):d.appendChild(a),b.parentNode===this.endContainer&&(this.endOffset=this.endOffset+c),this.setStartBefore(b)},setCursor:function(a,b){return this.collapse(!a).select(b)},createBookmark:function(a,b){var c,d=this.document.createElement("span");return d.style.cssText="display:none;line-height:0px;",d.appendChild(this.document.createTextNode("‍")),d.id="_baidu_bookmark_start_"+(b?"":h++),this.collapsed||(c=d.cloneNode(!0),c.id="_baidu_bookmark_end_"+(b?"":h++)),this.insertNode(d),c&&this.collapse().insertNode(c).setEndBefore(c),this.setStartAfter(d),{start:a?d.id:d,end:c?a?c.id:c:null,id:a}},moveToBookmark:function(a){var b=a.id?this.document.getElementById(a.start):a.start,c=a.end&&a.id?this.document.getElementById(a.end):a.end;return this.setStartBefore(b),domUtils.remove(b),c?(this.setEndBefore(c),domUtils.remove(c)):this.collapse(!0),this},enlarge:function(a,b){var c,d,e=domUtils.isBody,f=this.document.createTextNode("");if(a){for(d=this.startContainer,1==d.nodeType?d.childNodes[this.startOffset]?c=d=d.childNodes[this.startOffset]:(d.appendChild(f),c=d=f):c=d;;){if(domUtils.isBlockElm(d)){for(d=c;(c=d.previousSibling)&&!domUtils.isBlockElm(c);)d=c;this.setStartBefore(d);break}c=d,d=d.parentNode}for(d=this.endContainer,1==d.nodeType?((c=d.childNodes[this.endOffset])?d.insertBefore(f,c):d.appendChild(f),c=d=f):c=d;;){if(domUtils.isBlockElm(d)){for(d=c;(c=d.nextSibling)&&!domUtils.isBlockElm(c);)d=c;this.setEndAfter(d);break}c=d,d=d.parentNode}f.parentNode===this.endContainer&&this.endOffset--,domUtils.remove(f)}if(!this.collapsed){for(;!(0!=this.startOffset||b&&b(this.startContainer)||e(this.startContainer));)this.setStartBefore(this.startContainer);for(;!(this.endOffset!=(1==this.endContainer.nodeType?this.endContainer.childNodes.length:this.endContainer.nodeValue.length)||b&&b(this.endContainer)||e(this.endContainer));)this.setEndAfter(this.endContainer)}return this},enlargeToBlockElm:function(a){for(;!domUtils.isBlockElm(this.startContainer);)this.setStartBefore(this.startContainer);if(!a)for(;!domUtils.isBlockElm(this.endContainer);)this.setEndAfter(this.endContainer);return this},adjustmentBoundary:function(){if(!this.collapsed){for(;!domUtils.isBody(this.startContainer)&&this.startOffset==this.startContainer[3==this.startContainer.nodeType?"nodeValue":"childNodes"].length&&this.startContainer[3==this.startContainer.nodeType?"nodeValue":"childNodes"].length;)this.setStartAfter(this.startContainer);for(;!domUtils.isBody(this.endContainer)&&!this.endOffset&&this.endContainer[3==this.endContainer.nodeType?"nodeValue":"childNodes"].length;)this.setEndBefore(this.endContainer)}return this},applyInlineStyle:function(a,b,c){if(this.collapsed)return this;this.trimBoundary().enlarge(!1,function(a){return 1==a.nodeType&&domUtils.isBlockElm(a)}).adjustmentBoundary();for(var d,e,f=this.createBookmark(),g=f.end,h=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase():!domUtils.isWhitespace(a)},i=domUtils.getNextDomNode(f.start,!1,h),j=this.cloneRange();i&&domUtils.getPosition(i,g)&domUtils.POSITION_PRECEDING;)if(3==i.nodeType||dtd[a][i.tagName]){for(j.setStartBefore(i),d=i;d&&(3==d.nodeType||dtd[a][d.tagName])&&d!==g;)e=d,d=domUtils.getNextDomNode(d,1==d.nodeType,null,function(b){return dtd[a][b.tagName]});var k,l=j.setEndAfter(e).extractContents();if(c&&c.length>0){var m,n;n=m=c[0].cloneNode(!1);for(var o,p=1;o=c[p++];)m.appendChild(o.cloneNode(!1)),m=m.firstChild;k=m}else k=j.document.createElement(a);b&&domUtils.setAttributes(k,b),k.appendChild(l),j.insertNode(c?n:k);var q;if("span"==a&&b.style&&/text\-decoration/.test(b.style)&&(q=domUtils.findParentByTagName(k,"a",!0))?(domUtils.setAttributes(q,b),domUtils.remove(k,!0),k=q):(domUtils.mergeSibling(k),domUtils.clearEmptySibling(k)),domUtils.mergeChild(k,b),i=domUtils.getNextDomNode(k,!1,h),domUtils.mergeToParent(k),d===g)break}else i=domUtils.getNextDomNode(i,!0,h);return this.moveToBookmark(f)},removeInlineStyle:function(a){if(this.collapsed)return this;a=utils.isArray(a)?a:[a],this.shrinkBoundary().adjustmentBoundary();for(var b=this.startContainer,c=this.endContainer;;){if(1==b.nodeType){if(utils.indexOf(a,b.tagName.toLowerCase())>-1)break;if("body"==b.tagName.toLowerCase()){b=null;break}}b=b.parentNode}for(;;){if(1==c.nodeType){if(utils.indexOf(a,c.tagName.toLowerCase())>-1)break;if("body"==c.tagName.toLowerCase()){c=null;break}}c=c.parentNode}var d,e,f=this.createBookmark();b&&(e=this.cloneRange().setEndBefore(f.start).setStartBefore(b),d=e.extractContents(),e.insertNode(d),domUtils.clearEmptySibling(b,!0),b.parentNode.insertBefore(f.start,b)),c&&(e=this.cloneRange().setStartAfter(f.end).setEndAfter(c),d=e.extractContents(),e.insertNode(d),domUtils.clearEmptySibling(c,!1,!0),c.parentNode.insertBefore(f.end,c.nextSibling));for(var g,h=domUtils.getNextDomNode(f.start,!1,function(a){return 1==a.nodeType});h&&h!==f.end;)g=domUtils.getNextDomNode(h,!0,function(a){return 1==a.nodeType}),utils.indexOf(a,h.tagName.toLowerCase())>-1&&domUtils.remove(h,!0),h=g;return this.moveToBookmark(f)},getClosedNode:function(){var a;if(!this.collapsed){var c=this.cloneRange().adjustmentBoundary().shrinkBoundary();if(b(c)){var d=c.startContainer.childNodes[c.startOffset];d&&1==d.nodeType&&(dtd.$empty[d.tagName]||dtd.$nonChild[d.tagName])&&(a=d)}}return a},select:browser.ie?function(a,b){var c;this.collapsed||this.shrinkBoundary();var d=this.getClosedNode();if(d&&!b){try{c=this.document.body.createControlRange(),c.addElement(d),c.select()}catch(h){}return this}var j,k=this.createBookmark(),l=k.start;if(c=this.document.body.createTextRange(),c.moveToElementText(l),c.moveStart("character",1),this.collapsed){if(!a&&3!=this.startContainer.nodeType){var m=this.document.createTextNode(i),n=this.document.createElement("span");n.appendChild(this.document.createTextNode(i)),l.parentNode.insertBefore(n,l),l.parentNode.insertBefore(m,l),e(this.document,m),g=m,f(n,"previousSibling"),f(l,"nextSibling"),c.moveStart("character",-1),c.collapse(!0)}}else{var o=this.document.body.createTextRange();j=k.end,o.moveToElementText(j),c.setEndPoint("EndToEnd",o)}this.moveToBookmark(k),n&&domUtils.remove(n);try{c.select()}catch(h){}return this}:function(a){function b(a){function b(b,c,d){3==b.nodeType&&b.nodeValue.length0)j=k-1;else{if(!(l<0))return{container:d,offset:c(e)};i=k+1}}if(k==-1){if(h.moveToElementText(d),h.setEndPoint("StartToStart",a),f=h.text.replace(/(\r\n|\r)/g,"\n").length,g=d.childNodes,!f)return e=g[g.length-1],{container:e,offset:e.nodeValue.length};for(var m=g.length;f>0;)f-=g[--m].nodeValue.length;return{container:g[m],offset:-f}}if(h.collapse(l>0),h.setEndPoint(l>0?"StartToStart":"EndToStart",a),f=h.text.replace(/(\r\n|\r)/g,"\n").length,!f)return dtd.$empty[e.tagName]||dtd.$nonChild[e.tagName]?{container:d,offset:c(e)+(l>0?0:1)}:{container:e,offset:l>0?0:e.childNodes.length};for(;f>0;)try{var n=e;e=e[l>0?"previousSibling":"nextSibling"],f-=e.nodeValue.length}catch(o){return{container:d,offset:c(n)}}return{container:e,offset:l>0?-f:e.nodeValue.length+f}}function b(b,c){if(b.item)c.selectNode(b.item(0));else{var d=a(b,!0);c.setStart(d.container,d.offset),0!=b.compareEndPoints("StartToEnd",b)&&(d=a(b,!1),c.setEnd(d.container,d.offset))}return c}function c(a){var b;try{b=a.getNative().createRange()}catch(c){return null}var d=b.item?b.item(0):b.parentElement();return(d.ownerDocument||d)===a.document?b:null}var d=dom.Selection=function(a){var b,d=this;d.document=a,browser.ie9below&&(b=domUtils.getWindow(a).frameElement,domUtils.on(b,"beforedeactivate",function(){d._bakIERange=d.getIERange()}),domUtils.on(b,"activate",function(){try{!c(d)&&d._bakIERange&&d._bakIERange.select()}catch(a){}d._bakIERange=null})),b=a=null};d.prototype={rangeInBody:function(a,b){var c=browser.ie9below||b?a.item?a.item():a.parentElement():a.startContainer;return c===this.document.body||domUtils.inDoc(c,this.document)},getNative:function(){var a=this.document;try{return a?browser.ie9below?a.selection:domUtils.getWindow(a).getSelection():null}catch(b){return null}},getIERange:function(){var a=c(this);return!a&&this._bakIERange?this._bakIERange:a},cache:function(){this.clear(),this._cachedRange=this.getRange(),this._cachedStartElement=this.getStart(),this._cachedStartElementPath=this.getStartElementPath()},getStartElementPath:function(){if(this._cachedStartElementPath)return this._cachedStartElementPath;var a=this.getStart();return a?domUtils.findParents(a,!0,null,!0):[]},clear:function(){this._cachedStartElementPath=this._cachedRange=this._cachedStartElement=null},isFocus:function(){try{if(browser.ie9below){var a=c(this);return!(!a||!this.rangeInBody(a))}return!!this.getNative().rangeCount}catch(b){return!1}},getRange:function(){function a(a){for(var b=c.document.body.firstChild,d=a.collapsed;b&&b.firstChild;)a.setStart(b,0),b=b.firstChild;a.startContainer||a.setStart(c.document.body,0),d&&a.collapse(!0)}var c=this;if(null!=c._cachedRange)return this._cachedRange;var d=new baidu.editor.dom.Range(c.document);if(browser.ie9below){var e=c.getIERange();if(e)try{b(e,d)}catch(f){a(d)}else a(d)}else{var g=c.getNative();if(g&&g.rangeCount){var h=g.getRangeAt(0),i=g.getRangeAt(g.rangeCount-1);d.setStart(h.startContainer,h.startOffset).setEnd(i.endContainer,i.endOffset),d.collapsed&&domUtils.isBody(d.startContainer)&&!d.startOffset&&a(d)}else{if(this._bakRange&&domUtils.inDoc(this._bakRange.startContainer,this.document))return this._bakRange;a(d)}}return this._bakRange=d},getStart:function(){if(this._cachedStartElement)return this._cachedStartElement;var a,b,c,d,e=browser.ie9below?this.getIERange():this.getRange();if(browser.ie9below){if(!e)return this.document.body.firstChild;if(e.item)return e.item(0);for(a=e.duplicate(),a.text.length>0&&a.moveStart("character",1),a.collapse(1),b=a.parentElement(),d=c=e.parentElement();c=c.parentNode;)if(c==b){b=d;break}}else if(e.shrinkBoundary(),b=e.startContainer,1==b.nodeType&&b.hasChildNodes()&&(b=b.childNodes[Math.min(b.childNodes.length-1,e.startOffset)]),3==b.nodeType)return b.parentNode;return b},getText:function(){var a,b;return this.isFocus()&&(a=this.getNative())?(b=browser.ie9below?a.createRange():a.getRangeAt(0),browser.ie9below?b.text:b.toString()):""},clearRange:function(){this.getNative()[browser.ie9below?"empty":"removeAllRanges"]()}}}(),function(){function a(a,b){var c;if(b.textarea)if(utils.isString(b.textarea)){for(var d,e=0,f=domUtils.getElementsByTagName(a,"textarea");d=f[e++];)if(d.id=="ueditor_textarea_"+b.options.textarea){c=d;break}}else c=b.textarea;c||(a.appendChild(c=domUtils.createElement(document,"textarea",{name:b.options.textarea,id:"ueditor_textarea_"+b.options.textarea,style:"display:none"})),b.textarea=c),!c.getAttribute("name")&&c.setAttribute("name",b.options.textarea),c.value=b.hasContents()?b.options.allHtmlEnabled?b.getAllHtml():b.getContent(null,null,!0):""}function b(a){for(var b in a)return b}function c(a){a.langIsReady=!0,a.fireEvent("langReady")}var d,e=0,f=UE.Editor=function(a){var d=this;d.uid=e++,EventBase.call(d),d.commands={},d.options=utils.extend(utils.clone(a||{}),UEDITOR_CONFIG,!0),d.shortcutkeys={},d.inputRules=[],d.outputRules=[],d.setOpt(f.defaultOptions(d)),d.loadServerConfig(),utils.isEmptyObject(UE.I18N)?utils.loadFile(document,{src:d.options.langPath+d.options.lang+"/"+d.options.lang+".js",tag:"script",type:"text/javascript",defer:"defer"},function(){UE.plugin.load(d),c(d)}):(d.options.lang=b(UE.I18N),UE.plugin.load(d),c(d)),UE.instants["ueditorInstant"+d.uid]=d};f.prototype={registerCommand:function(a,b){this.commands[a]=b},ready:function(a){var b=this;a&&(b.isReady?a.apply(b):b.addListener("ready",a))},setOpt:function(a,b){var c={};utils.isString(a)?c[a]=b:c=a,utils.extend(this.options,c,!0)},getOpt:function(a){return this.options[a]},destroy:function(){var a=this;a.fireEvent("destroy");var b=a.container.parentNode,c=a.textarea;c?c.style.display="":(c=document.createElement("textarea"),b.parentNode.insertBefore(c,b)),c.style.width=a.iframe.offsetWidth+"px",c.style.height=a.iframe.offsetHeight+"px",c.value=a.getContent(),c.id=a.key,b.innerHTML="",domUtils.remove(b);var d=a.key;for(var e in a)a.hasOwnProperty(e)&&delete this[e];UE.delEditor(d)},render:function(a){var b=this,c=b.options,d=function(b){return parseInt(domUtils.getComputedStyle(a,b))};if(utils.isString(a)&&(a=document.getElementById(a)),a){c.initialFrameWidth?c.minFrameWidth=c.initialFrameWidth:c.minFrameWidth=c.initialFrameWidth=a.offsetWidth,c.initialFrameHeight?c.minFrameHeight=c.initialFrameHeight:c.initialFrameHeight=c.minFrameHeight=a.offsetHeight,a.style.width=/%$/.test(c.initialFrameWidth)?"100%":c.initialFrameWidth-d("padding-left")-d("padding-right")+"px",a.style.height=/%$/.test(c.initialFrameHeight)?"100%":c.initialFrameHeight-d("padding-top")-d("padding-bottom")+"px",a.style.zIndex=c.zIndex;var e=(ie&&browser.version<9?"":"")+""+(c.iframeCssUrl?"":"")+(c.initialStyle?"":"")+"";a.appendChild(domUtils.createElement(document,"iframe",{id:"ueditor_"+b.uid,width:"100%",height:"100%",frameborder:"0",src:"javascript:void(function(){document.open();"+(c.customDomain&&document.domain!=location.hostname?'document.domain="'+document.domain+'";':"")+'document.write("'+e+'");document.close();}())'})),a.style.overflow="hidden",setTimeout(function(){/%$/.test(c.initialFrameWidth)&&(c.minFrameWidth=c.initialFrameWidth=a.offsetWidth),/%$/.test(c.initialFrameHeight)&&(c.minFrameHeight=c.initialFrameHeight=a.offsetHeight,a.style.height=c.initialFrameHeight+"px")})}},_setup:function(b){var c=this,d=c.options;ie?(b.body.disabled=!0,b.body.contentEditable=!0,b.body.disabled=!1):b.body.contentEditable=!0,b.body.spellcheck=!1,c.document=b,c.window=b.defaultView||b.parentWindow,c.iframe=c.window.frameElement,c.body=b.body,c.selection=new dom.Selection(b);var e;browser.gecko&&(e=this.selection.getNative())&&e.removeAllRanges(),this._initEvents();for(var f=this.iframe.parentNode;!domUtils.isBody(f);f=f.parentNode)if("FORM"==f.tagName){c.form=f,c.options.autoSyncData?domUtils.on(c.window,"blur",function(){a(f,c)}):domUtils.on(f,"submit",function(){a(this,c)});break}if(d.initialContent)if(d.autoClearinitialContent){var g=c.execCommand;c.execCommand=function(){return c.fireEvent("firstBeforeExecCommand"),g.apply(c,arguments)},this._setDefaultContent(d.initialContent)}else this.setContent(d.initialContent,!1,!0);domUtils.isEmptyNode(c.body)&&(c.body.innerHTML="

    "+(browser.ie?"":"
    ")+"

    "),d.focus&&setTimeout(function(){c.focus(c.options.focusInEnd),!c.options.autoClearinitialContent&&c._selectionChange()},0),c.container||(c.container=this.iframe.parentNode),d.fullscreen&&c.ui&&c.ui.setFullScreen(!0);try{c.document.execCommand("2D-position",!1,!1)}catch(h){}try{c.document.execCommand("enableInlineTableEditing",!1,!1)}catch(h){}try{c.document.execCommand("enableObjectResizing",!1,!1)}catch(h){}c._bindshortcutKeys(),c.isReady=1,c.fireEvent("ready"),d.onready&&d.onready.call(c),browser.ie9below||domUtils.on(c.window,["blur","focus"],function(a){if("blur"==a.type){c._bakRange=c.selection.getRange();try{c._bakNativeRange=c.selection.getNative().getRangeAt(0),c.selection.getNative().removeAllRanges()}catch(a){c._bakNativeRange=null}}else try{c._bakRange&&c._bakRange.select()}catch(a){}}),browser.gecko&&browser.version<=10902&&(c.body.contentEditable=!1,setTimeout(function(){c.body.contentEditable=!0},100),setInterval(function(){c.body.style.height=c.iframe.offsetHeight-20+"px"},100)),!d.isShow&&c.setHide(),d.readonly&&c.setDisabled()},sync:function(b){var c=this,d=b?document.getElementById(b):domUtils.findParent(c.iframe.parentNode,function(a){return"FORM"==a.tagName},!0);d&&a(d,c)},setHeight:function(a,b){a!==parseInt(this.iframe.parentNode.style.height)&&(this.iframe.parentNode.style.height=a+"px"),!b&&(this.options.minFrameHeight=this.options.initialFrameHeight=a),this.body.style.height=a+"px",!b&&this.trigger("setHeight")},addshortcutkey:function(a,b){var c={};b?c[a]=b:c=a,utils.extend(this.shortcutkeys,c)},_bindshortcutKeys:function(){var a=this,b=this.shortcutkeys;a.addListener("keydown",function(c,d){var e=d.keyCode||d.which;for(var f in b)for(var g,h=b[f].split(","),i=0;g=h[i++];){g=g.split(":");var j=g[0],k=g[1];(/^(ctrl)(\+shift)?\+(\d+)$/.test(j.toLowerCase())||/^(\d+)$/.test(j))&&(("ctrl"==RegExp.$1?d.ctrlKey||d.metaKey:0)&&(""!=RegExp.$2?d[RegExp.$2.slice(1)+"Key"]:1)&&e==RegExp.$3||e==RegExp.$1)&&(a.queryCommandState(f,k)!=-1&&a.execCommand(f,k),domUtils.preventDefault(d))}})},getContent:function(a,b,c,d,e){var f=this;if(a&&utils.isFunction(a)&&(b=a,a=""),b?!b():!this.hasContents())return"";f.fireEvent("beforegetcontent");var g=UE.htmlparser(f.body.innerHTML,d);return f.filterOutputRule(g),f.fireEvent("aftergetcontent",a,g),g.toHtml(e)},getAllHtml:function(){var a=this,b=[];if(a.fireEvent("getAllHtml",b),browser.ie&&browser.version>8){var c="";utils.each(a.document.styleSheets,function(a){c+=a.href?'':""}),utils.each(a.document.getElementsByTagName("script"),function(a){c+=a.outerHTML})}return""+(a.options.charset?'':"")+(c||a.document.getElementsByTagName("head")[0].innerHTML)+b.join("\n")+""+a.getContent(null,null,!0)+""},getPlainTxt:function(){var a=new RegExp(domUtils.fillChar,"g"),b=this.body.innerHTML.replace(/[\n\r]/g,"");return b=b.replace(/<(p|div)[^>]*>(| )<\/\1>/gi,"\n").replace(//gi,"\n").replace(/<[^>\/]+>/g,"").replace(/(\n)?<\/([^>]+)>/g,function(a,b,c){return dtd.$block[c]?"\n":b?b:""}),b.replace(a,"").replace(/\u00a0/g," ").replace(/ /g," ")},getContentTxt:function(){var a=new RegExp(domUtils.fillChar,"g");return this.body[browser.ie?"innerText":"textContent"].replace(a,"").replace(/\u00a0/g," ")},setContent:function(b,c,d){function e(a){return"DIV"==a.tagName&&a.getAttribute("cdata_tag")}var f=this;f.fireEvent("beforesetcontent",b);var g=UE.htmlparser(b);if(f.filterInputRule(g),b=g.toHtml(),f.body.innerHTML=(c?f.body.innerHTML:"")+b,"p"==f.options.enterTag){var h,i=this.body.firstChild;if(!i||1==i.nodeType&&(dtd.$cdata[i.tagName]||e(i)||domUtils.isCustomeNode(i))&&i===this.body.lastChild)this.body.innerHTML="

    "+(browser.ie?" ":"
    ")+"

    "+this.body.innerHTML;else for(var j=f.document.createElement("p");i;){for(;i&&(3==i.nodeType||1==i.nodeType&&dtd.p[i.tagName]&&!dtd.$cdata[i.tagName]);)h=i.nextSibling,j.appendChild(i),i=h;if(j.firstChild){if(!i){f.body.appendChild(j);break}i.parentNode.insertBefore(j,i),j=f.document.createElement("p")}i=i.nextSibling}}f.fireEvent("aftersetcontent"),f.fireEvent("contentchange"),!d&&f._selectionChange(),f._bakRange=f._bakIERange=f._bakNativeRange=null;var k;browser.gecko&&(k=this.selection.getNative())&&k.removeAllRanges(),f.options.autoSyncData&&f.form&&a(f.form,f)},focus:function(a){try{var b=this,c=b.selection.getRange();if(a){var d=b.body.lastChild;d&&1==d.nodeType&&!dtd.$empty[d.tagName]&&(domUtils.isEmptyBlock(d)?c.setStartAtFirst(d):c.setStartAtLast(d),c.collapse(!0)),c.setCursor(!0)}else{if(!c.collapsed&&domUtils.isBody(c.startContainer)&&0==c.startOffset){var d=b.body.firstChild;d&&1==d.nodeType&&!dtd.$empty[d.tagName]&&c.setStartAtFirst(d).collapse(!0)}c.select(!0)}this.fireEvent("focus selectionchange")}catch(e){}},isFocus:function(){return this.selection.isFocus()},blur:function(){var a=this.selection.getNative();if(a.empty&&browser.ie){var b=document.body.createTextRange();b.moveToElementText(document.body),b.collapse(!0),b.select(),a.empty()}else a.removeAllRanges()},_initEvents:function(){var a=this,b=a.document,c=a.window;a._proxyDomEvent=utils.bind(a._proxyDomEvent,a),domUtils.on(b,["click","contextmenu","mousedown","keydown","keyup","keypress","mouseup","mouseover","mouseout","selectstart"],a._proxyDomEvent),domUtils.on(c,["focus","blur"],a._proxyDomEvent),domUtils.on(a.body,"drop",function(b){browser.gecko&&b.stopPropagation&&b.stopPropagation(),a.fireEvent("contentchange")}),domUtils.on(b,["mouseup","keydown"],function(b){"keydown"==b.type&&(b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)||2!=b.button&&a._selectionChange(250,b)})},_proxyDomEvent:function(a){return this.fireEvent("before"+a.type.replace(/^on/,"").toLowerCase())!==!1&&(this.fireEvent(a.type.replace(/^on/,""),a)!==!1&&this.fireEvent("after"+a.type.replace(/^on/,"").toLowerCase()))},_selectionChange:function(a,b){var c,e,f=this,g=!1;if(browser.ie&&browser.version<9&&b&&"mouseup"==b.type){var h=this.selection.getRange();h.collapsed||(g=!0,c=b.clientX,e=b.clientY)}clearTimeout(d),d=setTimeout(function(){if(f.selection&&f.selection.getNative()){var a;if(g&&"None"==f.selection.getNative().type){a=f.document.body.createTextRange();try{a.moveToPoint(c,e)}catch(d){a=null}}var h;a&&(h=f.selection.getIERange,f.selection.getIERange=function(){return a}),f.selection.cache(),h&&(f.selection.getIERange=h),f.selection._cachedRange&&f.selection._cachedStartElement&&(f.fireEvent("beforeselectionchange"),f.fireEvent("selectionchange",!!b),f.fireEvent("afterselectionchange"),f.selection.clear())}},a||50)},_callCmdFn:function(a,b){var c,d,e=b[0].toLowerCase();return c=this.commands[e]||UE.commands[e],d=c&&c[a],c&&d||"queryCommandState"!=a?d?d.apply(this,b):void 0:0},execCommand:function(a){a=a.toLowerCase();var b,c=this,d=c.commands[a]||UE.commands[a];return d&&d.execCommand?(d.notNeedUndo||c.__hasEnterExecCommand?(b=this._callCmdFn("execCommand",arguments),!c.__hasEnterExecCommand&&!d.ignoreContentChange&&!c._ignoreContentChange&&c.fireEvent("contentchange")):(c.__hasEnterExecCommand=!0,c.queryCommandState.apply(c,arguments)!=-1&&(c.fireEvent("saveScene"),c.fireEvent.apply(c,["beforeexeccommand",a].concat(arguments)),b=this._callCmdFn("execCommand",arguments),c.fireEvent.apply(c,["afterexeccommand",a].concat(arguments)),c.fireEvent("saveScene")),c.__hasEnterExecCommand=!1),!c.__hasEnterExecCommand&&!d.ignoreContentChange&&!c._ignoreContentChange&&c._selectionChange(),b):null},queryCommandState:function(a){return this._callCmdFn("queryCommandState",arguments)},queryCommandValue:function(a){return this._callCmdFn("queryCommandValue",arguments)},hasContents:function(a){if(a)for(var b,c=0;b=a[c++];)if(this.document.getElementsByTagName(b).length>0)return!0;if(!domUtils.isEmptyBlock(this.body))return!0;for(a=["div"],c=0;b=a[c++];)for(var d,e=domUtils.getElementsByTagName(this.document,b),f=0;d=e[f++];)if(domUtils.isCustomeNode(d))return!0;return!1},reset:function(){this.fireEvent("reset")},setEnabled:function(){var a,b=this;if("false"==b.body.contentEditable){b.body.contentEditable=!0,a=b.selection.getRange();try{a.moveToBookmark(b.lastBk),delete b.lastBk}catch(c){a.setStartAtFirst(b.body).collapse(!0)}a.select(!0),b.bkqueryCommandState&&(b.queryCommandState=b.bkqueryCommandState,delete b.bkqueryCommandState),b.bkqueryCommandValue&&(b.queryCommandValue=b.bkqueryCommandValue,delete b.bkqueryCommandValue),b.fireEvent("selectionchange")}},enable:function(){return this.setEnabled()},setDisabled:function(a){var b=this;a=a?utils.isArray(a)?a:[a]:[],"true"==b.body.contentEditable&&(b.lastBk||(b.lastBk=b.selection.getRange().createBookmark(!0)),b.body.contentEditable=!1,b.bkqueryCommandState=b.queryCommandState,b.bkqueryCommandValue=b.queryCommandValue,b.queryCommandState=function(c){return utils.indexOf(a,c)!=-1?b.bkqueryCommandState.apply(b,arguments):-1},b.queryCommandValue=function(c){return utils.indexOf(a,c)!=-1?b.bkqueryCommandValue.apply(b,arguments):null},b.fireEvent("selectionchange"))},disable:function(a){return this.setDisabled(a)},_setDefaultContent:function(){function a(){var b=this;b.document.getElementById("initContent")&&(b.body.innerHTML="

    "+(ie?"":"
    ")+"

    ",b.removeListener("firstBeforeExecCommand focus",a),setTimeout(function(){b.focus(),b._selectionChange()},0))}return function(b){var c=this;c.body.innerHTML='

    '+b+"

    ",c.addListener("firstBeforeExecCommand focus",a)}}(),setShow:function(){var a=this,b=a.selection.getRange();if("none"==a.container.style.display){try{b.moveToBookmark(a.lastBk),delete a.lastBk}catch(c){b.setStartAtFirst(a.body).collapse(!0)}setTimeout(function(){b.select(!0)},100),a.container.style.display=""}},show:function(){return this.setShow()},setHide:function(){ +var a=this;a.lastBk||(a.lastBk=a.selection.getRange().createBookmark(!0)),a.container.style.display="none"},hide:function(){return this.setHide()},getLang:function(a){var b=UE.I18N[this.options.lang];if(!b)throw Error("not import language file");a=(a||"").split(".");for(var c,d=0;(c=a[d++])&&(b=b[c],b););return b},getContentLength:function(a,b){var c=this.getContent(!1,!1,!0).length;if(a){b=(b||[]).concat(["hr","img","iframe"]),c=this.getContentTxt().replace(/[\t\r\n]+/g,"").length;for(var d,e=0;d=b[e++];)c+=this.document.getElementsByTagName(d).length}return c},addInputRule:function(a){this.inputRules.push(a)},filterInputRule:function(a){for(var b,c=0;b=this.inputRules[c++];)b.call(this,a)},addOutputRule:function(a){this.outputRules.push(a)},filterOutputRule:function(a){for(var b,c=0;b=this.outputRules[c++];)b.call(this,a)},getActionUrl:function(a){var b=this.getOpt(a)||a,c=this.getOpt("imageUrl"),d=this.getOpt("serverUrl");return!d&&c&&(d=c.replace(/^(.*[\/]).+([\.].+)$/,"$1controller$2")),d?(d=d+(d.indexOf("?")==-1?"?":"&")+"action="+(b||""),utils.formatUrl(d)):""}},utils.inherits(f,EventBase)}(),UE.Editor.defaultOptions=function(a){var b=a.options.UEDITOR_HOME_URL;return{isShow:!0,initialContent:"",initialStyle:"",autoClearinitialContent:!1,iframeCssUrl:b+"themes/iframe.css",textarea:"editorValue",focus:!1,focusInEnd:!0,autoClearEmptyNode:!0,fullscreen:!1,readonly:!1,zIndex:999,imagePopup:!0,enterTag:"p",customDomain:!1,lang:"zh-cn",langPath:b+"lang/",theme:"default",themePath:b+"themes/",allHtmlEnabled:!1,scaleEnabled:!1,tableNativeEditInFF:!1,autoSyncData:!0,fileNameFormat:"{time}{rand:6}"}},function(){UE.Editor.prototype.loadServerConfig=function(){function showErrorMsg(a){console&&console.error(a)}var me=this;setTimeout(function(){try{me.options.imageUrl&&me.setOpt("serverUrl",me.options.imageUrl.replace(/^(.*[\/]).+([\.].+)$/,"$1controller$2"));var configUrl=me.getActionUrl("config"),isJsonp=utils.isCrossDomainUrl(configUrl);me._serverConfigLoaded=!1,configUrl&&UE.ajax.request(configUrl,{method:"GET",dataType:isJsonp?"jsonp":"",onsuccess:function(r){try{var config=isJsonp?r:eval("("+r.responseText+")");utils.extend(me.options,config),me.fireEvent("serverConfigLoaded"),me._serverConfigLoaded=!0}catch(e){showErrorMsg(me.getLang("loadconfigFormatError"))}},onerror:function(){showErrorMsg(me.getLang("loadconfigHttpError"))}})}catch(e){showErrorMsg(me.getLang("loadconfigError"))}})},UE.Editor.prototype.isServerConfigLoaded=function(){var a=this;return a._serverConfigLoaded||!1},UE.Editor.prototype.afterConfigReady=function(a){if(a&&utils.isFunction(a)){var b=this,c=function(){a.apply(b,arguments),b.removeListener("serverConfigLoaded",c)};b.isServerConfigLoaded()?a.call(b,"serverConfigLoaded"):b.addListener("serverConfigLoaded",c)}}}(),UE.ajax=function(){function a(a){var b=[];for(var c in a)if("method"!=c&&"timeout"!=c&&"async"!=c&&"dataType"!=c&&"callback"!=c&&void 0!=a[c]&&null!=a[c])if("function"!=(typeof a[c]).toLowerCase()&&"object"!=(typeof a[c]).toLowerCase())b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));else if(utils.isArray(a[c]))for(var d=0;d/gi,"").replace(/]*>[\s\S]*?.<\/v:shape>/gi,function(a){if(browser.opera)return"";try{if(/Bitmap/i.test(a))return"";var c=a.match(/width:([ \d.]*p[tx])/i)[1],d=a.match(/height:([ \d.]*p[tx])/i)[1],e=a.match(/src=\s*"([^"]*)"/i)[1];return''}catch(f){return""}}).replace(/<\/?div[^>]*>/g,"").replace(/v:\w+=(["']?)[^'"]+\1/g,"").replace(/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|xml|meta|link|style|\w+:\w+)(?=[\s\/>]))[^>]*>/gi,"").replace(/

    ]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"

    $1

    ").replace(/\s+(class|lang|align)\s*=\s*(['"]?)([\w-]+)\2/gi,function(a,b,c,d){return"class"==b&&"MsoListParagraph"==d?a:""}).replace(/<(font|span)[^>]*>(\s*)<\/\1>/gi,function(a,b,c){return c.replace(/[\t\r\n ]+/g," ")}).replace(/(<[a-z][^>]*)\sstyle=(["'])([^\2]*?)\2/gi,function(a,c,d,e){for(var f,g=[],h=e.replace(/^\s+|\s+$/,"").replace(/'/g,"'").replace(/"/gi,"'").replace(/[\d.]+(cm|pt)/g,function(a){return utils.transUnitToPx(a)}).split(/;\s*/g),i=0;f=h[i];i++){var j,k,l=f.split(":");if(2==l.length){if(j=l[0].toLowerCase(),k=l[1].toLowerCase(),/^(background)\w*/.test(j)&&0==k.replace(/(initial|\s)/g,"").length||/^(margin)\w*/.test(j)&&/^0\w+$/.test(k))continue;switch(j){case"mso-padding-alt":case"mso-padding-top-alt":case"mso-padding-right-alt":case"mso-padding-bottom-alt":case"mso-padding-left-alt":case"mso-margin-alt":case"mso-margin-top-alt":case"mso-margin-right-alt":case"mso-margin-bottom-alt":case"mso-margin-left-alt":case"mso-height":case"mso-width":case"mso-vertical-align-alt":/1&&(a(h,j,!0),b(h,j)),c(k,h,i,j);break;case"text":d(g,h);break;case"element":e(g,h,i,j);break;case"comment":f(g,h,i)}return h}function d(a,b){"pre"==a.parentNode.tagName?b.push(a.data):b.push(l[a.parentNode.tagName]?utils.html(a.data):a.data.replace(/[ ]{2}/g,"  "))}function e(d,e,f,g){var h="";if(d.attrs){h=[];var i=d.attrs;for(var j in i)h.push(j+(void 0!==i[j]?'="'+(k[j]?utils.html(i[j]).replace(/["]/g,function(a){return"""}):utils.unhtml(i[j]))+'"':""));h=h.join(" ")}if(e.push("<"+d.tagName+(h?" "+h:"")+(dtd.$empty[d.tagName]?"/":"")+">"),f&&!dtd.$inlineWithA[d.tagName]&&"pre"!=d.tagName&&d.children&&d.children.length&&(g=a(e,g,!0),b(e,g)),d.children&&d.children.length)for(var l,m=0;l=d.children[m++];)f&&"element"==l.type&&!dtd.$inlineWithA[l.tagName]&&m>1&&(a(e,g),b(e,g)),c(l,e,f,g);dtd.$empty[d.tagName]||(f&&!dtd.$inlineWithA[d.tagName]&&"pre"!=d.tagName&&d.children&&d.children.length&&(g=a(e,g),b(e,g)),e.push(""))}function f(a,b){b.push("")}function g(a,b){var c;if("element"==a.type&&a.getAttr("id")==b)return a;if(a.children&&a.children.length)for(var d,e=0;d=a.children[e++];)if(c=g(d,b))return c}function h(a,b,c){if("element"==a.type&&a.tagName==b&&c.push(a),a.children&&a.children.length)for(var d,e=0;d=a.children[e++];)h(d,b,c)}function i(a,b){if(a.children&&a.children.length)for(var c,d=0;c=a.children[d];)i(c,b),c.parentNode&&(c.children&&c.children.length&&b(c),c.parentNode&&d++);else b(a)}var j=UE.uNode=function(a){this.type=a.type,this.data=a.data,this.tagName=a.tagName,this.parentNode=a.parentNode,this.attrs=a.attrs||{},this.children=a.children},k={href:1,src:1,_src:1,_href:1,cdata_data:1},l={style:1,script:1},m=" ",n="\n";j.createElement=function(a){return/[<>]/.test(a)?UE.htmlparser(a).children[0]:new j({type:"element",children:[],tagName:a})},j.createText=function(a,b){return new UE.uNode({type:"text",data:b?a:utils.unhtml(a||"")})},j.prototype={toHtml:function(a){var b=[];return c(this,b,a,0),b.join("")},innerHTML:function(a){if("element"!=this.type||dtd.$empty[this.tagName])return this;if(utils.isString(a)){if(this.children)for(var b,c=0;b=this.children[c++];)b.parentNode=null;this.children=[];for(var b,d=UE.htmlparser(a),c=0;b=d.children[c++];)this.children.push(b),b.parentNode=this;return this}var d=new UE.uNode({type:"root",children:this.children});return d.toHtml()},innerText:function(a,b){if("element"!=this.type||dtd.$empty[this.tagName])return this;if(a){if(this.children)for(var c,d=0;c=this.children[d++];)c.parentNode=null;return this.children=[],this.appendChild(j.createText(a,b)),this}return this.toHtml().replace(/<[^>]+>/g,"")},getData:function(){return"element"==this.type?"":this.data},firstChild:function(){return this.children?this.children[0]:null},lastChild:function(){return this.children?this.children[this.children.length-1]:null},previousSibling:function(){for(var a,b=this.parentNode,c=0;a=b.children[c];c++)if(a===this)return 0==c?null:b.children[c-1]},nextSibling:function(){for(var a,b=this.parentNode,c=0;a=b.children[c++];)if(a===this)return b.children[c]},replaceChild:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c,d=0;c=this.children[d];d++)if(c===b)return this.children.splice(d,1,a),b.parentNode=null,a.parentNode=this,a}},appendChild:function(a){if("root"==this.type||"element"==this.type&&!dtd.$empty[this.tagName]){this.children||(this.children=[]),a.parentNode&&a.parentNode.removeChild(a);for(var b,c=0;b=this.children[c];c++)if(b===a){this.children.splice(c,1);break}return this.children.push(a),a.parentNode=this,a}},insertBefore:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c,d=0;c=this.children[d];d++)if(c===b)return this.children.splice(d,0,a),a.parentNode=this,a}},insertAfter:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c,d=0;c=this.children[d];d++)if(c===b)return this.children.splice(d+1,0,a),a.parentNode=this,a}},removeChild:function(a,b){if(this.children)for(var c,d=0;c=this.children[d];d++)if(c===a){if(this.children.splice(d,1),c.parentNode=null,b&&c.children&&c.children.length)for(var e,f=0;e=c.children[f];f++)this.children.splice(d+f,0,e),e.parentNode=this;return c}},getAttr:function(a){return this.attrs&&this.attrs[a.toLowerCase()]},setAttr:function(a,b){if(!a)return void delete this.attrs;if(this.attrs||(this.attrs={}),utils.isObject(a))for(var c in a)a[c]?this.attrs[c.toLowerCase()]=a[c]:delete this.attrs[c];else b?this.attrs[a.toLowerCase()]=b:delete this.attrs[a]},getIndex:function(){for(var a,b=this.parentNode,c=0;a=b.children[c];c++)if(a===this)return c;return-1},getNodeById:function(a){var b;if(this.children&&this.children.length)for(var c,d=0;c=this.children[d++];)if(b=g(c,a))return b},getNodesByTagName:function(a){a=utils.trim(a).replace(/[ ]{2,}/g," ").split(" ");var b=[],c=this;return utils.each(a,function(a){if(c.children&&c.children.length)for(var d,e=0;d=c.children[e++];)h(d,a,b)}),b},getStyle:function(a){var b=this.getAttr("style");if(!b)return"";var c=new RegExp("(^|;)\\s*"+a+":([^;]+)","i"),d=b.match(c);return d&&d[0]?d[2]:""},setStyle:function(a,b){function c(a,b){var c=new RegExp("(^|;)\\s*"+a+":([^;]+;?)","gi");d=d.replace(c,"$1"),b&&(d=a+":"+utils.unhtml(b)+";"+d)}var d=this.getAttr("style");if(d||(d=""),utils.isObject(a))for(var e in a)c(e,a[e]);else c(a,b);this.setAttr("style",utils.trim(d))},traversal:function(a){return this.children&&this.children.length&&i(this,a),this}}}();var htmlparser=UE.htmlparser=function(a,b){function c(a,b){if(m[a.tagName]){var c=k.createElement(m[a.tagName]);a.appendChild(c),c.appendChild(k.createText(b)),a=c}else a.appendChild(k.createText(b))}function d(a,b,c){var e;if(e=l[b]){for(var f,h=a;"root"!=h.type;){if(utils.isArray(e)?utils.indexOf(e,h.tagName)!=-1:e==h.tagName){a=h,f=!0;break}h=h.parentNode}f||(a=d(a,utils.isArray(e)?e[0]:e))}var i=new k({parentNode:a,type:"element",tagName:b.toLowerCase(),children:dtd.$empty[b]?null:[]});if(c){for(var m,n={};m=g.exec(c);)n[m[1].toLowerCase()]=j[m[1].toLowerCase()]?m[2]||m[3]||m[4]:utils.unhtml(m[2]||m[3]||m[4]);i.attrs=n}return a.children.push(i),dtd.$empty[b]?a:i}function e(a,b){a.children.push(new k({type:"comment",data:b,parentNode:a}))}var f=/<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)-->)|(?:([^\s\/<>]+)\s*((?:(?:"[^"]*")|(?:'[^']*')|[^"'<>])*)\/?>))/g,g=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,h={b:1,code:1,i:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,span:1,sub:1,img:1,sup:1,font:1,big:1,small:1,iframe:1,a:1,br:1,pre:1};a=a.replace(new RegExp(domUtils.fillChar,"g"),""),b||(a=a.replace(new RegExp("[\\r\\t\\n"+(b?"":" ")+"]*]*)>[\\r\\t\\n"+(b?"":" ")+"]*","g"),function(a,c){return c&&h[c.toLowerCase()]?a.replace(/(^[\n\r]+)|([\n\r]+$)/g,""):a.replace(new RegExp("^[\\r\\n"+(b?"":" ")+"]+"),"").replace(new RegExp("[\\r\\n"+(b?"":" ")+"]+$"),"")}));for(var i,j={href:1,src:1},k=UE.uNode,l={td:"tr",tr:["tbody","thead","tfoot"],tbody:"table",th:"tr",thead:"table",tfoot:"table",caption:"table",li:["ul","ol"],dt:"dl",dd:"dl",option:"select"},m={ol:"li",ul:"li"},n=0,o=0,p=new k({type:"root",children:[]}),q=p;i=f.exec(a);){n=i.index;try{if(n>o&&c(q,a.slice(o,n)),i[3])dtd.$cdata[q.tagName]?c(q,i[0]):q=d(q,i[3].toLowerCase(),i[4]);else if(i[1]){if("root"!=q.type)if(dtd.$cdata[q.tagName]&&!dtd.$cdata[i[1]])c(q,i[0]);else{for(var r=q;"element"==q.type&&q.tagName!=i[1].toLowerCase();)if(q=q.parentNode,"root"==q.type)throw q=r,"break";q=q.parentNode}}else i[2]&&e(q,i[2])}catch(s){}o=f.lastIndex}return o");break;case"div":if(b.getAttr("cdata_tag"))break;if(d=b.getAttr("class"),d&&/^line number\d+/.test(d))break;if(!e)break;for(var f,g=UE.uNode.createElement("p");f=b.firstChild();)"text"!=f.type&&UE.dom.dtd.$block[f.tagName]?g.firstChild()?(b.parentNode.insertBefore(g,b),g=UE.uNode.createElement("p")):b.parentNode.insertBefore(f,b):g.appendChild(f);g.firstChild()&&b.parentNode.insertBefore(g,b),b.parentNode.removeChild(b);break;case"dl":b.tagName="ul";break;case"dt":case"dd":b.tagName="li";break;case"li":var h=b.getAttr("class");h&&/list\-/.test(h)||b.setAttr();var i=b.getNodesByTagName("ol ul");UE.utils.each(i,function(a){b.parentNode.insertAfter(a,b)});break;case"td":case"th":case"caption":b.children&&b.children.length||b.appendChild(browser.ie11below?UE.uNode.createText(" "):UE.uNode.createElement("br"));break;case"table":a.options.disabledTableInTable&&c(b)&&(b.parentNode.insertBefore(UE.uNode.createText(b.innerText()),b),b.parentNode.removeChild(b))}}})}),a.addOutputRule(function(b){var c;b.traversal(function(b){if("element"==b.type){if(a.options.autoClearEmptyNode&&dtd.$inline[b.tagName]&&!dtd.$empty[b.tagName]&&(!b.attrs||utils.isEmptyObject(b.attrs)))return void(b.firstChild()?"span"!=b.tagName||b.attrs&&!utils.isEmptyObject(b.attrs)||b.parentNode.removeChild(b,!0):b.parentNode.removeChild(b));switch(b.tagName){case"div":(c=b.getAttr("cdata_tag"))&&(b.tagName=c,b.appendChild(UE.uNode.createText(b.getAttr("cdata_data"))),b.setAttr({cdata_tag:"",cdata_data:"",_ue_custom_node_:""}));break;case"a":(c=b.getAttr("_href"))&&b.setAttr({href:utils.html(c),_href:""});break;case"span":c=b.getAttr("id"),c&&/^_baidu_bookmark_/i.test(c)&&b.parentNode.removeChild(b);break;case"img":(c=b.getAttr("_src"))&&b.setAttr({src:b.getAttr("_src"),_src:""})}}})})},UE.commands.inserthtml={execCommand:function(a,b,c){var d,e,f=this;if(b&&f.fireEvent("beforeinserthtml",b)!==!0){if(d=f.selection.getRange(),e=d.document.createElement("div"),e.style.display="inline",!c){var g=UE.htmlparser(b);f.options.filterRules&&UE.filterNode(g,f.options.filterRules),f.filterInputRule(g),b=g.toHtml()}if(e.innerHTML=utils.trim(b),!d.collapsed){var h=d.startContainer;if(domUtils.isFillChar(h)&&d.setStartBefore(h),h=d.endContainer,domUtils.isFillChar(h)&&d.setEndAfter(h),d.txtToElmBoundary(),d.endContainer&&1==d.endContainer.nodeType&&(h=d.endContainer.childNodes[d.endOffset],h&&domUtils.isBr(h)&&d.setEndAfter(h)),0==d.startOffset&&(h=d.startContainer,domUtils.isBoundaryNode(h,"firstChild")&&(h=d.endContainer,d.endOffset==(3==h.nodeType?h.nodeValue.length:h.childNodes.length)&&domUtils.isBoundaryNode(h,"lastChild")&&(f.body.innerHTML="

    "+(browser.ie?"":"
    ")+"

    ",d.setStart(f.body.firstChild,0).collapse(!0)))),!d.collapsed&&d.deleteContents(),1==d.startContainer.nodeType){var i,j=d.startContainer.childNodes[d.startOffset];if(j&&domUtils.isBlockElm(j)&&(i=j.previousSibling)&&domUtils.isBlockElm(i)){for(d.setEnd(i,i.childNodes.length).collapse();j.firstChild;)i.appendChild(j.firstChild);domUtils.remove(j)}}}var j,k,i,l,m,n=0;d.inFillChar()&&(j=d.startContainer,domUtils.isFillChar(j)?(d.setStartBefore(j).collapse(!0),domUtils.remove(j)):domUtils.isFillChar(j,!0)&&(j.nodeValue=j.nodeValue.replace(fillCharReg,""),d.startOffset--,d.collapsed&&d.collapse(!0)));var o=domUtils.findParentByTagName(d.startContainer,"li",!0);if(o){for(var p,q;j=e.firstChild;){for(;j&&(3==j.nodeType||!domUtils.isBlockElm(j)||"HR"==j.tagName);)p=j.nextSibling,d.insertNode(j).collapse(),q=j,j=p;if(j)if(/^(ol|ul)$/i.test(j.tagName)){for(;j.firstChild;)q=j.firstChild,domUtils.insertAfter(o,j.firstChild),o=o.nextSibling;domUtils.remove(j)}else{var r;p=j.nextSibling,r=f.document.createElement("li"),domUtils.insertAfter(o,r),r.appendChild(j),q=j,j=p,o=r}}o=domUtils.findParentByTagName(d.startContainer,"li",!0),domUtils.isEmptyBlock(o)&&domUtils.remove(o),q&&d.setStartAfter(q).collapse(!0).select(!0)}else{for(;j=e.firstChild;){if(n){for(var s=f.document.createElement("p");j&&(3==j.nodeType||!dtd.$block[j.tagName]);)m=j.nextSibling,s.appendChild(j),j=m;s.firstChild&&(j=s)}if(d.insertNode(j),m=j.nextSibling,!n&&j.nodeType==domUtils.NODE_ELEMENT&&domUtils.isBlockElm(j)&&(k=domUtils.findParent(j,function(a){return domUtils.isBlockElm(a)}),k&&"body"!=k.tagName.toLowerCase()&&(!dtd[k.tagName][j.nodeName]||j.parentNode!==k))){if(dtd[k.tagName][j.nodeName])for(l=j.parentNode;l!==k;)i=l,l=l.parentNode;else i=k;domUtils.breakParent(j,i||l);var i=j.previousSibling;domUtils.trimWhiteTextNode(i),i.childNodes.length||domUtils.remove(i),!browser.ie&&(p=j.nextSibling)&&domUtils.isBlockElm(p)&&p.lastChild&&!domUtils.isBr(p.lastChild)&&p.appendChild(f.document.createElement("br")),n=1}var p=j.nextSibling;if(!e.firstChild&&p&&domUtils.isBlockElm(p)){d.setStart(p,0).collapse(!0);break}d.setEndAfter(j).collapse()}if(j=d.startContainer,m&&domUtils.isBr(m)&&domUtils.remove(m),domUtils.isBlockElm(j)&&domUtils.isEmptyNode(j))if(m=j.nextSibling)domUtils.remove(j),1==m.nodeType&&dtd.$block[m.tagName]&&d.setStart(m,0).collapse(!0).shrinkBoundary();else try{j.innerHTML=browser.ie?domUtils.fillChar:"
    "}catch(t){d.setStartBefore(j),domUtils.remove(j)}try{d.select(!0)}catch(t){}}setTimeout(function(){d=f.selection.getRange(),d.scrollToView(f.autoHeightEnabled,f.autoHeightEnabled?domUtils.getXY(f.iframe).y:0),f.fireEvent("afterinserthtml",b)},200)}}},UE.plugins.autotypeset=function(){function a(a,b){return a&&3!=a.nodeType?domUtils.isBr(a)?1:a&&a.parentNode&&l[a.tagName.toLowerCase()]?g&&g.contains(a)||a.getAttribute("pagebreak")?0:b?!domUtils.isEmptyBlock(a):domUtils.isEmptyBlock(a,new RegExp("[\\s"+domUtils.fillChar+"]","g")):void 0:0}function b(a){a.style.cssText||(domUtils.removeAttributes(a,["style"]),"span"==a.tagName.toLowerCase()&&domUtils.hasNoAttributes(a)&&domUtils.remove(a,!0))}function c(c,f){var h,l=this;if(f){if(!i.pasteFilter)return;h=l.document.createElement("div"),h.innerHTML=f.html}else h=l.document.body;for(var m,n=domUtils.getElementsByTagName(h,"*"),o=0;m=n[o++];)if(l.fireEvent("excludeNodeinautotype",m)!==!0){if(i.clearFontSize&&m.style.fontSize&&(domUtils.removeStyle(m,"font-size"),b(m)),i.clearFontFamily&&m.style.fontFamily&&(domUtils.removeStyle(m,"font-family"),b(m)),a(m)){if(i.mergeEmptyline)for(var p,q=m.nextSibling,r=domUtils.isBr(m);a(q)&&(p=q,q=p.nextSibling,!r||q&&(!q||domUtils.isBr(q)));)domUtils.remove(p);if(i.removeEmptyline&&domUtils.inDoc(m,h)&&!k[m.parentNode.tagName.toLowerCase()]){if(domUtils.isBr(m)&&(q=m.nextSibling,q&&!domUtils.isBr(q)))continue;domUtils.remove(m);continue}}if(a(m,!0)&&"SPAN"!=m.tagName&&(i.indent&&(m.style.textIndent=i.indentValue),i.textAlign&&(m.style.textAlign=i.textAlign)),i.removeClass&&m.className&&!j[m.className.toLowerCase()]){if(g&&g.contains(m))continue;domUtils.removeAttributes(m,["class"])}if(i.imageBlockLine&&"img"==m.tagName.toLowerCase()&&!m.getAttribute("emotion"))if(f){var s=m;switch(i.imageBlockLine){case"left":case"right":case"none":for(var p,t,q,u=s.parentNode;dtd.$inline[u.tagName]||"A"==u.tagName;)u=u.parentNode;if(p=u,"P"==p.tagName&&"center"==domUtils.getStyle(p,"text-align")&&!domUtils.isBody(p)&&1==domUtils.getChildCount(p,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)}))if(t=p.previousSibling,q=p.nextSibling,t&&q&&1==t.nodeType&&1==q.nodeType&&t.tagName==q.tagName&&domUtils.isBlockElm(t)){for(t.appendChild(p.firstChild);q.firstChild;)t.appendChild(q.firstChild);domUtils.remove(p),domUtils.remove(q)}else domUtils.setStyle(p,"text-align","");domUtils.setStyle(s,"float",i.imageBlockLine);break;case"center":if("center"!=l.queryCommandValue("imagefloat")){for(u=s.parentNode,domUtils.setStyle(s,"float","none"),p=s;u&&1==domUtils.getChildCount(u,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)})&&(dtd.$inline[u.tagName]||"A"==u.tagName);)p=u,u=u.parentNode;var v=l.document.createElement("p");domUtils.setAttributes(v,{style:"text-align:center"}),p.parentNode.insertBefore(v,p),v.appendChild(p),domUtils.setStyle(p,"float","")}}}else{var w=l.selection.getRange();w.selectNode(m).select(),l.execCommand("imagefloat",i.imageBlockLine)}i.removeEmptyNode&&i.removeTagNames[m.tagName.toLowerCase()]&&domUtils.hasNoAttributes(m)&&domUtils.isEmptyBlock(m)&&domUtils.remove(m)}if(i.tobdc){var x=UE.htmlparser(h.innerHTML);x.traversal(function(a){"text"==a.type&&(a.data=e(a.data))}),h.innerHTML=x.toHtml()}if(i.bdc2sb){var x=UE.htmlparser(h.innerHTML);x.traversal(function(a){"text"==a.type&&(a.data=d(a.data))}),h.innerHTML=x.toHtml()}f&&(f.html=h.innerHTML)}function d(a){for(var b="",c=0;c=65281&&d<=65373?String.fromCharCode(a.charCodeAt(c)-65248):12288==d?String.fromCharCode(a.charCodeAt(c)-12288+32):a.charAt(c)}return b}function e(a){a=utils.html(a);for(var b="",c=0;c0?e.substring(e.indexOf(d.options.imagePath),e.length-1).replace(/"|\(|\)/gi,""):"none"!=e?e.replace(/url\("?|"?\)/gi,""):"";var g=' ",b.push(g)},aftersetcontent:function(){0==c&&b()}},inputRule:function(d){c=!1,utils.each(d.getNodesByTagName("p"),function(d){var e=d.getAttr("data-background");e&&(c=!0,b(a(e)),d.parentNode.removeChild(d))})},outputRule:function(a){var b=this,c=(utils.cssRule(e,b.document)||"").replace(/[\n\r]+/g,"").match(f);c&&a.appendChild(UE.uNode.createElement('


    '))},commands:{background:{execCommand:function(a,c){b(c)},queryCommandValue:function(){var b=this,c=(utils.cssRule(e,b.document)||"").replace(/[\n\r]+/g,"").match(f);return c?a(c[1]):null},notNeedUndo:!0}}}}),UE.commands.imagefloat={execCommand:function(a,b){var c=this,d=c.selection.getRange();if(!d.collapsed){var e=d.getClosedNode();if(e&&"IMG"==e.tagName)switch(b){case"left":case"right":case"none":for(var f,g,h,i=e.parentNode;dtd.$inline[i.tagName]||"A"==i.tagName;)i=i.parentNode;if(f=i,"P"==f.tagName&&"center"==domUtils.getStyle(f,"text-align")){if(!domUtils.isBody(f)&&1==domUtils.getChildCount(f,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)}))if(g=f.previousSibling,h=f.nextSibling,g&&h&&1==g.nodeType&&1==h.nodeType&&g.tagName==h.tagName&&domUtils.isBlockElm(g)){for(g.appendChild(f.firstChild);h.firstChild;)g.appendChild(h.firstChild);domUtils.remove(f),domUtils.remove(h)}else domUtils.setStyle(f,"text-align","");d.selectNode(e).select()}domUtils.setStyle(e,"float","none"==b?"":b),"none"==b&&domUtils.removeAttributes(e,"align");break;case"center":if("center"!=c.queryCommandValue("imagefloat")){for(i=e.parentNode,domUtils.setStyle(e,"float",""),domUtils.removeAttributes(e,"align"),f=e;i&&1==domUtils.getChildCount(i,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)})&&(dtd.$inline[i.tagName]||"A"==i.tagName);)f=i,i=i.parentNode;d.setStartBefore(f).setCursor(!1),i=c.document.createElement("div"),i.appendChild(f),domUtils.setStyle(f,"float",""),c.execCommand("insertHtml",'

    '+i.innerHTML+"

    "),f=c.document.getElementById("_img_parent_tmp"),f.removeAttribute("id"),f=f.firstChild,d.selectNode(f).select(),h=f.parentNode.nextSibling,h&&domUtils.isEmptyNode(h)&&domUtils.remove(h)}}}},queryCommandValue:function(){var a,b,c=this.selection.getRange();return c.collapsed?"none":(a=c.getClosedNode(),a&&1==a.nodeType&&"IMG"==a.tagName?(b=domUtils.getComputedStyle(a,"float")||a.getAttribute("align"),"none"==b&&(b="center"==domUtils.getComputedStyle(a.parentNode,"text-align")?"center":b),{left:1,right:1,center:1}[b]?b:"none"):"none")},queryCommandState:function(){var a,b=this.selection.getRange();return b.collapsed?-1:(a=b.getClosedNode(),a&&1==a.nodeType&&"IMG"==a.tagName?0:-1)}},UE.commands.insertimage={execCommand:function(a,b){function c(a){utils.each("width,height,border,hspace,vspace".split(","),function(b){a[b]&&(a[b]=parseInt(a[b],10)||0)}),utils.each("src,_src".split(","),function(b){a[b]&&(a[b]=utils.unhtmlForUrl(a[b]))}),utils.each("title,alt".split(","),function(b){a[b]&&(a[b]=utils.unhtml(a[b]))})}if(b=utils.isArray(b)?b:[b],b.length){var d=this,e=d.selection.getRange(),f=e.getClosedNode();if(d.fireEvent("beforeinsertimage",b)!==!0){if(!f||!/img/i.test(f.tagName)||"edui-faked-video"==f.className&&f.className.indexOf("edui-upload-video")==-1||f.getAttribute("word_img")){var g,h=[],i="";if(g=b[0],1==b.length)c(g),i=''+g.alt+'","center"==g.floatStyle&&(i='

    '+i+"

    "),h.push(i);else for(var j=0;g=b[j++];)c(g),i="

    ",h.push(i);d.execCommand("insertHtml",h.join(""))}else{var k=b.shift(),l=k.floatStyle;delete k.floatStyle,domUtils.setAttributes(f,k),d.execCommand("imagefloat",l),b.length>0&&(e.setStartAfter(f).setCursor(!1,!0),d.execCommand("insertimage",b))}d.fireEvent("afterinsertimage",b)}}}},UE.plugins.justify=function(){var a=domUtils.isBlockElm,b={left:1,right:1,center:1,justify:1},c=function(b,c){var d=b.createBookmark(),e=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase()&&!domUtils.isBookmarkNode(a):!domUtils.isWhitespace(a)};b.enlarge(!0);for(var f,g=b.createBookmark(),h=domUtils.getNextDomNode(g.start,!1,e),i=b.cloneRange();h&&!(domUtils.getPosition(h,g.end)&domUtils.POSITION_FOLLOWING);)if(3!=h.nodeType&&a(h))h=domUtils.getNextDomNode(h,!0,e);else{for(i.setStartBefore(h);h&&h!==g.end&&!a(h);)f=h,h=domUtils.getNextDomNode(h,!1,null,function(b){return!a(b)});i.setEndAfter(f);var j=i.getCommonAncestor();if(!domUtils.isBody(j)&&a(j))domUtils.setStyles(j,utils.isString(c)?{"text-align":c}:c),h=j;else{var k=b.document.createElement("p");domUtils.setStyles(k,utils.isString(c)?{"text-align":c}:c);var l=i.extractContents();k.appendChild(l),i.insertNode(k),h=k}h=domUtils.getNextDomNode(h,!1,e)}return b.moveToBookmark(g).moveToBookmark(d)};UE.commands.justify={execCommand:function(a,b){var d,e=this.selection.getRange();return e.collapsed&&(d=this.document.createTextNode("p"),e.insertNode(d)),c(e,b),d&&(e.setStartBefore(d).collapse(!0),domUtils.remove(d)),e.select(),!0},queryCommandValue:function(){var a=this.selection.getStart(),c=domUtils.getComputedStyle(a,"text-align");return b[c]?c:"left"},queryCommandState:function(){var a=this.selection.getStart(),b=a&&domUtils.findParentByTagName(a,["td","th","caption"],!0);return b?-1:0}}},UE.plugins.font=function(){function a(a){for(var b;(b=a.parentNode)&&"SPAN"==b.tagName&&1==domUtils.getChildCount(b,function(a){return!domUtils.isBookmarkNode(a)&&!domUtils.isBr(a)});)b.style.cssText+=a.style.cssText,domUtils.remove(a,!0),a=b}function b(a,b,c){if(g[b]&&(a.adjustmentBoundary(),!a.collapsed&&1==a.startContainer.nodeType)){var d=a.startContainer.childNodes[a.startOffset];if(d&&domUtils.isTagNode(d,"span")){var e=a.createBookmark();utils.each(domUtils.getElementsByTagName(d,"span"),function(a){a.parentNode&&!domUtils.isBookmarkNode(a)&&("backcolor"==b&&domUtils.getComputedStyle(a,"background-color").toLowerCase()===c||(domUtils.removeStyle(a,g[b]),0==a.style.cssText.replace(/^\s+$/,"").length&&domUtils.remove(a,!0)))}),a.moveToBookmark(e)}}}function c(c,d,e){var f,g=c.collapsed,h=c.createBookmark();if(g)for(f=h.start.parentNode;dtd.$inline[f.tagName];)f=f.parentNode;else f=domUtils.getCommonAncestor(h.start,h.end);utils.each(domUtils.getElementsByTagName(f,"span"),function(b){if(b.parentNode&&!domUtils.isBookmarkNode(b)){if(/\s*border\s*:\s*none;?\s*/i.test(b.style.cssText))return void(/^\s*border\s*:\s*none;?\s*$/.test(b.style.cssText)?domUtils.remove(b,!0):domUtils.removeStyle(b,"border"));if(/border/i.test(b.style.cssText)&&"SPAN"==b.parentNode.tagName&&/border/i.test(b.parentNode.style.cssText)&&(b.style.cssText=b.style.cssText.replace(/border[^:]*:[^;]+;?/gi,"")),"fontborder"!=d||"none"!=e)for(var c=b.nextSibling;c&&1==c.nodeType&&"SPAN"==c.tagName;)if(domUtils.isBookmarkNode(c)&&"fontborder"==d)b.appendChild(c),c=b.nextSibling;else{if(c.style.cssText==b.style.cssText&&(domUtils.moveChild(c,b),domUtils.remove(c)),b.nextSibling===c)break;c=b.nextSibling}if(a(b),browser.ie&&browser.version>8){var f=domUtils.findParent(b,function(a){return"SPAN"==a.tagName&&/background-color/.test(a.style.cssText)});f&&!/background-color/.test(b.style.cssText)&&(b.style.backgroundColor=f.style.backgroundColor)}}}),c.moveToBookmark(h),b(c,d,e)}var d=this,e={forecolor:"color",backcolor:"background-color",fontsize:"font-size",fontfamily:"font-family",underline:"text-decoration",strikethrough:"text-decoration",fontborder:"border"},f={underline:1,strikethrough:1,fontborder:1},g={forecolor:"color",backcolor:"background-color",fontsize:"font-size",fontfamily:"font-family"};d.setOpt({fontfamily:[{name:"songti",val:"宋体,SimSun"},{name:"yahei",val:"微软雅黑,Microsoft YaHei"},{name:"kaiti",val:"楷体,楷体_GB2312, SimKai"},{name:"heiti",val:"黑体, SimHei"},{name:"lishu",val:"隶书, SimLi"},{name:"andaleMono",val:"andale mono"},{name:"arial",val:"arial, helvetica,sans-serif"},{name:"arialBlack",val:"arial black,avant garde"},{name:"comicSansMs",val:"comic sans ms"},{name:"impact",val:"impact,chicago"},{name:"timesNewRoman",val:"times new roman"}],fontsize:[10,11,12,14,16,18,20,24,36]}),d.addInputRule(function(a){utils.each(a.getNodesByTagName("u s del font strike"),function(a){if("font"==a.tagName){var b=[];for(var c in a.attrs)switch(c){case"size":b.push("font-size:"+({1:"10",2:"12",3:"16",4:"18",5:"24",6:"32",7:"48"}[a.attrs[c]]||a.attrs[c])+"px");break;case"color":b.push("color:"+a.attrs[c]);break;case"face":b.push("font-family:"+a.attrs[c]);break;case"style":b.push(a.attrs[c])}a.attrs={style:b.join(";")}}else{var d="u"==a.tagName?"underline":"line-through";a.attrs={style:(a.getAttr("style")||"")+"text-decoration:"+d+";"}}a.tagName="span"})});for(var h in e)!function(a,b){UE.commands[a]={execCommand:function(d,e){e=e||(this.queryCommandState(d)?"none":"underline"==d?"underline":"fontborder"==d?"1px solid #000":"line-through");var g,h=this,i=this.selection.getRange();if("default"==e)i.collapsed&&(g=h.document.createTextNode("font"),i.insertNode(g).select()),h.execCommand("removeFormat","span,a",b),g&&(i.setStartBefore(g).collapse(!0),domUtils.remove(g)),c(i,d,e),i.select();else if(i.collapsed){var j=domUtils.findParentByTagName(i.startContainer,"span",!0);if(g=h.document.createTextNode("font"),!j||j.children.length||j[browser.ie?"innerText":"textContent"].replace(fillCharReg,"").length){if(i.insertNode(g),i.selectNode(g).select(),j=i.document.createElement("span"),f[a]){if(domUtils.findParentByTagName(g,"a",!0))return i.setStartBefore(g).setCursor(),void domUtils.remove(g);h.execCommand("removeFormat","span,a",b)}if(j.style.cssText=b+":"+e,g.parentNode.insertBefore(j,g),!browser.ie||browser.ie&&9==browser.version)for(var k=j.parentNode;!domUtils.isBlockElm(k);)"SPAN"==k.tagName&&(j.style.cssText=k.style.cssText+";"+j.style.cssText),k=k.parentNode;opera?setTimeout(function(){i.setStart(j,0).collapse(!0),c(i,d,e),i.select()}):(i.setStart(j,0).collapse(!0),c(i,d,e),i.select())}else i.insertNode(g),f[a]&&(i.selectNode(g).select(),h.execCommand("removeFormat","span,a",b,null),j=domUtils.findParentByTagName(g,"span",!0),i.setStartBefore(g)),j&&(j.style.cssText+=";"+b+":"+e),i.collapse(!0).select();domUtils.remove(g)}else f[a]&&h.queryCommandValue(a)&&h.execCommand("removeFormat","span,a",b),i=h.selection.getRange(),i.applyInlineStyle("span",{style:b+":"+e}),c(i,d,e),i.select();return!0},queryCommandValue:function(a){var c=this.selection.getStart();if("underline"==a||"strikethrough"==a){for(var d,e=c;e&&!domUtils.isBlockElm(e)&&!domUtils.isBody(e);){if(1==e.nodeType&&(d=domUtils.getComputedStyle(e,b),"none"!=d))return d;e=e.parentNode}return"none"}if("fontborder"==a){for(var f,g=c;g&&dtd.$inline[g.tagName];){if((f=domUtils.getComputedStyle(g,"border"))&&/1px/.test(f)&&/solid/.test(f))return f;g=g.parentNode}return""}if("FontSize"==a){var h=domUtils.getComputedStyle(c,b),g=/^([\d\.]+)(\w+)$/.exec(h);return g?Math.floor(g[1])+g[2]:h}return domUtils.getComputedStyle(c,b)},queryCommandState:function(a){if(!f[a])return 0;var b=this.queryCommandValue(a);return"fontborder"==a?/1px/.test(b)&&/solid/.test(b):"underline"==a?/underline/.test(b):/line\-through/.test(b)}}}(h,e[h])},UE.plugins.link=function(){function a(a){var b=a.startContainer,c=a.endContainer;(b=domUtils.findParentByTagName(b,"a",!0))&&a.setStartBefore(b),(c=domUtils.findParentByTagName(c,"a",!0))&&a.setEndAfter(c)}function b(b,c,d){var e=b.cloneRange(),f=d.queryCommandValue("link");a(b=b.adjustmentBoundary());var g=b.startContainer;if(1==g.nodeType&&f&&(g=g.childNodes[b.startOffset],g&&1==g.nodeType&&"A"==g.tagName&&/^(?:https?|ftp|file)\s*:\s*\/\//.test(g[browser.ie?"innerText":"textContent"])&&(g[browser.ie?"innerText":"textContent"]=utils.html(c.textValue||c.href))),e.collapsed&&!f||(b.removeInlineStyle("a"),e=b.cloneRange()),e.collapsed){var h=b.document.createElement("a"),i="";c.textValue?(i=utils.html(c.textValue),delete c.textValue):i=utils.html(c.href),domUtils.setAttributes(h,c),g=domUtils.findParentByTagName(e.startContainer,"a",!0),g&&domUtils.isInNodeEndBoundary(e,g)&&b.setStartAfter(g).collapse(!0),h[browser.ie?"innerText":"textContent"]=i,b.insertNode(h).selectNode(h)}else b.applyInlineStyle("a",c)}UE.commands.unlink={execCommand:function(){var b,c=this.selection.getRange();c.collapsed&&!domUtils.findParentByTagName(c.startContainer,"a",!0)||(b=c.createBookmark(),a(c),c.removeInlineStyle("a").moveToBookmark(b).select())},queryCommandState:function(){return!this.highlight&&this.queryCommandValue("link")?0:-1}},UE.commands.link={execCommand:function(a,c){var d;c._href&&(c._href=utils.unhtml(c._href,/[<">]/g)),c.href&&(c.href=utils.unhtml(c.href,/[<">]/g)),c.textValue&&(c.textValue=utils.unhtml(c.textValue,/[<">]/g)),b(d=this.selection.getRange(),c,this),d.collapse().select(!0)},queryCommandValue:function(){var a,b=this.selection.getRange();if(!b.collapsed){b.shrinkBoundary();var c=3!=b.startContainer.nodeType&&b.startContainer.childNodes[b.startOffset]?b.startContainer.childNodes[b.startOffset]:b.startContainer,d=3==b.endContainer.nodeType||0==b.endOffset?b.endContainer:b.endContainer.childNodes[b.endOffset-1],e=b.getCommonAncestor();if(a=domUtils.findParentByTagName(e,"a",!0),!a&&1==e.nodeType)for(var f,g,h,i=e.getElementsByTagName("a"),j=0;h=i[j++];)if(f=domUtils.getPosition(h,c),g=domUtils.getPosition(h,d),(f&domUtils.POSITION_FOLLOWING||f&domUtils.POSITION_CONTAINS)&&(g&domUtils.POSITION_PRECEDING||g&domUtils.POSITION_CONTAINS)){a=h;break}return a}if(a=b.startContainer,a=1==a.nodeType?a:a.parentNode,a&&(a=domUtils.findParentByTagName(a,"a",!0))&&!domUtils.isInNodeEndBoundary(b,a))return a},queryCommandState:function(){var a=this.selection.getRange().getClosedNode(),b=a&&("edui-faked-video"==a.className||a.className.indexOf("edui-upload-video")!=-1);return b?-1:0}}},UE.plugins.insertframe=function(){function a(){b._iframe&&delete b._iframe}var b=this;b.addListener("selectionchange",function(){a()})},UE.commands.scrawl={queryCommandState:function(){return browser.ie&&browser.version<=8?-1:0}},UE.plugins.removeformat=function(){var a=this;a.setOpt({removeFormatTags:"b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var",removeFormatAttributes:"class,style,lang,width,height,align,hspace,valign"}),a.commands.removeformat={execCommand:function(a,b,c,d,e){function f(a){if(3==a.nodeType||"span"!=a.tagName.toLowerCase())return 0;if(browser.ie){var b=a.attributes;if(b.length){for(var c=0,d=b.length;c
    "+this.getContent(null,null,!0)+"
    "),b.close()},notNeedUndo:1},UE.plugins.selectall=function(){var a=this;a.commands.selectall={execCommand:function(){var a=this,b=a.body,c=a.selection.getRange();c.selectNodeContents(b),domUtils.isEmptyBlock(b)&&(browser.opera&&b.firstChild&&1==b.firstChild.nodeType&&c.setStartAtFirst(b.firstChild),c.collapse(!0)),c.select(!0)},notNeedUndo:1},a.addshortcutkey({selectAll:"ctrl+65"})},UE.plugins.paragraph=function(){var a=this,b=domUtils.isBlockElm,c=["TD","LI","PRE"],d=function(a,d,e,f){var g,h=a.createBookmark(),i=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase()&&!domUtils.isBookmarkNode(a):!domUtils.isWhitespace(a)};a.enlarge(!0);for(var j,k=a.createBookmark(),l=domUtils.getNextDomNode(k.start,!1,i),m=a.cloneRange();l&&!(domUtils.getPosition(l,k.end)&domUtils.POSITION_FOLLOWING);)if(3!=l.nodeType&&b(l))l=domUtils.getNextDomNode(l,!0,i);else{for(m.setStartBefore(l);l&&l!==k.end&&!b(l);)j=l,l=domUtils.getNextDomNode(l,!1,null,function(a){return!b(a)});m.setEndAfter(j),g=a.document.createElement(d),e&&(domUtils.setAttributes(g,e),f&&"customstyle"==f&&e.style&&(g.style.cssText=e.style)),g.appendChild(m.extractContents()),domUtils.isEmptyNode(g)&&domUtils.fillChar(a.document,g),m.insertNode(g);var n=g.parentNode;b(n)&&!domUtils.isBody(g.parentNode)&&utils.indexOf(c,n.tagName)==-1&&(f&&"customstyle"==f||(n.getAttribute("dir")&&g.setAttribute("dir",n.getAttribute("dir")),n.style.cssText&&(g.style.cssText=n.style.cssText+";"+g.style.cssText),n.style.textAlign&&!g.style.textAlign&&(g.style.textAlign=n.style.textAlign),n.style.textIndent&&!g.style.textIndent&&(g.style.textIndent=n.style.textIndent),n.style.padding&&!g.style.padding&&(g.style.padding=n.style.padding)),e&&/h\d/i.test(n.tagName)&&!/h\d/i.test(g.tagName)?(domUtils.setAttributes(n,e),f&&"customstyle"==f&&e.style&&(n.style.cssText=e.style),domUtils.remove(g,!0),g=n):domUtils.remove(g.parentNode,!0)),l=utils.indexOf(c,n.tagName)!=-1?n:g,l=domUtils.getNextDomNode(l,!1,i)}return a.moveToBookmark(k).moveToBookmark(h)};a.setOpt("paragraph",{p:"",h1:"",h2:"",h3:"",h4:"",h5:"",h6:""}),a.commands.paragraph={execCommand:function(a,b,c,e){var f=this.selection.getRange();if(f.collapsed){var g=this.document.createTextNode("p");if(f.insertNode(g),browser.ie){var h=g.previousSibling;h&&domUtils.isWhitespace(h)&&domUtils.remove(h),h=g.nextSibling,h&&domUtils.isWhitespace(h)&&domUtils.remove(h)}}if(f=d(f,b,c,e),g&&(f.setStartBefore(g).collapse(!0),pN=g.parentNode,domUtils.remove(g),domUtils.isBlockElm(pN)&&domUtils.isEmptyNode(pN)&&domUtils.fillNode(this.document,pN)),browser.gecko&&f.collapsed&&1==f.startContainer.nodeType){var i=f.startContainer.childNodes[f.startOffset];i&&1==i.nodeType&&i.tagName.toLowerCase()==b&&f.setStart(i,0).collapse(!0)}return f.select(),!0},queryCommandValue:function(){var a=domUtils.filterNodeList(this.selection.getStartElementPath(),"p h1 h2 h3 h4 h5 h6");return a?a.tagName.toLowerCase():""}}},function(){var a=domUtils.isBlockElm,b=function(a){return domUtils.filterNodeList(a.selection.getStartElementPath(),function(a){return a&&1==a.nodeType&&a.getAttribute("dir")})},c=function(c,d,e){var f,g=function(a){return 1==a.nodeType?!domUtils.isBookmarkNode(a):!domUtils.isWhitespace(a)},h=b(d);if(h&&c.collapsed)return h.setAttribute("dir",e),c;f=c.createBookmark(),c.enlarge(!0);for(var i,j=c.createBookmark(),k=domUtils.getNextDomNode(j.start,!1,g),l=c.cloneRange();k&&!(domUtils.getPosition(k,j.end)&domUtils.POSITION_FOLLOWING);)if(3!=k.nodeType&&a(k))k=domUtils.getNextDomNode(k,!0,g);else{for(l.setStartBefore(k);k&&k!==j.end&&!a(k);)i=k,k=domUtils.getNextDomNode(k,!1,null,function(b){return!a(b)});l.setEndAfter(i);var m=l.getCommonAncestor();if(!domUtils.isBody(m)&&a(m))m.setAttribute("dir",e),k=m;else{var n=c.document.createElement("p");n.setAttribute("dir",e);var o=l.extractContents();n.appendChild(o),l.insertNode(n),k=n}k=domUtils.getNextDomNode(k,!1,g)}return c.moveToBookmark(j).moveToBookmark(f)};UE.commands.directionality={execCommand:function(a,b){var d=this.selection.getRange();if(d.collapsed){var e=this.document.createTextNode("d");d.insertNode(e)}return c(d,this,b),e&&(d.setStartBefore(e).collapse(!0),domUtils.remove(e)),d.select(),!0},queryCommandValue:function(){var a=b(this);return a?a.getAttribute("dir"):"ltr"}}}(),UE.plugins.horizontal=function(){var a=this;a.commands.horizontal={execCommand:function(a){var b=this;if(b.queryCommandState(a)!==-1){b.execCommand("insertHtml","
    ");var c=b.selection.getRange(),d=c.startContainer;if(1==d.nodeType&&!d.childNodes[c.startOffset]){var e;(e=d.childNodes[c.startOffset-1])&&1==e.nodeType&&"HR"==e.tagName&&("p"==b.options.enterTag?(e=b.document.createElement("p"),c.insertNode(e),c.setStart(e,0).setCursor()):(e=b.document.createElement("br"),c.insertNode(e),c.setStartBefore(e).setCursor()))}return!0}},queryCommandState:function(){return domUtils.filterNodeList(this.selection.getStartElementPath(),"table")?-1:0}},a.addListener("delkeydown",function(a,b){var c=this.selection.getRange();if(c.txtToElmBoundary(!0),domUtils.isStartInblock(c)){var d=c.startContainer,e=d.previousSibling;if(e&&domUtils.isTagNode(e,"hr"))return domUtils.remove(e),c.select(),domUtils.preventDefault(b),!0}})},UE.commands.time=UE.commands.date={execCommand:function(a,b){function c(a,b){var c=("0"+a.getHours()).slice(-2),d=("0"+a.getMinutes()).slice(-2),e=("0"+a.getSeconds()).slice(-2);return b=b||"hh:ii:ss",b.replace(/hh/gi,c).replace(/ii/gi,d).replace(/ss/gi,e)}function d(a,b){var c=("000"+a.getFullYear()).slice(-4),d=c.slice(-2),e=("0"+(a.getMonth()+1)).slice(-2),f=("0"+a.getDate()).slice(-2);return b=b||"yyyy-mm-dd",b.replace(/yyyy/gi,c).replace(/yy/gi,d).replace(/mm/gi,e).replace(/dd/gi,f)}var e=new Date;this.execCommand("insertHtml","time"==a?c(e,b):d(e,b))}},UE.plugins.rowspacing=function(){var a=this;a.setOpt({rowspacingtop:["5","10","15","20","25"],rowspacingbottom:["5","10","15","20","25"]}),a.commands.rowspacing={execCommand:function(a,b,c){return this.execCommand("paragraph","p",{style:"margin-"+c+":"+b+"px"}),!0},queryCommandValue:function(a,b){var c,d=domUtils.filterNodeList(this.selection.getStartElementPath(),function(a){return domUtils.isBlockElm(a)});return d?(c=domUtils.getComputedStyle(d,"margin-"+b).replace(/[^\d]/g,""),c?c:0):0}}},UE.plugins.lineheight=function(){var a=this;a.setOpt({lineheight:["1","1.5","1.75","2","3","4","5"]}),a.commands.lineheight={execCommand:function(a,b){return this.execCommand("paragraph","p",{style:"line-height:"+("1"==b?"normal":b+"em")}),!0},queryCommandValue:function(){var a=domUtils.filterNodeList(this.selection.getStartElementPath(),function(a){return domUtils.isBlockElm(a)});if(a){var b=domUtils.getComputedStyle(a,"line-height");return"normal"==b?1:b.replace(/[^\d.]*/gi,"")}}}},UE.plugins.insertcode=function(){var a=this;a.ready(function(){utils.cssRule("pre","pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}",a.document)}),a.setOpt("insertcode",{as3:"ActionScript3",bash:"Bash/Shell",cpp:"C/C++",css:"Css",cf:"CodeFunction","c#":"C#",delphi:"Delphi",diff:"Diff",erlang:"Erlang",groovy:"Groovy",html:"Html",java:"Java",jfx:"JavaFx",js:"Javascript",pl:"Perl",php:"Php",plain:"Plain Text",ps:"PowerShell",python:"Python",ruby:"Ruby",scala:"Scala",sql:"Sql",vb:"Vb",xml:"Xml"}),a.commands.insertcode={execCommand:function(a,b){var c=this,d=c.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"pre",!0);if(e)e.className="brush:"+b+";toolbar:false;";else{var f="";if(d.collapsed)f=browser.ie&&browser.ie11below?browser.version<=8?" ":"":"
    ";else{var g=d.extractContents(),h=c.document.createElement("div");h.appendChild(g),utils.each(UE.filterNode(UE.htmlparser(h.innerHTML.replace(/[\r\t]/g,"")),c.options.filterTxtRules).children,function(a){if(browser.ie&&browser.ie11below&&browser.version>8)"element"==a.type?"br"==a.tagName?f+="\n":dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?f+="\n":dtd.$empty[a.tagName]||(f+=b.innerText()):f+=b.data}),/\n$/.test(f)||(f+="\n")):f+=a.data+"\n",!a.nextSibling()&&/\n$/.test(f)&&(f=f.replace(/\n$/,""));else if(browser.ie&&browser.ie11below)"element"==a.type?"br"==a.tagName?f+="
    ":dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?f+="
    ":dtd.$empty[a.tagName]||(f+=b.innerText()):f+=b.data}),/br>$/.test(f)||(f+="
    ")):f+=a.data+"
    ",!a.nextSibling()&&/
    $/.test(f)&&(f=f.replace(/
    $/,""));else if(f+="element"==a.type?dtd.$empty[a.tagName]?"":a.innerText():a.data,!/br\/?\s*>$/.test(f)){if(!a.nextSibling())return;f+="
    "}})}c.execCommand("inserthtml",'
    '+f+"
    ",!0),e=c.document.getElementById("coder"),domUtils.removeAttributes(e,"id");var i=e.previousSibling;i&&(3==i.nodeType&&1==i.nodeValue.length&&browser.ie&&6==browser.version||domUtils.isEmptyBlock(i))&&domUtils.remove(i);var d=c.selection.getRange();domUtils.isEmptyBlock(e)?d.setStart(e,0).setCursor(!1,!0):d.selectNodeContents(e).select()}},queryCommandValue:function(){var a=this.selection.getStartElementPath(),b="";return utils.each(a,function(a){if("PRE"==a.nodeName){var c=a.className.match(/brush:([^;]+)/);return b=c&&c[1]?c[1]:"",!1}}),b}},a.addInputRule(function(a){utils.each(a.getNodesByTagName("pre"),function(a){var b=a.getNodesByTagName("br");if(b.length)return void(browser.ie&&browser.ie11below&&browser.version>8&&utils.each(b,function(a){var b=UE.uNode.createText("\n");a.parentNode.insertBefore(b,a),a.parentNode.removeChild(a)}));if(!(browser.ie&&browser.ie11below&&browser.version>8)){var c=a.innerText().split(/\n/);a.innerHTML(""),utils.each(c,function(b){b.length&&a.appendChild(UE.uNode.createText(b)),a.appendChild(UE.uNode.createElement("br"))})}})}),a.addOutputRule(function(a){utils.each(a.getNodesByTagName("pre"),function(a){var b="";utils.each(a.children,function(a){b+="text"==a.type?a.data.replace(/[ ]/g," ").replace(/\n$/,""):"br"==a.tagName?"\n":dtd.$empty[a.tagName]?a.innerText():""}),a.innerText(b.replace(/( |\n)+$/,""))})}),a.notNeedCodeQuery={help:1,undo:1,redo:1,source:1,print:1,searchreplace:1,fullscreen:1,preview:1,insertparagraph:1,elementpath:1,insertcode:1,inserthtml:1,selectall:1};a.queryCommandState;a.queryCommandState=function(a){var b=this;return!b.notNeedCodeQuery[a.toLowerCase()]&&b.selection&&b.queryCommandValue("insertcode")?-1:UE.Editor.prototype.queryCommandState.apply(this,arguments)},a.addListener("beforeenterkeydown",function(){var b=a.selection.getRange(),c=domUtils.findParentByTagName(b.startContainer,"pre",!0);if(c){if(a.fireEvent("saveScene"),b.collapsed||b.deleteContents(),!browser.ie||browser.ie9above){var c,d=a.document.createElement("br");b.insertNode(d).setStartAfter(d).collapse(!0);var e=d.nextSibling;e||browser.ie&&!(browser.version>10)?b.setStartAfter(d):b.insertNode(d.cloneNode(!1)), +c=d.previousSibling;for(var f;c;)if(f=c,c=c.previousSibling,!c||"BR"==c.nodeName){c=f;break}if(c){for(var g="";c&&"BR"!=c.nodeName&&new RegExp("^[\\s"+domUtils.fillChar+"]*$").test(c.nodeValue);)g+=c.nodeValue,c=c.nextSibling;if("BR"!=c.nodeName){var h=c.nodeValue.match(new RegExp("^([\\s"+domUtils.fillChar+"]+)"));h&&h[1]&&(g+=h[1])}g&&(g=a.document.createTextNode(g),b.insertNode(g).setStartAfter(g))}b.collapse(!0).select(!0)}else if(browser.version>8){var i=a.document.createTextNode("\n"),j=b.startContainer;if(0==b.startOffset){var k=j.previousSibling;if(k){b.insertNode(i);var l=a.document.createTextNode(" ");b.setStartAfter(i).insertNode(l).setStart(l,0).collapse(!0).select(!0)}}else{b.insertNode(i).setStartAfter(i);var l=a.document.createTextNode(" ");j=b.startContainer.childNodes[b.startOffset],j&&!/^\n/.test(j.nodeValue)&&b.setStartBefore(i),b.insertNode(l).setStart(l,0).collapse(!0).select(!0)}}else{var d=a.document.createElement("br");b.insertNode(d),b.insertNode(a.document.createTextNode(domUtils.fillChar)),b.setStartAfter(d),c=d.previousSibling;for(var f;c;)if(f=c,c=c.previousSibling,!c||"BR"==c.nodeName){c=f;break}if(c){for(var g="";c&&"BR"!=c.nodeName&&new RegExp("^[ "+domUtils.fillChar+"]*$").test(c.nodeValue);)g+=c.nodeValue,c=c.nextSibling;if("BR"!=c.nodeName){var h=c.nodeValue.match(new RegExp("^([ "+domUtils.fillChar+"]+)"));h&&h[1]&&(g+=h[1])}g=a.document.createTextNode(g),b.insertNode(g).setStartAfter(g)}b.collapse(!0).select()}return a.fireEvent("saveScene"),!0}}),a.addListener("tabkeydown",function(b,c){var d=a.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"pre",!0);if(e){if(a.fireEvent("saveScene"),c.shiftKey);else if(d.collapsed){var f=a.document.createTextNode(" ");d.insertNode(f).setStartAfter(f).collapse(!0).select(!0)}else{for(var g=d.createBookmark(),h=g.start.previousSibling;h;){if(e.firstChild===h&&!domUtils.isBr(h)){e.insertBefore(a.document.createTextNode(" "),h);break}if(domUtils.isBr(h)){e.insertBefore(a.document.createTextNode(" "),h.nextSibling);break}h=h.previousSibling}var i=g.end;for(h=g.start.nextSibling,e.firstChild===g.start&&e.insertBefore(a.document.createTextNode(" "),h.nextSibling);h&&h!==i;){if(domUtils.isBr(h)&&h.nextSibling){if(h.nextSibling===i)break;e.insertBefore(a.document.createTextNode(" "),h.nextSibling)}h=h.nextSibling}d.moveToBookmark(g).select()}return a.fireEvent("saveScene"),!0}}),a.addListener("beforeinserthtml",function(a,b){var c=this,d=c.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"pre",!0);if(e){d.collapsed||d.deleteContents();var f="";if(browser.ie&&browser.version>8){utils.each(UE.filterNode(UE.htmlparser(b),c.options.filterTxtRules).children,function(a){"element"==a.type?"br"==a.tagName?f+="\n":dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?f+="\n":dtd.$empty[a.tagName]||(f+=b.innerText()):f+=b.data}),/\n$/.test(f)||(f+="\n")):f+=a.data+"\n",!a.nextSibling()&&/\n$/.test(f)&&(f=f.replace(/\n$/,""))});var g=c.document.createTextNode(utils.html(f.replace(/ /g," ")));d.insertNode(g).selectNode(g).select()}else{var h=c.document.createDocumentFragment();utils.each(UE.filterNode(UE.htmlparser(b),c.options.filterTxtRules).children,function(a){"element"==a.type?"br"==a.tagName?h.appendChild(c.document.createElement("br")):dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?h.appendChild(c.document.createElement("br")):dtd.$empty[a.tagName]||h.appendChild(c.document.createTextNode(utils.html(b.innerText().replace(/ /g," ")))):h.appendChild(c.document.createTextNode(utils.html(b.data.replace(/ /g," "))))}),"BR"!=h.lastChild.nodeName&&h.appendChild(c.document.createElement("br"))):h.appendChild(c.document.createTextNode(utils.html(a.data.replace(/ /g," ")))),a.nextSibling()||"BR"!=h.lastChild.nodeName||h.removeChild(h.lastChild)}),d.insertNode(h).select()}return!0}}),a.addListener("keydown",function(a,b){var c=this,d=b.keyCode||b.which;if(40==d){var e,f=c.selection.getRange(),g=f.startContainer;if(f.collapsed&&(e=domUtils.findParentByTagName(f.startContainer,"pre",!0))&&!e.nextSibling){for(var h=e.lastChild;h&&"BR"==h.nodeName;)h=h.previousSibling;(h===g||f.startContainer===e&&f.startOffset==e.childNodes.length)&&(c.execCommand("insertparagraph"),domUtils.preventDefault(b))}}}),a.addListener("delkeydown",function(b,c){var d=this.selection.getRange();d.txtToElmBoundary(!0);var e=d.startContainer;if(domUtils.isTagNode(e,"pre")&&d.collapsed&&domUtils.isStartInblock(d)){var f=a.document.createElement("p");return domUtils.fillNode(a.document,f),e.parentNode.insertBefore(f,e),domUtils.remove(e),d.setStart(f,0).setCursor(!1,!0),domUtils.preventDefault(c),!0}})},UE.commands.cleardoc={execCommand:function(a){var b=this,c=b.options.enterTag,d=b.selection.getRange();"br"==c?(b.body.innerHTML="
    ",d.setStart(b.body,0).setCursor()):(b.body.innerHTML="

    "+(ie?"":"
    ")+"

    ",d.setStart(b.body.firstChild,0).setCursor(!1,!0)),setTimeout(function(){b.fireEvent("clearDoc")},0)}},UE.plugin.register("anchor",function(){return{bindEvents:{ready:function(){utils.cssRule("anchor",".anchorclass{background: url('"+this.options.themePath+this.options.theme+"/images/anchor.gif') no-repeat scroll left center transparent;cursor: auto;display: inline-block;height: 16px;width: 15px;}",this.document)}},outputRule:function(a){utils.each(a.getNodesByTagName("img"),function(a){var b;(b=a.getAttr("anchorname"))&&(a.tagName="a",a.setAttr({anchorname:"",name:b,"class":""}))})},inputRule:function(a){utils.each(a.getNodesByTagName("a"),function(a){var b;(b=a.getAttr("name"))&&!a.getAttr("href")&&(a.tagName="img",a.setAttr({anchorname:a.getAttr("name"),"class":"anchorclass"}),a.setAttr("name"))})},commands:{anchor:{execCommand:function(a,b){var c=this.selection.getRange(),d=c.getClosedNode();if(d&&d.getAttribute("anchorname"))b?d.setAttribute("anchorname",b):(c.setStartBefore(d).setCursor(),domUtils.remove(d));else if(b){var e=this.document.createElement("img");c.collapse(!0),domUtils.setAttributes(e,{anchorname:b,"class":"anchorclass"}),c.insertNode(e).setStartAfter(e).setCursor(!1,!0)}}}}}}),UE.plugins.wordcount=function(){var a=this;a.setOpt("wordCount",!0),a.addListener("contentchange",function(){a.fireEvent("wordcount")});var b;a.addListener("ready",function(){var a=this;domUtils.on(a.body,"keyup",function(c){var d=c.keyCode||c.which,e={16:1,18:1,20:1,37:1,38:1,39:1,40:1};d in e||(clearTimeout(b),b=setTimeout(function(){a.fireEvent("wordcount")},200))})})},UE.plugins.pagebreak=function(){function a(a){if(domUtils.isEmptyBlock(a)){for(var b,d=a.firstChild;d&&1==d.nodeType&&domUtils.isEmptyBlock(d);)b=d,d=d.firstChild;!b&&(b=a),domUtils.fillNode(c.document,b)}}function b(a){return a&&1==a.nodeType&&"HR"==a.tagName&&"pagebreak"==a.className}var c=this,d=["td"];c.setOpt("pageBreakTag","_ueditor_page_break_tag_"),c.ready(function(){utils.cssRule("pagebreak",".pagebreak{display:block;clear:both !important;cursor:default !important;width: 100% !important;margin:0;}",c.document)}),c.addInputRule(function(a){a.traversal(function(a){if("text"==a.type&&a.data==c.options.pageBreakTag){var b=UE.uNode.createElement('
    ');a.parentNode.insertBefore(b,a),a.parentNode.removeChild(a)}})}),c.addOutputRule(function(a){utils.each(a.getNodesByTagName("hr"),function(a){if("pagebreak"==a.getAttr("class")){var b=UE.uNode.createText(c.options.pageBreakTag);a.parentNode.insertBefore(b,a),a.parentNode.removeChild(a)}})}),c.commands.pagebreak={execCommand:function(){var e=c.selection.getRange(),f=c.document.createElement("hr");domUtils.setAttributes(f,{"class":"pagebreak",noshade:"noshade",size:"5"}),domUtils.unSelectable(f);var g,h=domUtils.findParentByTagName(e.startContainer,d,!0),i=[];if(h)switch(h.tagName){case"TD":if(g=h.parentNode,g.previousSibling)g.parentNode.insertBefore(f,g),i=domUtils.findParents(f);else{var j=domUtils.findParentByTagName(g,"table");j.parentNode.insertBefore(f,j),i=domUtils.findParents(f,!0)}g=i[1],f!==g&&domUtils.breakParent(f,g),c.fireEvent("afteradjusttable",c.document)}else{if(!e.collapsed){e.deleteContents();for(var k=e.startContainer;!domUtils.isBody(k)&&domUtils.isBlockElm(k)&&domUtils.isEmptyNode(k);)e.setStartBefore(k).collapse(!0),domUtils.remove(k),k=e.startContainer}e.insertNode(f);for(var l,g=f.parentNode;!domUtils.isBody(g);)domUtils.breakParent(f,g),l=f.nextSibling,l&&domUtils.isEmptyBlock(l)&&domUtils.remove(l),g=f.parentNode;l=f.nextSibling;var m=f.previousSibling;if(b(m)?domUtils.remove(m):m&&a(m),l)b(l)?domUtils.remove(l):a(l),e.setEndAfter(f).collapse(!1);else{var n=c.document.createElement("p");f.parentNode.appendChild(n),domUtils.fillNode(c.document,n),e.setStart(n,0).collapse(!0)}e.select(!0)}}}},UE.plugin.register("wordimage",function(){var a=this,b=[];return{commands:{wordimage:{execCommand:function(){for(var b,c=domUtils.getElementsByTagName(a.body,"img"),d=[],e=0;b=c[e++];){var f=b.getAttribute("word_img");f&&d.push(f)}return d},queryCommandState:function(){b=domUtils.getElementsByTagName(a.body,"img");for(var c,d=0;c=b[d++];)if(c.getAttribute("word_img"))return 1;return-1},notNeedUndo:!0}},inputRule:function(b){utils.each(b.getNodesByTagName("img"),function(b){var c=b.attrs,d=parseInt(c.width)<128||parseInt(c.height)<43,e=a.options,f=e.UEDITOR_HOME_URL+"themes/default/images/spacer.gif";c.src&&/^(?:(file:\/+))/.test(c.src)&&b.setAttr({width:c.width,height:c.height,alt:c.alt,word_img:c.src,src:f,style:"background:url("+(d?e.themePath+e.theme+"/images/word.gif":e.langPath+e.lang+"/images/localimage.png")+") no-repeat center center;border:1px solid #ddd"})})}}}),UE.plugins.dragdrop=function(){var a=this;a.ready(function(){domUtils.on(this.body,"dragend",function(){var b=a.selection.getRange(),c=b.getClosedNode()||a.selection.getStart();if(c&&"IMG"==c.tagName){for(var d,e=c.previousSibling;(d=c.nextSibling)&&1==d.nodeType&&"SPAN"==d.tagName&&!d.firstChild;)domUtils.remove(d);(!e||1!=e.nodeType||domUtils.isEmptyBlock(e))&&e||d&&(!d||domUtils.isEmptyBlock(d))||(e&&"P"==e.tagName&&!domUtils.isEmptyBlock(e)?(e.appendChild(c),domUtils.moveChild(d,e),domUtils.remove(d)):d&&"P"==d.tagName&&!domUtils.isEmptyBlock(d)&&d.insertBefore(c,d.firstChild),e&&"P"==e.tagName&&domUtils.isEmptyBlock(e)&&domUtils.remove(e),d&&"P"==d.tagName&&domUtils.isEmptyBlock(d)&&domUtils.remove(d),b.selectNode(c).select(),a.fireEvent("saveScene"))}})}),a.addListener("keyup",function(b,c){var d=c.keyCode||c.which;if(13==d){var e,f=a.selection.getRange();(e=domUtils.findParentByTagName(f.startContainer,"p",!0))&&"center"==domUtils.getComputedStyle(e,"text-align")&&domUtils.removeStyle(e,"text-align")}})},UE.plugins.undo=function(){function a(a,b){if(a.length!=b.length)return 0;for(var c=0,d=a.length;cf&&this.list.shift(),this.index=this.list.length-1,this.clearKey(),this.update())},this.update=function(){this.hasRedo=!!this.list[this.index+1],this.hasUndo=!!this.list[this.index-1]},this.reset=function(){this.list=[],this.index=0,this.hasUndo=!1,this.hasRedo=!1,this.clearKey()},this.clearKey=function(){m=0,k=null}}var d,e=this,f=e.options.maxUndoCount||20,g=e.options.maxInputCount||20,h=new RegExp(domUtils.fillChar+"|","gi"),i={ol:1,ul:1,table:1,tbody:1,tr:1,body:1},j=e.options.autoClearEmptyNode;e.undoManger=new c,e.undoManger.editor=e,e.addListener("saveScene",function(){var a=Array.prototype.splice.call(arguments,1);this.undoManger.save.apply(this.undoManger,a)}),e.addListener("reset",function(a,b){b||this.undoManger.reset()}),e.commands.redo=e.commands.undo={execCommand:function(a){this.undoManger[a]()},queryCommandState:function(a){return this.undoManger["has"+("undo"==a.toLowerCase()?"Undo":"Redo")]?0:-1},notNeedUndo:1};var k,l={16:1,17:1,18:1,37:1,38:1,39:1,40:1},m=0,n=!1;e.addListener("ready",function(){domUtils.on(this.body,"compositionstart",function(){n=!0}),domUtils.on(this.body,"compositionend",function(){n=!1})}),e.addshortcutkey({Undo:"ctrl+90",Redo:"ctrl+89"});var o=!0;e.addListener("keydown",function(a,b){function c(a){a.undoManger.save(!1,!0),a.fireEvent("selectionchange")}var e=this,f=b.keyCode||b.which;if(!(l[f]||b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)){if(n)return;if(!e.selection.getRange().collapsed)return e.undoManger.save(!1,!0),void(o=!1);0==e.undoManger.list.length&&e.undoManger.save(!0),clearTimeout(d),d=setTimeout(function(){if(n)var a=setInterval(function(){n||(c(e),clearInterval(a))},300);else c(e)},200),k=f,m++,m>=g&&c(e)}}),e.addListener("keyup",function(a,b){var c=b.keyCode||b.which;if(!(l[c]||b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)){if(n)return;o||(this.undoManger.save(!1,!0),o=!0)}}),e.stopCmdUndo=function(){e.__hasEnterExecCommand=!0},e.startCmdUndo=function(){e.__hasEnterExecCommand=!1}},UE.plugin.register("copy",function(){function a(){ZeroClipboard.config({debug:!1,swfPath:b.options.UEDITOR_HOME_URL+"third-party/zeroclipboard/ZeroClipboard.swf"});var a=b.zeroclipboard=new ZeroClipboard;a.on("copy",function(a){var c=a.client,d=b.selection.getRange(),e=document.createElement("div");e.appendChild(d.cloneContents()),c.setText(e.innerText||e.textContent),c.setHtml(e.innerHTML),d.select()}),a.on("mouseover mouseout",function(a){var b=a.target;"mouseover"==a.type?domUtils.addClass(b,"edui-state-hover"):"mouseout"==a.type&&domUtils.removeClasses(b,"edui-state-hover")}),a.on("wrongflash noflash",function(){ZeroClipboard.destroy()})}var b=this;return{bindEvents:{ready:function(){browser.ie||(window.ZeroClipboard?a():utils.loadFile(document,{src:b.options.UEDITOR_HOME_URL+"third-party/zeroclipboard/ZeroClipboard.js",tag:"script",type:"text/javascript",defer:"defer"},function(){a()}))}},commands:{copy:{execCommand:function(a){b.document.execCommand("copy")||alert(b.getLang("copymsg"))}}}}}),UE.plugins.paste=function(){function a(a){var b=this.document;if(!b.getElementById("baidu_pastebin")){var c=this.selection.getRange(),d=c.createBookmark(),e=b.createElement("div");e.id="baidu_pastebin",browser.webkit&&e.appendChild(b.createTextNode(domUtils.fillChar+domUtils.fillChar)),b.body.appendChild(e),d.start.style.display="",e.style.cssText="position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:"+domUtils.getXY(d.start).y+"px",c.selectNodeContents(e).select(!0),setTimeout(function(){if(browser.webkit)for(var f,g=0,h=b.querySelectorAll("#baidu_pastebin");f=h[g++];){if(!domUtils.isEmptyNode(f)){e=f;break}domUtils.remove(f)}try{e.parentNode.removeChild(e)}catch(i){}c.moveToBookmark(d).select(!0),a(e)},0)}}function b(a){return a.replace(/<(\/?)([\w\-]+)([^>]*)>/gi,function(a,b,c,d){return c=c.toLowerCase(),{img:1}[c]?a:(d=d.replace(/([\w\-]*?)\s*=\s*(("([^"]*)")|('([^']*)')|([^\s>]+))/gi,function(a,b,c){return{src:1,href:1,name:1}[b.toLowerCase()]?b+"="+c+" ":""}),{span:1,div:1}[c]?"":"<"+b+c+" "+utils.trim(d)+">")})}function c(a){var c;if(a.firstChild){for(var h,i=domUtils.getElementsByTagName(a,"span"),j=0;h=i[j++];)"_baidu_cut_start"!=h.id&&"_baidu_cut_end"!=h.id||domUtils.remove(h);if(browser.webkit){for(var k,l=a.querySelectorAll("div br"),j=0;k=l[j++];){var m=k.parentNode;"DIV"==m.tagName&&1==m.childNodes.length&&(m.innerHTML="


    ",domUtils.remove(m))}for(var n,o=a.querySelectorAll("#baidu_pastebin"),j=0;n=o[j++];){var p=d.document.createElement("p");for(n.parentNode.insertBefore(p,n);n.firstChild;)p.appendChild(n.firstChild);domUtils.remove(n)}for(var q,r=a.querySelectorAll("meta"),j=0;q=r[j++];)domUtils.remove(q);var l=a.querySelectorAll("br");for(j=0;q=l[j++];)/^apple-/i.test(q.className)&&domUtils.remove(q)}if(browser.gecko){var s=a.querySelectorAll("[_moz_dirty]");for(j=0;q=s[j++];)q.removeAttribute("_moz_dirty")}if(!browser.ie)for(var q,t=a.querySelectorAll("span.Apple-style-span"),j=0;q=t[j++];)domUtils.remove(q,!0);c=a.innerHTML,c=UE.filterWord(c);var u=UE.htmlparser(c);if(d.options.filterRules&&UE.filterNode(u,d.options.filterRules),d.filterInputRule(u),browser.webkit){var v=u.lastChild();v&&"element"==v.type&&"br"==v.tagName&&u.removeChild(v),utils.each(d.body.querySelectorAll("div"),function(a){domUtils.isEmptyBlock(a)&&domUtils.remove(a,!0)})}if(c={html:u.toHtml()},d.fireEvent("beforepaste",c,u),!c.html)return;u=UE.htmlparser(c.html,!0),1===d.queryCommandState("pasteplain")?d.execCommand("insertHtml",UE.filterNode(u,d.options.filterTxtRules).toHtml(),!0):(UE.filterNode(u,d.options.filterTxtRules),e=u.toHtml(),f=c.html,g=d.selection.getRange().createAddress(!0),d.execCommand("insertHtml",d.getOpt("retainOnlyLabelPasted")===!0?b(f):f,!0)),d.fireEvent("afterpaste",c)}}var d=this;d.setOpt({retainOnlyLabelPasted:!1});var e,f,g;d.addListener("pasteTransfer",function(a,c){if(g&&e&&f&&e!=f){var h=d.selection.getRange();if(h.moveToAddress(g,!0),!h.collapsed){for(;!domUtils.isBody(h.startContainer);){var i=h.startContainer;if(1==i.nodeType){if(i=i.childNodes[h.startOffset],!i){h.setStartBefore(h.startContainer);continue}var j=i.previousSibling;j&&3==j.nodeType&&new RegExp("^[\n\r\t "+domUtils.fillChar+"]*$").test(j.nodeValue)&&h.setStartBefore(j)}if(0!=h.startOffset)break;h.setStartBefore(h.startContainer)}for(;!domUtils.isBody(h.endContainer);){var k=h.endContainer;if(1==k.nodeType){if(k=k.childNodes[h.endOffset],!k){h.setEndAfter(h.endContainer);continue}var l=k.nextSibling;l&&3==l.nodeType&&new RegExp("^[\n\r\t"+domUtils.fillChar+"]*$").test(l.nodeValue)&&h.setEndAfter(l)}if(h.endOffset!=h.endContainer[3==h.endContainer.nodeType?"nodeValue":"childNodes"].length)break;h.setEndAfter(h.endContainer)}}h.deleteContents(),h.select(!0),d.__hasEnterExecCommand=!0;var m=f;2===c?m=b(m):c&&(m=e),d.execCommand("inserthtml",m,!0),d.__hasEnterExecCommand=!1;for(var n=d.selection.getRange();!domUtils.isBody(n.startContainer)&&!n.startOffset&&n.startContainer[3==n.startContainer.nodeType?"nodeValue":"childNodes"].length;)n.setStartBefore(n.startContainer);var o=n.createAddress(!0);g.endAddress=o.startAddress}}),d.addListener("ready",function(){domUtils.on(d.body,"cut",function(){var a=d.selection.getRange();!a.collapsed&&d.undoManger&&d.undoManger.save()}),domUtils.on(d.body,browser.ie||browser.opera?"keydown":"paste",function(b){(!browser.ie&&!browser.opera||(b.ctrlKey||b.metaKey)&&"86"==b.keyCode)&&a.call(d,function(a){c(a)})})}),d.commands.paste={execCommand:function(b){browser.ie?(a.call(d,function(a){c(a)}),d.document.execCommand("paste")):alert(d.getLang("pastemsg"))}}},UE.plugins.pasteplain=function(){var a=this;a.setOpt({pasteplain:!1,filterTxtRules:function(){function a(a){a.tagName="p",a.setStyle()}function b(a){a.parentNode.removeChild(a,!0)}return{"-":"script style object iframe embed input select",p:{$:{}},br:{$:{}},div:function(a){for(var b,c=UE.uNode.createElement("p");b=a.firstChild();)"text"!=b.type&&UE.dom.dtd.$block[b.tagName]?c.firstChild()?(a.parentNode.insertBefore(c,a),c=UE.uNode.createElement("p")):a.parentNode.insertBefore(b,a):c.appendChild(b);c.firstChild()&&a.parentNode.insertBefore(c,a),a.parentNode.removeChild(a)},ol:b,ul:b,dl:b,dt:b,dd:b,li:b,caption:a,th:a,tr:a,h1:a,h2:a,h3:a,h4:a,h5:a,h6:a,td:function(a){var b=!!a.innerText();b&&a.parentNode.insertAfter(UE.uNode.createText("    "),a),a.parentNode.removeChild(a,a.innerText())}}}()});var b=a.options.pasteplain;a.commands.pasteplain={queryCommandState:function(){return b?1:0},execCommand:function(){b=0|!b},notNeedUndo:1}},UE.plugins.list=function(){function a(a){var b=[];for(var c in a)b.push(c);return b}function b(a){var b=a.className;return domUtils.hasClass(a,/custom_/)?b.match(/custom_(\w+)/)[1]:domUtils.getStyle(a,"list-style-type")}function c(a,c){utils.each(domUtils.getElementsByTagName(a,"ol ul"),function(f){if(domUtils.inDoc(f,a)){var g=f.parentNode;if(g.tagName==f.tagName){var h=b(f)||("OL"==f.tagName?"decimal":"disc"),i=b(g)||("OL"==g.tagName?"decimal":"disc");if(h==i){var l=utils.indexOf(k[f.tagName],h);l=l+1==k[f.tagName].length?0:l+1,e(f,k[f.tagName][l])}}var m=0,n=2;domUtils.hasClass(f,/custom_/)?/[ou]l/i.test(g.tagName)&&domUtils.hasClass(g,/custom_/)||(n=1):/[ou]l/i.test(g.tagName)&&domUtils.hasClass(g,/custom_/)&&(n=3);var o=domUtils.getStyle(f,"list-style-type");o&&(f.style.cssText="list-style-type:"+o),f.className=utils.trim(f.className.replace(/list-paddingleft-\w+/,""))+" list-paddingleft-"+n,utils.each(domUtils.getElementsByTagName(f,"li"),function(a){if(a.style.cssText&&(a.style.cssText=""),!a.firstChild)return void domUtils.remove(a);if(a.parentNode===f){if(m++,domUtils.hasClass(f,/custom_/)){var c=1,d=b(f);if("OL"==f.tagName){if(d)switch(d){case"cn":case"cn1":case"cn2":m>10&&(m%10==0||m>10&&m<20)?c=2:m>20&&(c=3);break;case"num2":m>9&&(c=2)}a.className="list-"+j[d]+m+" list-"+d+"-paddingleft-"+c}else a.className="list-"+j[d]+" list-"+d+"-paddingleft"}else a.className=a.className.replace(/list-[\w\-]+/gi,"");var e=a.getAttribute("class");null===e||e.replace(/\s/g,"")||domUtils.removeAttributes(a,"class")}}),!c&&d(f,f.tagName.toLowerCase(),b(f)||domUtils.getStyle(f,"list-style-type"),!0)}})}function d(a,d,e,f){var g=a.nextSibling;g&&1==g.nodeType&&g.tagName.toLowerCase()==d&&(b(g)||domUtils.getStyle(g,"list-style-type")||("ol"==d?"decimal":"disc"))==e&&(domUtils.moveChild(g,a),0==g.childNodes.length&&domUtils.remove(g)),g&&domUtils.isFillChar(g)&&domUtils.remove(g);var h=a.previousSibling;h&&1==h.nodeType&&h.tagName.toLowerCase()==d&&(b(h)||domUtils.getStyle(h,"list-style-type")||("ol"==d?"decimal":"disc"))==e&&domUtils.moveChild(a,h),h&&domUtils.isFillChar(h)&&domUtils.remove(h),!f&&domUtils.isEmptyBlock(a)&&domUtils.remove(a),b(a)&&c(a.ownerDocument,!0)}function e(a,b){j[b]&&(a.className="custom_"+b);try{domUtils.setStyle(a,"list-style-type",b)}catch(c){}}function f(a){var b=a.previousSibling;b&&domUtils.isEmptyBlock(b)&&domUtils.remove(b),b=a.nextSibling,b&&domUtils.isEmptyBlock(b)&&domUtils.remove(b)}function g(a){for(;a&&!domUtils.isBody(a);){if("TABLE"==a.nodeName)return null;if("LI"==a.nodeName)return a;a=a.parentNode}}var h=this,i={TD:1,PRE:1,BLOCKQUOTE:1},j={cn:"cn-1-",cn1:"cn-2-",cn2:"cn-3-",num:"num-1-",num1:"num-2-",num2:"num-3-",dash:"dash",dot:"dot"};h.setOpt({autoTransWordToList:!1,insertorderedlist:{num:"",num1:"",num2:"",cn:"",cn1:"",cn2:"",decimal:"","lower-alpha":"","lower-roman":"","upper-alpha":"","upper-roman":""},insertunorderedlist:{circle:"",disc:"",square:"",dash:"",dot:""},listDefaultPaddingLeft:"30",listiconpath:"http://bs.baidu.com/listicon/",maxListLevel:-1,disablePInList:!1});var k={OL:a(h.options.insertorderedlist),UL:a(h.options.insertunorderedlist)},l=h.options.listiconpath;for(var m in j)h.options.insertorderedlist.hasOwnProperty(m)||h.options.insertunorderedlist.hasOwnProperty(m)||delete j[m];h.ready(function(){var a=[];for(var b in j){if("dash"==b||"dot"==b)a.push("li.list-"+j[b]+"{background-image:url("+l+j[b]+".gif)}"),a.push("ul.custom_"+b+"{list-style:none;}ul.custom_"+b+" li{background-position:0 3px;background-repeat:no-repeat}");else{for(var c=0;c<99;c++)a.push("li.list-"+j[b]+c+"{background-image:url("+l+"list-"+j[b]+c+".gif)}");a.push("ol.custom_"+b+"{list-style:none;}ol.custom_"+b+" li{background-position:0 3px;background-repeat:no-repeat}")}switch(b){case"cn":a.push("li.list-"+b+"-paddingleft-1{padding-left:25px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:40px}"),a.push("li.list-"+b+"-paddingleft-3{padding-left:55px}");break;case"cn1":a.push("li.list-"+b+"-paddingleft-1{padding-left:30px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:40px}"),a.push("li.list-"+b+"-paddingleft-3{padding-left:55px}");break;case"cn2":a.push("li.list-"+b+"-paddingleft-1{padding-left:40px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:55px}"),a.push("li.list-"+b+"-paddingleft-3{padding-left:68px}");break;case"num":case"num1":a.push("li.list-"+b+"-paddingleft-1{padding-left:25px}");break;case"num2":a.push("li.list-"+b+"-paddingleft-1{padding-left:35px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:40px}");break;case"dash":a.push("li.list-"+b+"-paddingleft{padding-left:35px}");break;case"dot":a.push("li.list-"+b+"-paddingleft{padding-left:20px}")}}a.push(".list-paddingleft-1{padding-left:0}"),a.push(".list-paddingleft-2{padding-left:"+h.options.listDefaultPaddingLeft+"px}"),a.push(".list-paddingleft-3{padding-left:"+2*h.options.listDefaultPaddingLeft+"px}"),utils.cssRule("list","ol,ul{margin:0;pading:0;"+(browser.ie?"":"width:95%")+"}li{clear:both;}"+a.join("\n"),h.document)}),h.ready(function(){domUtils.on(h.body,"cut",function(){setTimeout(function(){var a,b=h.selection.getRange();if(!b.collapsed&&(a=domUtils.findParentByTagName(b.startContainer,"li",!0))&&!a.nextSibling&&domUtils.isEmptyBlock(a)){var c,d=a.parentNode;if(c=d.previousSibling)domUtils.remove(d),b.setStartAtLast(c).collapse(!0),b.select(!0);else if(c=d.nextSibling)domUtils.remove(d),b.setStartAtFirst(c).collapse(!0),b.select(!0);else{var e=h.document.createElement("p");domUtils.fillNode(h.document,e),d.parentNode.insertBefore(e,d),domUtils.remove(d),b.setStart(e,0).collapse(!0),b.select(!0)}}})})}),h.addListener("beforepaste",function(a,c){var d,e=this,f=e.selection.getRange(),g=UE.htmlparser(c.html,!0);if(d=domUtils.findParentByTagName(f.startContainer,"li",!0)){var h=d.parentNode,i="OL"==h.tagName?"ul":"ol";utils.each(g.getNodesByTagName(i),function(c){if(c.tagName=h.tagName,c.setAttr(),c.parentNode===g)a=b(h)||("OL"==h.tagName?"decimal":"disc");else{var d=c.parentNode.getAttr("class");a=d&&/custom_/.test(d)?d.match(/custom_(\w+)/)[1]:c.parentNode.getStyle("list-style-type"),a||(a="OL"==h.tagName?"decimal":"disc")}var e=utils.indexOf(k[h.tagName],a);c.parentNode!==g&&(e=e+1==k[h.tagName].length?0:e+1);var f=k[h.tagName][e];j[f]?c.setAttr("class","custom_"+f):c.setStyle("list-style-type",f)})}c.html=g.toHtml()}),h.getOpt("disablePInList")===!0&&h.addOutputRule(function(a){utils.each(a.getNodesByTagName("li"),function(a){var b=[],c=0;utils.each(a.children,function(d){if("p"==d.tagName){for(var e;e=d.children.pop();)b.splice(c,0,e),e.parentNode=a,lastNode=e;if(e=b[b.length-1],!e||"element"!=e.type||"br"!=e.tagName){var f=UE.uNode.createElement("br");f.parentNode=a,b.push(f)}c=b.length}}),b.length&&(a.children=b)})}),h.addInputRule(function(a){function b(a,b){var e=b.firstChild();if(e&&"element"==e.type&&"span"==e.tagName&&/Wingdings|Symbol/.test(e.getStyle("font-family"))){for(var f in d)if(d[f]==e.data)return f;return"disc"}for(var f in c)if(c[f].test(a))return f}if(utils.each(a.getNodesByTagName("li"),function(a){for(var b,c=UE.uNode.createElement("p"),d=0;b=a.children[d];)"text"==b.type||dtd.p[b.tagName]?c.appendChild(b):c.firstChild()?(a.insertBefore(c,b),c=UE.uNode.createElement("p"),d+=2):d++;(c.firstChild()&&!c.parentNode||!a.firstChild())&&a.appendChild(c),c.firstChild()||c.innerHTML(browser.ie?" ":"
    ");var e=a.firstChild(),f=e.lastChild();f&&"text"==f.type&&/^\s*$/.test(f.data)&&e.removeChild(f)}),h.options.autoTransWordToList){var c={num1:/^\d+\)/,decimal:/^\d+\./,"lower-alpha":/^[a-z]+\)/,"upper-alpha":/^[A-Z]+\./,cn:/^[\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+[\u3001]/,cn2:/^\([\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+\)/},d={square:"n"};utils.each(a.getNodesByTagName("p"),function(a){function d(a,b,d){if("ol"==a.tagName)if(browser.ie){var e=b.firstChild();"element"==e.type&&"span"==e.tagName&&c[d].test(e.innerText())&&b.removeChild(e)}else b.innerHTML(b.innerHTML().replace(c[d],""));else b.removeChild(b.firstChild());var f=UE.uNode.createElement("li");f.appendChild(b),a.appendChild(f)}if("MsoListParagraph"==a.getAttr("class")){a.setStyle("margin",""),a.setStyle("margin-left",""),a.setAttr("class","");var e,f=a,g=a;if("li"!=a.parentNode.tagName&&(e=b(a.innerText(),a))){var i=UE.uNode.createElement(h.options.insertorderedlist.hasOwnProperty(e)?"ol":"ul");for(j[e]?i.setAttr("class","custom_"+e):i.setStyle("list-style-type",e);a&&"li"!=a.parentNode.tagName&&b(a.innerText(),a);)f=a.nextSibling(),f||a.parentNode.insertBefore(i,a),d(i,a,e),a=f;!i.parentNode&&a&&a.parentNode&&a.parentNode.insertBefore(i,a)}var k=g.firstChild();k&&"element"==k.type&&"span"==k.tagName&&/^\s*( )+\s*$/.test(k.innerText())&&k.parentNode.removeChild(k)}})}}),h.addListener("contentchange",function(){c(h.document)}),h.addListener("keydown",function(a,b){function c(){b.preventDefault?b.preventDefault():b.returnValue=!1,h.fireEvent("contentchange"),h.undoManger&&h.undoManger.save()}function d(a,b){for(;a&&!domUtils.isBody(a);){if(b(a))return null;if(1==a.nodeType&&/[ou]l/i.test(a.tagName))return a;a=a.parentNode}return null}var e=b.keyCode||b.which;if(13==e&&!b.shiftKey){var g=h.selection.getRange(),i=domUtils.findParent(g.startContainer,function(a){return domUtils.isBlockElm(a)},!0),j=domUtils.findParentByTagName(g.startContainer,"li",!0);if(i&&"PRE"!=i.tagName&&!j){var k=i.innerHTML.replace(new RegExp(domUtils.fillChar,"g"),"");/^\s*1\s*\.[^\d]/.test(k)&&(i.innerHTML=k.replace(/^\s*1\s*\./,""),g.setStartAtLast(i).collapse(!0).select(),h.__hasEnterExecCommand=!0,h.execCommand("insertorderedlist"),h.__hasEnterExecCommand=!1)}var l=h.selection.getRange(),m=d(l.startContainer,function(a){return"TABLE"==a.tagName}),n=l.collapsed?m:d(l.endContainer,function(a){return"TABLE"==a.tagName});if(m&&n&&m===n){if(!l.collapsed){if(m=domUtils.findParentByTagName(l.startContainer,"li",!0),n=domUtils.findParentByTagName(l.endContainer,"li",!0),!m||!n||m!==n){var o=l.cloneRange(),p=o.collapse(!1).createBookmark();l.deleteContents(),o.moveToBookmark(p);var j=domUtils.findParentByTagName(o.startContainer,"li",!0);return f(j),o.select(),void c()}if(l.deleteContents(),j=domUtils.findParentByTagName(l.startContainer,"li",!0),j&&domUtils.isEmptyBlock(j))return v=j.previousSibling,next=j.nextSibling,s=h.document.createElement("p"),domUtils.fillNode(h.document,s),q=j.parentNode,v&&next?(l.setStart(next,0).collapse(!0).select(!0),domUtils.remove(j)):((v||next)&&v?j.parentNode.parentNode.insertBefore(s,q.nextSibling):q.parentNode.insertBefore(s,q),domUtils.remove(j),q.firstChild||domUtils.remove(q),l.setStart(s,0).setCursor()),void c()}if(j=domUtils.findParentByTagName(l.startContainer,"li",!0)){ +if(domUtils.isEmptyBlock(j)){p=l.createBookmark();var q=j.parentNode;if(j!==q.lastChild?(domUtils.breakParent(j,q),f(j)):(q.parentNode.insertBefore(j,q.nextSibling),domUtils.isEmptyNode(q)&&domUtils.remove(q)),!dtd.$list[j.parentNode.tagName])if(domUtils.isBlockElm(j.firstChild))domUtils.remove(j,!0);else{for(s=h.document.createElement("p"),j.parentNode.insertBefore(s,j);j.firstChild;)s.appendChild(j.firstChild);domUtils.remove(j)}l.moveToBookmark(p).select()}else{var r=j.firstChild;if(!r||!domUtils.isBlockElm(r)){var s=h.document.createElement("p");for(!j.firstChild&&domUtils.fillNode(h.document,s);j.firstChild;)s.appendChild(j.firstChild);j.appendChild(s),r=s}var t=h.document.createElement("span");l.insertNode(t),domUtils.breakParent(t,j);var u=t.nextSibling;r=u.firstChild,r||(s=h.document.createElement("p"),domUtils.fillNode(h.document,s),u.appendChild(s),r=s),domUtils.isEmptyNode(r)&&(r.innerHTML="",domUtils.fillNode(h.document,r)),l.setStart(r,0).collapse(!0).shrinkBoundary().select(),domUtils.remove(t);var v=u.previousSibling;v&&domUtils.isEmptyBlock(v)&&(v.innerHTML="

    ",domUtils.fillNode(h.document,v.firstChild))}c()}}}if(8==e&&(l=h.selection.getRange(),l.collapsed&&domUtils.isStartInblock(l)&&(o=l.cloneRange().trimBoundary(),j=domUtils.findParentByTagName(l.startContainer,"li",!0),j&&domUtils.isStartInblock(o)))){if(m=domUtils.findParentByTagName(l.startContainer,"p",!0),m&&m!==j.firstChild){var q=domUtils.findParentByTagName(m,["ol","ul"]);return domUtils.breakParent(m,q),f(m),h.fireEvent("contentchange"),l.setStart(m,0).setCursor(!1,!0),h.fireEvent("saveScene"),void domUtils.preventDefault(b)}if(j&&(v=j.previousSibling)){if(46==e&&j.childNodes.length)return;if(dtd.$list[v.tagName]&&(v=v.lastChild),h.undoManger&&h.undoManger.save(),r=j.firstChild,domUtils.isBlockElm(r))if(domUtils.isEmptyNode(r))for(v.appendChild(r),l.setStart(r,0).setCursor(!1,!0);j.firstChild;)v.appendChild(j.firstChild);else t=h.document.createElement("span"),l.insertNode(t),domUtils.isEmptyBlock(v)&&(v.innerHTML=""),domUtils.moveChild(j,v),l.setStartBefore(t).collapse(!0).select(!0),domUtils.remove(t);else if(domUtils.isEmptyNode(j)){var s=h.document.createElement("p");v.appendChild(s),l.setStart(s,0).setCursor()}else for(l.setEnd(v,v.childNodes.length).collapse().select(!0);j.firstChild;)v.appendChild(j.firstChild);return domUtils.remove(j),h.fireEvent("contentchange"),h.fireEvent("saveScene"),void domUtils.preventDefault(b)}if(j&&!j.previousSibling){var q=j.parentNode,p=l.createBookmark();if(domUtils.isTagNode(q.parentNode,"ol ul"))q.parentNode.insertBefore(j,q),domUtils.isEmptyNode(q)&&domUtils.remove(q);else{for(;j.firstChild;)q.parentNode.insertBefore(j.firstChild,q);domUtils.remove(j),domUtils.isEmptyNode(q)&&domUtils.remove(q)}return l.moveToBookmark(p).setCursor(!1,!0),h.fireEvent("contentchange"),h.fireEvent("saveScene"),void domUtils.preventDefault(b)}}}),h.addListener("keyup",function(a,c){var e=c.keyCode||c.which;if(8==e){var f,g=h.selection.getRange();(f=domUtils.findParentByTagName(g.startContainer,["ol","ul"],!0))&&d(f,f.tagName.toLowerCase(),b(f)||domUtils.getComputedStyle(f,"list-style-type"),!0)}}),h.addListener("tabkeydown",function(){function a(a){if(h.options.maxListLevel!=-1){for(var b=a.parentNode,c=0;/[ou]l/i.test(b.tagName);)c++,b=b.parentNode;if(c>=h.options.maxListLevel)return!0}}var c=h.selection.getRange(),f=domUtils.findParentByTagName(c.startContainer,"li",!0);if(f){var g;if(!c.collapsed){h.fireEvent("saveScene"),g=c.createBookmark();for(var i,j,l=0,m=domUtils.findParents(f);j=m[l++];)if(domUtils.isTagNode(j,"ol ul")){i=j;break}var n=f;if(g.end)for(;n&&!(domUtils.getPosition(n,g.end)&domUtils.POSITION_FOLLOWING);)if(a(n))n=domUtils.getNextDomNode(n,!1,null,function(a){return a!==i});else{var o=n.parentNode,p=h.document.createElement(o.tagName),q=utils.indexOf(k[p.tagName],b(o)||domUtils.getComputedStyle(o,"list-style-type")),r=q+1==k[p.tagName].length?0:q+1,s=k[p.tagName][r];for(e(p,s),o.insertBefore(p,n);n&&!(domUtils.getPosition(n,g.end)&domUtils.POSITION_FOLLOWING);){if(f=n.nextSibling,p.appendChild(n),!f||domUtils.isTagNode(f,"ol ul")){if(f)for(;(f=f.firstChild)&&"LI"!=f.tagName;);else f=domUtils.getNextDomNode(n,!1,null,function(a){return a!==i});break}n=f}d(p,p.tagName.toLowerCase(),s),n=f}return h.fireEvent("contentchange"),c.moveToBookmark(g).select(),!0}if(a(f))return!0;var o=f.parentNode,p=h.document.createElement(o.tagName),q=utils.indexOf(k[p.tagName],b(o)||domUtils.getComputedStyle(o,"list-style-type"));q=q+1==k[p.tagName].length?0:q+1;var s=k[p.tagName][q];if(e(p,s),domUtils.isStartInblock(c))return h.fireEvent("saveScene"),g=c.createBookmark(),o.insertBefore(p,f),p.appendChild(f),d(p,p.tagName.toLowerCase(),s),h.fireEvent("contentchange"),c.moveToBookmark(g).select(!0),!0}}),h.commands.insertorderedlist=h.commands.insertunorderedlist={execCommand:function(a,c){c||(c="insertorderedlist"==a.toLowerCase()?"decimal":"disc");var f=this,h=this.selection.getRange(),j=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase():!domUtils.isWhitespace(a)},k="insertorderedlist"==a.toLowerCase()?"ol":"ul",l=f.document.createDocumentFragment();h.adjustmentBoundary().shrinkBoundary();var m,n,o,p,q=h.createBookmark(!0),r=g(f.document.getElementById(q.start)),s=0,t=g(f.document.getElementById(q.end)),u=0;if(r||t){if(r&&(m=r.parentNode),q.end||(t=r),t&&(n=t.parentNode),m===n){for(;r!==t;){if(p=r,r=r.nextSibling,!domUtils.isBlockElm(p.firstChild)){for(var v=f.document.createElement("p");p.firstChild;)v.appendChild(p.firstChild);p.appendChild(v)}l.appendChild(p)}if(p=f.document.createElement("span"),m.insertBefore(p,t),!domUtils.isBlockElm(t.firstChild)){for(v=f.document.createElement("p");t.firstChild;)v.appendChild(t.firstChild);t.appendChild(v)}l.appendChild(t),domUtils.breakParent(p,m),domUtils.isEmptyNode(p.previousSibling)&&domUtils.remove(p.previousSibling),domUtils.isEmptyNode(p.nextSibling)&&domUtils.remove(p.nextSibling);var w=b(m)||domUtils.getComputedStyle(m,"list-style-type")||("insertorderedlist"==a.toLowerCase()?"decimal":"disc");if(m.tagName.toLowerCase()==k&&w==c){for(var x,y=0,z=f.document.createDocumentFragment();x=l.firstChild;)if(domUtils.isTagNode(x,"ol ul"))z.appendChild(x);else for(;x.firstChild;)z.appendChild(x.firstChild),domUtils.remove(x);p.parentNode.insertBefore(z,p)}else o=f.document.createElement(k),e(o,c),o.appendChild(l),p.parentNode.insertBefore(o,p);return domUtils.remove(p),o&&d(o,k,c),void h.moveToBookmark(q).select()}if(r){for(;r;){if(p=r.nextSibling,domUtils.isTagNode(r,"ol ul"))l.appendChild(r);else{for(var A=f.document.createDocumentFragment(),B=0;r.firstChild;)domUtils.isBlockElm(r.firstChild)&&(B=1),A.appendChild(r.firstChild);if(B)l.appendChild(A);else{var C=f.document.createElement("p");C.appendChild(A),l.appendChild(C)}domUtils.remove(r)}r=p}m.parentNode.insertBefore(l,m.nextSibling),domUtils.isEmptyNode(m)?(h.setStartBefore(m),domUtils.remove(m)):h.setStartAfter(m),s=1}if(t&&domUtils.inDoc(n,f.document)){for(r=n.firstChild;r&&r!==t;){if(p=r.nextSibling,domUtils.isTagNode(r,"ol ul"))l.appendChild(r);else{for(A=f.document.createDocumentFragment(),B=0;r.firstChild;)domUtils.isBlockElm(r.firstChild)&&(B=1),A.appendChild(r.firstChild);B?l.appendChild(A):(C=f.document.createElement("p"),C.appendChild(A),l.appendChild(C)),domUtils.remove(r)}r=p}var D=domUtils.createElement(f.document,"div",{tmpDiv:1});domUtils.moveChild(t,D),l.appendChild(D),domUtils.remove(t),n.parentNode.insertBefore(l,n),h.setEndBefore(n),domUtils.isEmptyNode(n)&&domUtils.remove(n),u=1}}s||h.setStartBefore(f.document.getElementById(q.start)),q.end&&!u&&h.setEndAfter(f.document.getElementById(q.end)),h.enlarge(!0,function(a){return i[a.tagName]}),l=f.document.createDocumentFragment();for(var E,F=h.createBookmark(),G=domUtils.getNextDomNode(F.start,!1,j),H=h.cloneRange(),I=domUtils.isBlockElm;G&&G!==F.end&&domUtils.getPosition(G,F.end)&domUtils.POSITION_PRECEDING;)if(3==G.nodeType||dtd.li[G.tagName]){if(1==G.nodeType&&dtd.$list[G.tagName]){for(;G.firstChild;)l.appendChild(G.firstChild);E=domUtils.getNextDomNode(G,!1,j),domUtils.remove(G),G=E;continue}for(E=G,H.setStartBefore(G);G&&G!==F.end&&(!I(G)||domUtils.isBookmarkNode(G));)E=G,G=domUtils.getNextDomNode(G,!1,null,function(a){return!i[a.tagName]});G&&I(G)&&(p=domUtils.getNextDomNode(E,!1,j),p&&domUtils.isBookmarkNode(p)&&(G=domUtils.getNextDomNode(p,!1,j),E=p)),H.setEndAfter(E),G=domUtils.getNextDomNode(E,!1,j);var J=h.document.createElement("li");if(J.appendChild(H.extractContents()),domUtils.isEmptyNode(J)){for(var E=h.document.createElement("p");J.firstChild;)E.appendChild(J.firstChild);J.appendChild(E)}l.appendChild(J)}else G=domUtils.getNextDomNode(G,!0,j);h.moveToBookmark(F).collapse(!0),o=f.document.createElement(k),e(o,c),o.appendChild(l),h.insertNode(o),d(o,k,c);for(var x,y=0,K=domUtils.getElementsByTagName(o,"div");x=K[y++];)x.getAttribute("tmpDiv")&&domUtils.remove(x,!0);h.moveToBookmark(q).select()},queryCommandState:function(a){for(var b,c="insertorderedlist"==a.toLowerCase()?"ol":"ul",d=this.selection.getStartElementPath(),e=0;b=d[e++];){if("TABLE"==b.nodeName)return 0;if(c==b.nodeName.toLowerCase())return 1}return 0},queryCommandValue:function(a){for(var c,d,e="insertorderedlist"==a.toLowerCase()?"ol":"ul",f=this.selection.getStartElementPath(),g=0;d=f[g++];){if("TABLE"==d.nodeName){c=null;break}if(e==d.nodeName.toLowerCase()){c=d;break}}return c?b(c)||domUtils.getComputedStyle(c,"list-style-type"):null}}},function(){var a={textarea:function(a,b){var c=b.ownerDocument.createElement("textarea");return c.style.cssText="position:absolute;resize:none;width:100%;height:100%;border:0;padding:0;margin:0;overflow-y:auto;",browser.ie&&browser.version<8&&(c.style.width=b.offsetWidth+"px",c.style.height=b.offsetHeight+"px",b.onresize=function(){c.style.width=b.offsetWidth+"px",c.style.height=b.offsetHeight+"px"}),b.appendChild(c),{setContent:function(a){c.value=a},getContent:function(){return c.value},select:function(){var a;browser.ie?(a=c.createTextRange(),a.collapse(!0),a.select()):(c.setSelectionRange(0,0),c.focus())},dispose:function(){b.removeChild(c),b.onresize=null,c=null,b=null}}},codemirror:function(a,b){var c=window.CodeMirror(b,{mode:"text/html",tabMode:"indent",lineNumbers:!0,lineWrapping:!0}),d=c.getWrapperElement();return d.style.cssText='position:absolute;left:0;top:0;width:100%;height:100%;font-family:consolas,"Courier new",monospace;font-size:13px;',c.getScrollerElement().style.cssText="position:absolute;left:0;top:0;width:100%;height:100%;",c.refresh(),{getCodeMirror:function(){return c},setContent:function(a){c.setValue(a)},getContent:function(){return c.getValue()},select:function(){c.focus()},dispose:function(){b.removeChild(d),d=null,c=null}}}};UE.plugins.source=function(){function b(b){return a["codemirror"==f.sourceEditor&&window.CodeMirror?"codemirror":"textarea"](e,b)}var c,d,e=this,f=this.options,g=!1;f.sourceEditor=browser.ie?"textarea":f.sourceEditor||"codemirror",e.setOpt({sourceEditorFirst:!1});var h,i,j;e.commands.source={execCommand:function(){if(g=!g){j=e.selection.getRange().createAddress(!1,!0),e.undoManger&&e.undoManger.save(!0),browser.gecko&&(e.body.contentEditable=!1),h=e.iframe.style.cssText,e.iframe.style.cssText+="position:absolute;left:-32768px;top:-32768px;",e.fireEvent("beforegetcontent");var a=UE.htmlparser(e.body.innerHTML);e.filterOutputRule(a),a.traversal(function(a){if("element"==a.type)switch(a.tagName){case"td":case"th":case"caption":a.children&&1==a.children.length&&"br"==a.firstChild().tagName&&a.removeChild(a.firstChild());break;case"pre":a.innerText(a.innerText().replace(/ /g," "))}}),e.fireEvent("aftergetcontent");var f=a.toHtml(!0);c=b(e.iframe.parentNode),c.setContent(f),d=e.setContent,e.setContent=function(a){var b=UE.htmlparser(a);e.filterInputRule(b),a=b.toHtml(),c.setContent(a)},setTimeout(function(){c.select(),e.addListener("fullscreenchanged",function(){try{c.getCodeMirror().refresh()}catch(a){}})}),i=e.getContent,e.getContent=function(){return c.getContent()||"

    "+(browser.ie?"":"
    ")+"

    "}}else{e.iframe.style.cssText=h;var k=c.getContent()||"

    "+(browser.ie?"":"
    ")+"

    ";k=k.replace(new RegExp("[\\r\\t\\n ]*]*)>","g"),function(a,b){return b&&!dtd.$inlineWithA[b.toLowerCase()]?a.replace(/(^[\n\r\t ]*)|([\n\r\t ]*$)/g,""):a.replace(/(^[\n\r\t]*)|([\n\r\t]*$)/g,"")}),e.setContent=d,e.setContent(k),c.dispose(),c=null,e.getContent=i;var l=e.body.firstChild;if(l||(e.body.innerHTML="

    "+(browser.ie?"":"
    ")+"

    ",l=e.body.firstChild),e.undoManger&&e.undoManger.save(!0),browser.gecko){var m=document.createElement("input");m.style.cssText="position:absolute;left:0;top:-32768px",document.body.appendChild(m),e.body.contentEditable=!1,setTimeout(function(){domUtils.setViewportOffset(m,{left:-32768,top:0}),m.focus(),setTimeout(function(){e.body.contentEditable=!0,e.selection.getRange().moveToAddress(j).select(!0),domUtils.remove(m)})})}else try{e.selection.getRange().moveToAddress(j).select(!0)}catch(n){}}this.fireEvent("sourcemodechanged",g)},queryCommandState:function(){return 0|g},notNeedUndo:1};var k=e.queryCommandState;e.queryCommandState=function(a){return a=a.toLowerCase(),g?a in{source:1,fullscreen:1}?1:-1:k.apply(this,arguments)},"codemirror"==f.sourceEditor&&e.addListener("ready",function(){utils.loadFile(document,{src:f.codeMirrorJsUrl||f.UEDITOR_HOME_URL+"third-party/codemirror/codemirror.js",tag:"script",type:"text/javascript",defer:"defer"},function(){f.sourceEditorFirst&&setTimeout(function(){e.execCommand("source")},0)}),utils.loadFile(document,{tag:"link",rel:"stylesheet",type:"text/css",href:f.codeMirrorCssUrl||f.UEDITOR_HOME_URL+"third-party/codemirror/codemirror.css"})})}}(),UE.plugins.enterkey=function(){var a,b=this,c=b.options.enterTag;b.addListener("keyup",function(c,d){var e=d.keyCode||d.which;if(13==e){var f,g=b.selection.getRange(),h=g.startContainer;if(browser.ie)b.fireEvent("saveScene",!0,!0);else{if(/h\d/i.test(a)){if(browser.gecko){var i=domUtils.findParentByTagName(h,["h1","h2","h3","h4","h5","h6","blockquote","caption","table"],!0);i||(b.document.execCommand("formatBlock",!1,"

    "),f=1)}else if(1==h.nodeType){var j,k=b.document.createTextNode("");if(g.insertNode(k),j=domUtils.findParentByTagName(k,"div",!0)){for(var l=b.document.createElement("p");j.firstChild;)l.appendChild(j.firstChild);j.parentNode.insertBefore(l,j),domUtils.remove(j),g.setStartBefore(k).setCursor(),f=1}domUtils.remove(k)}b.undoManger&&f&&b.undoManger.save()}browser.opera&&g.select()}}}),b.addListener("keydown",function(d,e){var f=e.keyCode||e.which;if(13==f){if(b.fireEvent("beforeenterkeydown"))return void domUtils.preventDefault(e);b.fireEvent("saveScene",!0,!0),a="";var g=b.selection.getRange();if(!g.collapsed){var h=g.startContainer,i=g.endContainer,j=domUtils.findParentByTagName(h,"td",!0),k=domUtils.findParentByTagName(i,"td",!0);if(j&&k&&j!==k||!j&&k||j&&!k)return void(e.preventDefault?e.preventDefault():e.returnValue=!1)}if("p"==c)browser.ie||(h=domUtils.findParentByTagName(g.startContainer,["ol","ul","p","h1","h2","h3","h4","h5","h6","blockquote","caption"],!0),h||browser.opera?(a=h.tagName,"p"==h.tagName.toLowerCase()&&browser.gecko&&domUtils.removeDirtyAttr(h)):(b.document.execCommand("formatBlock",!1,"

    "),browser.gecko&&(g=b.selection.getRange(),h=domUtils.findParentByTagName(g.startContainer,"p",!0),h&&domUtils.removeDirtyAttr(h))));else if(e.preventDefault?e.preventDefault():e.returnValue=!1,g.collapsed){m=g.document.createElement("br"),g.insertNode(m);var l=m.parentNode;l.lastChild===m?(m.parentNode.insertBefore(m.cloneNode(!0),m),g.setStartBefore(m)):g.setStartAfter(m),g.setCursor()}else if(g.deleteContents(),h=g.startContainer,1==h.nodeType&&(h=h.childNodes[g.startOffset])){for(;1==h.nodeType;){if(dtd.$empty[h.tagName])return g.setStartBefore(h).setCursor(),b.undoManger&&b.undoManger.save(),!1;if(!h.firstChild){var m=g.document.createElement("br");return h.appendChild(m),g.setStart(h,0).setCursor(),b.undoManger&&b.undoManger.save(),!1}h=h.firstChild}h===g.startContainer.childNodes[g.startOffset]?(m=g.document.createElement("br"),g.insertNode(m).setCursor()):g.setStart(h,0).setCursor()}else m=g.document.createElement("br"),g.insertNode(m).setStartAfter(m).setCursor()}})},UE.plugins.keystrokes=function(){var a=this,b=!0;a.addListener("keydown",function(c,d){var e=d.keyCode||d.which,f=a.selection.getRange();if(!f.collapsed&&!(d.ctrlKey||d.shiftKey||d.altKey||d.metaKey)&&(e>=65&&e<=90||e>=48&&e<=57||e>=96&&e<=111||{13:1,8:1,46:1}[e])){var g=f.startContainer;if(domUtils.isFillChar(g)&&f.setStartBefore(g),g=f.endContainer,domUtils.isFillChar(g)&&f.setEndAfter(g),f.txtToElmBoundary(),f.endContainer&&1==f.endContainer.nodeType&&(g=f.endContainer.childNodes[f.endOffset],g&&domUtils.isBr(g)&&f.setEndAfter(g)),0==f.startOffset&&(g=f.startContainer,domUtils.isBoundaryNode(g,"firstChild")&&(g=f.endContainer,f.endOffset==(3==g.nodeType?g.nodeValue.length:g.childNodes.length)&&domUtils.isBoundaryNode(g,"lastChild"))))return a.fireEvent("saveScene"),a.body.innerHTML="

    "+(browser.ie?"":"
    ")+"

    ",f.setStart(a.body.firstChild,0).setCursor(!1,!0),void a._selectionChange()}if(e==keymap.Backspace){if(f=a.selection.getRange(),b=f.collapsed,a.fireEvent("delkeydown",d))return;var h,i;if(f.collapsed&&f.inFillChar()&&(h=f.startContainer,domUtils.isFillChar(h)?(f.setStartBefore(h).shrinkBoundary(!0).collapse(!0),domUtils.remove(h)):(h.nodeValue=h.nodeValue.replace(new RegExp("^"+domUtils.fillChar),""),f.startOffset--,f.collapse(!0).select(!0))),h=f.getClosedNode())return a.fireEvent("saveScene"),f.setStartBefore(h),domUtils.remove(h),f.setCursor(),a.fireEvent("saveScene"),void domUtils.preventDefault(d);if(!browser.ie&&(h=domUtils.findParentByTagName(f.startContainer,"table",!0),i=domUtils.findParentByTagName(f.endContainer,"table",!0),h&&!i||!h&&i||h!==i))return void d.preventDefault()}if(e==keymap.Tab){var j={ol:1,ul:1,table:1};if(a.fireEvent("tabkeydown",d))return void domUtils.preventDefault(d);var k=a.selection.getRange();a.fireEvent("saveScene");for(var l=0,m="",n=a.options.tabSize||4,o=a.options.tabNode||" ";l"});d.insertNode(g).setStart(g,0).setCursor(!1,!0)}}if(!b&&(3==d.startContainer.nodeType||1==d.startContainer.nodeType&&domUtils.isEmptyBlock(d.startContainer)))if(browser.ie){var k=d.document.createElement("span");d.insertNode(k).setStartBefore(k).collapse(!0),d.select(),domUtils.remove(k)}else d.select()}})},UE.plugins.fiximgclick=function(){function a(){this.editor=null,this.resizer=null,this.cover=null,this.doc=document,this.prePos={x:0,y:0},this.startPos={x:0,y:0}}var b=!1;return function(){var c=[[0,0,-1,-1],[0,0,0,-1],[0,0,1,-1],[0,0,-1,0],[0,0,1,0],[0,0,-1,1],[0,0,0,1],[0,0,1,1]];a.prototype={init:function(a){var b=this;b.editor=a,b.startPos=this.prePos={x:0,y:0},b.dragId=-1;var c=[],d=b.cover=document.createElement("div"),e=b.resizer=document.createElement("div");for(d.id=b.editor.ui.id+"_imagescale_cover",d.style.cssText="position:absolute;display:none;z-index:"+b.editor.options.zIndex+";filter:alpha(opacity=0); opacity:0;background:#CCC;",domUtils.on(d,"mousedown click",function(){b.hide()}),i=0;i<8;i++)c.push('');e.id=b.editor.ui.id+"_imagescale",e.className="edui-editor-imagescale",e.innerHTML=c.join(""),e.style.cssText+=";display:none;border:1px solid #3b77ff;z-index:"+b.editor.options.zIndex+";",b.editor.ui.getDom().appendChild(d),b.editor.ui.getDom().appendChild(e),b.initStyle(),b.initEvents()},initStyle:function(){utils.cssRule("imagescale",".edui-editor-imagescale{display:none;position:absolute;border:1px solid #38B2CE;cursor:hand;-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}.edui-editor-imagescale span{position:absolute;width:6px;height:6px;overflow:hidden;font-size:0px;display:block;background-color:#3C9DD0;}.edui-editor-imagescale .edui-editor-imagescale-hand0{cursor:nw-resize;top:0;margin-top:-4px;left:0;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand1{cursor:n-resize;top:0;margin-top:-4px;left:50%;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand2{cursor:ne-resize;top:0;margin-top:-4px;left:100%;margin-left:-3px;}.edui-editor-imagescale .edui-editor-imagescale-hand3{cursor:w-resize;top:50%;margin-top:-4px;left:0;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand4{cursor:e-resize;top:50%;margin-top:-4px;left:100%;margin-left:-3px;}.edui-editor-imagescale .edui-editor-imagescale-hand5{cursor:sw-resize;top:100%;margin-top:-3px;left:0;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand6{cursor:s-resize;top:100%;margin-top:-3px;left:50%;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand7{cursor:se-resize;top:100%;margin-top:-3px;left:100%;margin-left:-3px;}")},initEvents:function(){var a=this;a.startPos.x=a.startPos.y=0,a.isDraging=!1},_eventHandler:function(a){var c=this;switch(a.type){case"mousedown":var d,d=a.target||a.srcElement;d.className.indexOf("edui-editor-imagescale-hand")!=-1&&c.dragId==-1&&(c.dragId=d.className.slice(-1),c.startPos.x=c.prePos.x=a.clientX,c.startPos.y=c.prePos.y=a.clientY,domUtils.on(c.doc,"mousemove",c.proxy(c._eventHandler,c)));break;case"mousemove":c.dragId!=-1&&(c.updateContainerStyle(c.dragId,{x:a.clientX-c.prePos.x,y:a.clientY-c.prePos.y}),c.prePos.x=a.clientX,c.prePos.y=a.clientY,b=!0,c.updateTargetElement());break;case"mouseup":c.dragId!=-1&&(c.updateContainerStyle(c.dragId,{x:a.clientX-c.prePos.x,y:a.clientY-c.prePos.y}),c.updateTargetElement(),c.target.parentNode&&c.attachTo(c.target),c.dragId=-1),domUtils.un(c.doc,"mousemove",c.proxy(c._eventHandler,c)),b&&(b=!1,c.editor.fireEvent("contentchange"))}},updateTargetElement:function(){var a=this;domUtils.setStyles(a.target,{width:a.resizer.style.width,height:a.resizer.style.height}),a.target.width=parseInt(a.resizer.style.width),a.target.height=parseInt(a.resizer.style.height),a.attachTo(a.target)},updateContainerStyle:function(a,b){var d,e=this,f=e.resizer;0!=c[a][0]&&(d=parseInt(f.style.left)+b.x,f.style.left=e._validScaledProp("left",d)+"px"),0!=c[a][1]&&(d=parseInt(f.style.top)+b.y,f.style.top=e._validScaledProp("top",d)+"px"),0!=c[a][2]&&(d=f.clientWidth+c[a][2]*b.x,f.style.width=e._validScaledProp("width",d)+"px"),0!=c[a][3]&&(d=f.clientHeight+c[a][3]*b.y,f.style.height=e._validScaledProp("height",d)+"px")},_validScaledProp:function(a,b){var c=this.resizer,d=document;switch(b=isNaN(b)?0:b,a){case"left":return b<0?0:b+c.clientWidth>d.clientWidth?d.clientWidth-c.clientWidth:b;case"top":return b<0?0:b+c.clientHeight>d.clientHeight?d.clientHeight-c.clientHeight:b;case"width":return b<=0?1:b+c.offsetLeft>d.clientWidth?d.clientWidth-c.offsetLeft:b;case"height":return b<=0?1:b+c.offsetTop>d.clientHeight?d.clientHeight-c.offsetTop:b}},hideCover:function(){this.cover.style.display="none"},showCover:function(){var a=this,b=domUtils.getXY(a.editor.ui.getDom()),c=domUtils.getXY(a.editor.iframe);domUtils.setStyles(a.cover,{width:a.editor.iframe.offsetWidth+"px",height:a.editor.iframe.offsetHeight+"px",top:c.y-b.y+"px",left:c.x-b.x+"px",position:"absolute",display:""})},show:function(a){var b=this;b.resizer.style.display="block",a&&b.attachTo(a),domUtils.on(this.resizer,"mousedown",b.proxy(b._eventHandler,b)),domUtils.on(b.doc,"mouseup",b.proxy(b._eventHandler,b)),b.showCover(),b.editor.fireEvent("afterscaleshow",b),b.editor.fireEvent("saveScene")},hide:function(){var a=this;a.hideCover(),a.resizer.style.display="none",domUtils.un(a.resizer,"mousedown",a.proxy(a._eventHandler,a)),domUtils.un(a.doc,"mouseup",a.proxy(a._eventHandler,a)),a.editor.fireEvent("afterscalehide",a)},proxy:function(a,b){return function(c){return a.apply(b||this,arguments)}},attachTo:function(a){var b=this,c=b.target=a,d=this.resizer,e=domUtils.getXY(c),f=domUtils.getXY(b.editor.iframe),g=domUtils.getXY(d.parentNode);domUtils.setStyles(d,{width:c.width+"px",height:c.height+"px",left:f.x+e.x-b.editor.document.body.scrollLeft-g.x-parseInt(d.style.borderLeftWidth)+"px",top:f.y+e.y-b.editor.document.body.scrollTop-g.y-parseInt(d.style.borderTopWidth)+"px"})}}}(),function(){var b,c=this;c.setOpt("imageScaleEnabled",!0),!browser.ie&&c.options.imageScaleEnabled&&c.addListener("click",function(d,e){var f=c.selection.getRange(),g=f.getClosedNode();if(g&&"IMG"==g.tagName&&"false"!=c.body.contentEditable){if(g.className.indexOf("edui-faked-music")!=-1||g.getAttribute("anchorname")||domUtils.hasClass(g,"loadingclass")||domUtils.hasClass(g,"loaderrorclass"))return;if(!b){b=new a,b.init(c),c.ui.getDom().appendChild(b.resizer);var h,i=function(a){b.hide(),b.target&&c.selection.getRange().selectNode(b.target).select()},j=function(a){var b=a.target||a.srcElement;!b||void 0!==b.className&&b.className.indexOf("edui-editor-imagescale")!=-1||i(a)};c.addListener("afterscaleshow",function(a){c.addListener("beforekeydown",i),c.addListener("beforemousedown",j),domUtils.on(document,"keydown",i),domUtils.on(document,"mousedown",j),c.selection.getNative().removeAllRanges()}),c.addListener("afterscalehide",function(a){c.removeListener("beforekeydown",i),c.removeListener("beforemousedown",j),domUtils.un(document,"keydown",i),domUtils.un(document,"mousedown",j);var d=b.target;d.parentNode&&c.selection.getRange().selectNode(d).select()}),domUtils.on(b.resizer,"mousedown",function(a){c.selection.getNative().removeAllRanges();var d=a.target||a.srcElement;d&&d.className.indexOf("edui-editor-imagescale-hand")==-1&&(h=setTimeout(function(){b.hide(),b.target&&c.selection.getRange().selectNode(d).select()},200))}),domUtils.on(b.resizer,"mouseup",function(a){var b=a.target||a.srcElement;b&&b.className.indexOf("edui-editor-imagescale-hand")==-1&&clearTimeout(h)})}b.show(g)}else b&&"none"!=b.resizer.style.display&&b.hide()}),browser.webkit&&c.addListener("click",function(a,b){if("IMG"==b.target.tagName&&"false"!=c.body.contentEditable){var d=new dom.Range(c.document);d.selectNode(b.target).select()}})}}(),UE.plugin.register("autolink",function(){var a=0;return browser.ie?{}:{bindEvents:{reset:function(){a=0},keydown:function(a,b){var c=this,d=b.keyCode||b.which;if(32==d||13==d){for(var e,f,g=c.selection.getNative(),h=g.getRangeAt(0).cloneRange(),i=h.startContainer;1==i.nodeType&&h.startOffset>0&&(i=h.startContainer.childNodes[h.startOffset-1]);)h.setStart(i,1==i.nodeType?i.childNodes.length:i.nodeValue.length),h.collapse(!0),i=h.startContainer;do{if(0==h.startOffset){for(i=h.startContainer.previousSibling;i&&1==i.nodeType;)i=i.lastChild;if(!i||domUtils.isFillChar(i))break;e=i.nodeValue.length}else i=h.startContainer,e=h.startOffset;h.setStart(i,e-1),f=h.toString().charCodeAt(0)}while(160!=f&&32!=f);if(h.toString().replace(new RegExp(domUtils.fillChar,"g"),"").match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i)){for(;h.toString().length&&!/^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test(h.toString());)try{h.setStart(h.startContainer,h.startOffset+1)}catch(j){for(var i=h.startContainer;!(next=i.nextSibling);){if(domUtils.isBody(i))return;i=i.parentNode}h.setStart(next,0)}if(domUtils.findParentByTagName(h.startContainer,"a",!0))return;var k,l=c.document.createElement("a"),m=c.document.createTextNode(" ");c.undoManger&&c.undoManger.save(),l.appendChild(h.extractContents()),l.href=l.innerHTML=l.innerHTML.replace(/<[^>]+>/g,""),k=l.getAttribute("href").replace(new RegExp(domUtils.fillChar,"g"),""),k=/^(?:https?:\/\/)/gi.test(k)?k:"http://"+k,l.setAttribute("_src",utils.html(k)),l.href=utils.html(k),h.insertNode(l),l.parentNode.insertBefore(m,l.nextSibling),h.setStart(m,0),h.collapse(!0),g.removeAllRanges(),g.addRange(h),c.undoManger&&c.undoManger.save()}}}}}},function(){function a(a){if(3==a.nodeType)return null;if("A"==a.nodeName)return a;for(var b=a.lastChild;b;){if("A"==b.nodeName)return b;if(3==b.nodeType){if(domUtils.isWhitespace(b)){b=b.previousSibling;continue}return null}b=b.lastChild}}var b={37:1,38:1,39:1,40:1,13:1,32:1};browser.ie&&this.addListener("keyup",function(c,d){var e=this,f=d.keyCode;if(b[f]){var g=e.selection.getRange(),h=g.startContainer;if(13==f){for(;h&&!domUtils.isBody(h)&&!domUtils.isBlockElm(h);)h=h.parentNode;if(h&&!domUtils.isBody(h)&&"P"==h.nodeName){var i=h.previousSibling;if(i&&1==i.nodeType){var i=a(i);i&&!i.getAttribute("_href")&&domUtils.remove(i,!0)}}}else if(32==f)3==h.nodeType&&/^\s$/.test(h.nodeValue)&&(h=h.previousSibling,h&&"A"==h.nodeName&&!h.getAttribute("_href")&&domUtils.remove(h,!0));else if(h=domUtils.findParentByTagName(h,"a",!0),h&&!h.getAttribute("_href")){var j=g.createBookmark();domUtils.remove(h,!0),g.moveToBookmark(j).select(!0)}}})}),UE.plugins.autoheight=function(){function a(){var a=this;clearTimeout(e),f||(!a.queryCommandState||a.queryCommandState&&1!=a.queryCommandState("source"))&&(e=setTimeout(function(){for(var b=a.body.lastChild;b&&1!=b.nodeType;)b=b.previousSibling;b&&1==b.nodeType&&(b.style.clear="both",d=Math.max(domUtils.getXY(b).y+b.offsetHeight+25,Math.max(h.minFrameHeight,h.initialFrameHeight)),d!=g&&(d!==parseInt(a.iframe.parentNode.style.height)&&(a.iframe.parentNode.style.height=d+"px"),a.body.style.height=d+"px",g=d),domUtils.removeStyle(b,"clear"))},50))}var b=this;if(b.autoHeightEnabled=b.options.autoHeightEnabled!==!1,b.autoHeightEnabled){var c,d,e,f,g=0,h=b.options;b.addListener("fullscreenchanged",function(a,b){f=b}),b.addListener("destroy",function(){b.removeListener("contentchange afterinserthtml keyup mouseup",a)}),b.enableAutoHeight=function(){var b=this;if(b.autoHeightEnabled){var d=b.document;b.autoHeightEnabled=!0,c=d.body.style.overflowY,d.body.style.overflowY="hidden",b.addListener("contentchange afterinserthtml keyup mouseup",a),setTimeout(function(){a.call(b)},browser.gecko?100:0),b.fireEvent("autoheightchanged",b.autoHeightEnabled)}},b.disableAutoHeight=function(){b.body.style.overflowY=c||"",b.removeListener("contentchange",a),b.removeListener("keyup",a),b.removeListener("mouseup",a),b.autoHeightEnabled=!1,b.fireEvent("autoheightchanged",b.autoHeightEnabled)},b.on("setHeight",function(){b.disableAutoHeight()}),b.addListener("ready",function(){b.enableAutoHeight();var c;domUtils.on(browser.ie?b.body:b.document,browser.webkit?"dragover":"drop",function(){clearTimeout(c),c=setTimeout(function(){a.call(b)},100)});var d;window.onscroll=function(){ +null===d?d=this.scrollY:0==this.scrollY&&0!=d&&(b.window.scrollTo(0,0),d=null)}})}},UE.plugins.autofloat=function(){function a(){return UE.ui?1:(alert(g.autofloatMsg),0)}function b(){var a=document.body.style;a.backgroundImage='url("about:blank")',a.backgroundAttachment="fixed"}function c(){var a=domUtils.getXY(k),b=domUtils.getComputedStyle(k,"position"),c=domUtils.getComputedStyle(k,"left");k.style.width=k.offsetWidth+"px",k.style.zIndex=1*f.options.zIndex+1,k.parentNode.insertBefore(q,k),o||p&&browser.ie?("absolute"!=k.style.position&&(k.style.position="absolute"),k.style.top=(document.body.scrollTop||document.documentElement.scrollTop)-l+i+"px"):(browser.ie7Compat&&r&&(r=!1,k.style.left=domUtils.getXY(k).x-document.documentElement.getBoundingClientRect().left+2+"px"),"fixed"!=k.style.position&&(k.style.position="fixed",k.style.top=i+"px",("absolute"==b||"relative"==b)&&parseFloat(c)&&(k.style.left=a.x+"px")))}function d(){r=!0,q.parentNode&&q.parentNode.removeChild(q),k.style.cssText=j}function e(){var a=m(f.container),b=f.options.toolbarTopOffset||0;a.top<0&&a.bottom-k.offsetHeight>b?c():d()}var f=this,g=f.getLang();f.setOpt({topOffset:0});var h=f.options.autoFloatEnabled!==!1,i=f.options.topOffset;if(h){var j,k,l,m,n=UE.ui.uiUtils,o=browser.ie&&browser.version<=6,p=browser.quirks,q=document.createElement("div"),r=!0,s=utils.defer(function(){e()},browser.ie?200:100,!0);f.addListener("destroy",function(){domUtils.un(window,["scroll","resize"],e),f.removeListener("keydown",s)}),f.addListener("ready",function(){if(a(f)){if(!f.ui)return;m=n.getClientRect,k=f.ui.getDom("toolbarbox"),l=m(k).top,j=k.style.cssText,q.style.height=k.offsetHeight+"px",o&&b(),domUtils.on(window,["scroll","resize"],e),f.addListener("keydown",s),f.addListener("beforefullscreenchange",function(a,b){b&&d()}),f.addListener("fullscreenchanged",function(a,b){b||e()}),f.addListener("sourcemodechanged",function(a,b){setTimeout(function(){e()},0)}),f.addListener("clearDoc",function(){setTimeout(function(){e()},0)})}})}},UE.plugins.video=function(){function a(a,b,d,e,f,g,h){a=utils.unhtmlForUrl(a),f=utils.unhtml(f),g=utils.unhtml(g),b=parseInt(b,10)||0,d=parseInt(d,10)||0;var i;switch(h){case"image":i="';break;case"embed":i='';break;case"video":var j=a.substr(a.lastIndexOf(".")+1);"ogv"==j&&(j="ogg"),i="'}return i}function b(b,c){utils.each(b.getNodesByTagName(c?"img":"embed video"),function(b){var d=b.getAttr("class");if(d&&d.indexOf("edui-faked-video")!=-1){var e=a(c?b.getAttr("_url"):b.getAttr("src"),b.getAttr("width"),b.getAttr("height"),null,b.getStyle("float")||"",d,c?"embed":"image");b.parentNode.replaceChild(UE.uNode.createElement(e),b)}if(d&&d.indexOf("edui-upload-video")!=-1){var e=a(c?b.getAttr("_url"):b.getAttr("src"),b.getAttr("width"),b.getAttr("height"),null,b.getStyle("float")||"",d,c?"video":"image");b.parentNode.replaceChild(UE.uNode.createElement(e),b)}})}var c=this;c.addOutputRule(function(a){b(a,!0)}),c.addInputRule(function(a){b(a)}),c.commands.insertvideo={execCommand:function(b,d,e){d=utils.isArray(d)?d:[d];for(var f,g,h=[],i="tmpVedio",j=0,k=d.length;j0)return 0;for(var c in dtd.$isNotEmpty)if(dtd.$isNotEmpty.hasOwnProperty(c)&&a.getElementsByTagName(c).length)return 0;return 1},b.getWidth=function(a){return a?parseInt(domUtils.getComputedStyle(a,"width"),10):0},b.getTableCellAlignState=function(a){!utils.isArray(a)&&(a=[a]);var b={},c=["align","valign"],d=null,e=!0;return utils.each(a,function(a){return utils.each(c,function(c){if(d=a.getAttribute(c),!b[c]&&d)b[c]=d;else if(!b[c]||d!==b[c])return e=!1,!1}),e}),e?b:null},b.getTableItemsByRange=function(a){var b=a.selection.getStart();b&&b.id&&0===b.id.indexOf("_baidu_bookmark_start_")&&b.nextSibling&&(b=b.nextSibling);var c=b&&domUtils.findParentByTagName(b,["td","th"],!0),d=c&&c.parentNode,e=b&&domUtils.findParentByTagName(b,"caption",!0),f=e?e.parentNode:d&&d.parentNode.parentNode;return{cell:c,tr:d,table:f,caption:e}},b.getUETableBySelected=function(a){var c=b.getTableItemsByRange(a).table;return c&&c.ueTable&&c.ueTable.selectedTds.length?c.ueTable:null},b.getDefaultValue=function(a,b){var c,d,e,f,g={thin:"0px",medium:"1px",thick:"2px"};if(b)return h=b.getElementsByTagName("td")[0],f=domUtils.getComputedStyle(b,"border-left-width"),c=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"padding-left"),d=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"border-left-width"),e=parseInt(g[f]||f,10),{tableBorder:c,tdPadding:d,tdBorder:e};b=a.document.createElement("table"),b.insertRow(0).insertCell(0).innerHTML="xxx",a.body.appendChild(b);var h=b.getElementsByTagName("td")[0];return f=domUtils.getComputedStyle(b,"border-left-width"),c=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"padding-left"),d=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"border-left-width"),e=parseInt(g[f]||f,10),domUtils.remove(b),{tableBorder:c,tdPadding:d,tdBorder:e}},b.getUETable=function(a){var c=a.tagName.toLowerCase();return a="td"==c||"th"==c||"caption"==c?domUtils.findParentByTagName(a,"table",!0):a,a.ueTable||(a.ueTable=new b(a)),a.ueTable},b.cloneCell=function(a,b,c){if(!a||utils.isString(a))return this.table.ownerDocument.createElement(a||"td");var d=domUtils.hasClass(a,"selectTdClass");d&&domUtils.removeClasses(a,"selectTdClass");var e=a.cloneNode(!0);return b&&(e.rowSpan=e.colSpan=1),!c&&domUtils.removeAttributes(e,"width height"),!c&&domUtils.removeAttributes(e,"style"),e.style.borderLeftStyle="",e.style.borderTopStyle="",e.style.borderLeftColor=a.style.borderRightColor,e.style.borderLeftWidth=a.style.borderRightWidth,e.style.borderTopColor=a.style.borderBottomColor,e.style.borderTopWidth=a.style.borderBottomWidth,d&&domUtils.addClass(a,"selectTdClass"),e},b.prototype={getMaxRows:function(){for(var a,b=this.table.rows,c=1,d=0;a=b[d];d++){for(var e,f=1,g=0;e=a.cells[g++];)f=Math.max(e.rowSpan||1,f);c=Math.max(f+d,c)}return c},getMaxCols:function(){for(var a,b=this.table.rows,c=0,d={},e=0;a=b[e];e++){for(var f,g=0,h=0;f=a.cells[h++];)if(g+=f.colSpan||1,f.rowSpan&&f.rowSpan>1)for(var i=1;ithis.rowsNum-1)?null:(e=c?h?i.endRowIndex+1:g.rowIndex+g.rowSpan:h?i.beginRowIndex-1:g.rowIndex-1,f=h?i.beginColIndex:g.colIndex,this.getCell(this.indexTable[e][f].rowIndex,this.indexTable[e][f].cellIndex))}catch(j){a(j)}},getSameEndPosCells:function(b,c){try{for(var d="x"===c.toLowerCase(),e=domUtils.getXY(b)[d?"x":"y"]+b["offset"+(d?"Width":"Height")],f=this.table.rows,g=null,h=[],i=0;ie&&d)break;if((b==j||e==l)&&(1==j[d?"colSpan":"rowSpan"]&&h.push(j),d))break}}return h}catch(m){a(m)}},setCellContent:function(a,b){a.innerHTML=b||(browser.ie?domUtils.fillChar:"
    ")},cloneCell:b.cloneCell,getSameStartPosXCells:function(b){try{for(var c,d=domUtils.getXY(b).x+b.offsetWidth,e=this.table.rows,f=[],g=0;gd)break;if(j==d&&1==h.colSpan){f.push(h);break}}}return f}catch(k){a(k)}},update:function(a){this.table=a||this.table,this.selectedTds=[],this.cellsRange={},this.indexTable=[];for(var b=this.table.rows,c=this.getMaxRows(),d=c-b.length,e=this.getMaxCols();d--;)this.table.insertRow(b.length);this.rowsNum=c,this.colsNum=e;for(var f=0,g=b.length;fc&&(j.rowSpan=c);for(var m=k,n=j.rowSpan||1,o=j.colSpan||1;this.indexTable[i][m];)m++;for(var p=0;p0)for(h=b;hf&&(m=Math.max(h,m));if(ee&&(l=Math.max(i,l));if(b>0)for(i=a;ig||d+b.colSpan-1>h)return null;j.push(this.getCell(c,b.cellIndex))}}return j},clearSelected:function(){b.removeSelectedClass(this.selectedTds),this.selectedTds=[],this.cellsRange={}},setSelected:function(a){var c=this.getCells(a);b.addSelectedClass(c),this.selectedTds=c,this.cellsRange=a},isFullRow:function(){var a=this.cellsRange;return a.endColIndex-a.beginColIndex+1==this.colsNum},isFullCol:function(){var a=this.cellsRange,b=this.table,c=b.getElementsByTagName("th"),d=a.endRowIndex-a.beginRowIndex+1;return c.length?d==this.rowsNum||d==this.rowsNum-1:d==this.rowsNum},getNextCell:function(b,c,d){try{var e,f,g=this.getCellInfo(b),h=this.selectedTds.length&&!d,i=this.cellsRange;return!c&&0==g.rowIndex||c&&(h?i.endRowIndex==this.rowsNum-1:g.rowIndex+g.rowSpan>this.rowsNum-1)?null:(e=c?h?i.endRowIndex+1:g.rowIndex+g.rowSpan:h?i.beginRowIndex-1:g.rowIndex-1,f=h?i.beginColIndex:g.colIndex,this.getCell(this.indexTable[e][f].rowIndex,this.indexTable[e][f].cellIndex))}catch(j){a(j)}},getPreviewCell:function(b,c){try{var d,e,f=this.getCellInfo(b),g=this.selectedTds.length,h=this.cellsRange;return!c&&(g?!h.beginColIndex:!f.colIndex)||c&&(g?h.endColIndex==this.colsNum-1:f.rowIndex>this.colsNum-1)?null:(d=c?g?h.beginRowIndex:f.rowIndex<1?0:f.rowIndex-1:g?h.beginRowIndex:f.rowIndex,e=c?g?h.endColIndex+1:f.colIndex:g?h.beginColIndex-1:f.colIndex<1?0:f.colIndex-1,this.getCell(this.indexTable[d][e].rowIndex,this.indexTable[d][e].cellIndex))}catch(i){a(i)}},moveContent:function(a,c){if(!b.isEmptyBlock(c)){if(b.isEmptyBlock(a))return void(a.innerHTML=c.innerHTML);var d=a.lastChild;for(3!=d.nodeType&&dtd.$block[d.tagName]||a.appendChild(a.ownerDocument.createElement("br"));d=c.firstChild;)a.appendChild(d)}},mergeRight:function(a){var b=this.getCellInfo(a),c=b.colIndex+b.colSpan,d=this.indexTable[b.rowIndex][c],e=this.getCell(d.rowIndex,d.cellIndex);a.colSpan=b.colSpan+d.colSpan,a.removeAttribute("width"),this.moveContent(a,e),this.deleteCell(e,d.rowIndex),this.update()},mergeDown:function(a){var b=this.getCellInfo(a),c=b.rowIndex+b.rowSpan,d=this.indexTable[c][b.colIndex],e=this.getCell(d.rowIndex,d.cellIndex);a.rowSpan=b.rowSpan+d.rowSpan,a.removeAttribute("height"),this.moveContent(a,e),this.deleteCell(e,d.rowIndex),this.update()},mergeRange:function(){var a=this.cellsRange,b=this.getCell(a.beginRowIndex,this.indexTable[a.beginRowIndex][a.beginColIndex].cellIndex);if("TH"==b.tagName&&a.endRowIndex!==a.beginRowIndex){var c=this.indexTable,d=this.getCellInfo(b);b=this.getCell(1,c[1][d.colIndex].cellIndex),a=this.getCellsRange(b,this.getCell(c[this.rowsNum-1][d.colIndex].rowIndex,c[this.rowsNum-1][d.colIndex].cellIndex))}for(var e,f=this.getCells(a),g=0;e=f[g++];)e!==b&&(this.moveContent(b,e),this.deleteCell(e));if(b.rowSpan=a.endRowIndex-a.beginRowIndex+1,b.rowSpan>1&&b.removeAttribute("height"),b.colSpan=a.endColIndex-a.beginColIndex+1,b.colSpan>1&&b.removeAttribute("width"),b.rowSpan==this.rowsNum&&1!=b.colSpan&&(b.colSpan=1),b.colSpan==this.colsNum&&1!=b.rowSpan){var h=b.parentNode.rowIndex;if(this.table.deleteRow)for(var g=h+1,i=h+1,j=b.rowSpan;g1&&g.rowIndex==a){var i=h.cloneNode(!0);i.rowSpan=h.rowSpan-1,i.innerHTML="",h.rowSpan=1;var j,k=a+1,l=this.table.rows[k],m=this.getPreviewMergedCellsNum(k,f)-e;m1?l.colSpan--:c[h].deleteCell(j.cellIndex),h+=j.rowSpan||1}}this.table.setAttribute("width",d-e),this.update()},splitToCells:function(a){var b=this,c=this.splitToRows(a);utils.each(c,function(a){b.splitToCols(a)})},splitToRows:function(a){var b=this.getCellInfo(a),c=b.rowIndex,d=b.colIndex,e=[];a.rowSpan=1,e.push(a);for(var f=c,g=c+b.rowSpan;f");for(var g=0;g'+(browser.ie&&browser.version<11?domUtils.fillChar:"
    ")+"");c.push("")}return"
    "+c.join("")+"
    "}b||(b=utils.extend({},{numCols:this.options.defaultCols,numRows:this.options.defaultRows,tdvalign:this.options.tdvalign}));var d=this,e=this.selection.getRange(),f=e.startContainer,h=domUtils.findParent(f,function(a){return domUtils.isBlockElm(a)},!0)||d.body,i=g(d),j=h.offsetWidth,k=Math.floor(j/b.numCols-2*i.tdPadding-i.tdBorder);!b.tdvalign&&(b.tdvalign=d.options.tdvalign),d.execCommand("inserthtml",c(b,k))}},UE.commands.insertparagraphbeforetable={queryCommandState:function(){return e(this).cell?0:-1},execCommand:function(){var a=e(this).table;if(a){var b=this.document.createElement("p");b.innerHTML=browser.ie?" ":"
    ",a.parentNode.insertBefore(b,a),this.selection.getRange().setStart(b,0).setCursor()}}},UE.commands.deletetable={queryCommandState:function(){var a=this.selection.getRange();return domUtils.findParentByTagName(a.startContainer,"table",!0)?0:-1},execCommand:function(a,b){var c=this.selection.getRange();if(b=b||domUtils.findParentByTagName(c.startContainer,"table",!0)){var d=b.nextSibling;d||(d=domUtils.createElement(this.document,"p",{innerHTML:browser.ie?domUtils.fillChar:"
    "}),b.parentNode.insertBefore(d,b)),domUtils.remove(b),c=this.selection.getRange(),3==d.nodeType?c.setStartBefore(d):c.setStart(d,0),c.setCursor(!1,!0),this.fireEvent("tablehasdeleted")}}},UE.commands.cellalign={queryCommandState:function(){return c(this).length?0:-1},execCommand:function(a,b){var d=c(this);if(d.length)for(var e,f=0;e=d[f++];)e.setAttribute("align",b)}},UE.commands.cellvalign={queryCommandState:function(){return c(this).length?0:-1},execCommand:function(a,b){var d=c(this);if(d.length)for(var e,f=0;e=d[f++];)e.setAttribute("vAlign",b)}},UE.commands.insertcaption={queryCommandState:function(){var a=e(this).table;return a&&0==a.getElementsByTagName("caption").length?1:-1},execCommand:function(){var a=e(this).table;if(a){var b=this.document.createElement("caption");b.innerHTML=browser.ie?domUtils.fillChar:"
    ",a.insertBefore(b,a.firstChild);var c=this.selection.getRange();c.setStart(b,0).setCursor()}}},UE.commands.deletecaption={queryCommandState:function(){var a=this.selection.getRange(),b=domUtils.findParentByTagName(a.startContainer,"table");return b?0==b.getElementsByTagName("caption").length?-1:1:-1},execCommand:function(){var a=this.selection.getRange(),b=domUtils.findParentByTagName(a.startContainer,"table");if(b){domUtils.remove(b.getElementsByTagName("caption")[0]);var c=this.selection.getRange();c.setStart(b.rows[0].cells[0],0).setCursor()}}},UE.commands.inserttitle={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[0];return"th"!=b.cells[b.cells.length-1].tagName.toLowerCase()?0:-1}return-1},execCommand:function(){var a=e(this).table;a&&h(a).insertRow(0,"th");var b=a.getElementsByTagName("th")[0];this.selection.getRange().setStart(b,0).setCursor(!1,!0)}},UE.commands.deletetitle={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[0];return"th"==b.cells[b.cells.length-1].tagName.toLowerCase()?0:-1}return-1},execCommand:function(){var a=e(this).table;a&&domUtils.remove(a.rows[0]);var b=a.getElementsByTagName("td")[0];this.selection.getRange().setStart(b,0).setCursor(!1,!0)}},UE.commands.inserttitlecol={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[a.rows.length-1];return b.getElementsByTagName("th").length?-1:0}return-1},execCommand:function(b){var c=e(this).table;c&&h(c).insertCol(0,"th"),a(c,this);var d=c.getElementsByTagName("th")[0];this.selection.getRange().setStart(d,0).setCursor(!1,!0)}},UE.commands.deletetitlecol={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[a.rows.length-1];return b.getElementsByTagName("th").length?0:-1}return-1},execCommand:function(){var b=e(this).table;if(b)for(var c=0;c=f.colsNum)return-1;var j=f.indexTable[g.rowIndex][i],k=c.rows[j.rowIndex].cells[j.cellIndex];return k&&d.tagName==k.tagName&&j.rowIndex==g.rowIndex&&j.rowSpan==g.rowSpan?0:-1},execCommand:function(a){var b=this.selection.getRange(),c=b.createBookmark(!0),d=e(this).cell,f=h(d);f.mergeRight(d),b.moveToBookmark(c).select()}},UE.commands.mergedown={queryCommandState:function(a){var b=e(this),c=b.table,d=b.cell;if(!c||!d)return-1;var f=h(c);if(f.selectedTds.length)return-1;var g=f.getCellInfo(d),i=g.rowIndex+g.rowSpan;if(i>=f.rowsNum)return-1;var j=f.indexTable[i][g.colIndex],k=c.rows[j.rowIndex].cells[j.cellIndex];return k&&d.tagName==k.tagName&&j.colIndex==g.colIndex&&j.colSpan==g.colSpan?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.mergeDown(c),a.moveToBookmark(b).select()}},UE.commands.mergecells={queryCommandState:function(){return f(this)?0:-1},execCommand:function(){var a=f(this);if(a&&a.selectedTds.length){var b=a.selectedTds[0];a.mergeRange();var c=this.selection.getRange();domUtils.isEmptyBlock(b)?c.setStart(b,0).collapse(!0):c.selectNodeContents(b),c.select()}}},UE.commands.insertrow={queryCommandState:function(){var a=e(this),b=a.cell;return b&&("TD"==b.tagName||"TH"==b.tagName&&a.tr!==a.table.rows[0])&&h(a.table).rowsNum0?-1:b&&(b.colSpan>1||b.rowSpan>1)?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.splitToCells(c),a.moveToBookmark(b).select()}},UE.commands.splittorows={queryCommandState:function(){var a=e(this),b=a.cell;if(!b)return-1;var c=h(a.table);return c.selectedTds.length>0?-1:b&&b.rowSpan>1?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.splitToRows(c),a.moveToBookmark(b).select()}},UE.commands.splittocols={queryCommandState:function(){var a=e(this),b=a.cell;if(!b)return-1;var c=h(a.table);return c.selectedTds.length>0?-1:b&&b.colSpan>1?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.splitToCols(c),a.moveToBookmark(b).select()}},UE.commands.adaptbytext=UE.commands.adaptbywindow={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(b){var c=e(this),d=c.table;if(d)if("adaptbywindow"==b)a(d,this);else{var f=domUtils.getElementsByTagName(d,"td th");utils.each(f,function(a){a.removeAttribute("width")}),d.removeAttribute("width")}}},UE.commands.averagedistributecol={queryCommandState:function(){var a=f(this);return a&&(a.isFullRow()||a.isFullCol())?0:-1},execCommand:function(a){function b(){var a,b=e.table,c=0,f=0,h=g(d,b);if(e.isFullRow())c=b.offsetWidth,f=e.colsNum;else for(var i,j=e.cellsRange.beginColIndex,k=e.cellsRange.endColIndex,l=j;l<=k;)i=e.selectedTds[l],c+=i.offsetWidth,l+=i.colSpan,f+=1;return a=Math.ceil(c/f)-2*h.tdBorder-2*h.tdPadding}function c(a){utils.each(domUtils.getElementsByTagName(e.table,"th"),function(a){a.setAttribute("width","")});var b=e.isFullRow()?domUtils.getElementsByTagName(e.table,"td"):e.selectedTds;utils.each(b,function(b){1==b.colSpan&&b.setAttribute("width",a)})}var d=this,e=f(d);e&&e.selectedTds.length&&c(b())}},UE.commands.averagedistributerow={queryCommandState:function(){var a=f(this);return a?a.selectedTds&&/th/gi.test(a.selectedTds[0].tagName)?-1:a.isFullRow()||a.isFullCol()?0:-1:-1},execCommand:function(a){function b(){var a,b,c=0,f=e.table,h=g(d,f),i=parseInt(domUtils.getComputedStyle(f.getElementsByTagName("td")[0],"padding-top"));if(e.isFullCol()){var j,k,l=domUtils.getElementsByTagName(f,"caption"),m=domUtils.getElementsByTagName(f,"th");l.length>0&&(j=l[0].offsetHeight),m.length>0&&(k=m[0].offsetHeight),c=f.offsetHeight-(j||0)-(k||0),b=0==m.length?e.rowsNum:e.rowsNum-1}else{for(var n=e.cellsRange.beginRowIndex,o=e.cellsRange.endRowIndex,p=0,q=domUtils.getElementsByTagName(f,"tr"),r=n;r<=o;r++)c+=q[r].offsetHeight,p+=1;b=p}return a=browser.ie&&browser.version<9?Math.ceil(c/b):Math.ceil(c/b)-2*h.tdBorder-2*i}function c(a){var b=e.isFullCol()?domUtils.getElementsByTagName(e.table,"td"):e.selectedTds;utils.each(b,function(b){1==b.rowSpan&&b.setAttribute("height",a)})}var d=this,e=f(d);e&&e.selectedTds.length&&c(b())}},UE.commands.cellalignment={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a,b){var c=this,d=f(c);if(d)utils.each(d.selectedTds,function(a){domUtils.setAttributes(a,b)});else{var e=c.selection.getStart(),g=e&&domUtils.findParentByTagName(e,["td","th","caption"],!0);/caption/gi.test(g.tagName)?(g.style.textAlign=b.align,g.style.verticalAlign=b.vAlign):domUtils.setAttributes(g,b),c.selection.getRange().setCursor(!0)}},queryCommandValue:function(a){var b=e(this).cell;if(b||(b=c(this)[0]),b){var d=UE.UETable.getUETable(b).selectedTds;return!d.length&&(d=b),UE.UETable.getTableCellAlignState(d)}return null}},UE.commands.tablealignment={queryCommandState:function(){return browser.ie&&browser.version<8?-1:e(this).table?0:-1},execCommand:function(a,b){var c=this,d=c.selection.getStart(),e=d&&domUtils.findParentByTagName(d,["table"],!0);e&&e.setAttribute("align",b)}},UE.commands.edittable={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a,b){var c=this.selection.getRange(),d=domUtils.findParentByTagName(c.startContainer,"table");if(d){var e=domUtils.getElementsByTagName(d,"td").concat(domUtils.getElementsByTagName(d,"th"),domUtils.getElementsByTagName(d,"caption"));utils.each(e,function(a){a.style.borderColor=b})}}},UE.commands.edittd={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a,b){var c=this,d=f(c);if(d)utils.each(d.selectedTds,function(a){a.style.backgroundColor=b});else{var e=c.selection.getStart(),g=e&&domUtils.findParentByTagName(e,["td","th","caption"],!0);g&&(g.style.backgroundColor=b)}}},UE.commands.settablebackground={queryCommandState:function(){return c(this).length>1?0:-1},execCommand:function(a,b){var d,e;d=c(this),e=h(d[0]),e.setBackground(d,b)}},UE.commands.cleartablebackground={queryCommandState:function(){var a=c(this);if(!a.length)return-1;for(var b,d=0;b=a[d++];)if(""!==b.style.backgroundColor)return 0;return-1},execCommand:function(){var a=c(this),b=h(a[0]);b.removeBackground(a)}},UE.commands.interlacetable=UE.commands.uninterlacetable={queryCommandState:function(a){var b=e(this).table;if(!b)return-1;var c=b.getAttribute("interlaced");return"interlacetable"==a?"enabled"===c?-1:0:c&&"disabled"!==c?0:-1},execCommand:function(a,b){var c=e(this).table;"interlacetable"==a?(c.setAttribute("interlaced","enabled"),this.fireEvent("interlacetable",c,b)):(c.setAttribute("interlaced","disabled"),this.fireEvent("uninterlacetable",c))}},UE.commands.setbordervisible={queryCommandState:function(a){var b=e(this).table;return b?0:-1},execCommand:function(){var a=e(this).table;utils.each(domUtils.getElementsByTagName(a,"td"),function(a){a.style.borderWidth="1px",a.style.borderStyle="solid"})}}}(),UE.plugins.table=function(){function a(a){}function b(a,b){c(a,"width",!0),c(a,"height",!0)}function c(a,b,c){a.style[b]&&(c&&a.setAttribute(b,parseInt(a.style[b],10)),a.style[b]="")}function d(a){if("TD"==a.tagName||"TH"==a.tagName)return a;var b;return(b=domUtils.findParentByTagName(a,"td",!0)||domUtils.findParentByTagName(a,"th",!0))?b:null}function e(a){var b=new RegExp(domUtils.fillChar,"g");if(a[browser.ie?"innerText":"textContent"].replace(/^\s*$/,"").replace(b,"").length>0)return 0;for(var c in dtd.$isNotEmpty)if(a.getElementsByTagName(c).length)return 0;return 1}function f(a){return a.pageX||a.pageY?{x:a.pageX,y:a.pageY}:{x:a.clientX+N.document.body.scrollLeft-N.document.body.clientLeft,y:a.clientY+N.document.body.scrollTop-N.document.body.clientTop}}function g(b){if(!A())try{var c,e=d(b.target||b.srcElement);if(R&&(N.body.style.webkitUserSelect="none",(Math.abs(V.x-b.clientX)>T||Math.abs(V.y-b.clientY)>T)&&(t(),R=!1,U=0,v(b))),ca&&ha)return U=0,N.body.style.webkitUserSelect="none",N.selection.getNative()[browser.ie9below?"empty":"removeAllRanges"](),c=f(b),m(N,!0,ca,c,e),void("h"==ca?ga.style.left=k(ha,b)+"px":"v"==ca&&(ga.style.top=l(ha,b)+"px"));if(e){if(N.fireEvent("excludetable",e)===!0)return;c=f(b);var g=n(e,c),i=domUtils.findParentByTagName(e,"table",!0);if(j(i,e,b,!0)){if(N.fireEvent("excludetable",i)===!0)return;N.body.style.cursor="url("+N.options.cursorpath+"h.png),pointer"}else if(j(i,e,b)){if(N.fireEvent("excludetable",i)===!0)return;N.body.style.cursor="url("+N.options.cursorpath+"v.png),pointer"}else{N.body.style.cursor="text";/\d/.test(g)&&(g=g.replace(/\d/,""),e=Y(e).getPreviewCell(e,"v"==g)),m(N,!!e&&!!g,e?g:"",c,e)}}else h(!1,i,N)}catch(o){a(o)}}function h(a,b,c){if(a)i(b,c);else{if(fa)return;la=setTimeout(function(){!fa&&ea&&ea.parentNode&&ea.parentNode.removeChild(ea)},2e3)}}function i(a,b){function c(c,d){clearTimeout(g),g=setTimeout(function(){b.fireEvent("tableClicked",a,d)},300)}function d(c){clearTimeout(g);var d=Y(a),e=a.rows[0].cells[0],f=d.getLastCell(),h=d.getCellsRange(e,f);b.selection.getRange().setStart(e,0).setCursor(!1,!0),d.setSelected(h)}var e=domUtils.getXY(a),f=a.ownerDocument;if(ea&&ea.parentNode)return ea;ea=f.createElement("div"),ea.contentEditable=!1,ea.innerHTML="",ea.style.cssText="width:15px;height:15px;background-image:url("+b.options.UEDITOR_HOME_URL+"dialogs/table/dragicon.png);position: absolute;cursor:move;top:"+(e.y-15)+"px;left:"+e.x+"px;",domUtils.unSelectable(ea),ea.onmouseover=function(a){fa=!0},ea.onmouseout=function(a){fa=!1},domUtils.on(ea,"click",function(a,b){c(b,this)}),domUtils.on(ea,"dblclick",function(a,b){d(b)}),domUtils.on(ea,"dragstart",function(a,b){domUtils.preventDefault(b)});var g;f.body.appendChild(ea)}function j(a,b,c,d){var e=f(c),g=n(b,e);if(d){var h=a.getElementsByTagName("caption")[0],i=h?h.offsetHeight:0;return"v1"==g&&e.y-domUtils.getXY(a).y-i<8}return"h1"==g&&e.x-domUtils.getXY(a).x<8}function k(a,b){var c=Y(a);if(c){var d=c.getSameEndPosCells(a,"x")[0],e=c.getSameStartPosXCells(a)[0],g=f(b).x,h=(d?domUtils.getXY(d).x:domUtils.getXY(c.table).x)+20,i=e?domUtils.getXY(e).x+e.offsetWidth-20:N.body.offsetWidth+5||parseInt(domUtils.getComputedStyle(N.body,"width"),10);return h+=Q,i-=Q,gi?i:g}}function l(b,c){try{var d=domUtils.getXY(b).y,e=f(c).y;return ek[c]?(a=!1,!1):void l.push(d)});var b=a?l:k;utils.each(i,function(a,c){a.width=b[c]-G()})},0)}}}}function q(a){if(_(domUtils.getElementsByTagName(N.body,"td th")),utils.each(N.document.getElementsByTagName("table"),function(a){a.ueTable=null}),aa=M(N,a)){var b=domUtils.findParentByTagName(aa,"table",!0);ut=Y(b),ut&&ut.clearSelected(),da?r(a):(N.document.body.style.webkitUserSelect="",ia=!0,N.addListener("mouseover",x))}}function r(a){browser.ie&&(a=u(a)),t(),R=!0,O=setTimeout(function(){v(a)},W)}function s(a,b){for(var c=[],d=null,e=0,f=a.length;e0&&U--},W),2===U))return U=0,void p(b);if(2!=b.button){var c=this,d=c.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"table",!0),f=domUtils.findParentByTagName(d.endContainer,"table",!0);if((e||f)&&(e===f?(e=domUtils.findParentByTagName(d.startContainer,["td","th","caption"],!0),f=domUtils.findParentByTagName(d.endContainer,["td","th","caption"],!0),e!==f&&c.selection.clearRange()):c.selection.clearRange()),ia=!1,c.document.body.style.webkitUserSelect="",ca&&ha&&(c.selection.getNative()[browser.ie9below?"empty":"removeAllRanges"](),U=0,ga=c.document.getElementById("ue_tableDragLine"))){var g=domUtils.getXY(ha),h=domUtils.getXY(ga);switch(ca){case"h":z(ha,h.x-g.x);break;case"v":B(ha,h.y-g.y-ha.offsetHeight)}return ca="",ha=null,I(c),void c.fireEvent("saveScene")}if(aa){var i=Y(aa),j=i?i.selectedTds[0]:null;if(j)d=new dom.Range(c.document),domUtils.isEmptyBlock(j)?d.setStart(j,0).setCursor(!1,!0):d.selectNodeContents(j).shrinkBoundary().setCursor(!1,!0);else if(d=c.selection.getRange().shrinkBoundary(),!d.collapsed){var e=domUtils.findParentByTagName(d.startContainer,["td","th"],!0),f=domUtils.findParentByTagName(d.endContainer,["td","th"],!0);(e&&!f||!e&&f||e&&f&&e!==f)&&d.setCursor(!1,!0)}aa=null,c.removeListener("mouseover",x)}else{var k=domUtils.findParentByTagName(b.target||b.srcElement,"td",!0);if(k||(k=domUtils.findParentByTagName(b.target||b.srcElement,"th",!0)),k&&("TD"==k.tagName||"TH"==k.tagName)){if(c.fireEvent("excludetable",k)===!0)return;d=new dom.Range(c.document),d.setStart(k,0).setCursor(!1,!0)}}c._selectionChange(250,b)}}}function x(a,b){if(!A()){var c=this,d=b.target||b.srcElement;if(ba=domUtils.findParentByTagName(d,"td",!0)||domUtils.findParentByTagName(d,"th",!0),aa&&ba&&("TD"==aa.tagName&&"TD"==ba.tagName||"TH"==aa.tagName&&"TH"==ba.tagName)&&domUtils.findParentByTagName(aa,"table")==domUtils.findParentByTagName(ba,"table")){var e=Y(ba);if(aa!=ba){c.document.body.style.webkitUserSelect="none",c.selection.getNative()[browser.ie9below?"empty":"removeAllRanges"]();var f=e.getCellsRange(aa,ba);e.setSelected(f)}else c.document.body.style.webkitUserSelect="",e.clearSelected()}b.preventDefault?b.preventDefault():b.returnValue=!1}}function y(a,b,c){var d=parseInt(domUtils.getComputedStyle(a,"line-height"),10),e=c+b;b=ef?(c&&g.push({left:a}),!1):void 0})}),g}function D(a,b,c){if(a-=G(),a<0)return 0;a-=E(b);var d=a<0?"left":"right";return a=Math.abs(a),utils.each(c,function(b){var c=b[d];c&&(a=Math.min(a,E(c)-Q))}),a=a<0?0:a,"left"===d?-a:a}function E(a){var b=0,b=a.offsetWidth-G();a.nextSibling||(b-=F(a)),b=b<0?0:b;try{a.width=b}catch(c){}return b}function F(a){if(tab=domUtils.findParentByTagName(a,"table",!1),void 0===tab.offsetVal){var b=a.previousSibling;b?tab.offsetVal=a.offsetWidth-b.offsetWidth===X.borderWidth?X.borderWidth:0:tab.offsetVal=0}return tab.offsetVal}function G(){if(void 0===X.tabcellSpace){var a=N.document.createElement("table"),b=N.document.createElement("tbody"),c=N.document.createElement("tr"),d=N.document.createElement("td"),e=null;d.style.cssText="border: 0;",d.width=1,c.appendChild(d),c.appendChild(e=d.cloneNode(!1)),b.appendChild(c),a.appendChild(b),a.style.cssText="visibility: hidden;",N.body.appendChild(a),X.paddingSpace=d.offsetWidth-1;var f=a.offsetWidth;d.style.cssText="",e.style.cssText="",X.borderWidth=(a.offsetWidth-f)/3,X.tabcellSpace=X.paddingSpace+X.borderWidth,N.body.removeChild(a)}return G=function(){return X.tabcellSpace},X.tabcellSpace}function H(a,b){ia||(ga=a.document.createElement("div"),domUtils.setAttributes(ga,{id:"ue_tableDragLine",unselectable:"on",contenteditable:!1,onresizestart:"return false",ondragstart:"return false",onselectstart:"return false",style:"background-color:blue;position:absolute;padding:0;margin:0;background-image:none;border:0px none;opacity:0;filter:alpha(opacity=0)"}),a.body.appendChild(ga))}function I(a){if(!ia)for(var b;b=a.document.getElementById("ue_tableDragLine");)domUtils.remove(b)}function J(a,b){if(b){var c,d=domUtils.findParentByTagName(b,"table"),e=d.getElementsByTagName("caption"),f=d.offsetWidth,g=d.offsetHeight-(e.length>0?e[0].offsetHeight:0),h=domUtils.getXY(d),i=domUtils.getXY(b);switch(a){case"h":c="height:"+g+"px;top:"+(h.y+(e.length>0?e[0].offsetHeight:0))+"px;left:"+(i.x+b.offsetWidth),ga.style.cssText=c+"px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)";break;case"v":c="width:"+f+"px;left:"+h.x+"px;top:"+(i.y+b.offsetHeight),ga.style.cssText=c+"px;overflow:hidden;position: absolute;display:block;background-color:blue;height:1px;border:0;color:blue;opacity:.2;filter:alpha(opacity=20)"}}}function K(a,b){for(var c,d,e=domUtils.getElementsByTagName(a.body,"table"),f=0;d=e[f++];){var g=domUtils.getElementsByTagName(d,"td");g[0]&&(b?(c=g[0].style.borderColor.replace(/\s/g,""),/(#ffffff)|(rgb\(255,255,255\))/gi.test(c)&&domUtils.addClass(d,"noBorderTable")):domUtils.removeClasses(d,"noBorderTable"))}}function L(a,b,c){var d=a.body;return d.offsetWidth-(b?2*parseInt(domUtils.getComputedStyle(d,"margin-left"),10):0)-2*c.tableBorder-(a.options.offsetWidth||0)}function M(a,b){var c=domUtils.findParentByTagName(b.target||b.srcElement,["td","th"],!0),d=null;if(!c)return null;if(d=n(c,f(b)),!c)return null;if("h1"===d&&c.previousSibling){var e=domUtils.getXY(c),g=c.offsetWidth;Math.abs(e.x+g-b.clientX)>g/3&&(c=c.previousSibling)}else if("v1"===d&&c.parentNode.previousSibling){var e=domUtils.getXY(c),h=c.offsetHeight;Math.abs(e.y+h-b.clientY)>h/3&&(c=c.parentNode.previousSibling.firstChild)}return c&&a.fireEvent("excludetable",c)!==!0?c:null}var N=this,O=null,P=null,Q=5,R=!1,S=5,T=10,U=0,V=null,W=360,X=UE.UETable,Y=function(a){return X.getUETable(a)},Z=function(a){return X.getUETableBySelected(a)},$=function(a,b){return X.getDefaultValue(a,b)},_=function(a){return X.removeSelectedClass(a)};N.ready(function(){var a=this,b=a.selection.getText;a.selection.getText=function(){var c=Z(a);if(c){var d="";return utils.each(c.selectedTds,function(a){d+=a[browser.ie?"innerText":"textContent"]}),d}return b.call(a.selection)}});var aa=null,ba=null,ca="",da=!1,ea=null,fa=!1,ga=null,ha=null,ia=!1,ja=!0;N.setOpt({maxColNum:20,maxRowNum:100,defaultCols:5,defaultRows:5,tdvalign:"top",cursorpath:N.options.UEDITOR_HOME_URL+"themes/default/images/cursor_",tableDragable:!1,classList:["ue-table-interlace-color-single","ue-table-interlace-color-double"]}),N.getUETable=Y;var ka={deletetable:1,inserttable:1,cellvalign:1,insertcaption:1,deletecaption:1,inserttitle:1,deletetitle:1,mergeright:1,mergedown:1,mergecells:1,insertrow:1,insertrownext:1,deleterow:1,insertcol:1,insertcolnext:1,deletecol:1,splittocells:1,splittorows:1,splittocols:1,adaptbytext:1,adaptbywindow:1,adaptbycustomer:1,insertparagraph:1,insertparagraphbeforetable:1,averagedistributecol:1,averagedistributerow:1};N.ready(function(){utils.cssRule("table",".selectTdClass{background-color:#edf5fa !important}table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}table{margin-bottom:10px;border-collapse:collapse;display:table;}td,th{padding: 5px 10px;border: 1px solid #DDD;}caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}th{border-top:1px solid #BBB;background-color:#F7F7F7;}table tr.firstRow th{border-top-width:2px;}.ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }td p{margin:0;padding:0;}",N.document);var a,c,f;N.addListener("keydown",function(b,d){var g=this,h=d.keyCode||d.which;if(8==h){var i=Z(g);i&&i.selectedTds.length&&(i.isFullCol()?g.execCommand("deletecol"):i.isFullRow()?g.execCommand("deleterow"):g.fireEvent("delcells"),domUtils.preventDefault(d));var j=domUtils.findParentByTagName(g.selection.getStart(),"caption",!0),k=g.selection.getRange();if(k.collapsed&&j&&e(j)){g.fireEvent("saveScene");var l=j.parentNode;domUtils.remove(j),l&&k.setStart(l.rows[0].cells[0],0).setCursor(!1,!0),g.fireEvent("saveScene")}}if(46==h&&(i=Z(g))){g.fireEvent("saveScene");for(var m,n=0;m=i.selectedTds[n++];)domUtils.fillNode(g.document,m);g.fireEvent("saveScene"),domUtils.preventDefault(d)}if(13==h){var o=g.selection.getRange(),j=domUtils.findParentByTagName(o.startContainer,"caption",!0);if(j){var l=domUtils.findParentByTagName(j,"table");return o.collapsed?j&&o.setStart(l.rows[0].cells[0],0).setCursor(!1,!0):(o.deleteContents(),g.fireEvent("saveScene")),void domUtils.preventDefault(d)}if(o.collapsed){var l=domUtils.findParentByTagName(o.startContainer,"table");if(l){var p=l.rows[0].cells[0],q=domUtils.findParentByTagName(g.selection.getStart(),["td","th"],!0),r=l.previousSibling;if(p===q&&(!r||1==r.nodeType&&"TABLE"==r.tagName)&&domUtils.isStartInblock(o)){var s=domUtils.findParent(g.selection.getStart(),function(a){return domUtils.isBlockElm(a)},!0);s&&(/t(h|d)/i.test(s.tagName)||s===q.firstChild)&&(g.execCommand("insertparagraphbeforetable"),domUtils.preventDefault(d))}}}}if((d.ctrlKey||d.metaKey)&&"67"==d.keyCode){a=null;var i=Z(g);if(i){var t=i.selectedTds;c=i.isFullCol(),f=i.isFullRow(),a=[[i.cloneCell(t[0],null,!0)]];for(var m,n=1;m=t[n];n++)m.parentNode!==t[n-1].parentNode?a.push([i.cloneCell(m,null,!0)]):a[a.length-1].push(i.cloneCell(m,null,!0))}}}),N.addListener("tablehasdeleted",function(){m(this,!1,"",null),ea&&domUtils.remove(ea)}),N.addListener("beforepaste",function(d,g){var h=this,i=h.selection.getRange();if(domUtils.findParentByTagName(i.startContainer,"caption",!0)){var j=h.document.createElement("div");return j.innerHTML=g.html,void(g.html=j[browser.ie9below?"innerText":"textContent"])}var k=Z(h);if(a){h.fireEvent("saveScene");var l,m,i=h.selection.getRange(),n=domUtils.findParentByTagName(i.startContainer,["td","th"],!0);if(n){var o=Y(n);if(f){var p=o.getCellInfo(n).rowIndex;"TH"==n.tagName&&p++;for(var q,r=0;q=a[r++];){for(var s,t=o.insertRow(p++,"td"),u=0;s=q[u];u++){var v=t.cells[u];v||(v=t.insertCell(u)),v.innerHTML=s.innerHTML,s.getAttribute("width")&&v.setAttribute("width",s.getAttribute("width")),s.getAttribute("vAlign")&&v.setAttribute("vAlign",s.getAttribute("vAlign")),s.getAttribute("align")&&v.setAttribute("align",s.getAttribute("align")),s.style.cssText&&(v.style.cssText=s.style.cssText)}for(var s,u=0;(s=t.cells[u])&&q[u];u++)s.innerHTML=q[u].innerHTML,q[u].getAttribute("width")&&s.setAttribute("width",q[u].getAttribute("width")),q[u].getAttribute("vAlign")&&s.setAttribute("vAlign",q[u].getAttribute("vAlign")),q[u].getAttribute("align")&&s.setAttribute("align",q[u].getAttribute("align")),q[u].style.cssText&&(s.style.cssText=q[u].style.cssText)}}else{if(c){y=o.getCellInfo(n);for(var s,w=0,u=0,q=a[0];s=q[u++];)w+=s.colSpan||1;for(h.__hasEnterExecCommand=!0,r=0;r1&&(x.rowSpan=1)}var z=$(h),A=h.body.offsetWidth-(ja?2*parseInt(domUtils.getComputedStyle(h.body,"margin-left"),10):0)-2*z.tableBorder-(h.options.offsetWidth||0);h.execCommand("insertHTML",""+k.innerHTML.replace(/>\s*<").replace(/\bth\b/gi,"td")+"
    ")}return h.fireEvent("contentchange"),h.fireEvent("saveScene"),g.html="",!0}var B,j=h.document.createElement("div");j.innerHTML=g.html,B=j.getElementsByTagName("table"),domUtils.findParentByTagName(h.selection.getStart(),"table")?(utils.each(B,function(a){domUtils.remove(a)}),domUtils.findParentByTagName(h.selection.getStart(),"caption",!0)&&(j.innerHTML=j[browser.ie?"innerText":"textContent"])):utils.each(B,function(a){b(a,!0),domUtils.removeAttributes(a,["style","border"]),utils.each(domUtils.getElementsByTagName(a,"td"),function(a){e(a)&&domUtils.fillNode(h.document,a),b(a,!0)})}),g.html=j.innerHTML}),N.addListener("afterpaste",function(){utils.each(domUtils.getElementsByTagName(N.body,"table"),function(a){if(a.offsetWidth>N.body.offsetWidth){var b=$(N,a);a.style.width=N.body.offsetWidth-(ja?2*parseInt(domUtils.getComputedStyle(N.body,"margin-left"),10):0)-2*b.tableBorder-(N.options.offsetWidth||0)+"px"}})}),N.addListener("blur",function(){a=null});var i;N.addListener("keydown",function(){clearTimeout(i),i=setTimeout(function(){var a=N.selection.getRange(),b=domUtils.findParentByTagName(a.startContainer,["th","td"],!0);if(b){var c=b.parentNode.parentNode.parentNode;c.offsetWidth>c.getAttribute("width")&&(b.style.wordBreak="break-all")}},100)}),N.addListener("selectionchange",function(){m(N,!1,"",null)}),N.addListener("contentchange",function(){var a=this;if(I(a),!Z(a)){var b=a.selection.getRange(),c=b.startContainer;c=domUtils.findParentByTagName(c,["td","th"],!0),utils.each(domUtils.getElementsByTagName(a.document,"table"),function(b){a.fireEvent("excludetable",b)!==!0&&(b.ueTable=new X(b),b.onmouseover=function(){a.fireEvent("tablemouseover",b)},b.onmousemove=function(){a.fireEvent("tablemousemove",b),a.options.tableDragable&&h(!0,this,a),utils.defer(function(){a.fireEvent("contentchange",50)},!0)},b.onmouseout=function(){a.fireEvent("tablemouseout",b),m(a,!1,"",null),I(a)},b.onclick=function(b){b=a.window.event||b;var c=d(b.target||b.srcElement);if(c){var e,f=Y(c),g=f.table,h=f.getCellInfo(c),i=a.selection.getRange();if(j(g,c,b,!0)){var k=f.getCell(f.indexTable[f.rowsNum-1][h.colIndex].rowIndex,f.indexTable[f.rowsNum-1][h.colIndex].cellIndex);return void(b.shiftKey&&f.selectedTds.length?f.selectedTds[0]!==k?(e=f.getCellsRange(f.selectedTds[0],k),f.setSelected(e)):i&&i.selectNodeContents(k).select():c!==k?(e=f.getCellsRange(c,k),f.setSelected(e)):i&&i.selectNodeContents(k).select())}if(j(g,c,b)){var l=f.getCell(f.indexTable[h.rowIndex][f.colsNum-1].rowIndex,f.indexTable[h.rowIndex][f.colsNum-1].cellIndex);b.shiftKey&&f.selectedTds.length?f.selectedTds[0]!==l?(e=f.getCellsRange(f.selectedTds[0],l),f.setSelected(e)):i&&i.selectNodeContents(l).select():c!==l?(e=f.getCellsRange(c,l),f.setSelected(e)):i&&i.selectNodeContents(l).select()}}})}),K(a,!0)}}),domUtils.on(N.document,"mousemove",g),domUtils.on(N.document,"mouseout",function(a){var b=a.target||a.srcElement;"TABLE"==b.tagName&&m(N,!1,"",null)}),N.addListener("interlacetable",function(a,b,c){if(b)for(var d=this,e=b.rows,f=e.length,g=function(a,b,c){return a[b]?a[b]:c?a[b%a.length]:""},h=0;h1?k:f.getCellInfo(d).rowIndex;var g=f.getTabNextCell(d,k);g?e(g)?a.setStart(g,0).setCursor(!1,!0):a.selectNodeContents(g).select():(N.fireEvent("saveScene"),N.__hasEnterExecCommand=!0,this.execCommand("insertrownext"),N.__hasEnterExecCommand=!1,a=this.selection.getRange(),a.setStart(c.rows[c.rows.length-1].cells[0],0).setCursor(),N.fireEvent("saveScene"))}return!0}}),browser.ie&&N.addListener("selectionchange",function(){m(this,!1,"",null)}),N.addListener("keydown",function(a,b){var c=this,d=b.keyCode||b.which;if(8!=d&&46!=d){var e=!(b.ctrlKey||b.metaKey||b.shiftKey||b.altKey);e&&_(domUtils.getElementsByTagName(c.body,"td"));var f=Z(c);f&&e&&f.clearSelected()}}),N.addListener("beforegetcontent",function(){K(this,!1),browser.ie&&utils.each(this.document.getElementsByTagName("caption"),function(a){domUtils.isEmptyNode(a)&&(a.innerHTML=" ")})}),N.addListener("aftergetcontent",function(){K(this,!0)}),N.addListener("getAllHtml",function(){_(N.document.getElementsByTagName("td"))}),N.addListener("fullscreenchanged",function(a,b){if(!b){var c=this.body.offsetWidth/document.body.offsetWidth,d=domUtils.getElementsByTagName(this.body,"table");utils.each(d,function(a){if(a.offsetWidth1||c[e].getAttribute("rowspan")>1)return-1;return b?"enablesort"==a^"sortEnabled"!=b.getAttribute("data-sort")?-1:0:-1},execCommand:function(a){var b=d(this).table;b.setAttribute("data-sort","enablesort"==a?"sortEnabled":"sortDisabled"),"enablesort"==a?domUtils.addClass(b,"sortEnabled"):domUtils.removeClasses(b,"sortEnabled")}}},UE.plugins.contextmenu=function(){var a=this;if(a.setOpt("enableContextMenu",!0),a.getOpt("enableContextMenu")!==!1){var b,c=a.getLang("contextMenu"),d=a.options.contextMenu||[{label:c.selectall,cmdName:"selectall"},{label:c.cleardoc,cmdName:"cleardoc",exec:function(){confirm(c.confirmclear)&&this.execCommand("cleardoc")}},"-",{label:c.unlink,cmdName:"unlink"},"-",{group:c.paragraph,icon:"justifyjustify",subMenu:[{label:c.justifyleft,cmdName:"justify",value:"left"},{label:c.justifyright,cmdName:"justify",value:"right"},{label:c.justifycenter,cmdName:"justify",value:"center"},{label:c.justifyjustify,cmdName:"justify",value:"justify"}]},"-",{group:c.table,icon:"table",subMenu:[{label:c.inserttable,cmdName:"inserttable"},{label:c.deletetable,cmdName:"deletetable"},"-",{label:c.deleterow,cmdName:"deleterow"},{label:c.deletecol,cmdName:"deletecol"},{label:c.insertcol,cmdName:"insertcol"},{label:c.insertcolnext,cmdName:"insertcolnext"},{label:c.insertrow,cmdName:"insertrow"},{label:c.insertrownext,cmdName:"insertrownext"},"-",{label:c.insertcaption,cmdName:"insertcaption"},{label:c.deletecaption,cmdName:"deletecaption"},{label:c.inserttitle,cmdName:"inserttitle"},{label:c.deletetitle,cmdName:"deletetitle"},{label:c.inserttitlecol,cmdName:"inserttitlecol"},{label:c.deletetitlecol,cmdName:"deletetitlecol"},"-",{label:c.mergecells,cmdName:"mergecells"},{label:c.mergeright,cmdName:"mergeright"},{label:c.mergedown,cmdName:"mergedown"},"-",{label:c.splittorows,cmdName:"splittorows"},{label:c.splittocols,cmdName:"splittocols"},{label:c.splittocells,cmdName:"splittocells"},"-",{label:c.averageDiseRow,cmdName:"averagedistributerow"},{label:c.averageDisCol,cmdName:"averagedistributecol"},"-",{label:c.edittd,cmdName:"edittd",exec:function(){UE.ui.edittd&&new UE.ui.edittd(this),this.getDialog("edittd").open()}},{label:c.edittable,cmdName:"edittable",exec:function(){UE.ui.edittable&&new UE.ui.edittable(this),this.getDialog("edittable").open()}},{label:c.setbordervisible,cmdName:"setbordervisible"}]},{group:c.tablesort,icon:"tablesort",subMenu:[{label:c.enablesort,cmdName:"enablesort"},{label:c.disablesort,cmdName:"disablesort"},"-",{label:c.reversecurrent,cmdName:"sorttable",value:"reversecurrent"},{label:c.orderbyasc,cmdName:"sorttable",value:"orderbyasc"},{label:c.reversebyasc,cmdName:"sorttable",value:"reversebyasc"},{label:c.orderbynum,cmdName:"sorttable",value:"orderbynum"},{label:c.reversebynum,cmdName:"sorttable",value:"reversebynum"}]},{group:c.borderbk,icon:"borderBack",subMenu:[{label:c.setcolor,cmdName:"interlacetable",exec:function(){this.execCommand("interlacetable")}},{label:c.unsetcolor,cmdName:"uninterlacetable",exec:function(){this.execCommand("uninterlacetable")}},{label:c.setbackground,cmdName:"settablebackground",exec:function(){this.execCommand("settablebackground",{repeat:!0,colorList:["#bbb","#ccc"]})}},{label:c.unsetbackground,cmdName:"cleartablebackground",exec:function(){this.execCommand("cleartablebackground")}},{label:c.redandblue,cmdName:"settablebackground",exec:function(){this.execCommand("settablebackground",{repeat:!0,colorList:["red","blue"]})}},{label:c.threecolorgradient,cmdName:"settablebackground",exec:function(){this.execCommand("settablebackground",{repeat:!0,colorList:["#aaa","#bbb","#ccc"]})}}]},{group:c.aligntd,icon:"aligntd",subMenu:[{cmdName:"cellalignment",value:{align:"left",vAlign:"top"}},{cmdName:"cellalignment",value:{align:"center",vAlign:"top"}},{cmdName:"cellalignment",value:{align:"right",vAlign:"top"}},{cmdName:"cellalignment",value:{align:"left",vAlign:"middle"}},{cmdName:"cellalignment",value:{align:"center",vAlign:"middle"}},{cmdName:"cellalignment",value:{align:"right",vAlign:"middle"}},{cmdName:"cellalignment",value:{align:"left",vAlign:"bottom"}},{cmdName:"cellalignment",value:{align:"center",vAlign:"bottom"}},{cmdName:"cellalignment",value:{align:"right",vAlign:"bottom"}}]},{group:c.aligntable,icon:"aligntable",subMenu:[{cmdName:"tablealignment",className:"left",label:c.tableleft,value:"left"},{cmdName:"tablealignment",className:"center",label:c.tablecenter,value:"center"},{cmdName:"tablealignment",className:"right",label:c.tableright,value:"right"}]},"-",{label:c.insertparagraphbefore,cmdName:"insertparagraph",value:!0},{label:c.insertparagraphafter,cmdName:"insertparagraph"},{label:c.copy,cmdName:"copy"},{label:c.paste,cmdName:"paste"}];if(d.length){var e=UE.ui.uiUtils;a.addListener("contextmenu",function(f,g){var h=e.getViewportOffsetByEvent(g);a.fireEvent("beforeselectionchange"),b&&b.destroy();for(var i,j=0,k=[];i=d[j];j++){var l;!function(b){function d(){switch(b.icon){case"table":return a.getLang("contextMenu.table");case"justifyjustify":return a.getLang("contextMenu.paragraph");case"aligntd":return a.getLang("contextMenu.aligntd");case"aligntable":return a.getLang("contextMenu.aligntable");case"tablesort":return c.tablesort;case"borderBack":return c.borderbk;default:return""}}if("-"==b)(l=k[k.length-1])&&"-"!==l&&k.push("-");else if(b.hasOwnProperty("group")){for(var e,f=0,g=[];e=b.subMenu[f];f++)!function(b){"-"==b?(l=g[g.length-1])&&"-"!==l?g.push("-"):g.splice(g.length-1):(a.commands[b.cmdName]||UE.commands[b.cmdName]||b.query)&&(b.query?b.query():a.queryCommandState(b.cmdName))>-1&&g.push({label:b.label||a.getLang("contextMenu."+b.cmdName+(b.value||""))||"",className:"edui-for-"+b.cmdName+(b.className?" edui-for-"+b.cmdName+"-"+b.className:""),onclick:b.exec?function(){b.exec.call(a)}:function(){a.execCommand(b.cmdName,b.value)}})}(e);g.length&&k.push({label:d(),className:"edui-for-"+b.icon,subMenu:{items:g,editor:a}})}else(a.commands[b.cmdName]||UE.commands[b.cmdName]||b.query)&&(b.query?b.query.call(a):a.queryCommandState(b.cmdName))>-1&&k.push({label:b.label||a.getLang("contextMenu."+b.cmdName),className:"edui-for-"+(b.icon?b.icon:b.cmdName+(b.value||"")),onclick:b.exec?function(){b.exec.call(a)}:function(){a.execCommand(b.cmdName,b.value)}})}(i)}if("-"==k[k.length-1]&&k.pop(),b=new UE.ui.Menu({items:k,className:"edui-contextmenu",editor:a}),b.render(),b.showAt(h),a.fireEvent("aftershowcontextmenu",b),domUtils.preventDefault(g),browser.ie){var m;try{m=a.selection.getNative().createRange()}catch(n){return}if(m.item){var o=new dom.Range(a.document);o.selectNode(m.item(0)).select(!0,!0)}}}),a.addListener("aftershowcontextmenu",function(b,c){if(a.zeroclipboard){var d=c.items;for(var e in d)"edui-for-copy"==d[e].className&&a.zeroclipboard.clip(d[e].getDom())}})}}},UE.plugins.shortcutmenu=function(){var a,b=this,c=b.options.shortcutMenu||[];c.length&&(b.addListener("contextmenu mouseup",function(b,d){var e=this,f={type:b,target:d.target||d.srcElement,screenX:d.screenX,screenY:d.screenY,clientX:d.clientX,clientY:d.clientY};if(setTimeout(function(){var d=e.selection.getRange();d.collapsed!==!1&&"contextmenu"!=b||(a||(a=new baidu.editor.ui.ShortCutMenu({editor:e,items:c,theme:e.options.theme,className:"edui-shortcutmenu"}),a.render(),e.fireEvent("afterrendershortcutmenu",a)),a.show(f,!!UE.plugins.contextmenu))}),"contextmenu"==b&&(domUtils.preventDefault(d),browser.ie9below)){var g;try{g=e.selection.getNative().createRange()}catch(d){return}if(g.item){var h=new dom.Range(e.document);h.selectNode(g.item(0)).select(!0,!0)}}}),b.addListener("keydown",function(b){"keydown"==b&&a&&!a.isHidden&&a.hide()}))},UE.plugins.basestyle=function(){var a={bold:["strong","b"],italic:["em","i"],subscript:["sub"],superscript:["sup"]},b=function(a,b){return domUtils.filterNodeList(a.selection.getStartElementPath(),b)},c=this;c.addshortcutkey({Bold:"ctrl+66",Italic:"ctrl+73",Underline:"ctrl+85"}),c.addInputRule(function(a){utils.each(a.getNodesByTagName("b i"),function(a){switch(a.tagName){case"b":a.tagName="strong";break;case"i":a.tagName="em"}})});for(var d in a)!function(a,d){c.commands[a]={execCommand:function(a){var e=c.selection.getRange(),f=b(this,d);if(e.collapsed){if(f){var g=c.document.createTextNode("");e.insertNode(g).removeInlineStyle(d),e.setStartBefore(g),domUtils.remove(g)}else{var h=e.document.createElement(d[0]);"superscript"!=a&&"subscript"!=a||(g=c.document.createTextNode(""),e.insertNode(g).removeInlineStyle(["sub","sup"]).setStartBefore(g).collapse(!0)),e.insertNode(h).setStart(h,0)}e.collapse(!0)}else"superscript"!=a&&"subscript"!=a||f&&f.tagName.toLowerCase()==a||e.removeInlineStyle(["sub","sup"]),f?e.removeInlineStyle(d):e.applyInlineStyle(d[0]);e.select()},queryCommandState:function(){return b(this,d)?1:0}}}(d,a[d])},UE.plugins.elementpath=function(){var a,b,c=this;c.setOpt("elementPathEnabled",!0),c.options.elementPathEnabled&&(c.commands.elementpath={execCommand:function(d,e){var f=b[e],g=c.selection.getRange();a=1*e,g.selectNode(f).select()},queryCommandValue:function(){var c=[].concat(this.selection.getStartElementPath()).reverse(),d=[];b=c;for(var e,f=0;e=c[f];f++)if(3!=e.nodeType){var g=e.tagName.toLowerCase();if("img"==g&&e.getAttribute("anchorname")&&(g="anchor"),d[f]=g,a==f){a=-1;break}}return d}})},UE.plugins.formatmatch=function(){function a(f,g){function h(a){return m&&a.selectNode(m),a.applyInlineStyle(d[d.length-1].tagName,null,d)}if(browser.webkit)var i="IMG"==g.target.tagName?g.target:null;c.undoManger&&c.undoManger.save();var j=c.selection.getRange(),k=i||j.getClosedNode();if(b&&k&&"IMG"==k.tagName)k.style.cssText+=";float:"+(b.style.cssFloat||b.style.styleFloat||"none")+";display:"+(b.style.display||"inline"),b=null;else if(!b){var l=j.collapsed;if(l){var m=c.document.createTextNode("match");j.insertNode(m).select()}c.__hasEnterExecCommand=!0;var n=c.options.removeFormatAttributes;c.options.removeFormatAttributes="",c.execCommand("removeformat"),c.options.removeFormatAttributes=n,c.__hasEnterExecCommand=!1,j=c.selection.getRange(),d.length&&h(j),m&&j.setStartBefore(m).collapse(!0),j.select(),m&&domUtils.remove(m)}c.undoManger&&c.undoManger.save(),c.removeListener("mouseup",a),e=0}var b,c=this,d=[],e=0;c.addListener("reset",function(){d=[],e=0}),c.commands.formatmatch={execCommand:function(f){if(e)return e=0,d=[],void c.removeListener("mouseup",a);var g=c.selection.getRange();if(b=g.getClosedNode(),!b||"IMG"!=b.tagName){g.collapse(!0).shrinkBoundary();var h=g.startContainer;d=domUtils.findParents(h,!0,function(a){return!domUtils.isBlockElm(a)&&1==a.nodeType});for(var i,j=0;i=d[j];j++)if("A"==i.tagName){d.splice(j,1);break}}c.addListener("mouseup",a),e=1},queryCommandState:function(){return e},notNeedUndo:1}},UE.plugin.register("searchreplace",function(){function a(a,b,c){var d=b.searchStr;b.dir==-1&&(a=a.split("").reverse().join(""),d=d.split("").reverse().join(""),c=a.length-c);for(var e,f=new RegExp(d,"g"+(b.casesensitive?"":"i"));e=f.exec(a);)if(e.index>=c)return b.dir==-1?a.length-e.index-b.searchStr.length:e.index;return-1}function b(b,c,d){var e,f,h=d.all||1==d.dir?"getNextDomNode":"getPreDomNode";domUtils.isBody(b)&&(b=b.firstChild);for(var i=1;b;){if(e=3==b.nodeType?b.nodeValue:b[browser.ie?"innerText":"textContent"],f=a(e,d,c),i=0,f!=-1)return{node:b,index:f};for(b=domUtils[h](b);b&&g[b.nodeName.toLowerCase()];)b=domUtils[h](b,!0);b&&(c=d.dir==-1?(3==b.nodeType?b.nodeValue:b[browser.ie?"innerText":"textContent"]).length:0)}}function c(a,b,d){for(var e,f=0,g=a.firstChild,h=0;g;){if(3==g.nodeType){if(h=g.nodeValue.replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,"").length,f+=h,f>=b)return{node:g,index:h-(f-b)}}else if(!dtd.$empty[g.tagName]&&(h=g[browser.ie?"innerText":"textContent"].replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,"").length,f+=h,f>=b&&(e=c(g,h-(f-b),d))))return e;g=domUtils.getNextDomNode(g)}}function d(a,d){var f,g=a.selection.getRange(),h=d.searchStr,i=a.document.createElement("span");if(i.innerHTML="$$ueditor_searchreplace_key$$",g.shrinkBoundary(!0),!g.collapsed){g.select();var j=a.selection.getText();if(new RegExp("^"+d.searchStr+"$",d.casesensitive?"":"i").test(j)){if(void 0!=d.replaceStr)return e(g,d.replaceStr),g.select(),!0;g.collapse(d.dir==-1)}}g.insertNode(i),g.enlargeToBlockElm(!0),f=g.startContainer;var k=f[browser.ie?"innerText":"textContent"].indexOf("$$ueditor_searchreplace_key$$");g.setStartBefore(i),domUtils.remove(i);var l=b(f,k,d);if(l){var m=c(l.node,l.index,h),n=c(l.node,l.index+h.length,h);return g.setStart(m.node,m.index).setEnd(n.node,n.index),void 0!==d.replaceStr&&e(g,d.replaceStr),g.select(),!0}g.setCursor()}function e(a,b){b=f.document.createTextNode(b),a.deleteContents().insertNode(b)}var f=this,g={table:1,tbody:1,tr:1,ol:1,ul:1};return{commands:{searchreplace:{execCommand:function(a,b){utils.extend(b,{all:!1,casesensitive:!1,dir:1},!0);var c=0;if(b.all){var e=f.selection.getRange(),g=f.body.firstChild;for(g&&1==g.nodeType?(e.setStart(g,0),e.shrinkBoundary(!0)):3==g.nodeType&&e.setStartBefore(g),e.collapse(!0).select(!0),void 0!==b.replaceStr&&f.fireEvent("saveScene");d(this,b);)c++;c&&f.fireEvent("saveScene")}else void 0!==b.replaceStr&&f.fireEvent("saveScene"),d(this,b)&&c++,c&&f.fireEvent("saveScene");return c},notNeedUndo:1}}}}),UE.plugins.customstyle=function(){var a=this;a.setOpt({customstyle:[{tag:"h1",name:"tc",style:"font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;"},{tag:"h1",name:"tl",style:"font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:left;margin:0 0 10px 0;"},{tag:"span",name:"im",style:"font-size:16px;font-style:italic;font-weight:bold;line-height:18px;"},{tag:"span",name:"hi",style:"font-size:16px;font-style:italic;font-weight:bold;color:rgb(51, 153, 204);line-height:18px;"}]}),a.commands.customstyle={execCommand:function(a,b){var c,d,e=this,f=b.tag,g=domUtils.findParent(e.selection.getStart(),function(a){return a.getAttribute("label")},!0),h={};for(var i in b)void 0!==b[i]&&(h[i]=b[i]);if(delete h.tag,g&&g.getAttribute("label")==b.label){if(c=this.selection.getRange(),d=c.createBookmark(),c.collapsed)if(dtd.$block[g.tagName]){var j=e.document.createElement("p");domUtils.moveChild(g,j),g.parentNode.insertBefore(j,g),domUtils.remove(g)}else domUtils.remove(g,!0);else{var k=domUtils.getCommonAncestor(d.start,d.end),l=domUtils.getElementsByTagName(k,f);new RegExp(f,"i").test(k.tagName)&&l.push(k);for(var m,n=0;m=l[n++];)if(m.getAttribute("label")==b.label){var o=domUtils.getPosition(m,d.start),p=domUtils.getPosition(m,d.end);if((o&domUtils.POSITION_FOLLOWING||o&domUtils.POSITION_CONTAINS)&&(p&domUtils.POSITION_PRECEDING||p&domUtils.POSITION_CONTAINS)&&dtd.$block[f]){var j=e.document.createElement("p");domUtils.moveChild(m,j),m.parentNode.insertBefore(j,m)}domUtils.remove(m,!0)}g=domUtils.findParent(k,function(a){return a.getAttribute("label")==b.label},!0),g&&domUtils.remove(g,!0)}c.moveToBookmark(d).select()}else if(dtd.$block[f]){if(this.execCommand("paragraph",f,h,"customstyle"),c=e.selection.getRange(),!c.collapsed){c.collapse(),g=domUtils.findParent(e.selection.getStart(),function(a){return a.getAttribute("label")==b.label},!0);var q=e.document.createElement("p");domUtils.insertAfter(g,q),domUtils.fillNode(e.document,q),c.setStart(q,0).setCursor()}}else{if(c=e.selection.getRange(),c.collapsed)return g=e.document.createElement(f),domUtils.setAttributes(g,h),void c.insertNode(g).setStart(g,0).setCursor();d=c.createBookmark(),c.applyInlineStyle(f,h).moveToBookmark(d).select()}},queryCommandValue:function(){var a=domUtils.filterNodeList(this.selection.getStartElementPath(),function(a){return a.getAttribute("label")});return a?a.getAttribute("label"):""}},a.addListener("keyup",function(b,c){var d=c.keyCode||c.which;if(32==d||13==d){var e=a.selection.getRange();if(e.collapsed){var f=domUtils.findParent(a.selection.getStart(),function(a){return a.getAttribute("label")},!0);if(f&&dtd.$block[f.tagName]&&domUtils.isEmptyNode(f)){var g=a.document.createElement("p");domUtils.insertAfter(f,g),domUtils.fillNode(a.document,g),domUtils.remove(f),e.setStart(g,0).setCursor()}}}})},UE.plugins.catchremoteimage=function(){var me=this,ajax=UE.ajax;me.options.catchRemoteImageEnable!==!1&&(me.setOpt({catchRemoteImageEnable:!1}),me.addListener("afterpaste",function(){me.fireEvent("catchRemoteImage")}),me.addListener("catchRemoteImage",function(){function catchremoteimage(a,b){var c=utils.serializeParam(me.queryCommandValue("serverparam"))||"",d=utils.formatUrl(catcherActionUrl+(catcherActionUrl.indexOf("?")==-1?"?":"&")+c),e=utils.isCrossDomainUrl(d),f={method:"POST",dataType:e?"jsonp":"",timeout:6e4,onsuccess:b.success,onerror:b.error};f[catcherFieldName]=a,ajax.request(d,f)}for(var catcherLocalDomain=me.getOpt("catcherLocalDomain"),catcherActionUrl=me.getActionUrl(me.getOpt("catcherActionName")),catcherUrlPrefix=me.getOpt("catcherUrlPrefix"),catcherFieldName=me.getOpt("catcherFieldName"),remoteImages=[],imgs=domUtils.getElementsByTagName(me.document,"img"),test=function(a,b){if(a.indexOf(location.host)!=-1||/(^\.)|(^\/)/.test(a))return!0;if(b)for(var c,d=0;c=b[d++];)if(a.indexOf(c)!==-1)return!0;return!1},i=0,ci;ci=imgs[i++];)if(!ci.getAttribute("word_img")){var src=ci.getAttribute("_src")||ci.src||"";/^(https?|ftp):/i.test(src)&&!test(src,catcherLocalDomain)&&remoteImages.push(src)}remoteImages.length&&catchremoteimage(remoteImages,{success:function(r){try{var info=void 0!==r.state?r:eval("("+r.responseText+")")}catch(e){return}var i,j,ci,cj,oldSrc,newSrc,list=info.list;for(i=0;ci=imgs[i++];)for(oldSrc=ci.getAttribute("_src")||ci.src||"",j=0;cj=list[j++];)if(oldSrc==cj.source&&"SUCCESS"==cj.state){newSrc=catcherUrlPrefix+cj.url,domUtils.setAttributes(ci,{src:newSrc,_src:newSrc});break}me.fireEvent("catchremotesuccess")},error:function(){me.fireEvent("catchremoteerror")}})}))},UE.plugin.register("snapscreen",function(){function getLocation(a){var b,c=document.createElement("a"),d=utils.serializeParam(me.queryCommandValue("serverparam"))||"";return c.href=a,browser.ie&&(c.href=c.href),b=c.search,d&&(b=b+(b.indexOf("?")==-1?"?":"&")+d,b=b.replace(/[&]+/gi,"&")),{port:c.port,hostname:c.hostname,path:c.pathname+b||+c.hash}}var me=this,snapplugin;return{commands:{snapscreen:{execCommand:function(cmd){function onSuccess(rs){try{if(rs=eval("("+rs+")"),"SUCCESS"==rs.state){var opt=me.options;me.execCommand("insertimage",{src:opt.snapscreenUrlPrefix+rs.url,_src:opt.snapscreenUrlPrefix+rs.url,alt:rs.title||"",floatStyle:opt.snapscreenImgAlign})}else alert(rs.state)}catch(e){alert(lang.callBackErrorMsg)}}var url,local,res,lang=me.getLang("snapScreen_plugin");if(!snapplugin){var container=me.container,doc=me.container.ownerDocument||me.container.document;snapplugin=doc.createElement("object");try{snapplugin.type="application/x-pluginbaidusnap"}catch(e){return}snapplugin.style.cssText="position:absolute;left:-9999px;width:0;height:0;",snapplugin.setAttribute("width","0"),snapplugin.setAttribute("height","0"),container.appendChild(snapplugin)}url=me.getActionUrl(me.getOpt("snapscreenActionName")),local=getLocation(url),setTimeout(function(){try{res=snapplugin.saveSnapshot(local.hostname,local.path,local.port)}catch(a){return void me.ui._dialogs.snapscreenDialog.open()}onSuccess(res)},50)},queryCommandState:function(){return navigator.userAgent.indexOf("Windows",0)!=-1?0:-1}}}}}),UE.commands.insertparagraph={execCommand:function(a,b){for(var c,d=this,e=d.selection.getRange(),f=e.startContainer;f&&!domUtils.isBody(f);)c=f,f=f.parentNode;if(c){var g=d.document.createElement("p");b?c.parentNode.insertBefore(g,c):c.parentNode.insertBefore(g,c.nextSibling),domUtils.fillNode(d.document,g),e.setStart(g,0).setCursor(!1,!0)}}},UE.plugin.register("webapp",function(){function a(a,c){return c?'':'"}var b=this;return{outputRule:function(b){utils.each(b.getNodesByTagName("img"),function(b){var c;if("edui-faked-webapp"==b.getAttr("class")){c=a({title:b.getAttr("title"),width:b.getAttr("width"),height:b.getAttr("height"),align:b.getAttr("align"),cssfloat:b.getStyle("float"),url:b.getAttr("_url"),logo:b.getAttr("_logo_url")},!0);var d=UE.uNode.createElement(c);b.parentNode.replaceChild(d,b)}})},inputRule:function(b){utils.each(b.getNodesByTagName("iframe"),function(b){if("edui-faked-webapp"==b.getAttr("class")){var c=UE.uNode.createElement(a({title:b.getAttr("title"),width:b.getAttr("width"),height:b.getAttr("height"),align:b.getAttr("align"),cssfloat:b.getStyle("float"),url:b.getAttr("src"),logo:b.getAttr("logo_url")}));b.parentNode.replaceChild(c,b)}})},commands:{webapp:{execCommand:function(b,c){var d=this,e=a(utils.extend(c,{align:"none"}),!1);d.execCommand("inserthtml",e)},queryCommandState:function(){var a=this,b=a.selection.getRange().getClosedNode(),c=b&&"edui-faked-webapp"==b.className;return c?1:0}}}}}),UE.plugins.template=function(){UE.commands.template={execCommand:function(a,b){b.html&&this.execCommand("inserthtml",b.html)}},this.addListener("click",function(a,b){var c=b.target||b.srcElement,d=this.selection.getRange(),e=domUtils.findParent(c,function(a){if(a.className&&domUtils.hasClass(a,"ue_t"))return a},!0);e&&d.selectNode(e).shrinkBoundary().select()}),this.addListener("keydown",function(a,b){var c=this.selection.getRange();if(!c.collapsed&&!(b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)){var d=domUtils.findParent(c.startContainer,function(a){if(a.className&&domUtils.hasClass(a,"ue_t"))return a},!0);d&&domUtils.removeClasses(d,["ue_t"])}})},UE.plugin.register("music",function(){function a(a,c,d,e,f,g){return g?'':"'}var b=this;return{outputRule:function(b){utils.each(b.getNodesByTagName("img"),function(b){var c;if("edui-faked-music"==b.getAttr("class")){var d=b.getStyle("float"),e=b.getAttr("align");c=a(b.getAttr("_url"),b.getAttr("width"),b.getAttr("height"),e,d,!0);var f=UE.uNode.createElement(c);b.parentNode.replaceChild(f,b)}})},inputRule:function(b){utils.each(b.getNodesByTagName("embed"),function(b){if("edui-faked-music"==b.getAttr("class")){var c=b.getStyle("float"),d=b.getAttr("align");html=a(b.getAttr("src"),b.getAttr("width"),b.getAttr("height"),d,c,!1);var e=UE.uNode.createElement(html);b.parentNode.replaceChild(e,b)}})},commands:{music:{execCommand:function(b,c){var d=this,e=a(c.url,c.width||400,c.height||95,"none",!1);d.execCommand("inserthtml",e)},queryCommandState:function(){var a=this,b=a.selection.getRange().getClosedNode(),c=b&&"edui-faked-music"==b.className;return c?1:0}}}}}),UE.plugin.register("autoupload",function(){function a(a,b){var c,d,e,f,g,h,i,j,k=b,l=/image\/\w+/i.test(a.type)?"image":"file",m="loading_"+(+new Date).toString(36);if(c=k.getOpt(l+"FieldName"),d=k.getOpt(l+"UrlPrefix"),e=k.getOpt(l+"MaxSize"),f=k.getOpt(l+"AllowFiles"),g=k.getActionUrl(k.getOpt(l+"ActionName")),i=function(a){var b=k.document.getElementById(m);b&&domUtils.remove(b),k.fireEvent("showmessage",{id:m,content:a,type:"error",timeout:4e3})},"image"==l?(h='',j=function(a){var b=d+a.url,c=k.document.getElementById(m);c&&(c.setAttribute("src",b),c.setAttribute("_src",b),c.setAttribute("title",a.title||""),c.setAttribute("alt",a.original||""),c.removeAttribute("id"),domUtils.removeClasses(c,"loadingclass"))}):(h='

    ',j=function(a){var b=d+a.url,c=k.document.getElementById(m),e=k.selection.getRange(),f=e.createBookmark();e.selectNode(c).select(),k.execCommand("insertfile",{url:b}),e.moveToBookmark(f).select()}),k.execCommand("inserthtml",h),!k.getOpt(l+"ActionName"))return void i(k.getLang("autoupload.errorLoadConfig"));if(a.size>e)return void i(k.getLang("autoupload.exceedSizeError"));var n=a.name?a.name.substr(a.name.lastIndexOf(".")):"";if(n&&"image"!=l||f&&(f.join("")+".").indexOf(n.toLowerCase()+".")==-1)return void i(k.getLang("autoupload.exceedTypeError"));var o=new XMLHttpRequest,p=new FormData,q=utils.serializeParam(k.queryCommandValue("serverparam"))||"",r=utils.formatUrl(g+(g.indexOf("?")==-1?"?":"&")+q);p.append(c,a,a.name||"blob."+a.type.substr("image/".length)),p.append("type","ajax"),o.open("post",r,!0),o.setRequestHeader("X-Requested-With","XMLHttpRequest"),o.addEventListener("load",function(a){try{var b=new Function("return "+utils.trim(a.target.response))();"SUCCESS"==b.state&&b.url?j(b):i(b.state)}catch(c){i(k.getLang("autoupload.loadError"))}}),o.send(p)}function b(a){return a.clipboardData&&a.clipboardData.items&&1==a.clipboardData.items.length&&/^image\//.test(a.clipboardData.items[0].type)?a.clipboardData.items:null}function c(a){return a.dataTransfer&&a.dataTransfer.files?a.dataTransfer.files:null}return{outputRule:function(a){utils.each(a.getNodesByTagName("img"),function(a){/\b(loaderrorclass)|(bloaderrorclass)\b/.test(a.getAttr("class"))&&a.parentNode.removeChild(a)}),utils.each(a.getNodesByTagName("p"),function(a){/\bloadpara\b/.test(a.getAttr("class"))&&a.parentNode.removeChild(a)})},bindEvents:{ready:function(d){var e=this;window.FormData&&window.FileReader&&(domUtils.on(e.body,"paste drop",function(d){var f,g=!1;if(f="paste"==d.type?b(d):c(d)){for(var h,i=f.length;i--;)h=f[i],h.getAsFile&&(h=h.getAsFile()),h&&h.size>0&&(a(h,e),g=!0);g&&d.preventDefault()}}),domUtils.on(e.body,"dragover",function(a){"Files"==a.dataTransfer.types[0]&&a.preventDefault()}),utils.cssRule("loading",".loadingclass{display:inline-block;cursor:default;background: url('"+this.options.themePath+this.options.theme+"/images/loading.gif') no-repeat center center transparent;border:1px solid #cccccc;margin-left:1px;height: 22px;width: 22px;}\n.loaderrorclass{display:inline-block;cursor:default;background: url('"+this.options.themePath+this.options.theme+"/images/loaderror.png') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}",this.document))}}}}),UE.plugin.register("autosave",function(){function a(a){var f;if(!(new Date-c0?b._saveFlag=window.setTimeout(function(){a(b)},b.options.saveInterval):a(b))}},commands:{clearlocaldata:{execCommand:function(a,c){e&&b.getPreferences(e)&&b.removePreferences(e)},notNeedUndo:!0,ignoreContentChange:!0},getlocaldata:{execCommand:function(a,c){return e?b.getPreferences(e)||"":""},notNeedUndo:!0,ignoreContentChange:!0},drafts:{execCommand:function(a,c){e&&(b.body.innerHTML=b.getPreferences(e)||"

    "+domUtils.fillHtml+"

    ",b.focus(!0))},queryCommandState:function(){return e?null===b.getPreferences(e)?-1:0:-1},notNeedUndo:!0,ignoreContentChange:!0}}}}),UE.plugin.register("charts",function(){function a(a){var b=null,c=0;if(a.rows.length<2)return!1;if(a.rows[0].cells.length<2)return!1;b=a.rows[0].cells,c=b.length;for(var d,e=0;d=b[e];e++)if("th"!==d.tagName.toLowerCase())return!1;for(var f,e=1;f=a.rows[e];e++){if(f.cells.length!=c)return!1;if("th"!==f.cells[0].tagName.toLowerCase())return!1;for(var d,g=1;d=f.cells[g];g++){var h=utils.trim(d.innerText||d.textContent||"");if(h=h.replace(new RegExp(UE.dom.domUtils.fillChar,"g"),"").replace(/^\s+|\s+$/g,""),!/^\d*\.?\d+$/.test(h))return!1}}return!0}var b=this;return{bindEvents:{chartserror:function(){}},commands:{charts:{execCommand:function(c,d){var e=domUtils.findParentByTagName(this.selection.getRange().startContainer,"table",!0),f=[],g={};if(!e)return!1;if(!a(e))return b.fireEvent("chartserror"),!1;g.title=d.title||"",g.subTitle=d.subTitle||"",g.xTitle=d.xTitle||"",g.yTitle=d.yTitle||"",g.suffix=d.suffix||"",g.tip=d.tip||"",g.dataFormat=d.tableDataFormat||"",g.chartType=d.chartType||0;for(var h in g)g.hasOwnProperty(h)&&f.push(h+":"+g[h]);e.setAttribute("data-chart",f.join(";")),domUtils.addClass(e,"edui-charts-table")},queryCommandState:function(b,c){ +var d=domUtils.findParentByTagName(this.selection.getRange().startContainer,"table",!0);return d&&a(d)?0:-1}}},inputRule:function(a){utils.each(a.getNodesByTagName("table"),function(a){void 0!==a.getAttr("data-chart")&&a.setAttr("style")})},outputRule:function(a){utils.each(a.getNodesByTagName("table"),function(a){void 0!==a.getAttr("data-chart")&&a.setAttr("style","display: none;")})}}}),UE.plugin.register("section",function(){function a(a){this.tag="",this.level=-1,this.dom=null,this.nextSection=null,this.previousSection=null,this.parentSection=null,this.startAddress=[],this.endAddress=[],this.children=[]}function b(b){var c=new a;return utils.extend(c,b)}function c(a,b){for(var c=b,d=0;d=0){var o=h.selection.getRange().selectNode(i).createAddress(!0).startAddress,p=b({tag:i.tagName,title:i.innerText||i.textContent||"",level:f,dom:i,startAddress:utils.clone(o,[]),endAddress:utils.clone(o,[]),children:[]});for(j.nextSection=p,p.previousSection=j,g=j;f<=g.level;)g=g.parentSection;p.parentSection=g,g.children.push(p),k=j=p}else 1===i.nodeType&&e(i,c),k&&k.endAddress[k.endAddress.length-1]++}for(var f=c||["h1","h2","h3","h4","h5","h6"],g=0;g=c.length);f++){if(c[f]>a[f]){d=!0;break}if(c[f]=c.length);f++){if(c[f]a[f])break}return d&&e}var g,h,i=this;if(b&&d&&d.level!=-1&&(g=e?d.endAddress:d.startAddress,h=c(g,i.body),g&&h&&!f(b.startAddress,b.endAddress,g))){var j,k,l=c(b.startAddress,i.body),m=c(b.endAddress,i.body);if(e)for(j=m;j&&!(domUtils.getPosition(l,j)&domUtils.POSITION_FOLLOWING)&&(k=j.previousSibling,domUtils.insertAfter(h,j),j!=l);)j=k;else for(j=l;j&&!(domUtils.getPosition(j,m)&domUtils.POSITION_FOLLOWING)&&(k=j.nextSibling,h.parentNode.insertBefore(j,h),j!=m);)j=k;i.fireEvent("updateSections")}}},deletesection:{execCommand:function(a,b,c){function d(a){for(var b=e.body,c=0;c',b.className="edui-"+c.options.theme,b.id=c.ui.id+"_iframeupload",i.style.cssText=g,i.style.width=a+"px",i.style.height=e+"px",i.appendChild(b),i.parentNode&&(i.parentNode.style.width=a+"px",i.parentNode.style.height=a+"px");var k=h.getElementById("edui_form_"+j),l=h.getElementById("edui_input_"+j),m=h.getElementById("edui_iframe_"+j);domUtils.on(l,"change",function(){function a(){try{var e,f,g,h=(m.contentDocument||m.contentWindow.document).body,i=h.innerText||h.textContent||"";f=new Function("return "+i)(),e=c.options.imageUrlPrefix+f.url,"SUCCESS"==f.state&&f.url?(g=c.document.getElementById(d),g.setAttribute("src",e),g.setAttribute("_src",e),g.setAttribute("title",f.title||""),g.setAttribute("alt",f.original||""),g.removeAttribute("id"),domUtils.removeClasses(g,"loadingclass")):b&&b(f.state)}catch(j){b&&b(c.getLang("simpleupload.loadError"))}k.reset(),domUtils.un(m,"load",a)}function b(a){if(d){var b=c.document.getElementById(d);b&&domUtils.remove(b),c.fireEvent("showmessage",{id:d,content:a,type:"error",timeout:4e3})}}if(l.value){var d="loading_"+(+new Date).toString(36),e=utils.serializeParam(c.queryCommandValue("serverparam"))||"",f=c.getActionUrl(c.getOpt("imageActionName")),g=c.getOpt("imageAllowFiles");if(c.focus(),c.execCommand("inserthtml",''),!c.getOpt("imageActionName"))return void errorHandler(c.getLang("autoupload.errorLoadConfig"));var h=l.value,i=h?h.substr(h.lastIndexOf(".")):"";if(!i||g&&(g.join("")+".").indexOf(i.toLowerCase()+".")==-1)return void b(c.getLang("simpleupload.exceedTypeError"));domUtils.on(m,"load",a),k.action=utils.formatUrl(f+(f.indexOf("?")==-1?"?":"&")+e),k.submit()}});var n;c.addListener("selectionchange",function(){clearTimeout(n),n=setTimeout(function(){var a=c.queryCommandState("simpleupload");a==-1?l.disabled="disabled":l.disabled=!1},400)}),d=!0}),f.style.cssText=g,b.appendChild(f)}var b,c=this,d=!1;return{bindEvents:{ready:function(){utils.cssRule("loading",".loadingclass{display:inline-block;cursor:default;background: url('"+this.options.themePath+this.options.theme+"/images/loading.gif') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}\n.loaderrorclass{display:inline-block;cursor:default;background: url('"+this.options.themePath+this.options.theme+"/images/loaderror.png') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}",this.document)},simpleuploadbtnready:function(d,e){b=e,c.afterConfigReady(a)}},outputRule:function(a){utils.each(a.getNodesByTagName("img"),function(a){/\b(loaderrorclass)|(bloaderrorclass)\b/.test(a.getAttr("class"))&&a.parentNode.removeChild(a)})},commands:{simpleupload:{queryCommandState:function(){return d?0:-1}}}}}),UE.plugin.register("serverparam",function(){var a={};return{commands:{serverparam:{execCommand:function(b,c,d){void 0===c||null===c?a={}:utils.isString(c)?void 0===d||null===d?delete a[c]:a[c]=d:utils.isObject(c)?utils.extend(a,c,!0):utils.isFunction(c)&&utils.extend(a,c(),!0)},queryCommandValue:function(){return a||{}}}}}}),UE.plugin.register("insertfile",function(){function a(a){var b=a.substr(a.lastIndexOf(".")+1).toLowerCase(),c={rar:"icon_rar.gif",zip:"icon_rar.gif",tar:"icon_rar.gif",gz:"icon_rar.gif",bz2:"icon_rar.gif",doc:"icon_doc.gif",docx:"icon_doc.gif",pdf:"icon_pdf.gif",mp3:"icon_mp3.gif",xls:"icon_xls.gif",chm:"icon_chm.gif",ppt:"icon_ppt.gif",pptx:"icon_ppt.gif",avi:"icon_mv.gif",rmvb:"icon_mv.gif",wmv:"icon_mv.gif",flv:"icon_mv.gif",swf:"icon_mv.gif",rm:"icon_mv.gif",exe:"icon_exe.gif",psd:"icon_psd.gif",txt:"icon_txt.gif",jpg:"icon_jpg.gif",png:"icon_jpg.gif",jpeg:"icon_jpg.gif",gif:"icon_jpg.gif",ico:"icon_jpg.gif",bmp:"icon_jpg.gif"};return c[b]?c[b]:c.txt}var b=this;return{commands:{insertfile:{execCommand:function(c,d){d=utils.isArray(d)?d:[d];var e,f,g,h,i="",j=b.getOpt("UEDITOR_HOME_URL"),k=j+("/"==j.substr(j.length-1)?"":"/")+"dialogs/attachment/fileTypeImages/";for(e=0;e'+h+"

    ";b.execCommand("insertHtml",i)}}}}}),UE.plugins.xssFilter=function(){function a(a){var b=a.tagName,d=a.attrs;return c.hasOwnProperty(b)?void UE.utils.each(d,function(d,e){c[b].indexOf(e)===-1&&a.setAttr(e)}):(a.parentNode.removeChild(a),!1)}var b=UEDITOR_CONFIG,c=b.whitList;c&&b.xssFilterRules&&(this.options.filterRules=function(){var b={};return UE.utils.each(c,function(c,d){b[d]=function(b){return a(b)}}),b}());var d=[];UE.utils.each(c,function(a,b){d.push(b)}),c&&b.inputXssFilter&&this.addInputRule(function(b){b.traversal(function(b){return"element"===b.type&&void a(b)})}),c&&b.outputXssFilter&&this.addOutputRule(function(b){b.traversal(function(b){return"element"===b.type&&void a(b)})})};var baidu=baidu||{};baidu.editor=baidu.editor||{},UE.ui=baidu.editor.ui={},function(){function a(){var a=document.getElementById("edui_fixedlayer");i.setViewportOffset(a,{left:0,top:0})}function b(b){d.on(window,"scroll",a),d.on(window,"resize",baidu.editor.utils.defer(a,0,!0))}var c=baidu.editor.browser,d=baidu.editor.dom.domUtils,e="$EDITORUI",f=window[e]={},g="ID"+e,h=0,i=baidu.editor.ui.uiUtils={uid:function(a){return a?a[g]||(a[g]=++h):++h},hook:function(a,b){var c;return a&&a._callbacks?c=a:(c=function(){var b;a&&(b=a.apply(this,arguments));for(var d=c._callbacks,e=d.length;e--;){var f=d[e].apply(this,arguments);void 0===b&&(b=f)}return b},c._callbacks=[]),c._callbacks.push(b),c},createElementByHtml:function(a){var b=document.createElement("div");return b.innerHTML=a,b=b.firstChild,b.parentNode.removeChild(b),b},getViewportElement:function(){return c.ie&&c.quirks?document.body:document.documentElement},getClientRect:function(a){var b;try{b=a.getBoundingClientRect()}catch(c){b={left:0,top:0,height:0,width:0}}for(var e,f={left:Math.round(b.left),top:Math.round(b.top),height:Math.round(b.bottom-b.top),width:Math.round(b.right-b.left)};(e=a.ownerDocument)!==document&&(a=d.getWindow(e).frameElement);)b=a.getBoundingClientRect(),f.left+=b.left,f.top+=b.top;return f.bottom=f.top+f.height,f.right=f.left+f.width,f},getViewportRect:function(){var a=i.getViewportElement(),b=0|(window.innerWidth||a.clientWidth),c=0|(window.innerHeight||a.clientHeight);return{left:0,top:0,height:c,width:b,bottom:c,right:b}},setViewportOffset:function(a,b){var c=i.getFixedLayer();a.parentNode===c?(a.style.left=b.left+"px",a.style.top=b.top+"px"):d.setViewportOffset(a,b)},getEventOffset:function(a){var b=a.target||a.srcElement,c=i.getClientRect(b),d=i.getViewportOffsetByEvent(a);return{left:d.left-c.left,top:d.top-c.top}},getViewportOffsetByEvent:function(a){var b=a.target||a.srcElement,c=d.getWindow(b).frameElement,e={left:a.clientX,top:a.clientY};if(c&&b.ownerDocument!==document){var f=i.getClientRect(c);e.left+=f.left,e.top+=f.top}return e},setGlobal:function(a,b){return f[a]=b,e+'["'+a+'"]'},unsetGlobal:function(a){delete f[a]},copyAttributes:function(a,b){for(var e=b.attributes,f=e.length;f--;){var g=e[f];"style"==g.nodeName||"class"==g.nodeName||c.ie&&!g.specified||a.setAttribute(g.nodeName,g.nodeValue)}b.className&&d.addClass(a,b.className),b.style.cssText&&(a.style.cssText+=";"+b.style.cssText)},removeStyle:function(a,b){if(a.style.removeProperty)a.style.removeProperty(b);else{if(!a.style.removeAttribute)throw"";a.style.removeAttribute(b)}},contains:function(a,b){return a&&b&&a!==b&&(a.contains?a.contains(b):16&a.compareDocumentPosition(b))},startDrag:function(a,b,c){function d(a){var c=a.clientX-g,d=a.clientY-h;b.ondragmove(c,d,a),a.stopPropagation?a.stopPropagation():a.cancelBubble=!0}function e(a){c.removeEventListener("mousemove",d,!0),c.removeEventListener("mouseup",e,!0),window.removeEventListener("mouseup",e,!0),b.ondragstop()}function f(){i.releaseCapture(),i.detachEvent("onmousemove",d),i.detachEvent("onmouseup",f),i.detachEvent("onlosecaptrue",f),b.ondragstop()}var c=c||document,g=a.clientX,h=a.clientY;if(c.addEventListener)c.addEventListener("mousemove",d,!0),c.addEventListener("mouseup",e,!0),window.addEventListener("mouseup",e,!0),a.preventDefault();else{var i=a.srcElement;i.setCapture(),i.attachEvent("onmousemove",d),i.attachEvent("onmouseup",f),i.attachEvent("onlosecaptrue",f),a.returnValue=!1}b.ondragstart()},getFixedLayer:function(){var d=document.getElementById("edui_fixedlayer");return null==d&&(d=document.createElement("div"),d.id="edui_fixedlayer",document.body.appendChild(d),c.ie&&c.version<=8?(d.style.position="absolute",b(),setTimeout(a)):d.style.position="fixed",d.style.left="0",d.style.top="0",d.style.width="0",d.style.height="0"),d},makeUnselectable:function(a){if(c.opera||c.ie&&c.version<9){if(a.unselectable="on",a.hasChildNodes())for(var b=0;b'}},a.inherits(c,b)}(),function(){var a=baidu.editor.utils,b=baidu.editor.dom.domUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.uiUtils,e=baidu.editor.ui.Mask=function(a){this.initOptions(a),this.initUIBase()};e.prototype={getHtmlTpl:function(){return'
    '},postRender:function(){var a=this;b.on(window,"resize",function(){setTimeout(function(){a.isHidden()||a._fill()})})},show:function(a){this._fill(),this.getDom().style.display="",this.getDom().style.zIndex=a},hide:function(){this.getDom().style.display="none",this.getDom().style.zIndex=""},isHidden:function(){return"none"==this.getDom().style.display},_onMouseDown:function(){return!1},_onClick:function(a,b){this.fireEvent("click",a,b)},_fill:function(){var a=this.getDom(),b=d.getViewportRect();a.style.width=b.width+"px",a.style.height=b.height+"px"}},a.inherits(e,c)}(),function(){function a(a,b){for(var c=0;c
    '+this.getContentHtmlTpl()+"
    "},getContentHtmlTpl:function(){return this.content?"string"==typeof this.content?this.content:this.content.renderHtml():""},_UIBase_postRender:e.prototype.postRender,postRender:function(){if(this.content instanceof e&&this.content.postRender(),this.captureWheel&&!this.captured){this.captured=!0;var a=(document.documentElement.clientHeight||document.body.clientHeight)-80,b=this.getDom().offsetHeight,f=c.getClientRect(this.combox.getDom()).top,g=this.getDom("content"),h=this.getDom("body").getElementsByTagName("iframe"),i=this;for(h.length&&(h=h[0]);f+b>a;)b-=30;g.style.height=b+"px",h&&(h.style.height=b+"px"),window.XMLHttpRequest?d.on(g,"onmousewheel"in document.body?"mousewheel":"DOMMouseScroll",function(a){a.preventDefault?a.preventDefault():a.returnValue=!1,a.wheelDelta?g.scrollTop-=a.wheelDelta/120*60:g.scrollTop-=a.detail/-3*60}):d.on(this.getDom(),"mousewheel",function(a){a.returnValue=!1,i.getDom("content").scrollTop-=a.wheelDelta/120*60})}this.fireEvent("postRenderAfter"),this.hide(!0),this._UIBase_postRender()},_doAutoRender:function(){!this.getDom()&&this.autoRender&&this.render()},mesureSize:function(){var a=this.getDom("content");return c.getClientRect(a)},fitSize:function(){if(this.captureWheel&&this.sized)return this.__size;this.sized=!0;var a=this.getDom("body");a.style.width="",a.style.height="";var b=this.mesureSize();if(this.captureWheel){a.style.width=-(-20-b.width)+"px";var c=parseInt(this.getDom("content").style.height,10);!window.isNaN(c)&&(b.height=c)}else a.style.width=b.width+"px";return a.style.height=b.height+"px",this.__size=b,this.captureWheel&&(this.getDom("content").style.overflow="auto"),b},showAnchor:function(a,b){this.showAnchorRect(c.getClientRect(a),b)},showAnchorRect:function(a,b,e){this._doAutoRender();var f=c.getViewportRect();this.getDom().style.visibility="hidden",this._show();var g,i,j,k,l=this.fitSize();b?(g=this.canSideLeft&&a.right+l.width>f.right&&a.left>l.width,i=this.canSideUp&&a.top+l.height>f.bottom&&a.bottom>l.height,j=g?a.left-l.width:a.right,k=i?a.bottom-l.height:a.top):(g=this.canSideLeft&&a.right+l.width>f.right&&a.left>l.width,i=this.canSideUp&&a.top+l.height>f.bottom&&a.bottom>l.height,j=g?a.right-l.width:a.left,k=i?a.top-l.height:a.bottom);var m=this.getDom();c.setViewportOffset(m,{left:j,top:k}),d.removeClasses(m,h),m.className+=" "+h[2*(i?1:0)+(g?1:0)],this.editor&&(m.style.zIndex=1*this.editor.container.style.zIndex+10,baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex=m.style.zIndex-1),this.getDom().style.visibility="visible"},showAt:function(a){var b=a.left,c=a.top,d={left:b,top:c,right:b,bottom:c,height:0,width:0};this.showAnchorRect(d,!1,!0)},_show:function(){if(this._hidden){var a=this.getDom();a.style.display="",this._hidden=!1,this.fireEvent("show")}},isHidden:function(){return this._hidden},show:function(){this._doAutoRender(),this._show()},hide:function(a){!this._hidden&&this.getDom()&&(this.getDom().style.display="none",this._hidden=!0,a||this.fireEvent("hide"))},queryAutoHide:function(a){return!a||!c.contains(this.getDom(),a)}},b.inherits(f,e),d.on(document,"mousedown",function(b){var c=b.target||b.srcElement;a(b,c)}),d.on(window,"scroll",function(b,c){a(b,c)})}(),function(){function a(a,b){for(var c='
    '+a+'
    ',d=0;d"+(60==d?'":"")+""),c+=d<70?'':"";return c+="
    '+b.getLang("themeColor")+'
    '+b.getLang("standardColor")+"
    =60?"border-width:1px;":d>=10&&d<20?"border-width:1px 1px 0 1px;":"border-width:0 1px 0 1px;")+'">
    "}var b=baidu.editor.utils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.ColorPicker=function(a){this.initOptions(a),this.noColorText=this.noColorText||this.editor.getLang("clearColor"),this.initUIBase()};d.prototype={getHtmlTpl:function(){return a(this.noColorText,this.editor)},_onTableClick:function(a){var b=a.target||a.srcElement,c=b.getAttribute("data-color");c&&this.fireEvent("pickcolor",c)},_onTableOver:function(a){var b=a.target||a.srcElement,c=b.getAttribute("data-color");c&&(this.getDom("preview").style.backgroundColor=c)},_onTableOut:function(){this.getDom("preview").style.backgroundColor=""},_onPickNoColor:function(){this.fireEvent("picknocolor")}},b.inherits(d,c);var e="ffffff,000000,eeece1,1f497d,4f81bd,c0504d,9bbb59,8064a2,4bacc6,f79646,f2f2f2,7f7f7f,ddd9c3,c6d9f0,dbe5f1,f2dcdb,ebf1dd,e5e0ec,dbeef3,fdeada,d8d8d8,595959,c4bd97,8db3e2,b8cce4,e5b9b7,d7e3bc,ccc1d9,b7dde8,fbd5b5,bfbfbf,3f3f3f,938953,548dd4,95b3d7,d99694,c3d69b,b2a2c7,92cddc,fac08f,a5a5a5,262626,494429,17365d,366092,953734,76923c,5f497a,31859b,e36c09,7f7f7f,0c0c0c,1d1b10,0f243e,244061,632423,4f6128,3f3151,205867,974806,c00000,ff0000,ffc000,ffff00,92d050,00b050,00b0f0,0070c0,002060,7030a0,".split(",")}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.TablePicker=function(a){this.initOptions(a),this.initTablePicker()};d.prototype={defaultNumRows:10,defaultNumCols:10,maxNumRows:20,maxNumCols:20,numRows:10,numCols:10,lengthOfCellSide:22,initTablePicker:function(){this.initUIBase()},getHtmlTpl:function(){return'
    '},_UIBase_render:c.prototype.render,render:function(a){this._UIBase_render(a),this.getDom("label").innerHTML="0"+this.editor.getLang("t_row")+" x 0"+this.editor.getLang("t_col")},_track:function(a,b){var c=this.getDom("overlay").style,d=this.lengthOfCellSide;c.width=a*d+"px",c.height=b*d+"px";var e=this.getDom("label");e.innerHTML=a+this.editor.getLang("t_col")+" x "+b+this.editor.getLang("t_row"),this.numCols=a,this.numRows=b},_onMouseOver:function(a,c){var d=a.relatedTarget||a.fromElement;b.contains(c,d)||c===d||(this.getDom("label").innerHTML="0"+this.editor.getLang("t_col")+" x 0"+this.editor.getLang("t_row"),this.getDom("overlay").style.visibility="")},_onMouseOut:function(a,c){var d=a.relatedTarget||a.toElement;b.contains(c,d)||c===d||(this.getDom("label").innerHTML="0"+this.editor.getLang("t_col")+" x 0"+this.editor.getLang("t_row"),this.getDom("overlay").style.visibility="hidden")},_onMouseMove:function(a,c){var d=(this.getDom("overlay").style,b.getEventOffset(a)),e=this.lengthOfCellSide,f=Math.ceil(d.left/e),g=Math.ceil(d.top/e);this._track(f,g)},_onClick:function(){this.fireEvent("picktable",this.numCols,this.numRows)}},a.inherits(d,c)}(),function(){var a=baidu.editor.browser,b=baidu.editor.dom.domUtils,c=baidu.editor.ui.uiUtils,d='onmousedown="$$.Stateful_onMouseDown(event, this);" onmouseup="$$.Stateful_onMouseUp(event, this);"'+(a.ie?' onmouseenter="$$.Stateful_onMouseEnter(event, this);" onmouseleave="$$.Stateful_onMouseLeave(event, this);"':' onmouseover="$$.Stateful_onMouseOver(event, this);" onmouseout="$$.Stateful_onMouseOut(event, this);"');baidu.editor.ui.Stateful={alwalysHoverable:!1,target:null,Stateful_init:function(){this._Stateful_dGetHtmlTpl=this.getHtmlTpl,this.getHtmlTpl=this.Stateful_getHtmlTpl},Stateful_getHtmlTpl:function(){var a=this._Stateful_dGetHtmlTpl();return a.replace(/stateful/g,function(){return d})},Stateful_onMouseEnter:function(a,b){this.target=b,this.isDisabled()&&!this.alwalysHoverable||(this.addState("hover"),this.fireEvent("over"))},Stateful_onMouseLeave:function(a,b){this.isDisabled()&&!this.alwalysHoverable||(this.removeState("hover"),this.removeState("active"),this.fireEvent("out"))},Stateful_onMouseOver:function(a,b){var d=a.relatedTarget;c.contains(b,d)||b===d||this.Stateful_onMouseEnter(a,b)},Stateful_onMouseOut:function(a,b){var d=a.relatedTarget;c.contains(b,d)||b===d||this.Stateful_onMouseLeave(a,b)},Stateful_onMouseDown:function(a,b){this.isDisabled()||this.addState("active")},Stateful_onMouseUp:function(a,b){this.isDisabled()||this.removeState("active")},Stateful_postRender:function(){this.disabled&&!this.hasState("disabled")&&this.addState("disabled")},hasState:function(a){return b.hasClass(this.getStateDom(),"edui-state-"+a)},addState:function(a){this.hasState(a)||(this.getStateDom().className+=" edui-state-"+a)},removeState:function(a){this.hasState(a)&&b.removeClasses(this.getStateDom(),["edui-state-"+a])},getStateDom:function(){return this.getDom("state")},isChecked:function(){return this.hasState("checked")},setChecked:function(a){!this.isDisabled()&&a?this.addState("checked"):this.removeState("checked")},isDisabled:function(){return this.hasState("disabled")},setDisabled:function(a){a?(this.removeState("hover"),this.removeState("checked"),this.removeState("active"),this.addState("disabled")):this.removeState("disabled")}}}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.UIBase,c=baidu.editor.ui.Stateful,d=baidu.editor.ui.Button=function(a){if(a.name){var b=a.name,c=a.cssRules;a.className||(a.className="edui-for-"+b),a.cssRules=".edui-default .edui-for-"+b+" .edui-icon {"+c+"}"}this.initOptions(a),this.initButton()};d.prototype={uiName:"button",label:"",title:"",showIcon:!0,showText:!0,cssRules:"",initButton:function(){this.initUIBase(),this.Stateful_init(),this.cssRules&&a.cssRule("edui-customize-"+this.name+"-style",this.cssRules)},getHtmlTpl:function(){return'
    '+(this.showIcon?'
    ':"")+(this.showText?'
    '+this.label+"
    ":"")+"
    "},postRender:function(){this.Stateful_postRender(),this.setDisabled(this.disabled)},_onMouseDown:function(a){var b=a.target||a.srcElement,c=b&&b.tagName&&b.tagName.toLowerCase();if("input"==c||"object"==c||"object"==c)return!1},_onClick:function(){this.isDisabled()||this.fireEvent("click")},setTitle:function(a){var b=this.getDom("label");b.innerHTML=a}},a.inherits(d,b),a.extend(d.prototype,c)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=(baidu.editor.dom.domUtils,baidu.editor.ui.UIBase),d=baidu.editor.ui.Stateful,e=baidu.editor.ui.SplitButton=function(a){this.initOptions(a),this.initSplitButton()};e.prototype={popup:null,uiName:"splitbutton",title:"",initSplitButton:function(){this.initUIBase(),this.Stateful_init();if(null!=this.popup){var a=this.popup;this.popup=null,this.setPopup(a)}},_UIBase_postRender:c.prototype.postRender,postRender:function(){this.Stateful_postRender(),this._UIBase_postRender()},setPopup:function(c){this.popup!==c&&(null!=this.popup&&this.popup.dispose(),c.addListener("show",a.bind(this._onPopupShow,this)),c.addListener("hide",a.bind(this._onPopupHide,this)),c.addListener("postrender",a.bind(function(){c.getDom("body").appendChild(b.createElementByHtml('
    ')),c.getDom().className+=" "+this.className},this)),this.popup=c)},_onPopupShow:function(){this.addState("opened")},_onPopupHide:function(){this.removeState("opened")},getHtmlTpl:function(){return'
    '},showPopup:function(){var a=b.getClientRect(this.getDom());a.top-=this.popup.SHADOW_RADIUS,a.height+=this.popup.SHADOW_RADIUS,this.popup.showAnchorRect(a)},_onArrowClick:function(a,b){this.isDisabled()||this.showPopup()},_onButtonClick:function(){this.isDisabled()||this.fireEvent("buttonclick")}},a.inherits(e,c),a.extend(e.prototype,d,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.ColorPicker,d=baidu.editor.ui.Popup,e=baidu.editor.ui.SplitButton,f=baidu.editor.ui.ColorButton=function(a){this.initOptions(a),this.initColorButton()};f.prototype={initColorButton:function(){var a=this;this.popup=new d({content:new c({noColorText:a.editor.getLang("clearColor"),editor:a.editor,onpickcolor:function(b,c){a._onPickColor(c)},onpicknocolor:function(b,c){a._onPickNoColor(c)}}),editor:a.editor}),this.initSplitButton()},_SplitButton_postRender:e.prototype.postRender,postRender:function(){this._SplitButton_postRender(),this.getDom("button_body").appendChild(b.createElementByHtml('
    ')),this.getDom().className+=" edui-colorbutton"; +},setColor:function(a){this.getDom("colorlump").style.backgroundColor=a,this.color=a},_onPickColor:function(a){this.fireEvent("pickcolor",a)!==!1&&(this.setColor(a),this.popup.hide())},_onPickNoColor:function(a){this.fireEvent("picknocolor")!==!1&&this.popup.hide()}},a.inherits(f,e)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.Popup,c=baidu.editor.ui.TablePicker,d=baidu.editor.ui.SplitButton,e=baidu.editor.ui.TableButton=function(a){this.initOptions(a),this.initTableButton()};e.prototype={initTableButton:function(){var a=this;this.popup=new b({content:new c({editor:a.editor,onpicktable:function(b,c,d){a._onPickTable(c,d)}}),editor:a.editor}),this.initSplitButton()},_onPickTable:function(a,b){this.fireEvent("picktable",a,b)!==!1&&this.popup.hide()}},a.inherits(e,d)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.UIBase,c=baidu.editor.ui.AutoTypeSetPicker=function(a){this.initOptions(a),this.initAutoTypeSetPicker()};c.prototype={initAutoTypeSetPicker:function(){this.initUIBase()},getHtmlTpl:function(){var a=this.editor,b=a.options.autotypeset,c=a.getLang("autoTypeSet"),d="textAlignValue"+a.uid,e="imageBlockLineValue"+a.uid,f="symbolConverValue"+a.uid;return'
    "+c.mergeLine+'"+c.delLine+'
    "+c.removeFormat+'"+c.indent+'
    "+c.alignment+'"+a.getLang("justifyleft")+'"+a.getLang("justifycenter")+'"+a.getLang("justifyright")+'
    "+c.imageFloat+'"+a.getLang("default")+'"+a.getLang("justifyleft")+'"+a.getLang("justifycenter")+'"+a.getLang("justifyright")+'
    "+c.removeFontsize+'"+c.removeFontFamily+'
    "+c.removeHtml+'
    "+c.pasteFilter+'
    "+c.symbol+'"+c.bdc2sb+'"+c.tobdc+'
    "},_UIBase_render:b.prototype.render},a.inherits(c,b)}(),function(){function a(a){for(var c,d={},e=a.getDom(),f=a.editor.uid,g=null,h=null,i=domUtils.getElementsByTagName(e,"input"),j=i.length-1;c=i[j--];)if(g=c.getAttribute("type"),"checkbox"==g)if(h=c.getAttribute("name"),d[h]&&delete d[h],c.checked){var k=document.getElementById(h+"Value"+f);if(k){if(/input/gi.test(k.tagName))d[h]=k.value;else for(var l,m=k.getElementsByTagName("input"),n=m.length-1;l=m[n--];)if(l.checked){d[h]=l.value;break}}else d[h]=!0}else d[h]=!1;else d[c.getAttribute("value")]=c.checked;for(var o,p=domUtils.getElementsByTagName(e,"select"),j=0;o=p[j++];){var q=o.getAttribute("name");d[q]=d[q]?o.value:""}b.extend(a.editor.options.autotypeset,d),a.editor.setPreferences("autotypeset",d)}var b=baidu.editor.utils,c=baidu.editor.ui.Popup,d=baidu.editor.ui.AutoTypeSetPicker,e=baidu.editor.ui.SplitButton,f=baidu.editor.ui.AutoTypeSetButton=function(a){this.initOptions(a),this.initAutoTypeSetButton()};f.prototype={initAutoTypeSetButton:function(){var b=this;this.popup=new c({content:new d({editor:b.editor}),editor:b.editor,hide:function(){!this._hidden&&this.getDom()&&(a(this),this.getDom().style.display="none",this._hidden=!0,this.fireEvent("hide"))}});var e=0;this.popup.addListener("postRenderAfter",function(){var c=this;if(!e){var d=this.getDom(),f=d.getElementsByTagName("button")[0];f.onclick=function(){a(c),b.editor.execCommand("autotypeset"),c.hide()},domUtils.on(d,"click",function(d){var e=d.target||d.srcElement,f=b.editor.uid;if(e&&"INPUT"==e.tagName){if("imageBlockLine"==e.name||"textAlign"==e.name||"symbolConver"==e.name)for(var g=e.checked,h=document.getElementById(e.name+"Value"+f),i=h.getElementsByTagName("input"),j={imageBlockLine:"none",textAlign:"left",symbolConver:"tobdc"},k=0;k"),e.push('
    '),2===d&&e.push("");return'
    '+e.join("")+"
    "},getStateDom:function(){return this.target},_onClick:function(a){var c=a.target||a.srcElement;/icon/.test(c.className)&&(this.items[c.parentNode.getAttribute("index")].onclick(),b.postHide(a))},_UIBase_render:d.prototype.render},a.inherits(e,d),a.extend(e.prototype,c,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.Stateful,c=baidu.editor.ui.uiUtils,d=baidu.editor.ui.UIBase,e=baidu.editor.ui.PastePicker=function(a){this.initOptions(a),this.initPastePicker()};e.prototype={initPastePicker:function(){this.initUIBase(),this.Stateful_init()},getHtmlTpl:function(){return'
    '+this.editor.getLang("pasteOpt")+'
    '},getStateDom:function(){return this.target},format:function(a){this.editor.ui._isTransfer=!0,this.editor.fireEvent("pasteTransfer",a)},_onClick:function(a){var b=domUtils.getNextDomNode(a),d=c.getViewportRect().height,e=c.getClientRect(b);e.top+e.height>d?b.style.top=-e.height-a.offsetHeight+"px":b.style.top="",/hidden/gi.test(domUtils.getComputedStyle(b,"visibility"))?(b.style.visibility="visible",domUtils.addClass(a,"edui-state-opened")):(b.style.visibility="hidden",domUtils.removeClasses(a,"edui-state-opened"))},_UIBase_render:d.prototype.render},a.inherits(e,d),a.extend(e.prototype,b,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.Toolbar=function(a){this.initOptions(a),this.initToolbar()};d.prototype={items:null,initToolbar:function(){this.items=this.items||[],this.initUIBase()},add:function(a,b){void 0===b?this.items.push(a):this.items.splice(b,0,a)},getHtmlTpl:function(){for(var a=[],b=0;b'+a.join("")+""},postRender:function(){for(var a=this.getDom(),c=0;c
    '},postRender:function(){},queryAutoHide:function(){return!0}};h.prototype={items:null,uiName:"menu",initMenu:function(){this.items=this.items||[],this.initPopup(),this.initItems()},initItems:function(){for(var a=0;a'+a.join("")+""},_Popup_postRender:e.prototype.postRender,postRender:function(){for(var a=this,d=0;d
    '+this.renderLabelHtml()+"
    "},postRender:function(){var a=this;this.addListener("over",function(){a.ownerMenu.fireEvent("submenuover",a),a.subMenu&&a.delayShowSubMenu()}),this.subMenu&&(this.getDom().className+=" edui-hassubmenu",this.subMenu.render(),this.addListener("out",function(){a.delayHideSubMenu()}),this.subMenu.addListener("over",function(){clearTimeout(a._closingTimer),a._closingTimer=null,a.addState("opened")}),this.ownerMenu.addListener("hide",function(){a.hideSubMenu()}),this.ownerMenu.addListener("submenuover",function(b,c){c!==a&&a.delayHideSubMenu()}),this.subMenu._bakQueryAutoHide=this.subMenu.queryAutoHide,this.subMenu.queryAutoHide=function(b){return(!b||!c.contains(a.getDom(),b))&&this._bakQueryAutoHide(b)}),this.getDom().style.tabIndex="-1",c.makeUnselectable(this.getDom()),this.Stateful_postRender()},delayShowSubMenu:function(){var a=this;a.isDisabled()||(a.addState("opened"),clearTimeout(a._showingTimer),clearTimeout(a._closingTimer),a._closingTimer=null,a._showingTimer=setTimeout(function(){a.showSubMenu()},250))},delayHideSubMenu:function(){var a=this;a.isDisabled()||(a.removeState("opened"),clearTimeout(a._showingTimer),a._closingTimer||(a._closingTimer=setTimeout(function(){a.hasState("opened")||a.hideSubMenu(),a._closingTimer=null},400)))},renderLabelHtml:function(){return'
    '+(this.label||"")+"
    "},getStateDom:function(){return this.getDom()},queryAutoHide:function(a){if(this.subMenu&&this.hasState("opened"))return this.subMenu.queryAutoHide(a)},_onClick:function(a,b){this.hasState("disabled")||this.fireEvent("click",a,b)!==!1&&(this.subMenu?this.showSubMenu():e.postHide(a))},showSubMenu:function(){var a=c.getClientRect(this.getDom());a.right-=5,a.left+=2,a.width-=7,a.top-=4,a.bottom+=4,a.height+=8,this.subMenu.showAnchorRect(a,!0,!0)},hideSubMenu:function(){this.subMenu.hide()}},a.inherits(j,d),a.extend(j.prototype,f,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.Menu,d=baidu.editor.ui.SplitButton,e=baidu.editor.ui.Combox=function(a){this.initOptions(a),this.initCombox()};e.prototype={uiName:"combox",onbuttonclick:function(){this.showPopup()},initCombox:function(){var a=this;this.items=this.items||[];for(var b=0;bd.right&&(g=d.right-e.width);var h=a.top;h+e.height>d.bottom&&(h=d.bottom-e.height),c.style.left=Math.max(g,0)+"px",c.style.top=Math.max(h,0)+"px"},showAtCenter:function(){var a=f.getViewportRect();if(this.fullscreen){var b=this.getDom(),c=this.getDom("content");b.style.display="block";var d=UE.ui.uiUtils.getClientRect(b),g=UE.ui.uiUtils.getClientRect(c);b.style.left="-100000px",c.style.width=a.width-d.width+g.width+"px",c.style.height=a.height-d.height+g.height+"px",b.style.width=a.width+"px",b.style.height=a.height+"px",b.style.left=0,this._originalContext={html:{overflowX:document.documentElement.style.overflowX,overflowY:document.documentElement.style.overflowY},body:{overflowX:document.body.style.overflowX,overflowY:document.body.style.overflowY}},document.documentElement.style.overflowX="hidden",document.documentElement.style.overflowY="hidden",document.body.style.overflowX="hidden",document.body.style.overflowY="hidden"}else{this.getDom().style.display="";var h=this.fitSize(),i=0|this.getDom("titlebar").offsetHeight,j=a.width/2-h.width/2,k=a.height/2-(h.height-i)/2-i,l=this.getDom();this.safeSetOffset({left:Math.max(0|j,0),top:Math.max(0|k,0)}),e.hasClass(l,"edui-state-centered")||(l.className+=" edui-state-centered")}this._show()},getContentHtml:function(){var a="";return"string"==typeof this.content?a=this.content:this.iframeUrl&&(a=''),a},getHtmlTpl:function(){var a="";if(this.buttons){for(var b=[],c=0;c
    '+b.join("")+"
    "}return'
    '+(this.title||"")+"
    "+this.closeButton.renderHtml()+'
    '+(this.autoReset?"":this.getContentHtml())+"
    "+a+"
    "},postRender:function(){this.modalMask.getDom()||(this.modalMask.render(),this.modalMask.hide()),this.dragMask.getDom()||(this.dragMask.render(),this.dragMask.hide());var a=this;if(this.addListener("show",function(){a.modalMask.show(this.getDom().style.zIndex-2)}),this.addListener("hide",function(){a.modalMask.hide()}),this.buttons)for(var b=0;b',a.editor.container.style.zIndex&&(this.getDom().style.zIndex=1*a.editor.container.style.zIndex+1))}}),this.onbuttonclick=function(){this.showPopup()},this.initSplitButton()}},a.inherits(d,c)}(),function(){function a(a){var b=a.target||a.srcElement,c=g.findParent(b,function(a){return g.hasClass(a,"edui-shortcutmenu")||g.hasClass(a,"edui-popup")},!0);if(!c)for(var d,e=0;d=h[e++];)d.hide()}var b,c=baidu.editor.ui,d=c.UIBase,e=c.uiUtils,f=baidu.editor.utils,g=baidu.editor.dom.domUtils,h=[],i=!1,j=c.ShortCutMenu=function(a){this.initOptions(a),this.initShortCutMenu()};j.postHide=a,j.prototype={isHidden:!0,SPACE:5,initShortCutMenu:function(){this.items=this.items||[],this.initUIBase(),this.initItems(),this.initEvent(),h.push(this)},initEvent:function(){var a=this,c=a.editor.document;g.on(c,"mousemove",function(c){if(a.isHidden===!1){if(a.getSubMenuMark()||"contextmenu"==a.eventType)return;var d=!0,e=a.getDom(),f=e.offsetWidth,g=e.offsetHeight,h=f/2+a.SPACE,i=g/2,j=Math.abs(c.screenX-a.left),k=Math.abs(c.screenY-a.top);clearTimeout(b),b=setTimeout(function(){k>0&&ki&&ki+70&&k0&&jh&&jh+70&&j'+a+""}},f.inherits(j,d),g.on(document,"mousedown",function(b){a(b)}),g.on(window,"scroll",function(b){a(b)})}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.UIBase,c=baidu.editor.ui.Breakline=function(a){this.initOptions(a),this.initSeparator()};c.prototype={uiName:"Breakline",initSeparator:function(){this.initUIBase()},getHtmlTpl:function(){return"
    "}},a.inherits(c,b)}(),function(){var a=baidu.editor.utils,b=baidu.editor.dom.domUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.Message=function(a){this.initOptions(a),this.initMessage()};d.prototype={initMessage:function(){this.initUIBase()},getHtmlTpl:function(){return'
    ×
    '},reset:function(a){var b=this;a.keepshow||(clearTimeout(this.timer),b.timer=setTimeout(function(){b.hide()},a.timeout||4e3)),void 0!==a.content&&b.setContent(a.content),void 0!==a.type&&b.setType(a.type),b.show()},postRender:function(){var a=this,c=this.getDom("closer");c&&b.on(c,"click",function(){a.hide()})},setContent:function(a){this.getDom("content").innerHTML=a},setType:function(a){a=a||"info";var b=this.getDom("body");b.className=b.className.replace(/edui-message-type-[\w-]+/,"edui-message-type-"+a)},getContent:function(){return this.getDom("content").innerHTML},getType:function(){var a=this.getDom("body").match(/edui-message-type-([\w-]+)/);return a?a[1]:""},show:function(){this.getDom().style.display="block"},hide:function(){var a=this.getDom();a&&(a.style.display="none",a.parentNode&&a.parentNode.removeChild(a))}},a.inherits(d,c)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui,c=b.Dialog;b.buttons={},b.Dialog=function(a){var b=new c(a);return b.addListener("hide",function(){if(b.editor){var a=b.editor;try{if(browser.gecko){var c=a.window.scrollY,d=a.window.scrollX;a.body.focus(),a.window.scrollTo(d,c)}else a.focus()}catch(e){}}}),b};for(var d,e={anchor:"~/dialogs/anchor/anchor.html",insertimage:"~/dialogs/image/image.html",link:"~/dialogs/link/link.html",spechars:"~/dialogs/spechars/spechars.html",searchreplace:"~/dialogs/searchreplace/searchreplace.html",map:"~/dialogs/map/map.html",gmap:"~/dialogs/gmap/gmap.html",insertvideo:"~/dialogs/video/video.html",help:"~/dialogs/help/help.html",preview:"~/dialogs/preview/preview.html",emotion:"~/dialogs/emotion/emotion.html",wordimage:"~/dialogs/wordimage/wordimage.html",attachment:"~/dialogs/attachment/attachment.html",insertframe:"~/dialogs/insertframe/insertframe.html",edittip:"~/dialogs/table/edittip.html",edittable:"~/dialogs/table/edittable.html",edittd:"~/dialogs/table/edittd.html",webapp:"~/dialogs/webapp/webapp.html",snapscreen:"~/dialogs/snapscreen/snapscreen.html",scrawl:"~/dialogs/scrawl/scrawl.html",music:"~/dialogs/music/music.html",template:"~/dialogs/template/template.html",background:"~/dialogs/background/background.html",charts:"~/dialogs/charts/charts.html"},f=["undo","redo","formatmatch","bold","italic","underline","fontborder","touppercase","tolowercase","strikethrough","subscript","superscript","source","indent","outdent","blockquote","pasteplain","pagebreak","selectall","print","horizontal","removeformat","time","date","unlink","insertparagraphbeforetable","insertrow","insertcol","mergeright","mergedown","deleterow","deletecol","splittorows","splittocols","splittocells","mergecells","deletetable","drafts"],g=0;d=f[g++];)d=d.toLowerCase(),b[d]=function(a){return function(c){var d=new b.Button({className:"edui-for-"+a,title:c.options.labelMap[a]||c.getLang("labelMap."+a)||"",onclick:function(){c.execCommand(a)},theme:c.options.theme,showText:!1});return b.buttons[a]=d,c.addListener("selectionchange",function(b,e,f){var g=c.queryCommandState(a);g==-1?(d.setDisabled(!0),d.setChecked(!1)):f||(d.setDisabled(!1),d.setChecked(g))}),d}}(d);b.cleardoc=function(a){var c=new b.Button({className:"edui-for-cleardoc",title:a.options.labelMap.cleardoc||a.getLang("labelMap.cleardoc")||"",theme:a.options.theme,onclick:function(){confirm(a.getLang("confirmClear"))&&a.execCommand("cleardoc")}});return b.buttons.cleardoc=c,a.addListener("selectionchange",function(){c.setDisabled(a.queryCommandState("cleardoc")==-1)}),c};var h={justify:["left","right","center","justify"],imagefloat:["none","left","center","right"],directionality:["ltr","rtl"]};for(var i in h)!function(a,c){for(var d,e=0;d=c[e++];)!function(c){b[a.replace("float","")+c]=function(d){var e=new b.Button({ +className:"edui-for-"+a.replace("float","")+c,title:d.options.labelMap[a.replace("float","")+c]||d.getLang("labelMap."+a.replace("float","")+c)||"",theme:d.options.theme,onclick:function(){d.execCommand(a,c)}});return b.buttons[a]=e,d.addListener("selectionchange",function(b,f,g){e.setDisabled(d.queryCommandState(a)==-1),e.setChecked(d.queryCommandValue(a)==c&&!g)}),e}}(d)}(i,h[i]);for(var d,g=0;d=["backcolor","forecolor"][g++];)b[d]=function(a){return function(c){var d=new b.ColorButton({className:"edui-for-"+a,color:"default",title:c.options.labelMap[a]||c.getLang("labelMap."+a)||"",editor:c,onpickcolor:function(b,d){c.execCommand(a,d)},onpicknocolor:function(){c.execCommand(a,"default"),this.setColor("transparent"),this.color="default"},onbuttonclick:function(){c.execCommand(a,this.color)}});return b.buttons[a]=d,c.addListener("selectionchange",function(){d.setDisabled(c.queryCommandState(a)==-1)}),d}}(d);var j={noOk:["searchreplace","help","spechars","webapp","preview"],ok:["attachment","anchor","link","insertimage","map","gmap","insertframe","wordimage","insertvideo","insertframe","edittip","edittable","edittd","scrawl","template","music","background","charts"]};for(var i in j)!function(c,d){for(var f,g=0;f=d[g++];)browser.opera&&"searchreplace"===f||!function(d){b[d]=function(f,g,h){g=g||(f.options.iframeUrlMap||{})[d]||e[d],h=f.options.labelMap[d]||f.getLang("labelMap."+d)||"";var i;g&&(i=new b.Dialog(a.extend({iframeUrl:f.ui.mapUrl(g),editor:f,className:"edui-for-"+d,title:h,holdScroll:"insertimage"===d,fullscreen:/charts|preview/.test(d),closeDialog:f.getLang("closeDialog")},"ok"==c?{buttons:[{className:"edui-okbutton",label:f.getLang("ok"),editor:f,onclick:function(){i.close(!0)}},{className:"edui-cancelbutton",label:f.getLang("cancel"),editor:f,onclick:function(){i.close(!1)}}]}:{})),f.ui._dialogs[d+"Dialog"]=i);var j=new b.Button({className:"edui-for-"+d,title:h,onclick:function(){if(i)switch(d){case"wordimage":var a=f.execCommand("wordimage");a&&a.length&&(i.render(),i.open());break;case"scrawl":f.queryCommandState("scrawl")!=-1&&(i.render(),i.open());break;default:i.render(),i.open()}},theme:f.options.theme,disabled:"scrawl"==d&&f.queryCommandState("scrawl")==-1||"charts"==d});return b.buttons[d]=j,f.addListener("selectionchange",function(){var a={edittable:1};if(!(d in a)){var b=f.queryCommandState(d);j.getDom()&&(j.setDisabled(b==-1),j.setChecked(b))}}),j}}(f.toLowerCase())}(i,j[i]);b.snapscreen=function(a,c,d){d=a.options.labelMap.snapscreen||a.getLang("labelMap.snapscreen")||"";var f=new b.Button({className:"edui-for-snapscreen",title:d,onclick:function(){a.execCommand("snapscreen")},theme:a.options.theme});if(b.buttons.snapscreen=f,c=c||(a.options.iframeUrlMap||{}).snapscreen||e.snapscreen){var g=new b.Dialog({iframeUrl:a.ui.mapUrl(c),editor:a,className:"edui-for-snapscreen",title:d,buttons:[{className:"edui-okbutton",label:a.getLang("ok"),editor:a,onclick:function(){g.close(!0)}},{className:"edui-cancelbutton",label:a.getLang("cancel"),editor:a,onclick:function(){g.close(!1)}}]});g.render(),a.ui._dialogs.snapscreenDialog=g}return a.addListener("selectionchange",function(){f.setDisabled(a.queryCommandState("snapscreen")==-1)}),f},b.insertcode=function(c,d,e){d=c.options.insertcode||[],e=c.options.labelMap.insertcode||c.getLang("labelMap.insertcode")||"";var f=[];a.each(d,function(a,b){f.push({label:a,value:b,theme:c.options.theme,renderLabelHtml:function(){return'
    '+(this.label||"")+"
    "}})});var g=new b.Combox({editor:c,items:f,onselect:function(a,b){c.execCommand("insertcode",this.items[b].value)},onbuttonclick:function(){this.showPopup()},title:e,initValue:e,className:"edui-for-insertcode",indexByValue:function(a){if(a)for(var b,c=0;b=this.items[c];c++)if(b.value.indexOf(a)!=-1)return c;return-1}});return b.buttons.insertcode=g,c.addListener("selectionchange",function(a,b,d){if(!d){var f=c.queryCommandState("insertcode");if(f==-1)g.setDisabled(!0);else{g.setDisabled(!1);var h=c.queryCommandValue("insertcode");if(!h)return void g.setValue(e);h&&(h=h.replace(/['"]/g,"").split(",")[0]),g.setValue(h)}}}),g},b.fontfamily=function(c,d,e){if(d=c.options.fontfamily||[],e=c.options.labelMap.fontfamily||c.getLang("labelMap.fontfamily")||"",d.length){for(var f,g=0,h=[];f=d[g];g++){var i=c.getLang("fontfamily")[f.name]||"";!function(b,d){h.push({label:b,value:d,theme:c.options.theme,renderLabelHtml:function(){return'
    '+(this.label||"")+"
    "}})}(f.label||i,f.val)}var j=new b.Combox({editor:c,items:h,onselect:function(a,b){c.execCommand("FontFamily",this.items[b].value)},onbuttonclick:function(){this.showPopup()},title:e,initValue:e,className:"edui-for-fontfamily",indexByValue:function(a){if(a)for(var b,c=0;b=this.items[c];c++)if(b.value.indexOf(a)!=-1)return c;return-1}});return b.buttons.fontfamily=j,c.addListener("selectionchange",function(a,b,d){if(!d){var e=c.queryCommandState("FontFamily");if(e==-1)j.setDisabled(!0);else{j.setDisabled(!1);var f=c.queryCommandValue("FontFamily");f&&(f=f.replace(/['"]/g,"").split(",")[0]),j.setValue(f)}}}),j}},b.fontsize=function(a,c,d){if(d=a.options.labelMap.fontsize||a.getLang("labelMap.fontsize")||"",c=c||a.options.fontsize||[],c.length){for(var e=[],f=0;f'+(this.label||"")+""}})}var h=new b.Combox({editor:a,items:e,title:d,initValue:d,onselect:function(b,c){a.execCommand("FontSize",this.items[c].value)},onbuttonclick:function(){this.showPopup()},className:"edui-for-fontsize"});return b.buttons.fontsize=h,a.addListener("selectionchange",function(b,c,d){if(!d){var e=a.queryCommandState("FontSize");e==-1?h.setDisabled(!0):(h.setDisabled(!1),h.setValue(a.queryCommandValue("FontSize")))}}),h}},b.paragraph=function(c,d,e){if(e=c.options.labelMap.paragraph||c.getLang("labelMap.paragraph")||"",d=c.options.paragraph||[],!a.isEmptyObject(d)){var f=[];for(var g in d)f.push({value:g,label:d[g]||c.getLang("paragraph")[g],theme:c.options.theme,renderLabelHtml:function(){return'
    '+(this.label||"")+"
    "}});var h=new b.Combox({editor:c,items:f,title:e,initValue:e,className:"edui-for-paragraph",onselect:function(a,b){c.execCommand("Paragraph",this.items[b].value)},onbuttonclick:function(){this.showPopup()}});return b.buttons.paragraph=h,c.addListener("selectionchange",function(a,b,d){if(!d){var e=c.queryCommandState("Paragraph");if(e==-1)h.setDisabled(!0);else{h.setDisabled(!1);var f=c.queryCommandValue("Paragraph"),g=h.indexByValue(f);g!=-1?h.setValue(f):h.setValue(h.initValue)}}}),h}},b.customstyle=function(a){var c=a.options.customstyle||[],d=a.options.labelMap.customstyle||a.getLang("labelMap.customstyle")||"";if(c.length){for(var e,f=a.getLang("customstyle"),g=0,h=[];e=c[g++];)!function(b){var c={};c.label=b.label?b.label:f[b.name],c.style=b.style,c.className=b.className,c.tag=b.tag,h.push({label:c.label,value:c,theme:a.options.theme,renderLabelHtml:function(){return'
    <'+c.tag+" "+(c.className?' class="'+c.className+'"':"")+(c.style?' style="'+c.style+'"':"")+">"+c.label+"
    "}})}(e);var i=new b.Combox({editor:a,items:h,title:d,initValue:d,className:"edui-for-customstyle",onselect:function(b,c){a.execCommand("customstyle",this.items[c].value)},onbuttonclick:function(){this.showPopup()},indexByValue:function(a){for(var b,c=0;b=this.items[c++];)if(b.label==a)return c-1;return-1}});return b.buttons.customstyle=i,a.addListener("selectionchange",function(b,c,d){if(!d){var e=a.queryCommandState("customstyle");if(e==-1)i.setDisabled(!0);else{i.setDisabled(!1);var f=a.queryCommandValue("customstyle"),g=i.indexByValue(f);g!=-1?i.setValue(f):i.setValue(i.initValue)}}}),i}},b.inserttable=function(a,c,d){d=a.options.labelMap.inserttable||a.getLang("labelMap.inserttable")||"";var e=new b.TableButton({editor:a,title:d,className:"edui-for-inserttable",onpicktable:function(b,c,d){a.execCommand("InsertTable",{numRows:d,numCols:c,border:1})},onbuttonclick:function(){this.showPopup()}});return b.buttons.inserttable=e,a.addListener("selectionchange",function(){e.setDisabled(a.queryCommandState("inserttable")==-1)}),e},b.lineheight=function(a){var c=a.options.lineheight||[];if(c.length){for(var d,e=0,f=[];d=c[e++];)f.push({label:d,value:d,theme:a.options.theme,onclick:function(){a.execCommand("lineheight",this.value)}});var g=new b.MenuButton({editor:a,className:"edui-for-lineheight",title:a.options.labelMap.lineheight||a.getLang("labelMap.lineheight")||"",items:f,onbuttonclick:function(){var b=a.queryCommandValue("LineHeight")||this.value;a.execCommand("LineHeight",b)}});return b.buttons.lineheight=g,a.addListener("selectionchange",function(){var b=a.queryCommandState("LineHeight");if(b==-1)g.setDisabled(!0);else{g.setDisabled(!1);var c=a.queryCommandValue("LineHeight");c&&g.setValue((c+"").replace(/cm/,"")),g.setChecked(b)}}),g}};for(var k,l=["top","bottom"],m=0;k=l[m++];)!function(a){b["rowspacing"+a]=function(c){var d=c.options["rowspacing"+a]||[];if(!d.length)return null;for(var e,f=0,g=[];e=d[f++];)g.push({label:e,value:e,theme:c.options.theme,onclick:function(){c.execCommand("rowspacing",this.value,a)}});var h=new b.MenuButton({editor:c,className:"edui-for-rowspacing"+a,title:c.options.labelMap["rowspacing"+a]||c.getLang("labelMap.rowspacing"+a)||"",items:g,onbuttonclick:function(){var b=c.queryCommandValue("rowspacing",a)||this.value;c.execCommand("rowspacing",b,a)}});return b.buttons[a]=h,c.addListener("selectionchange",function(){var b=c.queryCommandState("rowspacing",a);if(b==-1)h.setDisabled(!0);else{h.setDisabled(!1);var d=c.queryCommandValue("rowspacing",a);d&&h.setValue((d+"").replace(/%/,"")),h.setChecked(b)}}),h}}(k);for(var n,o=["insertorderedlist","insertunorderedlist"],p=0;n=o[p++];)!function(a){b[a]=function(c){var d=c.options[a],e=function(){c.execCommand(a,this.value)},f=[];for(var g in d)f.push({label:d[g]||c.getLang()[a][g]||"",value:g,theme:c.options.theme,onclick:e});var h=new b.MenuButton({editor:c,className:"edui-for-"+a,title:c.getLang("labelMap."+a)||"",items:f,onbuttonclick:function(){var b=c.queryCommandValue(a)||this.value;c.execCommand(a,b)}});return b.buttons[a]=h,c.addListener("selectionchange",function(){var b=c.queryCommandState(a);if(b==-1)h.setDisabled(!0);else{h.setDisabled(!1);var d=c.queryCommandValue(a);h.setValue(d),h.setChecked(b)}}),h}}(n);b.fullscreen=function(a,c){c=a.options.labelMap.fullscreen||a.getLang("labelMap.fullscreen")||"";var d=new b.Button({className:"edui-for-fullscreen",title:c,theme:a.options.theme,onclick:function(){a.ui&&a.ui.setFullScreen(!a.ui.isFullScreen()),this.setChecked(a.ui.isFullScreen())}});return b.buttons.fullscreen=d,a.addListener("selectionchange",function(){var b=a.queryCommandState("fullscreen");d.setDisabled(b==-1),d.setChecked(a.ui.isFullScreen())}),d},b.emotion=function(a,c){var d="emotion",f=new b.MultiMenuPop({title:a.options.labelMap[d]||a.getLang("labelMap."+d)||"",editor:a,className:"edui-for-"+d,iframeUrl:a.ui.mapUrl(c||(a.options.iframeUrlMap||{})[d]||e[d])});return b.buttons[d]=f,a.addListener("selectionchange",function(){f.setDisabled(a.queryCommandState(d)==-1)}),f},b.autotypeset=function(a){var c=new b.AutoTypeSetButton({editor:a,title:a.options.labelMap.autotypeset||a.getLang("labelMap.autotypeset")||"",className:"edui-for-autotypeset",onbuttonclick:function(){a.execCommand("autotypeset")}});return b.buttons.autotypeset=c,a.addListener("selectionchange",function(){c.setDisabled(a.queryCommandState("autotypeset")==-1)}),c},b.simpleupload=function(a){var c="simpleupload",d=new b.Button({className:"edui-for-"+c,title:a.options.labelMap[c]||a.getLang("labelMap."+c)||"",onclick:function(){},theme:a.options.theme,showText:!1});return b.buttons[c]=d,a.addListener("ready",function(){var b=d.getDom("body"),c=b.children[0];a.fireEvent("simpleuploadbtnready",c)}),a.addListener("selectionchange",function(b,e,f){var g=a.queryCommandState(c);g==-1?(d.setDisabled(!0),d.setChecked(!1)):f||(d.setDisabled(!1),d.setChecked(g))}),d}}(),function(){function a(a){this.initOptions(a),this.initEditorUI()}var b=baidu.editor.utils,c=baidu.editor.ui.uiUtils,d=baidu.editor.ui.UIBase,e=baidu.editor.dom.domUtils,f=[];a.prototype={uiName:"editor",initEditorUI:function(){function a(a,b){a.setOpt({wordCount:!0,maximumWords:1e4,wordCountMsg:a.options.wordCountMsg||a.getLang("wordCountMsg"),wordOverFlowMsg:a.options.wordOverFlowMsg||a.getLang("wordOverFlowMsg")});var c=a.options,d=c.maximumWords,e=c.wordCountMsg,f=c.wordOverFlowMsg,g=b.getDom("wordcount");if(c.wordCount){var h=a.getContentLength(!0);h>d?(g.innerHTML=f,a.fireEvent("wordcountoverflow")):g.innerHTML=e.replace("{#leave}",d-h).replace("{#count}",h)}}this.editor.ui=this,this._dialogs={},this.initUIBase(),this._initToolbars();var b=this.editor,c=this;b.addListener("ready",function(){function d(){a(b,c),e.un(b.document,"click",arguments.callee)}b.getDialog=function(a){return b.ui._dialogs[a+"Dialog"]},e.on(b.window,"scroll",function(a){baidu.editor.ui.Popup.postHide(a)}),b.ui._actualFrameWidth=b.options.initialFrameWidth,UE.browser.ie&&6===UE.browser.version&&b.container.ownerDocument.execCommand("BackgroundImageCache",!1,!0),b.options.elementPathEnabled&&(b.ui.getDom("elementpath").innerHTML='
    '+b.getLang("elementPathTip")+":
    "),b.options.wordCount&&(e.on(b.document,"click",d),b.ui.getDom("wordcount").innerHTML=b.getLang("wordCountTip")),b.ui._scale(),b.options.scaleEnabled?(b.autoHeightEnabled&&b.disableAutoHeight(),c.enableScale()):c.disableScale(),b.options.elementPathEnabled||b.options.wordCount||b.options.scaleEnabled||(b.ui.getDom("elementpath").style.display="none",b.ui.getDom("wordcount").style.display="none",b.ui.getDom("scale").style.display="none"),b.selection.isFocus()&&b.fireEvent("selectionchange",!1,!0)}),b.addListener("mousedown",function(a,b){var c=b.target||b.srcElement;baidu.editor.ui.Popup.postHide(b,c),baidu.editor.ui.ShortCutMenu.postHide(b)}),b.addListener("delcells",function(){UE.ui.edittip&&new UE.ui.edittip(b),b.getDialog("edittip").open()});var d,f,g=!1;b.addListener("afterpaste",function(){b.queryCommandState("pasteplain")||(baidu.editor.ui.PastePicker&&(d=new baidu.editor.ui.Popup({content:new baidu.editor.ui.PastePicker({editor:b}),editor:b,className:"edui-wordpastepop"}),d.render()),g=!0)}),b.addListener("afterinserthtml",function(){clearTimeout(f),f=setTimeout(function(){if(d&&(g||b.ui._isTransfer)){if(d.isHidden()){var a=e.createElement(b.document,"span",{style:"line-height:0px;",innerHTML:"\ufeff"}),c=b.selection.getRange();c.insertNode(a);var f=getDomNode(a,"firstChild","previousSibling");f&&d.showAnchor(3==f.nodeType?f.parentNode:f),e.remove(a)}else d.show();delete b.ui._isTransfer,g=!1}},200)}),b.addListener("contextmenu",function(a,b){baidu.editor.ui.Popup.postHide(b)}),b.addListener("keydown",function(a,b){d&&d.dispose(b);var c=b.keyCode||b.which;b.altKey&&90==c&&UE.ui.buttons.fullscreen.onclick()}),b.addListener("wordcount",function(b){a(this,c)}),b.addListener("selectionchange",function(){b.options.elementPathEnabled&&c[(b.queryCommandState("elementpath")==-1?"dis":"en")+"ableElementPath"](),b.options.scaleEnabled&&c[(b.queryCommandState("scale")==-1?"dis":"en")+"ableScale"]()});var h=new baidu.editor.ui.Popup({editor:b,content:"",className:"edui-bubble",_onEditButtonClick:function(){this.hide(),b.ui._dialogs.linkDialog.open()},_onImgEditButtonClick:function(a){this.hide(),b.ui._dialogs[a]&&b.ui._dialogs[a].open()},_onImgSetFloat:function(a){this.hide(),b.execCommand("imagefloat",a)},_setIframeAlign:function(a){var b=h.anchorEl,c=b.cloneNode(!0);switch(a){case-2:c.setAttribute("align","");break;case-1:c.setAttribute("align","left");break;case 1:c.setAttribute("align","right")}b.parentNode.insertBefore(c,b),e.remove(b),h.anchorEl=c,h.showAnchor(h.anchorEl)},_updateIframe:function(){var a=b._iframe=h.anchorEl;e.hasClass(a,"ueditor_baidumap")?(b.selection.getRange().selectNode(a).select(),b.ui._dialogs.mapDialog.open(),h.hide()):(b.ui._dialogs.insertframeDialog.open(),h.hide())},_onRemoveButtonClick:function(a){b.execCommand(a),this.hide()},queryAutoHide:function(a){return a&&a.ownerDocument==b.document&&("img"==a.tagName.toLowerCase()||e.findParentByTagName(a,"a",!0))?a!==h.anchorEl:baidu.editor.ui.Popup.prototype.queryAutoHide.call(this,a)}});h.render(),b.options.imagePopup&&(b.addListener("mouseover",function(a,c){c=c||window.event;var d=c.target||c.srcElement;if(b.ui._dialogs.insertframeDialog&&/iframe/gi.test(d.tagName)){var e=h.formatHtml(""+b.getLang("property")+': '+b.getLang("default")+'  '+b.getLang("justifyleft")+'  '+b.getLang("justifyright")+'   '+b.getLang("modify")+"");e?(h.getDom("content").innerHTML=e,h.anchorEl=d,h.showAnchor(h.anchorEl)):h.hide()}}),b.addListener("selectionchange",function(a,c){if(c){var d="",f="",g=b.selection.getRange().getClosedNode(),i=b.ui._dialogs;if(g&&"IMG"==g.tagName){var j="insertimageDialog";if(g.className.indexOf("edui-faked-video")==-1&&g.className.indexOf("edui-upload-video")==-1||(j="insertvideoDialog"),g.className.indexOf("edui-faked-webapp")!=-1&&(j="webappDialog"),g.src.indexOf("http://api.map.baidu.com")!=-1&&(j="mapDialog"),g.className.indexOf("edui-faked-music")!=-1&&(j="musicDialog"),g.src.indexOf("http://maps.google.com/maps/api/staticmap")!=-1&&(j="gmapDialog"),g.getAttribute("anchorname")&&(j="anchorDialog",d=h.formatHtml(""+b.getLang("property")+': '+b.getLang("modify")+"  "+b.getLang("delete")+"")),g.getAttribute("word_img")&&(b.word_img=[g.getAttribute("word_img")],j="wordimageDialog"),(e.hasClass(g,"loadingclass")||e.hasClass(g,"loaderrorclass"))&&(j=""),!i[j])return;f=""+b.getLang("property")+': '+b.getLang("default")+'  '+b.getLang("justifyleft")+'  '+b.getLang("justifyright")+'  '+b.getLang("justifycenter")+"  '+b.getLang("modify")+"",!d&&(d=h.formatHtml(f))}if(b.ui._dialogs.linkDialog){var k,l=b.queryCommandValue("link");if(l&&(k=l.getAttribute("_href")||l.getAttribute("href",2))){var m=k;k.length>30&&(m=k.substring(0,20)+"..."),d&&(d+='
    '),d+=h.formatHtml(""+b.getLang("anthorMsg")+': '+m+' '+b.getLang("modify")+' '+b.getLang("clear")+""),h.showAnchor(l)}}d?(h.getDom("content").innerHTML=d,h.anchorEl=g||l,h.showAnchor(h.anchorEl)):h.hide()}}))},_initToolbars:function(){for(var a=this.editor,c=this.toolbars||[],d=[],e=0;e
    '+(this.toolbars.length?'
    '+this.renderToolbarBoxHtml()+"
    ":"")+'
    '},showWordImageDialog:function(){this._dialogs.wordimageDialog.open()},renderToolbarBoxHtml:function(){for(var a=[],b=0;b'+c+"
    ");b.innerHTML='
    '+this.editor.getLang("elementPathTip")+": "+d.join(" > ")+"
    "}else b.style.display="none"},disableElementPath:function(){var a=this.getDom("elementpath");a.innerHTML="",a.style.display="none",this.elementPathEnabled=!1},enableElementPath:function(){var a=this.getDom("elementpath");a.style.display="",this.elementPathEnabled=!0,this._updateElementPath()},_scale:function(){function a(){o=e.getXY(h),p||(p=g.options.minFrameHeight+j.offsetHeight+k.offsetHeight),m.style.cssText="position:absolute;left:0;display:;top:0;background-color:#41ABFF;opacity:0.4;filter: Alpha(opacity=40);width:"+h.offsetWidth+"px;height:"+h.offsetHeight+"px;z-index:"+(g.options.zIndex+1),e.on(f,"mousemove",b),e.on(i,"mouseup",c),e.on(f,"mouseup",c)}function b(a){d();var b=a||window.event;r=b.pageX||f.documentElement.scrollLeft+b.clientX,s=b.pageY||f.documentElement.scrollTop+b.clientY,t=r-o.x,u=s-o.y,t>=q&&(n=!0,m.style.width=t+"px"),u>=p&&(n=!0,m.style.height=u+"px")}function c(){n&&(n=!1,g.ui._actualFrameWidth=m.offsetWidth-2,h.style.width=g.ui._actualFrameWidth+"px",g.setHeight(m.offsetHeight-k.offsetHeight-j.offsetHeight-2,!0)),m&&(m.style.display="none"),d(),e.un(f,"mousemove",b),e.un(i,"mouseup",c),e.un(f,"mouseup",c)}function d(){browser.ie?f.selection.clear():window.getSelection().removeAllRanges()}var f=document,g=this.editor,h=g.container,i=g.document,j=this.getDom("toolbarbox"),k=this.getDom("bottombar"),l=this.getDom("scale"),m=this.getDom("scalelayer"),n=!1,o=null,p=0,q=g.options.minFrameWidth,r=0,s=0,t=0,u=0,v=this;this.editor.addListener("fullscreenchanged",function(a,b){if(b)v.disableScale();else if(v.editor.options.scaleEnabled){v.enableScale();var c=v.editor.document.createElement("span");v.editor.body.appendChild(c),v.editor.body.style.height=Math.max(e.getXY(c).y,v.editor.iframe.offsetHeight-20)+"px",e.remove(c)}}),this.enableScale=function(){1!=g.queryCommandState("source")&&(l.style.display="",this.scaleEnabled=!0,e.on(l,"mousedown",a))},this.disableScale=function(){l.style.display="none",this.scaleEnabled=!1,e.un(l,"mousedown",a)}},isFullScreen:function(){return this._fullscreen},postRender:function(){d.prototype.postRender.call(this);for(var a=0;a[\n\r\t]+([ ]{4})+/g,">").replace(/[\n\r\t]+([ ]{4})+[\n\r\t]+<"),c.className&&(b.className=c.className),c.style.cssText&&(b.style.cssText=c.style.cssText),/textarea/i.test(c.tagName)?(d.textarea=c,d.textarea.style.display="none"):c.parentNode.removeChild(c),c.id&&(b.id=c.id,e.removeAttributes(c,"id")),c=b,c.innerHTML=""}e.addClass(c,"edui-"+d.options.theme),d.ui.render(c);var h=d.options;d.container=d.ui.getDom();for(var i,j=e.findParents(c,!0),k=[],l=0;i=j[l];l++)k[l]=i.style.display,i.style.display="block";if(h.initialFrameWidth)h.minFrameWidth=h.initialFrameWidth;else{h.minFrameWidth=h.initialFrameWidth=c.offsetWidth;var m=c.style.width;/%$/.test(m)&&(h.initialFrameWidth=m)}h.initialFrameHeight?h.minFrameHeight=h.initialFrameHeight:h.initialFrameHeight=h.minFrameHeight=c.offsetHeight;for(var i,l=0;i=j[l];l++)i.style.display=k[l];c.style.height&&(c.style.height=""),d.container.style.width=h.initialFrameWidth+(/%$/.test(h.initialFrameWidth)?"":"px"),d.container.style.zIndex=h.zIndex,f.call(d,d.ui.getDom("iframeholder")),d.fireEvent("afteruiready")}d.langIsReady?b():d.addListener("langReady",b)})},d},UE.getEditor=function(a,b){var c=g[a];return c||(c=g[a]=new UE.ui.Editor(b),c.render(a)),c},UE.delEditor=function(a){var b;(b=g[a])&&(b.key&&b.destroy(),delete g[a])},UE.registerUI=function(a,c,d,e){b.each(a.split(/\s+/),function(a){UE._customizeUI[a]={id:e,execFn:c,index:d}})}}(),UE.registerUI("message",function(a){function b(){var a=g.ui.getDom("toolbarbox");a&&(c.style.top=a.offsetHeight+3+"px"),c.style.zIndex=Math.max(g.options.zIndex,g.iframe.style.zIndex)+1}var c,d=baidu.editor.ui,e=d.Message,f=[],g=a;g.addListener("ready",function(){c=document.getElementById(g.ui.id+"_message_holder"),b(),setTimeout(function(){b()},500)}),g.addListener("showmessage",function(a,d){d=utils.isString(d)?{content:d}:d;var h=new e({timeout:d.timeout,type:d.type,content:d.content,keepshow:d.keepshow,editor:g}),i=d.id||"msg_"+(+new Date).toString(36);return h.render(c),f[i]=h,h.reset(d),b(),i}),g.addListener("updatemessage",function(a,b,d){d=utils.isString(d)?{content:d}:d;var e=f[b];e.render(c),e&&e.reset(d)}),g.addListener("hidemessage",function(a,b){var c=f[b];c&&c.hide()})}),UE.registerUI("autosave",function(a){var b=null,c=null;a.on("afterautosave",function(){clearTimeout(b),b=setTimeout(function(){c&&a.trigger("hidemessage",c),c=a.trigger("showmessage",{content:a.getLang("autosave.success"),timeout:2e3})},2e3)})})}(); \ No newline at end of file diff --git a/src/main/webapp/js/ue/ueditor.config.js b/src/main/webapp/js/ue/ueditor.config.js new file mode 100644 index 0000000..cec8e25 --- /dev/null +++ b/src/main/webapp/js/ue/ueditor.config.js @@ -0,0 +1,497 @@ +/** + * ueditor完整配置项 + * 可以在这里配置整个编辑器的特性 + */ +/**************************提示******************************** + * 所有被注释的配置项均为UEditor默认值。 + * 修改默认配置请首先确保已经完全明确该参数的真实用途。 + * 主要有两种修改方案,一种是取消此处注释,然后修改成对应参数;另一种是在实例化编辑器时传入对应参数。 + * 当升级编辑器时,可直接使用旧版配置文件替换新版配置文件,不用担心旧版配置文件中因缺少新功能所需的参数而导致脚本报错。 + **************************提示********************************/ + +(function () { + + /** + * 编辑器资源文件根路径。它所表示的含义是:以编辑器实例化页面为当前路径,指向编辑器资源文件(即dialog等文件夹)的路径。 + * 鉴于很多同学在使用编辑器的时候出现的种种路径问题,此处强烈建议大家使用"相对于网站根目录的相对路径"进行配置。 + * "相对于网站根目录的相对路径"也就是以斜杠开头的形如"/myProject/ueditor/"这样的路径。 + * 如果站点中有多个不在同一层级的页面需要实例化编辑器,且引用了同一UEditor的时候,此处的URL可能不适用于每个页面的编辑器。 + * 因此,UEditor提供了针对不同页面的编辑器可单独配置的根路径,具体来说,在需要实例化编辑器的页面最顶部写上如下代码即可。当然,需要令此处的URL等于对应的配置。 + * window.UEDITOR_HOME_URL = "/xxxx/xxxx/"; + */ + var URL = window.UEDITOR_HOME_URL || getUEBasePath(); + + /** + * 配置项主体。注意,此处所有涉及到路径的配置别遗漏URL变量。 + */ + window.UEDITOR_CONFIG = { + + //为编辑器实例添加一个路径,这个不能被注释 + UEDITOR_HOME_URL: URL + + // 服务器统一请求接口路径 + , serverUrl: URL + "jsp/controller.jsp" + + //工具栏上的所有的功能按钮和下拉框,可以在new编辑器的实例时选择自己需要的重新定义 + , toolbars: [[ + 'fullscreen', 'source', '|', 'undo', 'redo', '|', + 'bold', 'italic', 'underline', 'fontborder', 'strikethrough', 'superscript', 'subscript', 'removeformat', 'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', 'selectall', 'cleardoc', '|', + 'rowspacingtop', 'rowspacingbottom', 'lineheight', '|', + 'customstyle', 'paragraph', 'fontfamily', 'fontsize', '|', + 'directionalityltr', 'directionalityrtl', 'indent', '|', + 'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|', 'touppercase', 'tolowercase', '|', + 'link', 'unlink', 'anchor', '|', 'imagenone', 'imageleft', 'imageright', 'imagecenter', '|', + 'simpleupload', 'insertimage', 'emotion', 'scrawl', 'insertvideo', 'music', 'attachment', 'map', 'gmap', 'insertframe', 'insertcode', 'webapp', 'pagebreak', 'template', 'background', '|', + 'horizontal', 'date', 'time', 'spechars', 'snapscreen', 'wordimage', '|', + 'inserttable', 'deletetable', 'insertparagraphbeforetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', 'mergeright', 'mergedown', 'splittocells', 'splittorows', 'splittocols', 'charts', '|', + 'print', 'preview', 'searchreplace', 'drafts', 'help' + ]] + //当鼠标放在工具栏上时显示的tooltip提示,留空支持自动多语言配置,否则以配置值为准 + //,labelMap:{ + // 'anchor':'', 'undo':'' + //} + + //语言配置项,默认是zh-cn。有需要的话也可以使用如下这样的方式来自动多语言切换,当然,前提条件是lang文件夹下存在对应的语言文件: + //lang值也可以通过自动获取 (navigator.language||navigator.browserLanguage ||navigator.userLanguage).toLowerCase() + //,lang:"zh-cn" + //,langPath:URL +"lang/" + + //主题配置项,默认是default。有需要的话也可以使用如下这样的方式来自动多主题切换,当然,前提条件是themes文件夹下存在对应的主题文件: + //现有如下皮肤:default + //,theme:'default' + //,themePath:URL +"themes/" + + //,zIndex : 900 //编辑器层级的基数,默认是900 + + //针对getAllHtml方法,会在对应的head标签中增加该编码设置。 + //,charset:"utf-8" + + //若实例化编辑器的页面手动修改的domain,此处需要设置为true + //,customDomain:false + + //常用配置项目 + //,isShow : true //默认显示编辑器 + + //,textarea:'editorValue' // 提交表单时,服务器获取编辑器提交内容的所用的参数,多实例时可以给容器name属性,会将name给定的值最为每个实例的键值,不用每次实例化的时候都设置这个值 + + //,initialContent:'欢迎使用ueditor!' //初始化编辑器的内容,也可以通过textarea/script给值,看官网例子 + + //,autoClearinitialContent:true //是否自动清除编辑器初始内容,注意:如果focus属性设置为true,这个也为真,那么编辑器一上来就会触发导致初始化的内容看不到了 + + //,focus:false //初始化时,是否让编辑器获得焦点true或false + + //如果自定义,最好给p标签如下的行高,要不输入中文时,会有跳动感 + //,initialStyle:'p{line-height:1em}'//编辑器层级的基数,可以用来改变字体等 + + //,iframeCssUrl: URL + '/themes/iframe.css' //给编辑区域的iframe引入一个css文件 + + //indentValue + //首行缩进距离,默认是2em + //,indentValue:'2em' + + //,initialFrameWidth:1000 //初始化编辑器宽度,默认1000 + //,initialFrameHeight:320 //初始化编辑器高度,默认320 + + //,readonly : false //编辑器初始化结束后,编辑区域是否是只读的,默认是false + + //,autoClearEmptyNode : true //getContent时,是否删除空的inlineElement节点(包括嵌套的情况) + + //启用自动保存 + //,enableAutoSave: true + //自动保存间隔时间, 单位ms + //,saveInterval: 500 + + //,fullscreen : false //是否开启初始化时即全屏,默认关闭 + + //,imagePopup:true //图片操作的浮层开关,默认打开 + + //,autoSyncData:true //自动同步编辑器要提交的数据 + //,emotionLocalization:false //是否开启表情本地化,默认关闭。若要开启请确保emotion文件夹下包含官网提供的images表情文件夹 + + //粘贴只保留标签,去除标签所有属性 + //,retainOnlyLabelPasted: false + + //,pasteplain:false //是否默认为纯文本粘贴。false为不使用纯文本粘贴,true为使用纯文本粘贴 + //纯文本粘贴模式下的过滤规则 + //'filterTxtRules' : function(){ + // function transP(node){ + // node.tagName = 'p'; + // node.setStyle(); + // } + // return { + // //直接删除及其字节点内容 + // '-' : 'script style object iframe embed input select', + // 'p': {$:{}}, + // 'br':{$:{}}, + // 'div':{'$':{}}, + // 'li':{'$':{}}, + // 'caption':transP, + // 'th':transP, + // 'tr':transP, + // 'h1':transP,'h2':transP,'h3':transP,'h4':transP,'h5':transP,'h6':transP, + // 'td':function(node){ + // //没有内容的td直接删掉 + // var txt = !!node.innerText(); + // if(txt){ + // node.parentNode.insertAfter(UE.uNode.createText('    '),node); + // } + // node.parentNode.removeChild(node,node.innerText()) + // } + // } + //}() + + //,allHtmlEnabled:false //提交到后台的数据是否包含整个html字符串 + + //insertorderedlist + //有序列表的下拉配置,值留空时支持多语言自动识别,若配置值,则以此值为准 + //,'insertorderedlist':{ + // //自定的样式 + // 'num':'1,2,3...', + // 'num1':'1),2),3)...', + // 'num2':'(1),(2),(3)...', + // 'cn':'一,二,三....', + // 'cn1':'一),二),三)....', + // 'cn2':'(一),(二),(三)....', + // //系统自带 + // 'decimal' : '' , //'1,2,3...' + // 'lower-alpha' : '' , // 'a,b,c...' + // 'lower-roman' : '' , //'i,ii,iii...' + // 'upper-alpha' : '' , lang //'A,B,C' + // 'upper-roman' : '' //'I,II,III...' + //} + + //insertunorderedlist + //无序列表的下拉配置,值留空时支持多语言自动识别,若配置值,则以此值为准 + //,insertunorderedlist : { //自定的样式 + // 'dash' :'— 破折号', //-破折号 + // 'dot':' 。 小圆圈', //系统自带 + // 'circle' : '', // '○ 小圆圈' + // 'disc' : '', // '● 小圆点' + // 'square' : '' //'■ 小方块' + //} + //,listDefaultPaddingLeft : '30'//默认的左边缩进的基数倍 + //,listiconpath : 'http://bs.baidu.com/listicon/'//自定义标号的路径 + //,maxListLevel : 3 //限制可以tab的级数, 设置-1为不限制 + + //,autoTransWordToList:false //禁止word中粘贴进来的列表自动变成列表标签 + + //fontfamily + //字体设置 label留空支持多语言自动切换,若配置,则以配置值为准 + //,'fontfamily':[ + // { label:'',name:'songti',val:'宋体,SimSun'}, + // { label:'',name:'kaiti',val:'楷体,楷体_GB2312, SimKai'}, + // { label:'',name:'yahei',val:'微软雅黑,Microsoft YaHei'}, + // { label:'',name:'heiti',val:'黑体, SimHei'}, + // { label:'',name:'lishu',val:'隶书, SimLi'}, + // { label:'',name:'andaleMono',val:'andale mono'}, + // { label:'',name:'arial',val:'arial, helvetica,sans-serif'}, + // { label:'',name:'arialBlack',val:'arial black,avant garde'}, + // { label:'',name:'comicSansMs',val:'comic sans ms'}, + // { label:'',name:'impact',val:'impact,chicago'}, + // { label:'',name:'timesNewRoman',val:'times new roman'} + //] + + //fontsize + //字号 + //,'fontsize':[10, 11, 12, 14, 16, 18, 20, 24, 36] + + //paragraph + //段落格式 值留空时支持多语言自动识别,若配置,则以配置值为准 + //,'paragraph':{'p':'', 'h1':'', 'h2':'', 'h3':'', 'h4':'', 'h5':'', 'h6':''} + + //rowspacingtop + //段间距 值和显示的名字相同 + //,'rowspacingtop':['5', '10', '15', '20', '25'] + + //rowspacingBottom + //段间距 值和显示的名字相同 + //,'rowspacingbottom':['5', '10', '15', '20', '25'] + + //lineheight + //行内间距 值和显示的名字相同 + //,'lineheight':['1', '1.5','1.75','2', '3', '4', '5'] + + //customstyle + //自定义样式,不支持国际化,此处配置值即可最后显示值 + //block的元素是依据设置段落的逻辑设置的,inline的元素依据BIU的逻辑设置 + //尽量使用一些常用的标签 + //参数说明 + //tag 使用的标签名字 + //label 显示的名字也是用来标识不同类型的标识符,注意这个值每个要不同, + //style 添加的样式 + //每一个对象就是一个自定义的样式 + //,'customstyle':[ + // {tag:'h1', name:'tc', label:'', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;'}, + // {tag:'h1', name:'tl',label:'', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;margin:0 0 10px 0;'}, + // {tag:'span',name:'im', label:'', style:'font-style:italic;font-weight:bold'}, + // {tag:'span',name:'hi', label:'', style:'font-style:italic;font-weight:bold;color:rgb(51, 153, 204)'} + //] + + //打开右键菜单功能 + //,enableContextMenu: true + //右键菜单的内容,可以参考plugins/contextmenu.js里边的默认菜单的例子,label留空支持国际化,否则以此配置为准 + //,contextMenu:[ + // { + // label:'', //显示的名称 + // cmdName:'selectall',//执行的command命令,当点击这个右键菜单时 + // //exec可选,有了exec就会在点击时执行这个function,优先级高于cmdName + // exec:function () { + // //this是当前编辑器的实例 + // //this.ui._dialogs['inserttableDialog'].open(); + // } + // } + //] + + //快捷菜单 + //,shortcutMenu:["fontfamily", "fontsize", "bold", "italic", "underline", "forecolor", "backcolor", "insertorderedlist", "insertunorderedlist"] + + //elementPathEnabled + //是否启用元素路径,默认是显示 + //,elementPathEnabled : true + + //wordCount + //,wordCount:true //是否开启字数统计 + //,maximumWords:10000 //允许的最大字符数 + //字数统计提示,{#count}代表当前字数,{#leave}代表还可以输入多少字符数,留空支持多语言自动切换,否则按此配置显示 + //,wordCountMsg:'' //当前已输入 {#count} 个字符,您还可以输入{#leave} 个字符 + //超出字数限制提示 留空支持多语言自动切换,否则按此配置显示 + //,wordOverFlowMsg:'' //你输入的字符个数已经超出最大允许值,服务器可能会拒绝保存! + + //tab + //点击tab键时移动的距离,tabSize倍数,tabNode什么字符做为单位 + //,tabSize:4 + //,tabNode:' ' + + //removeFormat + //清除格式时可以删除的标签和属性 + //removeForamtTags标签 + //,removeFormatTags:'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var' + //removeFormatAttributes属性 + //,removeFormatAttributes:'class,style,lang,width,height,align,hspace,valign' + + //undo + //可以最多回退的次数,默认20 + //,maxUndoCount:20 + //当输入的字符数超过该值时,保存一次现场 + //,maxInputCount:1 + + //autoHeightEnabled + // 是否自动长高,默认true + //,autoHeightEnabled:true + + //scaleEnabled + //是否可以拉伸长高,默认true(当开启时,自动长高失效) + //,scaleEnabled:false + //,minFrameWidth:800 //编辑器拖动时最小宽度,默认800 + //,minFrameHeight:220 //编辑器拖动时最小高度,默认220 + + //autoFloatEnabled + //是否保持toolbar的位置不动,默认true + //,autoFloatEnabled:true + //浮动时工具栏距离浏览器顶部的高度,用于某些具有固定头部的页面 + //,topOffset:30 + //编辑器底部距离工具栏高度(如果参数大于等于编辑器高度,则设置无效) + //,toolbarTopOffset:400 + + //设置远程图片是否抓取到本地保存 + //,catchRemoteImageEnable: true //设置是否抓取远程图片 + + //pageBreakTag + //分页标识符,默认是_ueditor_page_break_tag_ + //,pageBreakTag:'_ueditor_page_break_tag_' + + //autotypeset + //自动排版参数 + //,autotypeset: { + // mergeEmptyline: true, //合并空行 + // removeClass: true, //去掉冗余的class + // removeEmptyline: false, //去掉空行 + // textAlign:"left", //段落的排版方式,可以是 left,right,center,justify 去掉这个属性表示不执行排版 + // imageBlockLine: 'center', //图片的浮动方式,独占一行剧中,左右浮动,默认: center,left,right,none 去掉这个属性表示不执行排版 + // pasteFilter: false, //根据规则过滤没事粘贴进来的内容 + // clearFontSize: false, //去掉所有的内嵌字号,使用编辑器默认的字号 + // clearFontFamily: false, //去掉所有的内嵌字体,使用编辑器默认的字体 + // removeEmptyNode: false, // 去掉空节点 + // //可以去掉的标签 + // removeTagNames: {标签名字:1}, + // indent: false, // 行首缩进 + // indentValue : '2em', //行首缩进的大小 + // bdc2sb: false, + // tobdc: false + //} + + //tableDragable + //表格是否可以拖拽 + //,tableDragable: true + + + + //sourceEditor + //源码的查看方式,codemirror 是代码高亮,textarea是文本框,默认是codemirror + //注意默认codemirror只能在ie8+和非ie中使用 + //,sourceEditor:"codemirror" + //如果sourceEditor是codemirror,还用配置一下两个参数 + //codeMirrorJsUrl js加载的路径,默认是 URL + "third-party/codemirror/codemirror.js" + //,codeMirrorJsUrl:URL + "third-party/codemirror/codemirror.js" + //codeMirrorCssUrl css加载的路径,默认是 URL + "third-party/codemirror/codemirror.css" + //,codeMirrorCssUrl:URL + "third-party/codemirror/codemirror.css" + //编辑器初始化完成后是否进入源码模式,默认为否。 + //,sourceEditorFirst:false + + //iframeUrlMap + //dialog内容的路径 ~会被替换成URL,垓属性一旦打开,将覆盖所有的dialog的默认路径 + //,iframeUrlMap:{ + // 'anchor':'~/dialogs/anchor/anchor.html', + //} + + //allowLinkProtocol 允许的链接地址,有这些前缀的链接地址不会自动添加http + //, allowLinkProtocols: ['http:', 'https:', '#', '/', 'ftp:', 'mailto:', 'tel:', 'git:', 'svn:'] + + //webAppKey 百度应用的APIkey,每个站长必须首先去百度官网注册一个key后方能正常使用app功能,注册介绍,http://app.baidu.com/static/cms/getapikey.html + //, webAppKey: "" + + //默认过滤规则相关配置项目 + //,disabledTableInTable:true //禁止表格嵌套 + //,allowDivTransToP:true //允许进入编辑器的div标签自动变成p标签 + //,rgb2Hex:true //默认产出的数据中的color自动从rgb格式变成16进制格式 + + // xss 过滤是否开启,inserthtml等操作 + ,xssFilterRules: true + //input xss过滤 + ,inputXssFilter: true + //output xss过滤 + ,outputXssFilter: true + // xss过滤白名单 名单来源: https://raw.githubusercontent.com/leizongmin/js-xss/master/lib/default.js + ,whitList: { + a: ['target', 'href', 'title', 'class', 'style'], + abbr: ['title', 'class', 'style'], + address: ['class', 'style'], + area: ['shape', 'coords', 'href', 'alt'], + article: [], + aside: [], + audio: ['autoplay', 'controls', 'loop', 'preload', 'src', 'class', 'style'], + b: ['class', 'style'], + bdi: ['dir'], + bdo: ['dir'], + big: [], + blockquote: ['cite', 'class', 'style'], + br: [], + caption: ['class', 'style'], + center: [], + cite: [], + code: ['class', 'style'], + col: ['align', 'valign', 'span', 'width', 'class', 'style'], + colgroup: ['align', 'valign', 'span', 'width', 'class', 'style'], + dd: ['class', 'style'], + del: ['datetime'], + details: ['open'], + div: ['class', 'style'], + dl: ['class', 'style'], + dt: ['class', 'style'], + em: ['class', 'style'], + font: ['color', 'size', 'face'], + footer: [], + h1: ['class', 'style'], + h2: ['class', 'style'], + h3: ['class', 'style'], + h4: ['class', 'style'], + h5: ['class', 'style'], + h6: ['class', 'style'], + header: [], + hr: [], + i: ['class', 'style'], + img: ['src', 'alt', 'title', 'width', 'height', 'id', '_src', 'loadingclass', 'class'], + ins: ['datetime'], + li: ['class', 'style'], + mark: [], + nav: [], + ol: ['class', 'style'], + p: ['class', 'style'], + pre: ['class', 'style'], + s: [], + section:[], + small: [], + span: ['class', 'style'], + sub: ['class', 'style'], + sup: ['class', 'style'], + strong: ['class', 'style'], + table: ['width', 'border', 'align', 'valign', 'class', 'style'], + tbody: ['align', 'valign', 'class', 'style'], + td: ['width', 'rowspan', 'colspan', 'align', 'valign', 'class', 'style'], + tfoot: ['align', 'valign', 'class', 'style'], + th: ['width', 'rowspan', 'colspan', 'align', 'valign', 'class', 'style'], + thead: ['align', 'valign', 'class', 'style'], + tr: ['rowspan', 'align', 'valign', 'class', 'style'], + tt: [], + u: [], + ul: ['class', 'style'], + video: ['autoplay', 'controls', 'loop', 'preload', 'src', 'height', 'width', 'class', 'style'] + } + }; + + function getUEBasePath(docUrl, confUrl) { + + return getBasePath(docUrl || self.document.URL || self.location.href, confUrl || getConfigFilePath()); + + } + + function getConfigFilePath() { + + var configPath = document.getElementsByTagName('script'); + + return configPath[ configPath.length - 1 ].src; + + } + + function getBasePath(docUrl, confUrl) { + + var basePath = confUrl; + + + if (/^(\/|\\\\)/.test(confUrl)) { + + basePath = /^.+?\w(\/|\\\\)/.exec(docUrl)[0] + confUrl.replace(/^(\/|\\\\)/, ''); + + } else if (!/^[a-z]+:/i.test(confUrl)) { + + docUrl = docUrl.split("#")[0].split("?")[0].replace(/[^\\\/]+$/, ''); + + basePath = docUrl + "" + confUrl; + + } + + return optimizationPath(basePath); + + } + + function optimizationPath(path) { + + var protocol = /^[a-z]+:\/\//.exec(path)[ 0 ], + tmp = null, + res = []; + + path = path.replace(protocol, "").split("?")[0].split("#")[0]; + + path = path.replace(/\\/g, '/').split(/\//); + + path[ path.length - 1 ] = ""; + + while (path.length) { + + if (( tmp = path.shift() ) === "..") { + res.pop(); + } else if (tmp !== ".") { + res.push(tmp); + } + + } + + return protocol + res.join("/"); + + } + + window.UE = { + getUEBasePath: getUEBasePath + }; + +})(); diff --git a/src/main/webapp/js/ue/ueditor.parse.js b/src/main/webapp/js/ue/ueditor.parse.js new file mode 100644 index 0000000..052d681 --- /dev/null +++ b/src/main/webapp/js/ue/ueditor.parse.js @@ -0,0 +1,1022 @@ +/*! + * UEditor + * version: ueditor + * build: Mon Jul 25 2016 13:58:39 GMT+0800 (中国标准时间) + */ + +(function(){ + +(function(){ + UE = window.UE || {}; + var isIE = !!window.ActiveXObject; + //定义utils工具 + var utils = { + removeLastbs : function(url){ + return url.replace(/\/$/,'') + }, + extend : function(t,s){ + var a = arguments, + notCover = this.isBoolean(a[a.length - 1]) ? a[a.length - 1] : false, + len = this.isBoolean(a[a.length - 1]) ? a.length - 1 : a.length; + for (var i = 1; i < len; i++) { + var x = a[i]; + for (var k in x) { + if (!notCover || !t.hasOwnProperty(k)) { + t[k] = x[k]; + } + } + } + return t; + }, + isIE : isIE, + cssRule : isIE ? function(key,style,doc){ + var indexList,index; + doc = doc || document; + if(doc.indexList){ + indexList = doc.indexList; + }else{ + indexList = doc.indexList = {}; + } + var sheetStyle; + if(!indexList[key]){ + if(style === undefined){ + return '' + } + sheetStyle = doc.createStyleSheet('',index = doc.styleSheets.length); + indexList[key] = index; + }else{ + sheetStyle = doc.styleSheets[indexList[key]]; + } + if(style === undefined){ + return sheetStyle.cssText + } + sheetStyle.cssText = sheetStyle.cssText + '\n' + (style || '') + } : function(key,style,doc){ + doc = doc || document; + var head = doc.getElementsByTagName('head')[0],node; + if(!(node = doc.getElementById(key))){ + if(style === undefined){ + return '' + } + node = doc.createElement('style'); + node.id = key; + head.appendChild(node) + } + if(style === undefined){ + return node.innerHTML + } + if(style !== ''){ + node.innerHTML = node.innerHTML + '\n' + style; + }else{ + head.removeChild(node) + } + }, + domReady : function (onready) { + var doc = window.document; + if (doc.readyState === "complete") { + onready(); + }else{ + if (isIE) { + (function () { + if (doc.isReady) return; + try { + doc.documentElement.doScroll("left"); + } catch (error) { + setTimeout(arguments.callee, 0); + return; + } + onready(); + })(); + window.attachEvent('onload', function(){ + onready() + }); + } else { + doc.addEventListener("DOMContentLoaded", function () { + doc.removeEventListener("DOMContentLoaded", arguments.callee, false); + onready(); + }, false); + window.addEventListener('load', function(){onready()}, false); + } + } + + }, + each : function(obj, iterator, context) { + if (obj == null) return; + if (obj.length === +obj.length) { + for (var i = 0, l = obj.length; i < l; i++) { + if(iterator.call(context, obj[i], i, obj) === false) + return false; + } + } else { + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + if(iterator.call(context, obj[key], key, obj) === false) + return false; + } + } + } + }, + inArray : function(arr,item){ + var index = -1; + this.each(arr,function(v,i){ + if(v === item){ + index = i; + return false; + } + }); + return index; + }, + pushItem : function(arr,item){ + if(this.inArray(arr,item)==-1){ + arr.push(item) + } + }, + trim: function (str) { + return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, ''); + }, + indexOf: function (array, item, start) { + var index = -1; + start = this.isNumber(start) ? start : 0; + this.each(array, function (v, i) { + if (i >= start && v === item) { + index = i; + return false; + } + }); + return index; + }, + hasClass: function (element, className) { + className = className.replace(/(^[ ]+)|([ ]+$)/g, '').replace(/[ ]{2,}/g, ' ').split(' '); + for (var i = 0, ci, cls = element.className; ci = className[i++];) { + if (!new RegExp('\\b' + ci + '\\b', 'i').test(cls)) { + return false; + } + } + return i - 1 == className.length; + }, + addClass:function (elm, classNames) { + if(!elm)return; + classNames = this.trim(classNames).replace(/[ ]{2,}/g,' ').split(' '); + for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){ + if(!new RegExp('\\b' + ci + '\\b').test(cls)){ + cls += ' ' + ci; + } + } + elm.className = utils.trim(cls); + }, + removeClass:function (elm, classNames) { + classNames = this.isArray(classNames) ? classNames : + this.trim(classNames).replace(/[ ]{2,}/g,' ').split(' '); + for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){ + cls = cls.replace(new RegExp('\\b' + ci + '\\b'),'') + } + cls = this.trim(cls).replace(/[ ]{2,}/g,' '); + elm.className = cls; + !cls && elm.removeAttribute('className'); + }, + on: function (element, type, handler) { + var types = this.isArray(type) ? type : type.split(/\s+/), + k = types.length; + if (k) while (k--) { + type = types[k]; + if (element.addEventListener) { + element.addEventListener(type, handler, false); + } else { + if (!handler._d) { + handler._d = { + els : [] + }; + } + var key = type + handler.toString(),index = utils.indexOf(handler._d.els,element); + if (!handler._d[key] || index == -1) { + if(index == -1){ + handler._d.els.push(element); + } + if(!handler._d[key]){ + handler._d[key] = function (evt) { + return handler.call(evt.srcElement, evt || window.event); + }; + } + + + element.attachEvent('on' + type, handler._d[key]); + } + } + } + element = null; + }, + off: function (element, type, handler) { + var types = this.isArray(type) ? type : type.split(/\s+/), + k = types.length; + if (k) while (k--) { + type = types[k]; + if (element.removeEventListener) { + element.removeEventListener(type, handler, false); + } else { + var key = type + handler.toString(); + try{ + element.detachEvent('on' + type, handler._d ? handler._d[key] : handler); + }catch(e){} + if (handler._d && handler._d[key]) { + var index = utils.indexOf(handler._d.els,element); + if(index!=-1){ + handler._d.els.splice(index,1); + } + handler._d.els.length == 0 && delete handler._d[key]; + } + } + } + }, + loadFile : function () { + var tmpList = []; + function getItem(doc,obj){ + try{ + for(var i= 0,ci;ci=tmpList[i++];){ + if(ci.doc === doc && ci.url == (obj.src || obj.href)){ + return ci; + } + } + }catch(e){ + return null; + } + + } + return function (doc, obj, fn) { + var item = getItem(doc,obj); + if (item) { + if(item.ready){ + fn && fn(); + }else{ + item.funs.push(fn) + } + return; + } + tmpList.push({ + doc:doc, + url:obj.src||obj.href, + funs:[fn] + }); + if (!doc.body) { + var html = []; + for(var p in obj){ + if(p == 'tag')continue; + html.push(p + '="' + obj[p] + '"') + } + doc.write('<' + obj.tag + ' ' + html.join(' ') + ' >'); + return; + } + if (obj.id && doc.getElementById(obj.id)) { + return; + } + var element = doc.createElement(obj.tag); + delete obj.tag; + for (var p in obj) { + element.setAttribute(p, obj[p]); + } + element.onload = element.onreadystatechange = function () { + if (!this.readyState || /loaded|complete/.test(this.readyState)) { + item = getItem(doc,obj); + if (item.funs.length > 0) { + item.ready = 1; + for (var fi; fi = item.funs.pop();) { + fi(); + } + } + element.onload = element.onreadystatechange = null; + } + }; + element.onerror = function(){ + throw Error('The load '+(obj.href||obj.src)+' fails,check the url') + }; + doc.getElementsByTagName("head")[0].appendChild(element); + } + }() + }; + utils.each(['String', 'Function', 'Array', 'Number', 'RegExp', 'Object','Boolean'], function (v) { + utils['is' + v] = function (obj) { + return Object.prototype.toString.apply(obj) == '[object ' + v + ']'; + } + }); + var parselist = {}; + UE.parse = { + register : function(parseName,fn){ + parselist[parseName] = fn; + }, + load : function(opt){ + utils.each(parselist,function(v){ + v.call(opt,utils); + }) + } + }; + uParse = function(selector,opt){ + utils.domReady(function(){ + var contents; + if(document.querySelectorAll){ + contents = document.querySelectorAll(selector) + }else{ + if(/^#/.test(selector)){ + contents = [document.getElementById(selector.replace(/^#/,''))] + }else if(/^\./.test(selector)){ + var contents = []; + utils.each(document.getElementsByTagName('*'),function(node){ + if(node.className && new RegExp('\\b' + selector.replace(/^\./,'') + '\\b','i').test(node.className)){ + contents.push(node) + } + }) + }else{ + contents = document.getElementsByTagName(selector) + } + } + utils.each(contents,function(v){ + UE.parse.load(utils.extend({root:v,selector:selector},opt)) + }) + }) + } +})(); + +UE.parse.register('insertcode',function(utils){ + var pres = this.root.getElementsByTagName('pre'); + if(pres.length){ + if(typeof XRegExp == "undefined"){ + var jsurl,cssurl; + if(this.rootPath !== undefined){ + jsurl = utils.removeLastbs(this.rootPath) + '/third-party/SyntaxHighlighter/shCore.js'; + cssurl = utils.removeLastbs(this.rootPath) + '/third-party/SyntaxHighlighter/shCoreDefault.css'; + }else{ + jsurl = this.highlightJsUrl; + cssurl = this.highlightCssUrl; + } + utils.loadFile(document,{ + id : "syntaxhighlighter_css", + tag : "link", + rel : "stylesheet", + type : "text/css", + href : cssurl + }); + utils.loadFile(document,{ + id : "syntaxhighlighter_js", + src : jsurl, + tag : "script", + type : "text/javascript", + defer : "defer" + },function(){ + utils.each(pres,function(pi){ + if(pi && /brush/i.test(pi.className)){ + SyntaxHighlighter.highlight(pi); + } + }); + }); + }else{ + utils.each(pres,function(pi){ + if(pi && /brush/i.test(pi.className)){ + SyntaxHighlighter.highlight(pi); + } + }); + } + } + +}); +UE.parse.register('table', function (utils) { + var me = this, + root = this.root, + tables = root.getElementsByTagName('table'); + if (tables.length) { + var selector = this.selector; + //追加默认的表格样式 + utils.cssRule('table', + selector + ' table.noBorderTable td,' + + selector + ' table.noBorderTable th,' + + selector + ' table.noBorderTable caption{border:1px dashed #ddd !important}' + + selector + ' table.sortEnabled tr.firstRow th,' + selector + ' table.sortEnabled tr.firstRow td{padding-right:20px; background-repeat: no-repeat;' + + 'background-position: center right; background-image:url(' + this.rootPath + 'themes/default/images/sortable.png);}' + + selector + ' table.sortEnabled tr.firstRow th:hover,' + selector + ' table.sortEnabled tr.firstRow td:hover{background-color: #EEE;}' + + selector + ' table{margin-bottom:10px;border-collapse:collapse;display:table;}' + + selector + ' td,' + selector + ' th{ background:white; padding: 5px 10px;border: 1px solid #DDD;}' + + selector + ' caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}' + + selector + ' th{border-top:1px solid #BBB;background:#F7F7F7;}' + + selector + ' table tr.firstRow th{border-top:2px solid #BBB;background:#F7F7F7;}' + + selector + ' tr.ue-table-interlace-color-single td{ background: #fcfcfc; }' + + selector + ' tr.ue-table-interlace-color-double td{ background: #f7faff; }' + + selector + ' td p{margin:0;padding:0;}', + document); + //填充空的单元格 + + utils.each('td th caption'.split(' '), function (tag) { + var cells = root.getElementsByTagName(tag); + cells.length && utils.each(cells, function (node) { + if (!node.firstChild) { + node.innerHTML = ' '; + + } + }) + }); + + //表格可排序 + var tables = root.getElementsByTagName('table'); + utils.each(tables, function (table) { + if (/\bsortEnabled\b/.test(table.className)) { + utils.on(table, 'click', function(e){ + var target = e.target || e.srcElement, + cell = findParentByTagName(target, ['td', 'th']); + var table = findParentByTagName(target, 'table'), + colIndex = utils.indexOf(table.rows[0].cells, cell), + sortType = table.getAttribute('data-sort-type'); + if(colIndex != -1) { + sortTable(table, colIndex, me.tableSortCompareFn || sortType); + updateTable(table); + } + }); + } + }); + + //按照标签名查找父节点 + function findParentByTagName(target, tagNames) { + var i, current = target; + tagNames = utils.isArray(tagNames) ? tagNames:[tagNames]; + while(current){ + for(i = 0;i < tagNames.length; i++) { + if(current.tagName == tagNames[i].toUpperCase()) return current; + } + current = current.parentNode; + } + return null; + } + //表格排序 + function sortTable(table, sortByCellIndex, compareFn) { + var rows = table.rows, + trArray = [], + flag = rows[0].cells[0].tagName === "TH", + lastRowIndex = 0; + + for (var i = 0,len = rows.length; i < len; i++) { + trArray[i] = rows[i]; + } + + var Fn = { + 'reversecurrent': function(td1,td2){ + return 1; + }, + 'orderbyasc': function(td1,td2){ + var value1 = td1.innerText||td1.textContent, + value2 = td2.innerText||td2.textContent; + return value1.localeCompare(value2); + }, + 'reversebyasc': function(td1,td2){ + var value1 = td1.innerHTML, + value2 = td2.innerHTML; + return value2.localeCompare(value1); + }, + 'orderbynum': function(td1,td2){ + var value1 = td1[utils.isIE ? 'innerText':'textContent'].match(/\d+/), + value2 = td2[utils.isIE ? 'innerText':'textContent'].match(/\d+/); + if(value1) value1 = +value1[0]; + if(value2) value2 = +value2[0]; + return (value1||0) - (value2||0); + }, + 'reversebynum': function(td1,td2){ + var value1 = td1[utils.isIE ? 'innerText':'textContent'].match(/\d+/), + value2 = td2[utils.isIE ? 'innerText':'textContent'].match(/\d+/); + if(value1) value1 = +value1[0]; + if(value2) value2 = +value2[0]; + return (value2||0) - (value1||0); + } + }; + + //对表格设置排序的标记data-sort-type + table.setAttribute('data-sort-type', compareFn && typeof compareFn === "string" && Fn[compareFn] ? compareFn:''); + + //th不参与排序 + flag && trArray.splice(0, 1); + trArray = sort(trArray,function (tr1, tr2) { + var result; + if (compareFn && typeof compareFn === "function") { + result = compareFn.call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } else if (compareFn && typeof compareFn === "number") { + result = 1; + } else if (compareFn && typeof compareFn === "string" && Fn[compareFn]) { + result = Fn[compareFn].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } else { + result = Fn['orderbyasc'].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } + return result; + }); + var fragment = table.ownerDocument.createDocumentFragment(); + for (var j = 0, len = trArray.length; j < len; j++) { + fragment.appendChild(trArray[j]); + } + var tbody = table.getElementsByTagName("tbody")[0]; + if(!lastRowIndex){ + tbody.appendChild(fragment); + }else{ + tbody.insertBefore(fragment,rows[lastRowIndex- range.endRowIndex + range.beginRowIndex - 1]) + } + } + //冒泡排序 + function sort(array, compareFn){ + compareFn = compareFn || function(item1, item2){ return item1.localeCompare(item2);}; + for(var i= 0,len = array.length; i 0){ + var t = array[i]; + array[i] = array[j]; + array[j] = t; + } + } + } + return array; + } + //更新表格 + function updateTable(table) { + //给第一行设置firstRow的样式名称,在排序图标的样式上使用到 + if(!utils.hasClass(table.rows[0], "firstRow")) { + for(var i = 1; i< table.rows.length; i++) { + utils.removeClass(table.rows[i], "firstRow"); + } + utils.addClass(table.rows[0], "firstRow"); + } + } + } +}); +UE.parse.register('charts',function( utils ){ + + utils.cssRule('chartsContainerHeight','.edui-chart-container { height:'+(this.chartContainerHeight||300)+'px}'); + var resourceRoot = this.rootPath, + containers = this.root, + sources = null; + + //不存在指定的根路径, 则直接退出 + if ( !resourceRoot ) { + return; + } + + if ( sources = parseSources() ) { + + loadResources(); + + } + + + function parseSources () { + + if ( !containers ) { + return null; + } + + return extractChartData( containers ); + + } + + /** + * 提取数据 + */ + function extractChartData ( rootNode ) { + + var data = [], + tables = rootNode.getElementsByTagName( "table" ); + + for ( var i = 0, tableNode; tableNode = tables[ i ]; i++ ) { + + if ( tableNode.getAttribute( "data-chart" ) !== null ) { + + data.push( formatData( tableNode ) ); + + } + + } + + return data.length ? data : null; + + } + + function formatData ( tableNode ) { + + var meta = tableNode.getAttribute( "data-chart" ), + metaConfig = {}, + data = []; + + //提取table数据 + for ( var i = 0, row; row = tableNode.rows[ i ]; i++ ) { + + var rowData = []; + + for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) { + + var value = ( cell.innerText || cell.textContent || '' ); + rowData.push( cell.tagName == 'TH' ? value:(value | 0) ); + + } + + data.push( rowData ); + + } + + //解析元信息 + meta = meta.split( ";" ); + for ( var i = 0, metaData; metaData = meta[ i ]; i++ ) { + + metaData = metaData.split( ":" ); + metaConfig[ metaData[ 0 ] ] = metaData[ 1 ]; + + } + + + return { + table: tableNode, + meta: metaConfig, + data: data + }; + + } + + //加载资源 + function loadResources () { + + loadJQuery(); + + } + + function loadJQuery () { + + //不存在jquery, 则加载jquery + if ( !window.jQuery ) { + + utils.loadFile(document,{ + src : resourceRoot + "/third-party/jquery-1.10.2.min.js", + tag : "script", + type : "text/javascript", + defer : "defer" + },function(){ + + loadHighcharts(); + + }); + + } else { + + loadHighcharts(); + + } + + } + + function loadHighcharts () { + + //不存在Highcharts, 则加载Highcharts + if ( !window.Highcharts ) { + + utils.loadFile(document,{ + src : resourceRoot + "/third-party/highcharts/highcharts.js", + tag : "script", + type : "text/javascript", + defer : "defer" + },function(){ + + loadTypeConfig(); + + }); + + } else { + + loadTypeConfig(); + + } + + } + + //加载图表差异化配置文件 + function loadTypeConfig () { + + utils.loadFile(document,{ + src : resourceRoot + "/dialogs/charts/chart.config.js", + tag : "script", + type : "text/javascript", + defer : "defer" + },function(){ + + render(); + + }); + + } + + //渲染图表 + function render () { + + var config = null, + chartConfig = null, + container = null; + + for ( var i = 0, len = sources.length; i < len; i++ ) { + + config = sources[ i ]; + + chartConfig = analysisConfig( config ); + + container = createContainer( config.table ); + + renderChart( container, typeConfig[ config.meta.chartType ], chartConfig ); + + } + + + } + + /** + * 渲染图表 + * @param container 图表容器节点对象 + * @param typeConfig 图表类型配置 + * @param config 图表通用配置 + * */ + function renderChart ( container, typeConfig, config ) { + + + $( container ).highcharts( $.extend( {}, typeConfig, { + + credits: { + enabled: false + }, + exporting: { + enabled: false + }, + title: { + text: config.title, + x: -20 //center + }, + subtitle: { + text: config.subTitle, + x: -20 + }, + xAxis: { + title: { + text: config.xTitle + }, + categories: config.categories + }, + yAxis: { + title: { + text: config.yTitle + }, + plotLines: [{ + value: 0, + width: 1, + color: '#808080' + }] + }, + tooltip: { + enabled: true, + valueSuffix: config.suffix + }, + legend: { + layout: 'vertical', + align: 'right', + verticalAlign: 'middle', + borderWidth: 1 + }, + series: config.series + + } )); + + } + + /** + * 创建图表的容器 + * 新创建的容器会替换掉对应的table对象 + * */ + function createContainer ( tableNode ) { + + var container = document.createElement( "div" ); + container.className = "edui-chart-container"; + + tableNode.parentNode.replaceChild( container, tableNode ); + + return container; + + } + + //根据config解析出正确的类别和图表数据信息 + function analysisConfig ( config ) { + + var series = [], + //数据类别 + categories = [], + result = [], + data = config.data, + meta = config.meta; + + //数据对齐方式为相反的方式, 需要反转数据 + if ( meta.dataFormat != "1" ) { + + for ( var i = 0, len = data.length; i < len ; i++ ) { + + for ( var j = 0, jlen = data[ i ].length; j < jlen; j++ ) { + + if ( !result[ j ] ) { + result[ j ] = []; + } + + result[ j ][ i ] = data[ i ][ j ]; + + } + + } + + data = result; + + } + + result = {}; + + //普通图表 + if ( meta.chartType != typeConfig.length - 1 ) { + + categories = data[ 0 ].slice( 1 ); + + for ( var i = 1, curData; curData = data[ i ]; i++ ) { + series.push( { + name: curData[ 0 ], + data: curData.slice( 1 ) + } ); + } + + result.series = series; + result.categories = categories; + result.title = meta.title; + result.subTitle = meta.subTitle; + result.xTitle = meta.xTitle; + result.yTitle = meta.yTitle; + result.suffix = meta.suffix; + + } else { + + var curData = []; + + for ( var i = 1, len = data[ 0 ].length; i < len; i++ ) { + + curData.push( [ data[ 0 ][ i ], data[ 1 ][ i ] | 0 ] ); + + } + + //饼图 + series[ 0 ] = { + type: 'pie', + name: meta.tip, + data: curData + }; + + result.series = series; + result.title = meta.title; + result.suffix = meta.suffix; + + } + + return result; + + } + +}); +UE.parse.register('background', function (utils) { + var me = this, + root = me.root, + p = root.getElementsByTagName('p'), + styles; + + for (var i = 0,ci; ci = p[i++];) { + styles = ci.getAttribute('data-background'); + if (styles){ + ci.parentNode.removeChild(ci); + } + } + + //追加默认的表格样式 + styles && utils.cssRule('ueditor_background', me.selector + '{' + styles + '}', document); +}); +UE.parse.register('list',function(utils){ + var customCss = [], + customStyle = { + 'cn' : 'cn-1-', + 'cn1' : 'cn-2-', + 'cn2' : 'cn-3-', + 'num' : 'num-1-', + 'num1' : 'num-2-', + 'num2' : 'num-3-', + 'dash' : 'dash', + 'dot' : 'dot' + }; + + + utils.extend(this,{ + liiconpath : 'http://bs.baidu.com/listicon/', + listDefaultPaddingLeft : '20' + }); + + var root = this.root, + ols = root.getElementsByTagName('ol'), + uls = root.getElementsByTagName('ul'), + selector = this.selector; + + if(ols.length){ + applyStyle.call(this,ols); + } + + if(uls.length){ + applyStyle.call(this,uls); + } + + if(ols.length || uls.length){ + customCss.push(selector +' .list-paddingleft-1{padding-left:0}'); + customCss.push(selector +' .list-paddingleft-2{padding-left:'+ this.listDefaultPaddingLeft+'px}'); + customCss.push(selector +' .list-paddingleft-3{padding-left:'+ this.listDefaultPaddingLeft*2+'px}'); + + utils.cssRule('list', selector +' ol,'+selector +' ul{margin:0;padding:0;}li{clear:both;}'+customCss.join('\n'), document); + } + function applyStyle(nodes){ + var T = this; + utils.each(nodes,function(list){ + if(list.className && /custom_/i.test(list.className)){ + var listStyle = list.className.match(/custom_(\w+)/)[1]; + if(listStyle == 'dash' || listStyle == 'dot'){ + utils.pushItem(customCss,selector +' li.list-' + customStyle[listStyle] + '{background-image:url(' + T.liiconpath +customStyle[listStyle]+'.gif)}'); + utils.pushItem(customCss,selector +' ul.custom_'+listStyle+'{list-style:none;} '+ selector +' ul.custom_'+listStyle+' li{background-position:0 3px;background-repeat:no-repeat}'); + + }else{ + var index = 1; + utils.each(list.childNodes,function(li){ + if(li.tagName == 'LI'){ + utils.pushItem(customCss,selector + ' li.list-' + customStyle[listStyle] + index + '{background-image:url(' + T.liiconpath + 'list-'+customStyle[listStyle] +index + '.gif)}'); + index++; + } + }); + utils.pushItem(customCss,selector + ' ol.custom_'+listStyle+'{list-style:none;}'+selector+' ol.custom_'+listStyle+' li{background-position:0 3px;background-repeat:no-repeat}'); + } + switch(listStyle){ + case 'cn': + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:25px}'); + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:40px}'); + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-3{padding-left:55px}'); + break; + case 'cn1': + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:30px}'); + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:40px}'); + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-3{padding-left:55px}'); + break; + case 'cn2': + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:40px}'); + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:55px}'); + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-3{padding-left:68px}'); + break; + case 'num': + case 'num1': + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:25px}'); + break; + case 'num2': + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:35px}'); + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:40px}'); + break; + case 'dash': + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft{padding-left:35px}'); + break; + case 'dot': + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft{padding-left:20px}'); + } + } + }); + } + + +}); +UE.parse.register('vedio',function(utils){ + var video = this.root.getElementsByTagName('video'), + audio = this.root.getElementsByTagName('audio'); + + document.createElement('video');document.createElement('audio'); + if(video.length || audio.length){ + var sourcePath = utils.removeLastbs(this.rootPath), + jsurl = sourcePath + '/third-party/video-js/video.js', + cssurl = sourcePath + '/third-party/video-js/video-js.min.css', + swfUrl = sourcePath + '/third-party/video-js/video-js.swf'; + + if(window.videojs) { + videojs.autoSetup(); + } else { + utils.loadFile(document,{ + id : "video_css", + tag : "link", + rel : "stylesheet", + type : "text/css", + href : cssurl + }); + utils.loadFile(document,{ + id : "video_js", + src : jsurl, + tag : "script", + type : "text/javascript" + },function(){ + videojs.options.flash.swf = swfUrl; + videojs.autoSetup(); + }); + } + + } +}); + +})(); diff --git a/src/main/webapp/js/ue/ueditor.parse.min.js b/src/main/webapp/js/ue/ueditor.parse.min.js new file mode 100644 index 0000000..2804cce --- /dev/null +++ b/src/main/webapp/js/ue/ueditor.parse.min.js @@ -0,0 +1,7 @@ +/*! + * UEditor + * version: ueditor + * build: Mon Jul 25 2016 13:58:42 GMT+0800 (中国标准时间) + */ + +!function(){!function(){UE=window.UE||{};var a=!!window.ActiveXObject,b={removeLastbs:function(a){return a.replace(/\/$/,"")},extend:function(a,b){for(var c=arguments,d=!!this.isBoolean(c[c.length-1])&&c[c.length-1],e=this.isBoolean(c[c.length-1])?c.length-1:c.length,f=1;f=c&&a===b)return d=e,!1}),d},hasClass:function(a,b){b=b.replace(/(^[ ]+)|([ ]+$)/g,"").replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)if(!new RegExp("\\b"+c+"\\b","i").test(e))return!1;return d-1==b.length},addClass:function(a,c){if(a){c=this.trim(c).replace(/[ ]{2,}/g," ").split(" ");for(var d,e=0,f=a.className;d=c[e++];)new RegExp("\\b"+d+"\\b").test(f)||(f+=" "+d);a.className=b.trim(f)}},removeClass:function(a,b){b=this.isArray(b)?b:this.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)e=e.replace(new RegExp("\\b"+c+"\\b"),"");e=this.trim(e).replace(/[ ]{2,}/g," "),a.className=e,!e&&a.removeAttribute("className")},on:function(a,c,d){var e=this.isArray(c)?c:c.split(/\s+/),f=e.length;if(f)for(;f--;)if(c=e[f],a.addEventListener)a.addEventListener(c,d,!1);else{d._d||(d._d={els:[]});var g=c+d.toString(),h=b.indexOf(d._d.els,a);d._d[g]&&h!=-1||(h==-1&&d._d.els.push(a),d._d[g]||(d._d[g]=function(a){return d.call(a.srcElement,a||window.event)}),a.attachEvent("on"+c,d._d[g]))}a=null},off:function(a,c,d){var e=this.isArray(c)?c:c.split(/\s+/),f=e.length;if(f)for(;f--;)if(c=e[f],a.removeEventListener)a.removeEventListener(c,d,!1);else{var g=c+d.toString();try{a.detachEvent("on"+c,d._d?d._d[g]:d)}catch(h){}if(d._d&&d._d[g]){var i=b.indexOf(d._d.els,a);i!=-1&&d._d.els.splice(i,1),0==d._d.els.length&&delete d._d[g]}}},loadFile:function(){function a(a,c){try{for(var d,e=0;d=b[e++];)if(d.doc===a&&d.url==(c.src||c.href))return d}catch(f){return null}}var b=[];return function(c,d,e){var f=a(c,d);if(f)return void(f.ready?e&&e():f.funs.push(e));if(b.push({doc:c,url:d.src||d.href,funs:[e]}),!c.body){var g=[];for(var h in d)"tag"!=h&&g.push(h+'="'+d[h]+'"');return void c.write("<"+d.tag+" "+g.join(" ")+" >")}if(!d.id||!c.getElementById(d.id)){var i=c.createElement(d.tag);delete d.tag;for(var h in d)i.setAttribute(h,d[h]);i.onload=i.onreadystatechange=function(){if(!this.readyState||/loaded|complete/.test(this.readyState)){if(f=a(c,d),f.funs.length>0){f.ready=1;for(var b;b=f.funs.pop();)b()}i.onload=i.onreadystatechange=null}},i.onerror=function(){throw Error("The load "+(d.href||d.src)+" fails,check the url")},c.getElementsByTagName("head")[0].appendChild(i)}}}()};b.each(["String","Function","Array","Number","RegExp","Object","Boolean"],function(a){b["is"+a]=function(b){return Object.prototype.toString.apply(b)=="[object "+a+"]"}});var c={};UE.parse={register:function(a,b){c[a]=b},load:function(a){b.each(c,function(c){c.call(a,b)})}},uParse=function(a,c){b.domReady(function(){var d;if(document.querySelectorAll)d=document.querySelectorAll(a);else if(/^#/.test(a))d=[document.getElementById(a.replace(/^#/,""))];else if(/^\./.test(a)){var d=[];b.each(document.getElementsByTagName("*"),function(b){b.className&&new RegExp("\\b"+a.replace(/^\./,"")+"\\b","i").test(b.className)&&d.push(b)})}else d=document.getElementsByTagName(a);b.each(d,function(d){UE.parse.load(b.extend({root:d,selector:a},c))})})}}(),UE.parse.register("insertcode",function(a){var b=this.root.getElementsByTagName("pre");if(b.length)if("undefined"==typeof XRegExp){var c,d;void 0!==this.rootPath?(c=a.removeLastbs(this.rootPath)+"/third-party/SyntaxHighlighter/shCore.js",d=a.removeLastbs(this.rootPath)+"/third-party/SyntaxHighlighter/shCoreDefault.css"):(c=this.highlightJsUrl,d=this.highlightCssUrl),a.loadFile(document,{id:"syntaxhighlighter_css",tag:"link",rel:"stylesheet",type:"text/css",href:d}),a.loadFile(document,{id:"syntaxhighlighter_js",src:c,tag:"script",type:"text/javascript",defer:"defer"},function(){a.each(b,function(a){a&&/brush/i.test(a.className)&&SyntaxHighlighter.highlight(a)})})}else a.each(b,function(a){a&&/brush/i.test(a.className)&&SyntaxHighlighter.highlight(a)})}),UE.parse.register("table",function(a){function b(b,c){var d,e=b;for(c=a.isArray(c)?c:[c];e;){for(d=0;d0){var g=a[c];a[c]=a[e],a[e]=g}return a}function e(b){if(!a.hasClass(b.rows[0],"firstRow")){for(var c=1;c", - html:true, - placement:"bottom", - trigger:"hover" - }); - }); - $.getJSON('newdata.json', function(data) { +// $.get("test/indexurl",function(data){ +// //position:fixed;bottom:0;left: 0; z-index:99999 ; +// $('#qr').popover({ +// title:"扫一扫", +// content:"扫一扫访问", +// html:true, +// placement:"bottom", +// trigger:"hover" +// }); +// }); + $.getJSON('user/newdata.json', function(data) { $("#xinzeng").text(data.newcount); $("#xinzeng").tooltip({ "title" : "今日新增数据,点击查看", @@ -53,7 +53,7 @@ }); $("#xinzeng").mouseover(); $(".login_username").text(data.username); - $.getJSON('datacount', function(data) { + $.getJSON('user/datacount', function(data) { var myChart = echarts.init(document .getElementById('echarts_test')); var option = { From 544c0ab22a9858be4eca98da8e721d4869d06635 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Fri, 20 Jan 2017 17:38:34 +0800 Subject: [PATCH 09/60] update --- .../dao/IUserDao.java | 4 ++++ .../model/User.java | 9 +++++++++ .../service/IUserService.java | 2 ++ .../serviceimpl/UserServiceImpl.java | 19 +++++++++++++++++++ src/main/java/db.sql | 5 ++++- ...ingBootBootstrapTableApplicationTests.java | 5 +++++ 6 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/dao/IUserDao.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/dao/IUserDao.java index d456018..df2702b 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/dao/IUserDao.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/dao/IUserDao.java @@ -80,6 +80,10 @@ public interface IUserDao extends JpaRepository,JpaSpecificationExecu @Async Future findById(Long id); + @Query(value = "select u from User u where u.id=?1") + @Lock(value = LockModeType.PESSIMISTIC_WRITE) + User findByIdForUpdate(Long id); + User findByN(String name); //直接关联查询出card实体,不再发送额外的sql diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/model/User.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/model/User.java index fb35874..81e73dc 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/model/User.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/model/User.java @@ -45,6 +45,8 @@ public class User implements Serializable { private transient String comments; // 用户使用的地址 private List
    addresses; + //1是admin 0不是admin + private int isAdmin; // private String[] img; // // public String[] getImg() { @@ -225,4 +227,11 @@ public String toString() { return ToStringBuilder.reflectionToString(this,null,true); } + public int getIsAdmin() { + return isAdmin; + } + + public void setIsAdmin(int isAdmin) { + this.isAdmin = isAdmin; + } } \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/service/IUserService.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/service/IUserService.java index 9831d09..c442ea6 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/service/IUserService.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/service/IUserService.java @@ -21,4 +21,6 @@ public interface IUserService { public void addUM(); public void addUMtest() throws IllegalArgumentException; public void deleteById(Long id); + User findByIdForUpdate(long id); + User updateUserStatus(long id,boolean isAdmin); } \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/serviceimpl/UserServiceImpl.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/serviceimpl/UserServiceImpl.java index bda91bf..a304407 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/serviceimpl/UserServiceImpl.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/serviceimpl/UserServiceImpl.java @@ -9,6 +9,8 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -105,4 +107,21 @@ public void addUMtest() throws IllegalArgumentException { public void deleteById(Long id) { userDao.delete(id); } + + @Transactional(readOnly = true) + @Override + public User findByIdForUpdate(long id) { + return userDao.findByIdForUpdate(id); + } + + @Override + public User updateUserStatus(long id, boolean isAdmin) { + User user=findByIdForUpdate(id);//会阻塞掉其它select .. for update查询 + if(String.valueOf(user.getIsAdmin()).equals(isAdmin)){ + return user; + } + user.setIsAdmin(isAdmin?1:0); + userDao.save(user); + return user; + } } \ No newline at end of file diff --git a/src/main/java/db.sql b/src/main/java/db.sql index 98c51ec..a6f9fcb 100644 --- a/src/main/java/db.sql +++ b/src/main/java/db.sql @@ -112,4 +112,7 @@ CREATE TABLE `t_crud_demo` ( CREATE TABLE `t_crud_demosub` ( `id` bigint(20) DEFAULT NULL, `name` varchar(255) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE `user` +ADD COLUMN `is_admin` int NULL COMMENT '是否是管理员1是管理员,0不是管理员' AFTER `adddate`; \ No newline at end of file diff --git a/src/test/java/cn/com/ttblog/SpringBootBootstrapTableApplicationTests.java b/src/test/java/cn/com/ttblog/SpringBootBootstrapTableApplicationTests.java index 043fc60..e4b13f7 100644 --- a/src/test/java/cn/com/ttblog/SpringBootBootstrapTableApplicationTests.java +++ b/src/test/java/cn/com/ttblog/SpringBootBootstrapTableApplicationTests.java @@ -20,6 +20,11 @@ public class SpringBootBootstrapTableApplicationTests { public void contextLoads() { } + @Test + public void testFindByIdForUpdate(){ + userService.findByIdForUpdate(1L); + } + @Test public void test(){ userService.getDataSum(); From 501de59c7fb60b7da252af37ced19d84d3f01513 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Wed, 25 Jan 2017 21:39:17 +0800 Subject: [PATCH 10/60] error view/interceptor --- .../config/MvcConfig.java | 19 +++++++-- .../controller/TestController.java | 40 +++++++++++++++++++ .../interceptor/SpringMvcInterceptor.java | 30 ++++++++++++++ src/main/webapp/error.jsp | 36 +++++++++++++++++ 4 files changed, 121 insertions(+), 4 deletions(-) create mode 100644 src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/TestController.java create mode 100644 src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/interceptor/SpringMvcInterceptor.java create mode 100644 src/main/webapp/error.jsp diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfig.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfig.java index a8394e8..cdf45b8 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfig.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfig.java @@ -1,5 +1,6 @@ package cn.com.ttblog.spring_boot_bootstrap_table.config; +import cn.com.ttblog.spring_boot_bootstrap_table.interceptor.SpringMvcInterceptor; import cn.com.ttblog.spring_boot_bootstrap_table.views.JsonViewResolver; import com.alibaba.fastjson.support.spring.FastJsonJsonView; import org.springframework.beans.factory.BeanFactory; @@ -18,6 +19,9 @@ import java.util.ArrayList; import java.util.List; +/** + * spring boot默认的错误处理由org.springframework.boot.autoconfigure.web.BasicErrorController处理, + */ @Configuration @EnableWebMvc public class MvcConfig extends WebMvcConfigurerAdapter{ @@ -53,10 +57,17 @@ public ViewResolver internalResourceViewResolver () { } // 注册自定义拦截器 -// @Override -// public void addInterceptors(InterceptorRegistry registry) { -// registry.addInterceptor(); -// } + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new SpringMvcInterceptor()) + .addPathPatterns("/**") + .excludePathPatterns("/static") + .excludePathPatterns("/css") + .excludePathPatterns("/image") + .excludePathPatterns("/js") + .excludePathPatterns("/*.html") + .excludePathPatterns("/favicon.ico"); + } // 文件上传设置 @Bean diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/TestController.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/TestController.java new file mode 100644 index 0000000..5d30d0b --- /dev/null +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/TestController.java @@ -0,0 +1,40 @@ +package cn.com.ttblog.spring_boot_bootstrap_table.controller; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +@RequestMapping("/test") +@Controller +public class TestController { + + private static final Logger LOG=LoggerFactory.getLogger(TestController.class); + + //退出系统 + @RequestMapping(value = "/err",method = RequestMethod.GET) + public String exit(HttpSession session,HttpServletRequest request, + HttpServletResponse response) { + int i=1/0; + return "redirect:/index.html"; + } + + //终止服务器 + @RequestMapping("/sysexit") + public String sysexit(){ + //退出当前jvm,导致容器停止(tomcat关闭等) + System.exit(-1); + return "exit"; + } + +// @ExceptionHandler +// public ModelAndView handleAllException(Exception ex) { +// ModelAndView mav = new ModelAndView("500"); +// mav.addObject("errMsg", ex.getMessage()); +// return mav; +// } +} \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/interceptor/SpringMvcInterceptor.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/interceptor/SpringMvcInterceptor.java new file mode 100644 index 0000000..10f6829 --- /dev/null +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/interceptor/SpringMvcInterceptor.java @@ -0,0 +1,30 @@ +package cn.com.ttblog.spring_boot_bootstrap_table.interceptor; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class SpringMvcInterceptor extends HandlerInterceptorAdapter{ + + private static final Logger LOG= LoggerFactory.getLogger(SpringMvcInterceptor.class); + + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + LOG.info("prehandle interceptor"); + return true; + } + + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + LOG.info("postHandle interceptor"); + } + + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + LOG.info("afterCompletion interceptor"); + } + + public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + LOG.info("afterConcurrentHandlingStarted interceptor"); + } +} diff --git a/src/main/webapp/error.jsp b/src/main/webapp/error.jsp new file mode 100644 index 0000000..2e49ccf --- /dev/null +++ b/src/main/webapp/error.jsp @@ -0,0 +1,36 @@ +<%@ page language="java" isErrorPage="true" errorPage="500.jsp" + contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> +<%-- <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> --%> + + + + + + +error + + + + + +
    + 发生错误啦: + +

    校验信息错误

    +
    +

    错误数量:${result.errorCount}

    +

    错误对象名:${result.objectName}

    + + ${error.code }/${error.defaultMessage }
    +
    +
    + +
    错误信息:${errMsg } +
    + ${exception} +
    + + \ No newline at end of file From d678e77a4e1f52d92171ef18f2be336af4e991f5 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 26 Jan 2017 11:23:18 +0800 Subject: [PATCH 11/60] filter / interceptor --- pom.xml | 5 + .../SpringBootBootstrapTableApplication.java | 6 + .../filter/LoginFilter.java | 163 ++++++++++++++++++ .../interceptor/SpringMvcInterceptor.java | 4 +- .../model/User.java | 6 +- 5 files changed, 180 insertions(+), 4 deletions(-) create mode 100644 src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/filter/LoginFilter.java diff --git a/pom.xml b/pom.xml index 08e8462..7e710f3 100644 --- a/pom.xml +++ b/pom.xml @@ -134,6 +134,11 @@ commons-codec 1.10 + + com.github.js-cookie + java-cookie + 0.0.2 + diff --git a/src/main/java/cn/com/ttblog/SpringBootBootstrapTableApplication.java b/src/main/java/cn/com/ttblog/SpringBootBootstrapTableApplication.java index 35b47b8..b0889f1 100644 --- a/src/main/java/cn/com/ttblog/SpringBootBootstrapTableApplication.java +++ b/src/main/java/cn/com/ttblog/SpringBootBootstrapTableApplication.java @@ -3,8 +3,14 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.boot.web.support.SpringBootServletInitializer; +/** + * 使用@ServletComponentScan注解开启servlet、filter、listener的扫描支持,也可以通过代码来注册servlet等 + * http://blog.csdn.net/catoop/article/details/50501686 + */ +@ServletComponentScan @SpringBootApplication public class SpringBootBootstrapTableApplication extends SpringBootServletInitializer { diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/filter/LoginFilter.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/filter/LoginFilter.java new file mode 100644 index 0000000..4d9ddeb --- /dev/null +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/filter/LoginFilter.java @@ -0,0 +1,163 @@ +package cn.com.ttblog.spring_boot_bootstrap_table.filter; + +import java.io.IOException; +import java.util.Arrays; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.annotation.WebFilter; +import javax.servlet.annotation.WebInitParam; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import cn.com.ttblog.spring_boot_bootstrap_table.Constant.ConfigConstant; +import cn.com.ttblog.spring_boot_bootstrap_table.service.IUserService; +import cn.com.ttblog.spring_boot_bootstrap_table.util.AntPathMatcherUtil; +import com.github.jscookie.javacookie.Cookies; +import org.apache.commons.codec.binary.Base64; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +@WebFilter( + filterName = "login_filter", + displayName = "登录处理过滤器", + description = "处理未登录的拦截处理", + urlPatterns ={"/*"}, + asyncSupported = true, + initParams = { + @WebInitParam(name = "noFilterTags",value = "/*/index.html*\n" + + " /*/login/**\n" + + " /*/register/**\n" + + " /*/captcha/**\n" + + " /*/css/**\n" + + " /*/js/**\n" + + " /*/image/**\n" + + " /*/jsonp/**\n" + + " /*/cxf/**"), + @WebInitParam(name = "enable",value = "true") +}) +public class LoginFilter implements Filter { + + private FilterConfig filterConfig; + @Autowired + private IUserService userService; + + private static final Logger LOG=LoggerFactory.getLogger(LoginFilter.class); + @Override + public void init(FilterConfig filterConfig) throws ServletException { + this.filterConfig = filterConfig; + } + + @Override + public void doFilter(ServletRequest servletRequest, + ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; + HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse; + String noFilterTagString = filterConfig + .getInitParameter("noFilterTags").trim(); + boolean enable=Boolean.parseBoolean(filterConfig.getInitParameter("enable")); + //不起用的情况下直接通过 + if(!enable){ + filterChain.doFilter(httpServletRequest, + httpServletResponse); + return ; + } + + String[] noFilterTags = noFilterTagString.split("\n"); + int length=noFilterTags.length; + for(int i=0;i0){ + find=true; + LOG.warn("查询用户:{}",userService.getUserByName(cookie.getValue())); + httpServletRequest.getSession().setAttribute(ConfigConstant.ISLOGIN, true); + httpServletRequest.getSession().setAttribute(ConfigConstant.USERNAME, cookie.getValue()); + if(uri.endsWith(ConfigConstant.PROJECTNAME+"/")){ + httpServletResponse.sendRedirect(httpServletRequest + .getContextPath() + "/manage.html"); + }else{ + filterChain.doFilter(httpServletRequest, httpServletResponse); + } + } + } + if(!find){ + //关于committed状态 http://blog.csdn.net/jubincn/article/details/8920573 + if(!httpServletResponse.isCommitted()){ + //记录之前访问的参数 + String requrib=httpServletRequest.getRequestURI()+"?"+httpServletRequest.getQueryString(); + String requri=Base64.encodeBase64String(requrib.getBytes()); + httpServletResponse.sendRedirect(httpServletRequest + .getContextPath() + "/index.html?requri="+requri); + } + return ; + } + }else{ + LOG.debug("^^^no cookie,no session"); +// if(uri.endsWith(ConfigConstant.PROJECTNAME+"/")){ +// httpServletResponse.sendRedirect(httpServletRequest +// .getContextPath() + "/index.html"); +// } + if(!httpServletResponse.isCommitted()){ + //记录之前访问的参数 + String requrib=httpServletRequest.getRequestURI()+"?"+httpServletRequest.getQueryString(); + String requri=Base64.encodeBase64String(requrib.getBytes()); + httpServletResponse.sendRedirect(httpServletRequest + .getContextPath() + "/index.html?requri="+requri); + } + return ; + } + + } + + @Override + public void destroy() { + LOG.debug("destory"); + } +} diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/interceptor/SpringMvcInterceptor.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/interceptor/SpringMvcInterceptor.java index 10f6829..4759391 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/interceptor/SpringMvcInterceptor.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/interceptor/SpringMvcInterceptor.java @@ -12,7 +12,9 @@ public class SpringMvcInterceptor extends HandlerInterceptorAdapter{ private static final Logger LOG= LoggerFactory.getLogger(SpringMvcInterceptor.class); public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - LOG.info("prehandle interceptor"); + LOG.info("=============================================================prehandle interceptor"); + LOG.info("request.getRequestURI():{},request.getRemoteAddr():{}",request.getRequestURI(),request.getRemoteAddr()); + LOG.info("=============================================================prehandle interceptor"); return true; } diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/model/User.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/model/User.java index 81e73dc..f75e98e 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/model/User.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/model/User.java @@ -46,7 +46,7 @@ public class User implements Serializable { // 用户使用的地址 private List
    addresses; //1是admin 0不是admin - private int isAdmin; + private Integer isAdmin; // private String[] img; // // public String[] getImg() { @@ -227,11 +227,11 @@ public String toString() { return ToStringBuilder.reflectionToString(this,null,true); } - public int getIsAdmin() { + public Integer getIsAdmin() { return isAdmin; } - public void setIsAdmin(int isAdmin) { + public void setIsAdmin(Integer isAdmin) { this.isAdmin = isAdmin; } } \ No newline at end of file From 2eb00d8dff054620151f355bea885ca59987b741 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Fri, 27 Jan 2017 11:58:33 +0800 Subject: [PATCH 12/60] test Log4jdbc Log4j2 Jdbc4 --- README.md | 5 ++++- pom.xml | 5 +++++ .../config/DruidConfiguration.java | 4 +++- src/main/resources/log4jdbc.log4j2.properties | 20 +++++++++++++++++++ src/main/resources/logback-springboot.xml | 6 ++++++ 5 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/log4jdbc.log4j2.properties diff --git a/README.md b/README.md index 74b344e..34cc1cb 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ ### spring-boot bootstrap_table demo --- * spring-boot 1.4.3 -* integration with jsp \ No newline at end of file +* integration with jsp +* bootstrap-table1.9 +* bootstrap3 +* log4jdbc-log4j2 diff --git a/pom.xml b/pom.xml index 7e710f3..01dc861 100644 --- a/pom.xml +++ b/pom.xml @@ -139,6 +139,11 @@ java-cookie 0.0.2 + + org.bgee.log4jdbc-log4j2 + log4jdbc-log4j2-jdbc4.1 + 1.16 + diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/DruidConfiguration.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/DruidConfiguration.java index cc73c3c..460c202 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/DruidConfiguration.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/DruidConfiguration.java @@ -3,6 +3,7 @@ import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; +import net.sf.log4jdbc.sql.jdbcapi.DataSourceSpy; import org.springframework.boot.context.embedded.FilterRegistrationBean; import org.springframework.boot.context.embedded.ServletRegistrationBean; import org.springframework.context.annotation.Bean; @@ -30,7 +31,8 @@ public DataSource druidDataSource() { } catch (SQLException e) { e.printStackTrace(); } - return druidDataSource; + DataSourceSpy dataSourceSpy=new DataSourceSpy(druidDataSource); + return dataSourceSpy; } @Bean diff --git a/src/main/resources/log4jdbc.log4j2.properties b/src/main/resources/log4jdbc.log4j2.properties new file mode 100644 index 0000000..5eef839 --- /dev/null +++ b/src/main/resources/log4jdbc.log4j2.properties @@ -0,0 +1,20 @@ +#use slf4j way +log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator +log4jdbc.debug.stack.prefix= +log4jdbc.sqltiming.warn.threshold= +log4jdbc.sqltiming.error.threshold= +log4jdbc.dump.booleanastruefalse= +log4jdbc.dump.sql.maxlinelength= +log4jdbc.dump.fulldebugstacktrace= +log4jdbc.statement.warn= +log4jdbc.dump.sql.select= +log4jdbc.dump.sql.insert= +log4jdbc.dump.sql.update= +log4jdbc.dump.sql.delete= +log4jdbc.dump.sql.create= +log4jdbc.dump.sql.addsemicolon= +log4jdbc.auto.load.popular.drivers= +log4jdbc.trim.sql= +log4jdbc.trim.sql.extrablanklines= +log4jdbc.suppress.generated.keys.exception= +log4jdbc.drivers= \ No newline at end of file diff --git a/src/main/resources/logback-springboot.xml b/src/main/resources/logback-springboot.xml index 2124956..fddb05e 100644 --- a/src/main/resources/logback-springboot.xml +++ b/src/main/resources/logback-springboot.xml @@ -55,6 +55,12 @@ + + + + + + From 36567b5f268b4f46e407bff22d6cd3d74540f7b1 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sun, 4 Jun 2017 22:46:27 +0800 Subject: [PATCH 13/60] update readme --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 34cc1cb..be7c325 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,13 @@ * bootstrap-table1.9 * bootstrap3 * log4jdbc-log4j2 + +> `ssmbootstrap_table(spring+springmvc+mybatis)` github:[https://github.com/netbuffer/ssmbootstrap_table](https://github.com/netbuffer/ssmbootstrap_table)`/`git@osc:[https://git.oschina.net/gradle/ssmbootstrap_table](https://git.oschina.net/gradle/ssmbootstrap_table) + +> `sssbootstrap_table(spring+springmvc+spring data jpa)` github:[https://github.com/netbuffer/sssbootstrap_table](https://github.com/netbuffer/sssbootstrap_table)`/`git@osc:[https://git.oschina.net/netbuffer/sssbootstrap_table](https://git.oschina.net/netbuffer/sssbootstrap_table) + +> `sshbootstrap_table(spring+struts2+hibernate)` github:[https://github.com/netbuffer/sshbootstrap-table](https://github.com/netbuffer/sshbootstrap-table)`/`git@osc:[https://git.oschina.net/netbuffer/sshbootstrap-table](https://git.oschina.net/netbuffer/sshbootstrap-table) + +> `jfinal-bootstrap-table(jfinal)`github:[https://github.com/netbuffer/jfinal-bootstrap-table](https://github.com/netbuffer/jfinal-bootstrap-table)`/`git@osc:[http://git.oschina.net/gradle/jfinal-bootstrap-table](http://git.oschina.net/gradle/jfinal-bootstrap-table) + +> `medoo_bootstrap_table(php5)`github:[https://github.com/netbuffer/medoo_bootstrap_table](https://github.com/netbuffer/medoo_bootstrap_table)`/`git@osc:[http://git.oschina.net/gradle/medoo_bootstrap_table](http://git.oschina.net/gradle/medoo_bootstrap_table) From 8684ff28fdad06504162ceffc3347acb75bcb3b9 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sat, 26 Aug 2017 15:43:43 +0800 Subject: [PATCH 14/60] update readme --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index be7c325..bf832df 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,11 @@ * bootstrap3 * log4jdbc-log4j2 +# other projects > `ssmbootstrap_table(spring+springmvc+mybatis)` github:[https://github.com/netbuffer/ssmbootstrap_table](https://github.com/netbuffer/ssmbootstrap_table)`/`git@osc:[https://git.oschina.net/gradle/ssmbootstrap_table](https://git.oschina.net/gradle/ssmbootstrap_table) +> `ssmbt(ssmbootstrap_table maven module )` github:[https://github.com/netbuffer/ssmbt](https://github.com/netbuffer/ssmbt)`/`git@osc:[https://git.oschina.net/netbuffer/ssmbt](https://git.oschina.net/netbuffer/ssmbt) + > `sssbootstrap_table(spring+springmvc+spring data jpa)` github:[https://github.com/netbuffer/sssbootstrap_table](https://github.com/netbuffer/sssbootstrap_table)`/`git@osc:[https://git.oschina.net/netbuffer/sssbootstrap_table](https://git.oschina.net/netbuffer/sssbootstrap_table) > `sshbootstrap_table(spring+struts2+hibernate)` github:[https://github.com/netbuffer/sshbootstrap-table](https://github.com/netbuffer/sshbootstrap-table)`/`git@osc:[https://git.oschina.net/netbuffer/sshbootstrap-table](https://git.oschina.net/netbuffer/sshbootstrap-table) From 8167353df317016786564028c05ac4588cd96259 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Fri, 27 Oct 2017 10:34:31 +0800 Subject: [PATCH 15/60] update LoginFilter --- .../filter/LoginFilter.java | 153 +++++++++--------- 1 file changed, 76 insertions(+), 77 deletions(-) diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/filter/LoginFilter.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/filter/LoginFilter.java index 4d9ddeb..21079d9 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/filter/LoginFilter.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/filter/LoginFilter.java @@ -14,10 +14,12 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.com.ttblog.spring_boot_bootstrap_table.Constant.ConfigConstant; +import cn.com.ttblog.spring_boot_bootstrap_table.model.User; import cn.com.ttblog.spring_boot_bootstrap_table.service.IUserService; import cn.com.ttblog.spring_boot_bootstrap_table.util.AntPathMatcherUtil; import com.github.jscookie.javacookie.Cookies; import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -45,7 +47,7 @@ public class LoginFilter implements Filter { private FilterConfig filterConfig; @Autowired private IUserService userService; - + private static final Logger LOG=LoggerFactory.getLogger(LoginFilter.class); @Override public void init(FilterConfig filterConfig) throws ServletException { @@ -54,110 +56,107 @@ public void init(FilterConfig filterConfig) throws ServletException { @Override public void doFilter(ServletRequest servletRequest, - ServletResponse servletResponse, FilterChain filterChain) + ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse; - String noFilterTagString = filterConfig - .getInitParameter("noFilterTags").trim(); + String noFilterTagString = filterConfig.getInitParameter("noFilterTags").trim(); boolean enable=Boolean.parseBoolean(filterConfig.getInitParameter("enable")); //不起用的情况下直接通过 if(!enable){ - filterChain.doFilter(httpServletRequest, - httpServletResponse); + filterChain.doFilter(httpServletRequest,httpServletResponse); return ; } - String[] noFilterTags = noFilterTagString.split("\n"); int length=noFilterTags.length; for(int i=0;i0){ + //从cookie检查登录状态 + checkStatusFromCookie(httpServletRequest,httpServletResponse,filterChain); + return; + }else{ + LOG.debug("^^^no cookie,no session"); + if(!httpServletResponse.isCommitted()){ + redirect(httpServletRequest,httpServletResponse); + return ; + }else { + LOG.info("no cookie&session httpServletResponse.isCommitted():{}",httpServletResponse.isCommitted()); } - } else if(cookies!=null){ - LOG.debug("p2"); - boolean find=false; - for(Cookie cookie:cookies){ - if(cookie.getName().equals(ConfigConstant.USERNAME)&&cookie.getValue().length()>0){ - find=true; - LOG.warn("查询用户:{}",userService.getUserByName(cookie.getValue())); - httpServletRequest.getSession().setAttribute(ConfigConstant.ISLOGIN, true); - httpServletRequest.getSession().setAttribute(ConfigConstant.USERNAME, cookie.getValue()); - if(uri.endsWith(ConfigConstant.PROJECTNAME+"/")){ - httpServletResponse.sendRedirect(httpServletRequest - .getContextPath() + "/manage.html"); - }else{ - filterChain.doFilter(httpServletRequest, httpServletResponse); - } + } + } + + private void checkStatusFromSession(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,FilterChain filterChain) throws IOException, ServletException { + LOG.debug("get login status from session"); + String uri = httpServletRequest.getRequestURI(); + if(uri.endsWith(ConfigConstant.PROJECTNAME+"/")){ + httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/manage.html"); + }else{ + filterChain.doFilter(httpServletRequest, httpServletResponse); + } + } + + private void checkStatusFromCookie(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,FilterChain filterChain) throws IOException, ServletException { + LOG.debug("get login status from cookie"); + String uri = httpServletRequest.getRequestURI(); + Cookie[] cookiesArray=httpServletRequest.getCookies(); + boolean find=false; + for(Cookie cookie:cookiesArray){ + if(cookie.getName().equals(ConfigConstant.USERNAME)&&cookie.getValue().length()>0){ + User user=userService.getUserByName(cookie.getValue()); + LOG.warn("根据cookie:{}查询用户:{}",cookie,user); + if(user==null){ + break; } - } - if(!find){ - //关于committed状态 http://blog.csdn.net/jubincn/article/details/8920573 - if(!httpServletResponse.isCommitted()){ - //记录之前访问的参数 - String requrib=httpServletRequest.getRequestURI()+"?"+httpServletRequest.getQueryString(); - String requri=Base64.encodeBase64String(requrib.getBytes()); - httpServletResponse.sendRedirect(httpServletRequest - .getContextPath() + "/index.html?requri="+requri); + find=true; + httpServletRequest.getSession().setAttribute(ConfigConstant.ISLOGIN, true); + httpServletRequest.getSession().setAttribute(ConfigConstant.USERNAME, cookie.getValue()); + if(uri.endsWith(ConfigConstant.PROJECTNAME+"/")){ + httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/manage.html"); + }else{ + break; } - return ; } - }else{ - LOG.debug("^^^no cookie,no session"); -// if(uri.endsWith(ConfigConstant.PROJECTNAME+"/")){ -// httpServletResponse.sendRedirect(httpServletRequest -// .getContextPath() + "/index.html"); -// } + } + if(!find){ + //关于committed状态 http://blog.csdn.net/jubincn/article/details/8920573 if(!httpServletResponse.isCommitted()){ - //记录之前访问的参数 - String requrib=httpServletRequest.getRequestURI()+"?"+httpServletRequest.getQueryString(); - String requri=Base64.encodeBase64String(requrib.getBytes()); - httpServletResponse.sendRedirect(httpServletRequest - .getContextPath() + "/index.html?requri="+requri); + redirect(httpServletRequest,httpServletResponse); + }else { + LOG.info("no cookie httpServletResponse.isCommitted():{}",httpServletResponse.isCommitted()); } - return ; + }else { + filterChain.doFilter(httpServletRequest,httpServletResponse); + } + } + + private void redirect(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse) throws IOException { + //记录之前访问的参数 + String uri = httpServletRequest.getRequestURI(); + if(StringUtils.isNotBlank(httpServletRequest.getQueryString())){ + uri+="?="+httpServletRequest.getQueryString(); } - + String base64uri=Base64.encodeBase64String(uri.getBytes()); + httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/index.html?requri="+base64uri); } @Override public void destroy() { - LOG.debug("destory"); + LOG.debug("loginfilter destory"); } } From f013f47c5c8006f66a13a16dbdda903124b5bf0a Mon Sep 17 00:00:00 2001 From: netbuffer Date: Fri, 27 Oct 2017 10:41:39 +0800 Subject: [PATCH 16/60] update login twice --- .../controller/IndexController.java | 5 ++++- .../controller/UserController.java | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java index 0e49231..4c22da5 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java @@ -3,6 +3,7 @@ import cn.com.ttblog.spring_boot_bootstrap_table.Constant.ConfigConstant; import cn.com.ttblog.spring_boot_bootstrap_table.service.IUserService; import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang3.StringUtils; import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -83,7 +84,9 @@ public String login(HttpSession session, HttpServletRequest request, String uri=new String(Base64.decodeBase64(requri)); String touri=uri.substring(request.getContextPath().length()+1); logger.debug("request.getContextPath():{} decode-requri:{} touri:{}",request.getContextPath(),uri,touri); - return "redirect:/"+touri; + if(StringUtils.isNotBlank(touri)&&!touri.equals("/")){ + return "redirect:/"+touri; + } } return "redirect:/manage.html"; } else { diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/UserController.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/UserController.java index 50d31d5..90139f2 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/UserController.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/UserController.java @@ -197,7 +197,7 @@ public String userpdfview(Model model) { @RequestMapping("/userlist") public String userlist(@RequestParam(value="search",required=false)String search,String order, int limit, int offset, Model model) { long startTime = System.nanoTime(); - logger.info("参数:{},{},{}", order, limit, offset); +// logger.info("参数:{},{},{}", order, limit, offset); if(search!=null){ try { //get参数乱码问题:http://luanxiyuan.iteye.com/blog/1849169 From 6e615618ff8abd53d51fbb29a0d7d2fce30ea51c Mon Sep 17 00:00:00 2001 From: netbuffer Date: Fri, 27 Oct 2017 10:43:30 +0800 Subject: [PATCH 17/60] rename package --- .../{Constant => constant}/ConfigConstant.java | 2 +- .../spring_boot_bootstrap_table/controller/IndexController.java | 2 +- .../spring_boot_bootstrap_table/controller/UserController.java | 2 +- .../ttblog/spring_boot_bootstrap_table/filter/LoginFilter.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/{Constant => constant}/ConfigConstant.java (84%) diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/Constant/ConfigConstant.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/constant/ConfigConstant.java similarity index 84% rename from src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/Constant/ConfigConstant.java rename to src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/constant/ConfigConstant.java index 4a185fd..d4c070e 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/Constant/ConfigConstant.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/constant/ConfigConstant.java @@ -1,4 +1,4 @@ -package cn.com.ttblog.spring_boot_bootstrap_table.Constant; +package cn.com.ttblog.spring_boot_bootstrap_table.constant; public class ConfigConstant { /** diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java index 4c22da5..8b578b6 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java @@ -1,6 +1,6 @@ package cn.com.ttblog.spring_boot_bootstrap_table.controller; -import cn.com.ttblog.spring_boot_bootstrap_table.Constant.ConfigConstant; +import cn.com.ttblog.spring_boot_bootstrap_table.constant.ConfigConstant; import cn.com.ttblog.spring_boot_bootstrap_table.service.IUserService; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.StringUtils; diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/UserController.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/UserController.java index 90139f2..06fe642 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/UserController.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/UserController.java @@ -1,6 +1,6 @@ package cn.com.ttblog.spring_boot_bootstrap_table.controller; -import cn.com.ttblog.spring_boot_bootstrap_table.Constant.ConfigConstant; +import cn.com.ttblog.spring_boot_bootstrap_table.constant.ConfigConstant; import cn.com.ttblog.spring_boot_bootstrap_table.model.User; import cn.com.ttblog.spring_boot_bootstrap_table.service.IUserService; import com.alibaba.fastjson.JSONArray; diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/filter/LoginFilter.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/filter/LoginFilter.java index 21079d9..9075410 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/filter/LoginFilter.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/filter/LoginFilter.java @@ -13,7 +13,7 @@ import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import cn.com.ttblog.spring_boot_bootstrap_table.Constant.ConfigConstant; +import cn.com.ttblog.spring_boot_bootstrap_table.constant.ConfigConstant; import cn.com.ttblog.spring_boot_bootstrap_table.model.User; import cn.com.ttblog.spring_boot_bootstrap_table.service.IUserService; import cn.com.ttblog.spring_boot_bootstrap_table.util.AntPathMatcherUtil; From 811e2548b2158111c0cc2fa82f62967310fc64f9 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sun, 4 Feb 2018 20:42:54 +0800 Subject: [PATCH 18/60] update --- src/main/resources/logback-springboot.xml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/resources/logback-springboot.xml b/src/main/resources/logback-springboot.xml index fddb05e..6c5a670 100644 --- a/src/main/resources/logback-springboot.xml +++ b/src/main/resources/logback-springboot.xml @@ -4,10 +4,9 @@ - - - %date [%thread] %-5level %logger{80} - %msg%n - + true + + %highlight(%date{yyyy-MM-dd HH:mm:ss.SSS}) %cyan([%thread]) %yellow(%-5level) %green(%logger{36}) - %blue(%msg%n) Date: Wed, 7 Feb 2018 21:52:58 +0800 Subject: [PATCH 19/60] add spring-boot-devtools --- pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pom.xml b/pom.xml index 01dc861..b340629 100644 --- a/pom.xml +++ b/pom.xml @@ -52,6 +52,12 @@ org.springframework.boot spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-devtools + + From c7f3c8907dc6e220a5a177715bcfda5993d8c263 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 8 Feb 2018 09:54:11 +0800 Subject: [PATCH 20/60] rename --- .../cn/com/ttblog/spring_boot_bootstrap_table/dao/IUserDao.java | 2 +- .../serviceimpl/UserServiceImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/dao/IUserDao.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/dao/IUserDao.java index df2702b..4869b5f 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/dao/IUserDao.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/dao/IUserDao.java @@ -51,7 +51,7 @@ public interface IUserDao extends JpaRepository,JpaSpecificationExecu String querySex(@Param("id") Long id); @Query(value = "select count(id) from user where DATE_FORMAT(NOW(),'%Y-%m-%d')=FROM_UNIXTIME(adddate,'%Y-%m-%d')",nativeQuery = true) - int getNewDate(); + int getNewData(); @Query(value = "select count(id) num,FROM_UNIXTIME(adddate,'%Y-%m-%d') adddate from user group by FROM_UNIXTIME(adddate,'%Y-%m-%d')",nativeQuery = true) List getDataSum(); diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/serviceimpl/UserServiceImpl.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/serviceimpl/UserServiceImpl.java index a304407..b5e4211 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/serviceimpl/UserServiceImpl.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/serviceimpl/UserServiceImpl.java @@ -71,7 +71,7 @@ public long getUserListCount(String search) { @Override public int getNewData() { - return userDao.getNewDate(); + return userDao.getNewData(); } @Override From 5d51c26fe269a7db204b7b5a0889d42247644084 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sat, 10 Feb 2018 16:30:01 +0800 Subject: [PATCH 21/60] update static files --- .../filter/LoginFilter.java | 1 + src/main/webapp/index.html | 16 +- src/main/webapp/manage.html | 39 +- src/main/webapp/static/bootbox.min.js | 1 + .../static/bootstrap-datetimepicker.min.css | 5 + .../static/bootstrap-datetimepicker.min.js | 214 ++ .../bootstrap-table-export.min.js | 7 + .../bootstrap-table-zh-CN.min.js | 7 + .../bootstrap-table/bootstrap-table.min.css | 1 + .../bootstrap-table/bootstrap-table.min.js | 8 + .../webapp/static/bootstrap/bootstrap.min.css | 5 + .../webapp/static/bootstrap/bootstrap.min.js | 7 + src/main/webapp/{js => static}/city-picker.js | 0 src/main/webapp/static/echarts.min.js | 14 + .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23320 bytes .../{js => static}/jquery-cloneya.min.js | 0 src/main/webapp/{js => static}/jquery-weui.js | 0 .../webapp/static/jquery.backstretch.min.js | 4 + src/main/webapp/static/jquery.min.js | 5 + src/main/webapp/{js => static}/laytpl.js | 0 src/main/webapp/{js => static}/moment.min.js | 0 .../webapp/{js => static}/moment.zh-cn.js | 0 src/main/webapp/static/purl.min.js | 1 + src/main/webapp/static/tableExport.js | 2232 +++++++++++++++++ .../webapp/{js => static}/ue/jsp/config.json | 0 .../{js => static}/ue/jsp/controller.jsp | 0 .../webapp/{js => static}/ue/lang/en/en.js | 0 .../ue/lang/en/images/addimage.png | Bin .../lang/en/images/alldeletebtnhoverskin.png | Bin .../ue/lang/en/images/alldeletebtnupskin.png | Bin .../ue/lang/en/images/background.png | Bin .../ue/lang/en/images/button.png | Bin .../{js => static}/ue/lang/en/images/copy.png | Bin .../ue/lang/en/images/deletedisable.png | Bin .../ue/lang/en/images/deleteenable.png | Bin .../ue/lang/en/images/listbackground.png | Bin .../ue/lang/en/images/localimage.png | Bin .../ue/lang/en/images/music.png | Bin .../ue/lang/en/images/rotateleftdisable.png | Bin .../ue/lang/en/images/rotateleftenable.png | Bin .../ue/lang/en/images/rotaterightdisable.png | Bin .../ue/lang/en/images/rotaterightenable.png | Bin .../ue/lang/en/images/upload.png | Bin .../ue/lang/zh-cn/images/copy.png | Bin .../ue/lang/zh-cn/images/localimage.png | Bin .../ue/lang/zh-cn/images/music.png | Bin .../ue/lang/zh-cn/images/upload.png | Bin .../{js => static}/ue/lang/zh-cn/zh-cn.js | 0 .../ue/themes/default/css/ueditor.css | 0 .../ue/themes/default/css/ueditor.min.css | 0 .../ue/themes/default/dialogbase.css | 0 .../ue/themes/default/images/anchor.gif | Bin .../ue/themes/default/images/arrow.png | Bin .../ue/themes/default/images/arrow_down.png | Bin .../ue/themes/default/images/arrow_up.png | Bin .../ue/themes/default/images/button-bg.gif | Bin .../ue/themes/default/images/cancelbutton.gif | Bin .../ue/themes/default/images/charts.png | Bin .../ue/themes/default/images/cursor_h.gif | Bin .../ue/themes/default/images/cursor_h.png | Bin .../ue/themes/default/images/cursor_v.gif | Bin .../ue/themes/default/images/cursor_v.png | Bin .../themes/default/images/dialog-title-bg.png | Bin .../ue/themes/default/images/filescan.png | Bin .../ue/themes/default/images/highlighted.gif | Bin .../ue/themes/default/images/icons-all.gif | Bin .../ue/themes/default/images/icons.gif | Bin .../ue/themes/default/images/icons.png | Bin .../ue/themes/default/images/loaderror.png | Bin .../ue/themes/default/images/loading.gif | Bin .../ue/themes/default/images/lock.gif | Bin .../default/images/neweditor-tab-bg.png | Bin .../ue/themes/default/images/pagebreak.gif | Bin .../ue/themes/default/images/scale.png | Bin .../ue/themes/default/images/sortable.png | Bin .../ue/themes/default/images/spacer.gif | Bin .../ue/themes/default/images/sparator_v.png | Bin .../default/images/table-cell-align.png | Bin .../default/images/tangram-colorpicker.png | Bin .../ue/themes/default/images/toolbar_bg.png | Bin .../themes/default/images/unhighlighted.gif | Bin .../ue/themes/default/images/upload.png | Bin .../ue/themes/default/images/videologo.gif | Bin .../ue/themes/default/images/word.gif | Bin .../ue/themes/default/images/wordpaste.png | Bin .../{js => static}/ue/themes/iframe.css | 0 .../third-party/SyntaxHighlighter/shCore.js | 0 .../SyntaxHighlighter/shCoreDefault.css | 0 .../ue/third-party/codemirror/codemirror.css | 0 .../ue/third-party/codemirror/codemirror.js | 0 .../highcharts/adapters/mootools-adapter.js | 0 .../adapters/mootools-adapter.src.js | 0 .../highcharts/adapters/prototype-adapter.js | 0 .../adapters/prototype-adapter.src.js | 0 .../adapters/standalone-framework.js | 0 .../adapters/standalone-framework.src.js | 0 .../third-party/highcharts/highcharts-more.js | 0 .../highcharts/highcharts-more.src.js | 0 .../ue/third-party/highcharts/highcharts.js | 0 .../third-party/highcharts/highcharts.src.js | 0 .../highcharts/modules/annotations.js | 0 .../highcharts/modules/annotations.src.js | 0 .../highcharts/modules/canvas-tools.js | 0 .../highcharts/modules/canvas-tools.src.js | 0 .../ue/third-party/highcharts/modules/data.js | 0 .../highcharts/modules/data.src.js | 0 .../highcharts/modules/drilldown.js | 0 .../highcharts/modules/drilldown.src.js | 0 .../highcharts/modules/exporting.js | 0 .../highcharts/modules/exporting.src.js | 0 .../third-party/highcharts/modules/funnel.js | 0 .../highcharts/modules/funnel.src.js | 0 .../third-party/highcharts/modules/heatmap.js | 0 .../highcharts/modules/heatmap.src.js | 0 .../ue/third-party/highcharts/modules/map.js | 0 .../third-party/highcharts/modules/map.src.js | 0 .../highcharts/modules/no-data-to-display.js | 0 .../modules/no-data-to-display.src.js | 0 .../highcharts/themes/dark-blue.js | 0 .../highcharts/themes/dark-green.js | 0 .../ue/third-party/highcharts/themes/gray.js | 0 .../ue/third-party/highcharts/themes/grid.js | 0 .../ue/third-party/highcharts/themes/skies.js | 0 .../ue/third-party/jquery-1.10.2.js | 0 .../ue/third-party/jquery-1.10.2.min.js | 0 .../ue/third-party/jquery-1.10.2.min.map | 0 .../snapscreen/UEditorSnapscreen.exe | Bin .../ue/third-party/video-js/font/vjs.eot | Bin .../ue/third-party/video-js/font/vjs.svg | 0 .../ue/third-party/video-js/font/vjs.ttf | Bin .../ue/third-party/video-js/font/vjs.woff | Bin .../ue/third-party/video-js/video-js.css | 0 .../ue/third-party/video-js/video-js.min.css | 0 .../ue/third-party/video-js/video-js.swf | Bin .../ue/third-party/video-js/video.dev.js | 0 .../ue/third-party/video-js/video.js | 0 .../ue/third-party/webuploader/Uploader.swf | Bin .../third-party/webuploader/webuploader.css | 0 .../webuploader/webuploader.custom.js | 0 .../webuploader/webuploader.custom.min.js | 0 .../webuploader/webuploader.flashonly.js | 0 .../webuploader/webuploader.flashonly.min.js | 0 .../webuploader/webuploader.html5only.js | 0 .../webuploader/webuploader.html5only.min.js | 0 .../ue/third-party/webuploader/webuploader.js | 0 .../webuploader/webuploader.min.js | 0 .../webuploader/webuploader.withoutimage.js | 0 .../webuploader.withoutimage.min.js | 0 .../{js => static}/ue/third-party/xss.min.js | 0 .../zeroclipboard/ZeroClipboard.js | 0 .../zeroclipboard/ZeroClipboard.min.js | 0 .../zeroclipboard/ZeroClipboard.swf | Bin .../webapp/{js => static}/ue/ueditor.all.js | 0 .../{js => static}/ue/ueditor.all.min.js | 0 .../{js => static}/ue/ueditor.config.js | 0 .../webapp/{js => static}/ue/ueditor.parse.js | 0 .../{js => static}/ue/ueditor.parse.min.js | 0 .../jquery.validationEngine-zh_CN.min.js | 2 + .../jquery.validationEngine.min.js | 6 + .../validationEngine.jquery.min.css | 1 + 160 files changed, 2542 insertions(+), 34 deletions(-) create mode 100644 src/main/webapp/static/bootbox.min.js create mode 100644 src/main/webapp/static/bootstrap-datetimepicker.min.css create mode 100644 src/main/webapp/static/bootstrap-datetimepicker.min.js create mode 100644 src/main/webapp/static/bootstrap-table/bootstrap-table-export.min.js create mode 100644 src/main/webapp/static/bootstrap-table/bootstrap-table-zh-CN.min.js create mode 100644 src/main/webapp/static/bootstrap-table/bootstrap-table.min.css create mode 100644 src/main/webapp/static/bootstrap-table/bootstrap-table.min.js create mode 100644 src/main/webapp/static/bootstrap/bootstrap.min.css create mode 100644 src/main/webapp/static/bootstrap/bootstrap.min.js rename src/main/webapp/{js => static}/city-picker.js (100%) create mode 100644 src/main/webapp/static/echarts.min.js create mode 100644 src/main/webapp/static/fonts/glyphicons-halflings-regular.woff rename src/main/webapp/{js => static}/jquery-cloneya.min.js (100%) rename src/main/webapp/{js => static}/jquery-weui.js (100%) create mode 100644 src/main/webapp/static/jquery.backstretch.min.js create mode 100644 src/main/webapp/static/jquery.min.js rename src/main/webapp/{js => static}/laytpl.js (100%) rename src/main/webapp/{js => static}/moment.min.js (100%) rename src/main/webapp/{js => static}/moment.zh-cn.js (100%) create mode 100644 src/main/webapp/static/purl.min.js create mode 100644 src/main/webapp/static/tableExport.js rename src/main/webapp/{js => static}/ue/jsp/config.json (100%) rename src/main/webapp/{js => static}/ue/jsp/controller.jsp (100%) rename src/main/webapp/{js => static}/ue/lang/en/en.js (100%) rename src/main/webapp/{js => static}/ue/lang/en/images/addimage.png (100%) rename src/main/webapp/{js => static}/ue/lang/en/images/alldeletebtnhoverskin.png (100%) rename src/main/webapp/{js => static}/ue/lang/en/images/alldeletebtnupskin.png (100%) rename src/main/webapp/{js => static}/ue/lang/en/images/background.png (100%) rename src/main/webapp/{js => static}/ue/lang/en/images/button.png (100%) rename src/main/webapp/{js => static}/ue/lang/en/images/copy.png (100%) rename src/main/webapp/{js => static}/ue/lang/en/images/deletedisable.png (100%) rename src/main/webapp/{js => static}/ue/lang/en/images/deleteenable.png (100%) rename src/main/webapp/{js => static}/ue/lang/en/images/listbackground.png (100%) rename src/main/webapp/{js => static}/ue/lang/en/images/localimage.png (100%) rename src/main/webapp/{js => static}/ue/lang/en/images/music.png (100%) rename src/main/webapp/{js => static}/ue/lang/en/images/rotateleftdisable.png (100%) rename src/main/webapp/{js => static}/ue/lang/en/images/rotateleftenable.png (100%) rename src/main/webapp/{js => static}/ue/lang/en/images/rotaterightdisable.png (100%) rename src/main/webapp/{js => static}/ue/lang/en/images/rotaterightenable.png (100%) rename src/main/webapp/{js => static}/ue/lang/en/images/upload.png (100%) rename src/main/webapp/{js => static}/ue/lang/zh-cn/images/copy.png (100%) rename src/main/webapp/{js => static}/ue/lang/zh-cn/images/localimage.png (100%) rename src/main/webapp/{js => static}/ue/lang/zh-cn/images/music.png (100%) rename src/main/webapp/{js => static}/ue/lang/zh-cn/images/upload.png (100%) rename src/main/webapp/{js => static}/ue/lang/zh-cn/zh-cn.js (100%) rename src/main/webapp/{js => static}/ue/themes/default/css/ueditor.css (100%) rename src/main/webapp/{js => static}/ue/themes/default/css/ueditor.min.css (100%) rename src/main/webapp/{js => static}/ue/themes/default/dialogbase.css (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/anchor.gif (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/arrow.png (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/arrow_down.png (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/arrow_up.png (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/button-bg.gif (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/cancelbutton.gif (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/charts.png (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/cursor_h.gif (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/cursor_h.png (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/cursor_v.gif (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/cursor_v.png (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/dialog-title-bg.png (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/filescan.png (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/highlighted.gif (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/icons-all.gif (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/icons.gif (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/icons.png (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/loaderror.png (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/loading.gif (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/lock.gif (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/neweditor-tab-bg.png (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/pagebreak.gif (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/scale.png (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/sortable.png (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/spacer.gif (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/sparator_v.png (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/table-cell-align.png (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/tangram-colorpicker.png (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/toolbar_bg.png (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/unhighlighted.gif (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/upload.png (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/videologo.gif (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/word.gif (100%) rename src/main/webapp/{js => static}/ue/themes/default/images/wordpaste.png (100%) rename src/main/webapp/{js => static}/ue/themes/iframe.css (100%) rename src/main/webapp/{js => static}/ue/third-party/SyntaxHighlighter/shCore.js (100%) rename src/main/webapp/{js => static}/ue/third-party/SyntaxHighlighter/shCoreDefault.css (100%) rename src/main/webapp/{js => static}/ue/third-party/codemirror/codemirror.css (100%) rename src/main/webapp/{js => static}/ue/third-party/codemirror/codemirror.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/adapters/mootools-adapter.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/adapters/mootools-adapter.src.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/adapters/prototype-adapter.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/adapters/prototype-adapter.src.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/adapters/standalone-framework.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/adapters/standalone-framework.src.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/highcharts-more.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/highcharts-more.src.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/highcharts.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/highcharts.src.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/modules/annotations.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/modules/annotations.src.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/modules/canvas-tools.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/modules/canvas-tools.src.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/modules/data.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/modules/data.src.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/modules/drilldown.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/modules/drilldown.src.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/modules/exporting.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/modules/exporting.src.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/modules/funnel.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/modules/funnel.src.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/modules/heatmap.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/modules/heatmap.src.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/modules/map.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/modules/map.src.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/modules/no-data-to-display.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/modules/no-data-to-display.src.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/themes/dark-blue.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/themes/dark-green.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/themes/gray.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/themes/grid.js (100%) rename src/main/webapp/{js => static}/ue/third-party/highcharts/themes/skies.js (100%) rename src/main/webapp/{js => static}/ue/third-party/jquery-1.10.2.js (100%) rename src/main/webapp/{js => static}/ue/third-party/jquery-1.10.2.min.js (100%) rename src/main/webapp/{js => static}/ue/third-party/jquery-1.10.2.min.map (100%) rename src/main/webapp/{js => static}/ue/third-party/snapscreen/UEditorSnapscreen.exe (100%) rename src/main/webapp/{js => static}/ue/third-party/video-js/font/vjs.eot (100%) rename src/main/webapp/{js => static}/ue/third-party/video-js/font/vjs.svg (100%) rename src/main/webapp/{js => static}/ue/third-party/video-js/font/vjs.ttf (100%) rename src/main/webapp/{js => static}/ue/third-party/video-js/font/vjs.woff (100%) rename src/main/webapp/{js => static}/ue/third-party/video-js/video-js.css (100%) rename src/main/webapp/{js => static}/ue/third-party/video-js/video-js.min.css (100%) rename src/main/webapp/{js => static}/ue/third-party/video-js/video-js.swf (100%) rename src/main/webapp/{js => static}/ue/third-party/video-js/video.dev.js (100%) rename src/main/webapp/{js => static}/ue/third-party/video-js/video.js (100%) rename src/main/webapp/{js => static}/ue/third-party/webuploader/Uploader.swf (100%) rename src/main/webapp/{js => static}/ue/third-party/webuploader/webuploader.css (100%) rename src/main/webapp/{js => static}/ue/third-party/webuploader/webuploader.custom.js (100%) rename src/main/webapp/{js => static}/ue/third-party/webuploader/webuploader.custom.min.js (100%) rename src/main/webapp/{js => static}/ue/third-party/webuploader/webuploader.flashonly.js (100%) rename src/main/webapp/{js => static}/ue/third-party/webuploader/webuploader.flashonly.min.js (100%) rename src/main/webapp/{js => static}/ue/third-party/webuploader/webuploader.html5only.js (100%) rename src/main/webapp/{js => static}/ue/third-party/webuploader/webuploader.html5only.min.js (100%) rename src/main/webapp/{js => static}/ue/third-party/webuploader/webuploader.js (100%) rename src/main/webapp/{js => static}/ue/third-party/webuploader/webuploader.min.js (100%) rename src/main/webapp/{js => static}/ue/third-party/webuploader/webuploader.withoutimage.js (100%) rename src/main/webapp/{js => static}/ue/third-party/webuploader/webuploader.withoutimage.min.js (100%) rename src/main/webapp/{js => static}/ue/third-party/xss.min.js (100%) rename src/main/webapp/{js => static}/ue/third-party/zeroclipboard/ZeroClipboard.js (100%) rename src/main/webapp/{js => static}/ue/third-party/zeroclipboard/ZeroClipboard.min.js (100%) rename src/main/webapp/{js => static}/ue/third-party/zeroclipboard/ZeroClipboard.swf (100%) rename src/main/webapp/{js => static}/ue/ueditor.all.js (100%) rename src/main/webapp/{js => static}/ue/ueditor.all.min.js (100%) rename src/main/webapp/{js => static}/ue/ueditor.config.js (100%) rename src/main/webapp/{js => static}/ue/ueditor.parse.js (100%) rename src/main/webapp/{js => static}/ue/ueditor.parse.min.js (100%) create mode 100644 src/main/webapp/static/validationEngine/jquery.validationEngine-zh_CN.min.js create mode 100644 src/main/webapp/static/validationEngine/jquery.validationEngine.min.js create mode 100644 src/main/webapp/static/validationEngine/validationEngine.jquery.min.css diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/filter/LoginFilter.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/filter/LoginFilter.java index 9075410..0da483f 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/filter/LoginFilter.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/filter/LoginFilter.java @@ -36,6 +36,7 @@ " /*/register/**\n" + " /*/captcha/**\n" + " /*/css/**\n" + + " /*/static/**\n" + " /*/js/**\n" + " /*/image/**\n" + " /*/jsonp/**\n" + diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html index 91898d4..8ae510b 100644 --- a/src/main/webapp/index.html +++ b/src/main/webapp/index.html @@ -6,19 +6,17 @@ 登陆系统 - - + + - - - - - + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + \ No newline at end of file From a360e3dd532cca3bccbac50eb0d2d0486699703e Mon Sep 17 00:00:00 2001 From: netbuffer Date: Wed, 14 Mar 2018 09:26:31 +0800 Subject: [PATCH 24/60] enable spring-boot-devtools --- pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pom.xml b/pom.xml index b340629..a7888f6 100644 --- a/pom.xml +++ b/pom.xml @@ -56,6 +56,7 @@ org.springframework.boot spring-boot-devtools + true @@ -158,6 +159,9 @@ org.springframework.boot spring-boot-maven-plugin + + true + maven-compiler-plugin From 2b527ccde7c9e48ef7ca1b4edd07bd521f7e68be Mon Sep 17 00:00:00 2001 From: netbuffer Date: Mon, 19 Mar 2018 15:58:05 +0800 Subject: [PATCH 25/60] use druid-spring-boot-starter --- pom.xml | 10 +++- .../config/DruidConfiguration.java | 46 ------------------- .../resources/application-dev.propertiesbak | 8 ---- src/main/resources/application-dev.yaml | 32 +++++++++---- src/main/resources/application.propertiesbak | 1 - 5 files changed, 31 insertions(+), 66 deletions(-) delete mode 100644 src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/DruidConfiguration.java delete mode 100644 src/main/resources/application-dev.propertiesbak delete mode 100644 src/main/resources/application.propertiesbak diff --git a/pom.xml b/pom.xml index a7888f6..5a02742 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.3.RELEASE + 1.5.3.RELEASE @@ -59,6 +59,12 @@ true + + com.alibaba + druid-spring-boot-starter + 1.1.4 + + @@ -108,7 +114,7 @@ com.alibaba druid - 1.0.21 + 1.1.9 diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/DruidConfiguration.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/DruidConfiguration.java deleted file mode 100644 index 460c202..0000000 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/DruidConfiguration.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.com.ttblog.spring_boot_bootstrap_table.config; - -import com.alibaba.druid.pool.DruidDataSource; -import com.alibaba.druid.support.http.StatViewServlet; -import com.alibaba.druid.support.http.WebStatFilter; -import net.sf.log4jdbc.sql.jdbcapi.DataSourceSpy; -import org.springframework.boot.context.embedded.FilterRegistrationBean; -import org.springframework.boot.context.embedded.ServletRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import javax.sql.DataSource; -import java.sql.SQLException; - -@Configuration -public class DruidConfiguration { - - @Bean - public ServletRegistrationBean druidServlet() { - return new ServletRegistrationBean(new StatViewServlet(), "/druid/*"); - } - - @Bean - public DataSource druidDataSource() { - DruidDataSource druidDataSource = new DruidDataSource(); - druidDataSource.setDriverClassName("com.mysql.jdbc.Driver"); - druidDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/u"); - druidDataSource.setUsername("root"); - druidDataSource.setPassword("root"); - try { - druidDataSource.setFilters("stat, wall"); - } catch (SQLException e) { - e.printStackTrace(); - } - DataSourceSpy dataSourceSpy=new DataSourceSpy(druidDataSource); - return dataSourceSpy; - } - - @Bean - public FilterRegistrationBean filterRegistrationBean() { - FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); - filterRegistrationBean.setFilter(new WebStatFilter()); - filterRegistrationBean.addUrlPatterns("/*"); - filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); - return filterRegistrationBean; - } -} \ No newline at end of file diff --git a/src/main/resources/application-dev.propertiesbak b/src/main/resources/application-dev.propertiesbak deleted file mode 100644 index 148289a..0000000 --- a/src/main/resources/application-dev.propertiesbak +++ /dev/null @@ -1,8 +0,0 @@ -server.port=8081 -server.context-path=/s -spring.datasource.driver-class-name=com.mysql.jdbc.Driver -spring.datasource.url=jdbc:mysql://127.0.0.1:3306/u -spring.datasource.username=root -spring.datasource.password=root -spring.mvc.view.prefix=/WEB-INF/ -spring.mvc.view.suffix=.jsp \ No newline at end of file diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index 15a5239..439c576 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -5,15 +5,29 @@ endpoints: shutdown: enabled: true #启用shutdown management: - context-path: /mge #actuator访问路径前缀,便于做统一的拦截处理 -#spring: -# datasource: -# type: com.alibaba.druid.pool.DruidDataSource -# driver-class-name: com.mysql.jdbc.Driver -# url: jdbc:mysql://127.0.0.1:3306/u -# username: root -# password: root -# initial-size: 3 + context-path: /mge + +# 配置:https://github.com/alibaba/druid/blob/master/druid-spring-boot-starter/src/test/resources/config-template.properties +spring: + datasource: + druid: + url: jdbc:mysql://127.0.0.1:3306/u + username: root + password: root + driver-class-name: com.mysql.jdbc.Driver + initial-size: 1 + min-idle: 1 + max-active: 5 + validation-query: select 1 + filters : stat,slf4j,wall + filter: + slf4j: + enabled: true + statement-close-after-log-enabled: false + result-set-open-after-log-enabled: false + result-set-close-after-log-enabled : false + +#actuator访问路径前缀,便于做统一的拦截处理 # 测试发现在Config文件中配置jsp的路径才有效,这里配置不生效 #spring: # mvc: diff --git a/src/main/resources/application.propertiesbak b/src/main/resources/application.propertiesbak deleted file mode 100644 index 257b306..0000000 --- a/src/main/resources/application.propertiesbak +++ /dev/null @@ -1 +0,0 @@ -spring.profiles.active=dev \ No newline at end of file From 8f776d7f75b83fc6742b98c6aa98d917d42de948 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Mon, 19 Mar 2018 16:03:06 +0800 Subject: [PATCH 26/60] add font --- ...97wLxj96qwHyNIkxPesZW2xOQ-xsNqO47m55DA.woff2 | Bin 0 -> 14556 bytes ...k-tfSpn0qi1SFdUfVtXRa8TVwTICgirnJhmVJw.woff2 | Bin 0 -> 14524 bytes ...nzeo3R5zSexge8UUVtXRa8TVwTICgirnJhmVJw.woff2 | Bin 0 -> 14596 bytes src/main/webapp/css/css.css | 8 ++++---- 4 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 src/main/webapp/css/2tsd397wLxj96qwHyNIkxPesZW2xOQ-xsNqO47m55DA.woff2 create mode 100644 src/main/webapp/css/Hgo13k-tfSpn0qi1SFdUfVtXRa8TVwTICgirnJhmVJw.woff2 create mode 100644 src/main/webapp/css/RxZJdnzeo3R5zSexge8UUVtXRa8TVwTICgirnJhmVJw.woff2 diff --git a/src/main/webapp/css/2tsd397wLxj96qwHyNIkxPesZW2xOQ-xsNqO47m55DA.woff2 b/src/main/webapp/css/2tsd397wLxj96qwHyNIkxPesZW2xOQ-xsNqO47m55DA.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0c7c5bcd257b663f2d29fbed2662efaa4f16afe4 GIT binary patch literal 14556 zcmV<2I3ve*Pew8T0RR91065$L5dZ)H0D~j|062O80ssI200000000000000000000 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 G1poj{?k;fv literal 0 HcmV?d00001 diff --git a/src/main/webapp/css/Hgo13k-tfSpn0qi1SFdUfVtXRa8TVwTICgirnJhmVJw.woff2 b/src/main/webapp/css/Hgo13k-tfSpn0qi1SFdUfVtXRa8TVwTICgirnJhmVJw.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c34c128065cbeee902296858fc0fc97860766212 GIT binary patch literal 14524 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/css/css.css b/src/main/webapp/css/css.css index f200843..a0e7698 100644 --- a/src/main/webapp/css/css.css +++ b/src/main/webapp/css/css.css @@ -2,25 +2,25 @@ font-family: 'Roboto'; font-style: normal; font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url(http://fonts.gstatic.com/s/roboto/v15/2tsd397wLxj96qwHyNIkxPesZW2xOQ-xsNqO47m55DA.woff2) format('woff2'); + src: local('Roboto Thin'), local('Roboto-Thin'), url(2tsd397wLxj96qwHyNIkxPesZW2xOQ-xsNqO47m55DA.woff2) format('woff2'); } @font-face { font-family: 'Roboto'; font-style: normal; font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url(http://fonts.gstatic.com/s/roboto/v15/Hgo13k-tfSpn0qi1SFdUfVtXRa8TVwTICgirnJhmVJw.woff2) format('woff2'); + src: local('Roboto Light'), local('Roboto-Light'), url(Hgo13k-tfSpn0qi1SFdUfVtXRa8TVwTICgirnJhmVJw.woff2) format('woff2'); } @font-face { font-family: 'Roboto'; font-style: normal; font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url(http://fonts.gstatic.com/s/roboto/v15/CWB0XYA8bzo0kSThX0UTuA.woff2) format('woff2'); + src: local('Roboto'), local('Roboto-Regular'), url(CWB0XYA8bzo0kSThX0UTuA.woff2) format('woff2'); } @font-face { font-family: 'Roboto'; font-style: normal; font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url(http://fonts.gstatic.com/s/roboto/v15/RxZJdnzeo3R5zSexge8UUVtXRa8TVwTICgirnJhmVJw.woff2) format('woff2'); + src: local('Roboto Medium'), local('Roboto-Medium'), url(RxZJdnzeo3R5zSexge8UUVtXRa8TVwTICgirnJhmVJw.woff2) format('woff2'); } .formError .formErrorContent { background-color: #c0c0c0; From 9301310fc72a3f2352b4f4eb92a277f768a9b467 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Mon, 19 Mar 2018 22:23:41 +0800 Subject: [PATCH 27/60] spring boot banner config --- src/main/resources/application.yaml | 4 ++++ src/main/resources/banner.txt | 3 +++ src/main/resources/docker.jpg | Bin 0 -> 7546 bytes src/main/resources/logback-springboot.xml | 6 +++--- 4 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/banner.txt create mode 100644 src/main/resources/docker.jpg diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 1b6a019..72f35bf 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -1,3 +1,7 @@ +banner: + image: + location: docker.jpg + location: banner.txt spring: profiles: active: dev diff --git a/src/main/resources/banner.txt b/src/main/resources/banner.txt new file mode 100644 index 0000000..e740cb5 --- /dev/null +++ b/src/main/resources/banner.txt @@ -0,0 +1,3 @@ +${AnsiColor.RED}${AnsiStyle.BOLD}${AnsiStyle.UNDERLINE}application-title:${application.title} +${AnsiColor.BLUE}${AnsiBackground.BRIGHT_BLACK}spring-boot.version:${spring-boot.version} +${AnsiColor.BRIGHT_CYAN}application.version:${application.version} \ No newline at end of file diff --git a/src/main/resources/docker.jpg b/src/main/resources/docker.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7d60799ea60138e8c59d04a20a2759cede8fbafb GIT binary patch literal 7546 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 M-v4tH>k;)o0Q^{SQUCw| literal 0 HcmV?d00001 diff --git a/src/main/resources/logback-springboot.xml b/src/main/resources/logback-springboot.xml index 6c5a670..4d93506 100644 --- a/src/main/resources/logback-springboot.xml +++ b/src/main/resources/logback-springboot.xml @@ -1,5 +1,5 @@ - + @@ -50,7 +50,7 @@ --> - + @@ -94,7 +94,7 @@ - + From ef063d1c7b9c0c23ca290b7e39a753ae1736cd6d Mon Sep 17 00:00:00 2001 From: netbuffer Date: Mon, 19 Mar 2018 23:01:32 +0800 Subject: [PATCH 28/60] enable management --- .../controller/IndexController.java | 207 +++++++++--------- src/main/resources/application-dev.yaml | 2 + src/main/webapp/error.jsp | 2 +- 3 files changed, 108 insertions(+), 103 deletions(-) diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java index 8b578b6..6d1aa50 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/IndexController.java @@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; + import javax.annotation.Resource; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; @@ -24,109 +25,111 @@ import java.util.HashMap; import java.util.Map; -@Controller(value="mainindex") +@Controller(value = "mainindex") @RequestMapping("/") public class IndexController { - public IndexController(){ - - } - @Resource - private IUserService userService; - - private Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Autowired - private ApplicationContext applicationContext; - - @RequestMapping(method = RequestMethod.GET) - public String index(){ - logger.info("index页面"); - return "redirect:index.html"; - } - - @RequestMapping(value = "/welcome",method = RequestMethod.GET) - public String welcome(Model m){ - logger.info("welcome页面"); - m.addAttribute("user","world"); - return "welcome"; - } - - @RequestMapping(value = "/error",method = RequestMethod.GET) - public String error(){ - logger.info("error页面"); - return "500"; - } - - //打开登录 - @RequestMapping(value = "/login",method = RequestMethod.GET) - public String login(@RequestParam(value="requri",required=false) String requri) { - return "redirect:/index.html?requri="+requri; - } - - //登录处理 - @RequestMapping(value = "/login",method = RequestMethod.POST) - public String login(HttpSession session, HttpServletRequest request, - HttpServletResponse response, String username, String password,@RequestParam(value="requri",required=false) String requri) { + public IndexController() { + + } + + @Resource + private IUserService userService; + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private ApplicationContext applicationContext; + + @RequestMapping(method = RequestMethod.GET) + public String index() { + logger.info("index页面"); + return "redirect:index.html"; + } + + @RequestMapping(value = "/welcome", method = RequestMethod.GET) + public String welcome(Model m) { + logger.info("welcome页面"); + m.addAttribute("user", "world"); + return "welcome"; + } + + @RequestMapping(value = "/error", method = RequestMethod.GET) + public String error() { + logger.info("500页面"); + return "500"; + } + + //打开登录 + @RequestMapping(value = "/login", method = RequestMethod.GET) + public String login(@RequestParam(value = "requri", required = false) String requri) { + return "redirect:/index.html?requri=" + requri; + } + + //登录处理 + @RequestMapping(value = "/login", method = RequestMethod.POST) + public String login(HttpSession session, HttpServletRequest request, + HttpServletResponse response, String username, String password, @RequestParam(value = "requri", required = false) String requri) { // RequestContextUtils.getWebApplicationContext(request) - logger.info("进入username:{},pwd:{},requri:{}", username, password,requri); - if (username.equals(ConfigConstant.USERNAME) - && password.equals("admin")) { - session.setAttribute(ConfigConstant.ISLOGIN, true); - session.setAttribute(ConfigConstant.USERNAME, username); - Cookie c = new Cookie(ConfigConstant.USERNAME, username); - c.setMaxAge(86400); - response.addCookie(c); - Map param=new HashMap(); - param.put("loginname", username); - param.put("logintime", new DateTime().toString("yyyy-MM-dd HH:mm:ss")); - param.put("loginip", request.getRemoteAddr()); - if(requri!=null&&requri.length()>0){ - String uri=new String(Base64.decodeBase64(requri)); - String touri=uri.substring(request.getContextPath().length()+1); - logger.debug("request.getContextPath():{} decode-requri:{} touri:{}",request.getContextPath(),uri,touri); - if(StringUtils.isNotBlank(touri)&&!touri.equals("/")){ - return "redirect:/"+touri; - } - } - return "redirect:/manage.html"; - } else { - return "redirect:/index.html?requri="+requri; - } - } - - //demo页面 - @RequestMapping(value = "/demo",method = RequestMethod.GET) - public String demolist() { - logger.debug("demo"); - return "redirect:/demolist.html"; - } - - //退出系统 - @RequestMapping(value = "/exit",method = RequestMethod.GET) - public String exit(HttpSession session,HttpServletRequest request, - HttpServletResponse response) { - logger.debug("用户{}退出系统",session.getAttribute(ConfigConstant.USERNAME)); - //删除cookie - Cookie cookie = new Cookie(ConfigConstant.USERNAME, null); - cookie.setMaxAge(0); - session.invalidate(); - logger.debug("exit c2:{}",cookie); - response.addCookie(cookie); - return "redirect:/index.html"; - } - - //终止服务器 - @RequestMapping("/sysexit") - public String sysexit(){ - //退出当前jvm,导致容器停止(tomcat关闭等) - System.exit(-1); - return "exit"; - } - - @ExceptionHandler - public ModelAndView handleAllException(Exception ex) { - ModelAndView mav = new ModelAndView("500"); - mav.addObject("errMsg", ex.getMessage()); - return mav; - } + logger.info("进入username:{},pwd:{},requri:{}", username, password, requri); + if (username.equals(ConfigConstant.USERNAME) + && password.equals("admin")) { + session.setAttribute(ConfigConstant.ISLOGIN, true); + session.setAttribute(ConfigConstant.USERNAME, username); + Cookie c = new Cookie(ConfigConstant.USERNAME, username); + c.setMaxAge(86400); + response.addCookie(c); + Map param = new HashMap(); + param.put("loginname", username); + param.put("logintime", new DateTime().toString("yyyy-MM-dd HH:mm:ss")); + param.put("loginip", request.getRemoteAddr()); + if (requri != null && requri.length() > 0) { + String uri = new String(Base64.decodeBase64(requri)); + String touri = uri.substring(request.getContextPath().length() + 1); + logger.debug("request.getContextPath():{} decode-requri:{} touri:{}", request.getContextPath(), uri, touri); + if (StringUtils.isNotBlank(touri) && !touri.equals("/")) { + return "redirect:/" + touri; + } + } + return "redirect:/manage.html"; + } else { + return "redirect:/index.html?requri=" + requri; + } + } + + //demo页面 + @RequestMapping(value = "/demo", method = RequestMethod.GET) + public String demolist() { + logger.debug("demo"); + return "redirect:/demolist.html"; + } + + //退出系统 + @RequestMapping(value = "/exit", method = RequestMethod.GET) + public String exit(HttpSession session, HttpServletRequest request, + HttpServletResponse response) { + logger.debug("用户{}退出系统", session.getAttribute(ConfigConstant.USERNAME)); + //删除cookie + Cookie cookie = new Cookie(ConfigConstant.USERNAME, null); + cookie.setMaxAge(0); + session.invalidate(); + logger.debug("exit c2:{}", cookie); + response.addCookie(cookie); + return "redirect:/index.html"; + } + + //终止服务器 + @RequestMapping("/sysexit") + public String sysexit() { + //退出当前jvm,导致容器停止(tomcat关闭等) + System.exit(-1); + return "exit"; + } + + @ExceptionHandler + public ModelAndView handleAllException(Exception ex) { + logger.error("backend error:", ex); + ModelAndView mav = new ModelAndView("500"); + mav.addObject("errMsg", ex.getMessage()); + return mav; + } } \ No newline at end of file diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index 439c576..ed278c6 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -6,6 +6,8 @@ endpoints: enabled: true #启用shutdown management: context-path: /mge + security: + enabled: false # 配置:https://github.com/alibaba/druid/blob/master/druid-spring-boot-starter/src/test/resources/config-template.properties spring: diff --git a/src/main/webapp/error.jsp b/src/main/webapp/error.jsp index 2e49ccf..488b5ae 100644 --- a/src/main/webapp/error.jsp +++ b/src/main/webapp/error.jsp @@ -1,4 +1,4 @@ -<%@ page language="java" isErrorPage="true" errorPage="500.jsp" +<%@ page language="java" isErrorPage="true" errorPage="error.jsp" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%-- <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> --%> From 23e597df2d6e44dd0aeed33b9fb58b3d86849ddc Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 20 Mar 2018 09:48:54 +0800 Subject: [PATCH 29/60] update --- src/main/resources/application.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 72f35bf..184893b 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -6,7 +6,7 @@ spring: profiles: active: dev logging: - # loback配置文件命名为logback.xml会导致启动不起来 + # logback配置文件命名为logback.xml会导致启动不起来 config: classpath:logback-springboot.xml endpoints: shutdown: From 318cde34e1b4c5275381b54cb7ee08ce43b6313b Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 20 Mar 2018 14:40:28 +0800 Subject: [PATCH 30/60] update --- README.md | 6 +++++- pom.xml | 3 +++ src/main/resources/application-dev.yaml | 5 +++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bf832df..a9fa8cb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,10 @@ ### spring-boot bootstrap_table demo --- -* spring-boot 1.4.3 +* spring-boot 1.5.3 +* spring-boot-starter-actuator +* spring-boot-devtools +* spring-data-jpa +* druid-spring-boot-starter 1.1.4 * integration with jsp * bootstrap-table1.9 * bootstrap3 diff --git a/pom.xml b/pom.xml index 5a02742..9c114c3 100644 --- a/pom.xml +++ b/pom.xml @@ -89,15 +89,18 @@ javax.servlet javax.servlet-api + provided javax.servlet jstl + provided javax.el javax.el-api 3.0.0 + provided javax.servlet.jsp diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index ed278c6..d9fd458 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -20,7 +20,12 @@ spring: initial-size: 1 min-idle: 1 max-active: 5 + max-wait: 120000 validation-query: select 1 + min-evictable-idle-time-millis: 60000 + max-evictable-idle-time-millis: 600000 + test-while-idle: true + test-on-borrow: true filters : stat,slf4j,wall filter: slf4j: From 7c518f3755b2bce168d7a06f5052dc3c3f1ebc77 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 3 Apr 2018 20:50:21 +0800 Subject: [PATCH 31/60] update git address --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index a9fa8cb..9b61901 100644 --- a/README.md +++ b/README.md @@ -11,14 +11,14 @@ * log4jdbc-log4j2 # other projects -> `ssmbootstrap_table(spring+springmvc+mybatis)` github:[https://github.com/netbuffer/ssmbootstrap_table](https://github.com/netbuffer/ssmbootstrap_table)`/`git@osc:[https://git.oschina.net/gradle/ssmbootstrap_table](https://git.oschina.net/gradle/ssmbootstrap_table) +> `ssmbootstrap_table(spring+springmvc+mybatis)` github:[https://github.com/netbuffer/ssmbootstrap_table](https://github.com/netbuffer/ssmbootstrap_table)`/`git@osc:[https://gitee.com/netbuffer/ssmbootstrap_table](https://gitee.com/netbuffer/ssmbootstrap_table) -> `ssmbt(ssmbootstrap_table maven module )` github:[https://github.com/netbuffer/ssmbt](https://github.com/netbuffer/ssmbt)`/`git@osc:[https://git.oschina.net/netbuffer/ssmbt](https://git.oschina.net/netbuffer/ssmbt) +> `ssmbt(ssmbootstrap_table maven module )` github:[https://github.com/netbuffer/ssmbt](https://github.com/netbuffer/ssmbt)`/`git@osc:[https://gitee.com/netbuffer/ssmbt](https://gitee.com/netbuffer/ssmbt) -> `sssbootstrap_table(spring+springmvc+spring data jpa)` github:[https://github.com/netbuffer/sssbootstrap_table](https://github.com/netbuffer/sssbootstrap_table)`/`git@osc:[https://git.oschina.net/netbuffer/sssbootstrap_table](https://git.oschina.net/netbuffer/sssbootstrap_table) +> `sssbootstrap_table(spring+springmvc+spring data jpa)` github:[https://github.com/netbuffer/sssbootstrap_table](https://github.com/netbuffer/sssbootstrap_table)`/`git@osc:[https://gitee.com/netbuffer/sssbootstrap_table](https://gitee.com/netbuffer/sssbootstrap_table) -> `sshbootstrap_table(spring+struts2+hibernate)` github:[https://github.com/netbuffer/sshbootstrap-table](https://github.com/netbuffer/sshbootstrap-table)`/`git@osc:[https://git.oschina.net/netbuffer/sshbootstrap-table](https://git.oschina.net/netbuffer/sshbootstrap-table) +> `sshbootstrap_table(spring+struts2+hibernate)` github:[https://github.com/netbuffer/sshbootstrap-table](https://github.com/netbuffer/sshbootstrap-table)`/`git@osc:[https://gitee.com/netbuffer/sshbootstrap-table](https://gitee.com/netbuffer/sshbootstrap-table) -> `jfinal-bootstrap-table(jfinal)`github:[https://github.com/netbuffer/jfinal-bootstrap-table](https://github.com/netbuffer/jfinal-bootstrap-table)`/`git@osc:[http://git.oschina.net/gradle/jfinal-bootstrap-table](http://git.oschina.net/gradle/jfinal-bootstrap-table) +> `jfinal-bootstrap-table(jfinal)`github:[https://github.com/netbuffer/jfinal-bootstrap-table](https://github.com/netbuffer/jfinal-bootstrap-table)`/`git@osc:[http://gitee.com/netbuffer/jfinal-bootstrap-table](http://gitee.com/netbuffer/jfinal-bootstrap-table) -> `medoo_bootstrap_table(php5)`github:[https://github.com/netbuffer/medoo_bootstrap_table](https://github.com/netbuffer/medoo_bootstrap_table)`/`git@osc:[http://git.oschina.net/gradle/medoo_bootstrap_table](http://git.oschina.net/gradle/medoo_bootstrap_table) +> `medoo_bootstrap_table(php5)`github:[https://github.com/netbuffer/medoo_bootstrap_table](https://github.com/netbuffer/medoo_bootstrap_table)`/`git@osc:[http://gitee.com/netbuffer/medoo_bootstrap_table](http://gitee.com/netbuffer/medoo_bootstrap_table) From c549d323811aca312d61af0cbc6288983577dff4 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 10 May 2018 22:34:19 +0800 Subject: [PATCH 32/60] add logback status --- .../config/MvcConfig.java | 23 ++++++++++++++----- .../controller/LogbackController.java | 20 ++++++++++++++++ 2 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/LogbackController.java diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfig.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfig.java index cdf45b8..1e8eebc 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfig.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfig.java @@ -1,9 +1,9 @@ package cn.com.ttblog.spring_boot_bootstrap_table.config; +import ch.qos.logback.classic.ViewStatusMessagesServlet; import cn.com.ttblog.spring_boot_bootstrap_table.interceptor.SpringMvcInterceptor; import cn.com.ttblog.spring_boot_bootstrap_table.views.JsonViewResolver; -import com.alibaba.fastjson.support.spring.FastJsonJsonView; -import org.springframework.beans.factory.BeanFactory; +import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; @@ -20,11 +20,11 @@ import java.util.List; /** - * spring boot默认的错误处理由org.springframework.boot.autoconfigure.web.BasicErrorController处理, + * spring boot默认的错误处理由org.springframework.boot.autoconfigure.web.BasicErrorController处理, */ @Configuration @EnableWebMvc -public class MvcConfig extends WebMvcConfigurerAdapter{ +public class MvcConfig extends WebMvcConfigurerAdapter { @Override public void configureContentNegotiation( @@ -41,14 +41,14 @@ public ViewResolver contentNegotiatingViewResolver( List resolvers = new ArrayList(); // jsp view resolver resolvers.add(internalResourceViewResolver()); - JsonViewResolver jsonViewResolver=new JsonViewResolver(); + JsonViewResolver jsonViewResolver = new JsonViewResolver(); resolvers.add(jsonViewResolver); resolver.setViewResolvers(resolvers); return resolver; } @Bean - public ViewResolver internalResourceViewResolver () { + public ViewResolver internalResourceViewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/"); viewResolver.setSuffix(".jsp"); @@ -77,6 +77,17 @@ public MultipartResolver multipartResolver() { return multipartResolver; } + /** + * 注册自定义的servlet + * @return + */ + @Bean + public ServletRegistrationBean AaServletRegistration() { + ServletRegistrationBean registration = new ServletRegistrationBean(new ViewStatusMessagesServlet()); + registration.addUrlMappings("/logback/status"); + return registration; + } + @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/LogbackController.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/LogbackController.java new file mode 100644 index 0000000..1e18f97 --- /dev/null +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/LogbackController.java @@ -0,0 +1,20 @@ +package cn.com.ttblog.spring_boot_bootstrap_table.controller; + +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.core.util.StatusPrinter; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/logback") +public class LogbackController { + + static final LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); + + @RequestMapping("/status/print") + public String printStatus() { + StatusPrinter.print(lc); + return "success"; + } +} From 5559456de8d87c28ed2571f836001ad463c80881 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Fri, 11 May 2018 10:03:02 +0800 Subject: [PATCH 33/60] update --- src/main/webapp/demolist.html | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/webapp/demolist.html b/src/main/webapp/demolist.html index e7bcbca..3c487b3 100644 --- a/src/main/webapp/demolist.html +++ b/src/main/webapp/demolist.html @@ -30,6 +30,7 @@

    demo list show demo!

    From b6e06b0a1415041fcb7a76f76ca995e69e170679 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sat, 26 May 2018 16:44:04 +0800 Subject: [PATCH 34/60] test getContextPath --- .../controller/TestController.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/TestController.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/TestController.java index 45c06f0..e1703a8 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/TestController.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/TestController.java @@ -6,6 +6,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import javax.servlet.http.Cookie; @@ -58,6 +59,12 @@ public String redirect(RedirectAttributes redirectAttributes, @RequestParam(valu return "redirect:/cookie.html"; } + @RequestMapping(value = "contextpath") + @ResponseBody + public String contextPath(HttpServletRequest request) { + return request.getServletContext().getContextPath(); + } + // @ExceptionHandler // public ModelAndView handleAllException(Exception ex) { // ModelAndView mav = new ModelAndView("500"); From 782d2ffaccb59c66abcfd8aa32eb530c57a7cf16 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sat, 26 May 2018 17:42:22 +0800 Subject: [PATCH 35/60] static inject --- pom.xml | 7 +++++++ .../controller/TestController.java | 15 +++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/pom.xml b/pom.xml index 9c114c3..370e062 100644 --- a/pom.xml +++ b/pom.xml @@ -26,6 +26,7 @@ UTF-8 UTF-8 1.7 + 1.16.18 @@ -160,6 +161,12 @@ log4jdbc-log4j2-jdbc4.1 1.16
    + + org.projectlombok + lombok + ${lombok.version} + true + diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/TestController.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/TestController.java index e1703a8..2eb46c1 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/TestController.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/TestController.java @@ -2,6 +2,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -20,6 +21,13 @@ public class TestController { private static final Logger LOG = LoggerFactory.getLogger(TestController.class); + public static String serverPort; + + @Value("${server.port}") + public void setServerPort(String serverPort) { + TestController.serverPort = serverPort; + } + //退出系统 @RequestMapping(value = "/err", method = RequestMethod.GET) public String exit(HttpSession session, HttpServletRequest request, @@ -65,6 +73,13 @@ public String contextPath(HttpServletRequest request) { return request.getServletContext().getContextPath(); } + @RequestMapping(value = "server/port") + @ResponseBody + public String getServerPort() { + LOG.info("server.port:{}", serverPort); + return serverPort; + } + // @ExceptionHandler // public ModelAndView handleAllException(Exception ex) { // ModelAndView mav = new ModelAndView("500"); From 3fd1d6c414771fbbc8ea0f105f4035a6b0832671 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 7 Jun 2018 16:28:09 +0800 Subject: [PATCH 36/60] rename --- .../ttblog/spring_boot_bootstrap_table/config/MvcConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfig.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfig.java index 1e8eebc..bb7b14a 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfig.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/MvcConfig.java @@ -82,7 +82,7 @@ public MultipartResolver multipartResolver() { * @return */ @Bean - public ServletRegistrationBean AaServletRegistration() { + public ServletRegistrationBean servletRegistration() { ServletRegistrationBean registration = new ServletRegistrationBean(new ViewStatusMessagesServlet()); registration.addUrlMappings("/logback/status"); return registration; From 9fa8e9a123c700b645b4441a3995718d42b12749 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Wed, 18 Jul 2018 15:58:03 +0800 Subject: [PATCH 37/60] xml output --- pom.xml | 7 +- .../controller/UserController.java | 429 +++++++++--------- .../interceptor/SpringMvcInterceptor.java | 4 + .../model/User.java | 2 +- .../serviceimpl/UserServiceImpl.java | 1 + 5 files changed, 228 insertions(+), 215 deletions(-) diff --git a/pom.xml b/pom.xml index 370e062..cb67213 100644 --- a/pom.xml +++ b/pom.xml @@ -109,7 +109,12 @@ 2.2.1-b03 provided - + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + 2.9.6 + com.alibaba fastjson diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/UserController.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/UserController.java index 06fe642..ccb1103 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/UserController.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/UserController.java @@ -11,6 +11,7 @@ import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; + import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; @@ -26,225 +27,227 @@ @RequestMapping("/user") public class UserController { - @Resource - private IUserService userService; + @Resource + private IUserService userService; - private static final Logger logger = LoggerFactory.getLogger(UserController.class); + private static final Logger logger = LoggerFactory.getLogger(UserController.class); // @InitBinder // public void initBinder(WebDataBinder binder){ // } - @RequestMapping(method=RequestMethod.GET) - public String add(Map m){ - logger.debug("to get user page"); - m.put("from","user"); - return "user/add"; - } - - @ModelAttribute - public void getUser(@RequestParam(value = "id",required = false) Long id,Map m){ - if(id!=null&&id>0){ - User user=userService.getUserById(id); - logger.info("modelattribute执行!,查询用户:{},放入map:{}",id,user); + @RequestMapping(method = RequestMethod.GET) + public String add(Map m) { + logger.debug("to get user page"); + m.put("from", "user"); + return "user/add"; + } + + @ModelAttribute + public void getUser(@RequestParam(value = "id", required = false) Long id, Map m) { + if (id != null && id > 0) { + User user = userService.getUserById(id); + logger.info("modelattribute执行!,查询用户:{},放入map:{}", id, user); // m.put("user",user); - m.put("u",user);//放入的键不是类名小写的话,那么在方法入参上需要加@ModelAttribute("u") User user标记 - } - } - //增 - @RequestMapping(method=RequestMethod.POST) - public String save(@Valid User user){ - logger.debug("save user:{}",user); - if(user.getAdddate()==null){ - user.setAdddate((int)(System.currentTimeMillis() / 1000)); - } - userService.addUser(user); - return "redirect:user"; - } - - //删 - @RequestMapping(method=RequestMethod.DELETE) - @ResponseBody - public Map delete(@RequestParam(value = "id",required =false)Long id){ - Map result=new HashMap(2); - logger.debug("delete user:{}",id); - try { - result.put("success",true); - userService.deleteById(id); - }catch (Exception e){ - result.put("success",false); - result.put("msg",e.getMessage()); - logger.error("delete user出错:{}",id,e); - } - return result; - } - - //改 - @RequestMapping(method=RequestMethod.PUT) - @ResponseBody - public Map update(@Valid @ModelAttribute("u") User user, BindingResult br){ - logger.debug("update user bindiing result:{}",br); - if(br.getFieldErrorCount()>0){ - logger.error("User校验错误:{}",br.getFieldErrors()); - } - Map result=new HashMap(2); - logger.debug("update user:{}",user); - try { - result.put("success",true); - userService.addUser(user); - }catch (Exception e){ - result.put("success",false); - result.put("msg",e.getMessage()); - logger.error("save user出错:{}",user,e); - } - result.put("user",user); - return result; - } - - @RequestMapping("/datacount") - public @ResponseBody Map datacount() { - logger.debug("获取datacount"); - List> counts = userService.getDataSum(); - JSONArray categorys = new JSONArray(); - JSONArray nums = new JSONArray(); - for (Map m : counts) { - categorys.add(m.get("adddate")==null?"":m.get("adddate").toString()); - nums.add(m.get("num").toString()); - } - logger.debug("categorys:{},nums:{}", categorys, nums); - Map data = new HashMap(); - data.put("c", categorys); - data.put("d", nums); - return data; - } - - @RequestMapping("/newdata") - public String newdata(HttpSession session, Model model) { - DecimalFormat df = new DecimalFormat("0.00"); - // Display the total amount of memory in the Java virtual machine. - long totalMem = Runtime.getRuntime().totalMemory() / 1024 / 1024; - System.out.println(df.format(totalMem) + " MB"); - // Display the maximum amount of memory that the Java virtual machine - // will attempt to use. - long maxMem = Runtime.getRuntime().maxMemory() / 1024 / 1024; - System.out.println(df.format(maxMem) + " MB"); - // Display the amount of free memory in the Java Virtual Machine. - long freeMem = Runtime.getRuntime().freeMemory() / 1024 / 1024; - System.out.println(df.format(freeMem) + " MB"); - logger.info("执行前:{}", model); - int newcount = userService.getNewData(); - String username = session.getAttribute(ConfigConstant.USERNAME).toString(); - model.addAttribute("newcount", newcount); - model.addAttribute("username", username); - logger.info("执行后:{}", model); - return "newdata"; - } - - @RequestMapping(value="/photos",method={RequestMethod.GET,RequestMethod.HEAD}) - public String photos() { - logger.debug("go to user-photos"); - return "user/photos"; - } - - @RequestMapping("/showUser/{id}") - public String toIndex(@PathVariable("id") int id, - HttpServletRequest request, Model model) { - logger.info("进入:{},参数:{}", request.getRequestURI(), model.toString()); - int userId = id; - User user = userService.getUserById(userId); - model.addAttribute("user", user); - return "su"; - } - - @RequestMapping("/testmodel") - public ModelAndView model() { - ModelAndView mav = new ModelAndView(); - User u = new User(); - u.setName("tianyu"); - u.setAge(11); - u.setDeliveryaddress("收货地址"); - mav.addObject("model", u); - return mav; - } - - /** - * 访问pdf视图 http://localhost:8080/sssbootstrap_table/user/userpdfview.pdf - * @param model - * @return - */ - @RequestMapping("/userpdfview") - public String userpdfview(Model model) { - model.addAttribute("users",userService.getUserList("desc",10,0)); - List columns=new ArrayList<>(); - columns.add("姓名"); - columns.add("性别"); - columns.add("年龄"); - columns.add("手机号"); - model.addAttribute("columns", columns); - return "userpdfview"; - } - - /** - * http://localhost:8080/sssbootstrap_table/user/userlist?order=asc&limit=10 - * &offset=0 - * - * @param order - * @param limit - * @param offset - * @param model - * @return - */ - @RequestMapping("/userlist") - public String userlist(@RequestParam(value="search",required=false)String search,String order, int limit, int offset, Model model) { - long startTime = System.nanoTime(); + m.put("u", user);//放入的键不是类名小写的话,那么在方法入参上需要加@ModelAttribute("u") User user标记 + } + } + + //增 + @RequestMapping(method = RequestMethod.POST) + public String save(@Valid User user) { + logger.debug("save user:{}", user); + if (user.getAdddate() == null) { + user.setAdddate((int) (System.currentTimeMillis() / 1000)); + } + userService.addUser(user); + return "redirect:user"; + } + + //删 + @RequestMapping(method = RequestMethod.DELETE) + @ResponseBody + public Map delete(@RequestParam(value = "id", required = false) Long id) { + Map result = new HashMap(2); + logger.debug("delete user:{}", id); + try { + result.put("success", true); + userService.deleteById(id); + } catch (Exception e) { + result.put("success", false); + result.put("msg", e.getMessage()); + logger.error("delete user出错:{}", id, e); + } + return result; + } + + //改 + @RequestMapping(method = RequestMethod.PUT) + @ResponseBody + public Map update(@Valid @ModelAttribute("u") User user, BindingResult br) { + logger.debug("update user bindiing result:{}", br); + if (br.getFieldErrorCount() > 0) { + logger.error("User校验错误:{}", br.getFieldErrors()); + } + Map result = new HashMap(2); + logger.debug("update user:{}", user); + try { + result.put("success", true); + userService.addUser(user); + } catch (Exception e) { + result.put("success", false); + result.put("msg", e.getMessage()); + logger.error("save user出错:{}", user, e); + } + result.put("user", user); + return result; + } + + @RequestMapping("/datacount") + public @ResponseBody + Map datacount() { + logger.debug("获取datacount"); + List> counts = userService.getDataSum(); + JSONArray categorys = new JSONArray(); + JSONArray nums = new JSONArray(); + for (Map m : counts) { + categorys.add(m.get("adddate") == null ? "" : m.get("adddate").toString()); + nums.add(m.get("num").toString()); + } + logger.debug("categorys:{},nums:{}", categorys, nums); + Map data = new HashMap(); + data.put("c", categorys); + data.put("d", nums); + return data; + } + + @RequestMapping("/newdata") + public String newdata(HttpSession session, Model model) { + DecimalFormat df = new DecimalFormat("0.00"); + // Display the total amount of memory in the Java virtual machine. + long totalMem = Runtime.getRuntime().totalMemory() / 1024 / 1024; + System.out.println(df.format(totalMem) + " MB"); + // Display the maximum amount of memory that the Java virtual machine + // will attempt to use. + long maxMem = Runtime.getRuntime().maxMemory() / 1024 / 1024; + System.out.println(df.format(maxMem) + " MB"); + // Display the amount of free memory in the Java Virtual Machine. + long freeMem = Runtime.getRuntime().freeMemory() / 1024 / 1024; + System.out.println(df.format(freeMem) + " MB"); + logger.info("执行前:{}", model); + int newcount = userService.getNewData(); + String username = session.getAttribute(ConfigConstant.USERNAME).toString(); + model.addAttribute("newcount", newcount); + model.addAttribute("username", username); + logger.info("执行后:{}", model); + return "newdata"; + } + + @RequestMapping(value = "/photos", method = {RequestMethod.GET, RequestMethod.HEAD}) + public String photos() { + logger.debug("go to user-photos"); + return "user/photos"; + } + + @RequestMapping("/showUser/{id}") + public String toIndex(@PathVariable("id") int id, + HttpServletRequest request, Model model) { + logger.info("进入:{},参数:{}", request.getRequestURI(), model.toString()); + int userId = id; + User user = userService.getUserById(userId); + model.addAttribute("user", user); + return "su"; + } + + @RequestMapping("/testmodel") + public ModelAndView model() { + ModelAndView mav = new ModelAndView(); + User u = new User(); + u.setName("tianyu"); + u.setAge(11); + u.setDeliveryaddress("收货地址"); + mav.addObject("model", u); + return mav; + } + + /** + * 访问pdf视图 http://localhost:8080/sssbootstrap_table/user/userpdfview.pdf + * + * @param model + * @return + */ + @RequestMapping("/userpdfview") + public String userpdfview(Model model) { + model.addAttribute("users", userService.getUserList("desc", 10, 0)); + List columns = new ArrayList<>(); + columns.add("姓名"); + columns.add("性别"); + columns.add("年龄"); + columns.add("手机号"); + model.addAttribute("columns", columns); + return "userpdfview"; + } + + /** + * http://localhost:8080/sssbootstrap_table/user/userlist?order=asc&limit=10 + * &offset=0 + * + * @param order + * @param limit + * @param offset + * @param model + * @return + */ + @RequestMapping("/userlist") + public String userlist(@RequestParam(value = "search", required = false) String search, String order, int limit, int offset, Model model) { + long startTime = System.nanoTime(); // logger.info("参数:{},{},{}", order, limit, offset); - if(search!=null){ - try { - //get参数乱码问题:http://luanxiyuan.iteye.com/blog/1849169 - search=new String(search.getBytes("ISO-8859-1"), "UTF-8"); - logger.info("查询参数:{}", search); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - - } - List users =search==null? userService.getUserList(order, limit, offset): userService.getUserList(search,order, limit, offset); - long total = search==null?userService.getUserListCount():userService.getUserListCount(search); - model.addAttribute("total", total); - model.addAttribute("rows", users); - logger.info("结果:{}", model); - long estimatedTime = System.nanoTime() - startTime; - logger.debug("userlist execute with:{}ns",estimatedTime); - return "userlist"; - } - - @RequestMapping("/delete") - @ResponseBody - public String delete(@RequestParam(value="id",required=false,defaultValue="0") String id) { - logger.info("删除用户:{}", id); - userService.deleteById(Long.parseLong(id)); - return "delete"; - } - - @RequestMapping("/showUserXML") - public ModelAndView showUserXML(HttpServletRequest request, Model model) { - ModelAndView mav = new ModelAndView("xStreamMarshallingView"); - int userId = Integer.parseInt("1"); - User user = userService.getUserById(userId); - return mav; - } - - @RequestMapping(method = RequestMethod.GET, value = "/u/{id}", headers = "Accept=application/json") - public @ResponseBody User getEmp(@PathVariable String id) { - User e = userService.getUserById(1); - return e; - } - - @RequestMapping(method = RequestMethod.GET, value = "/us", headers = "Accept=application/json") - public @ResponseBody List ListinggetAllEmp() { - List us = new ArrayList(); - us.add(userService.getUserById(1)); - us.add(userService.getUserById(2)); - return us; - } + if (search != null) { + try { + //get参数乱码问题:http://luanxiyuan.iteye.com/blog/1849169 + search = new String(search.getBytes("ISO-8859-1"), "UTF-8"); + logger.info("查询参数:{}", search); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + } + List users = search == null ? userService.getUserList(order, limit, offset) : userService.getUserList(search, order, limit, offset); + long total = search == null ? userService.getUserListCount() : userService.getUserListCount(search); + model.addAttribute("total", total); + model.addAttribute("rows", users); + logger.info("结果:{}", model); + long estimatedTime = System.nanoTime() - startTime; + logger.debug("userlist execute with:{}ns", estimatedTime); + return "userlist"; + } + + @RequestMapping("/delete") + @ResponseBody + public String delete(@RequestParam(value = "id", required = false, defaultValue = "0") String id) { + logger.info("删除用户:{}", id); + userService.deleteById(Long.parseLong(id)); + return "delete"; + } + + @RequestMapping(value = "/xml/{id}", produces = {"application/xml;charset=UTF-8"}) + @ResponseBody + public User getXmlUser(@PathVariable Long id) { + return userService.getUserById(id); + } + + @RequestMapping(method = RequestMethod.GET, value = "/u/{id}", headers = "Accept=application/json") + public @ResponseBody + User getUser(@PathVariable String id) { + return userService.getUserById(1); + } + + @RequestMapping(method = RequestMethod.GET, value = "/us", headers = "Accept=application/json") + public @ResponseBody + List listUsers() { + List users = new ArrayList(); + users.add(userService.getUserById(1)); + users.add(userService.getUserById(2)); + return users; + } } \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/interceptor/SpringMvcInterceptor.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/interceptor/SpringMvcInterceptor.java index 4759391..e7c632b 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/interceptor/SpringMvcInterceptor.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/interceptor/SpringMvcInterceptor.java @@ -11,6 +11,7 @@ public class SpringMvcInterceptor extends HandlerInterceptorAdapter{ private static final Logger LOG= LoggerFactory.getLogger(SpringMvcInterceptor.class); + @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { LOG.info("=============================================================prehandle interceptor"); LOG.info("request.getRequestURI():{},request.getRemoteAddr():{}",request.getRequestURI(),request.getRemoteAddr()); @@ -18,14 +19,17 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons return true; } + @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { LOG.info("postHandle interceptor"); } + @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { LOG.info("afterCompletion interceptor"); } + @Override public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { LOG.info("afterConcurrentHandlingStarted interceptor"); } diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/model/User.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/model/User.java index f75e98e..d9d6b46 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/model/User.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/model/User.java @@ -20,7 +20,7 @@ @NamedQuery(name = "User.findByN", query = "select u from User u where u.name = ?1") @Entity @Table(name = "user") -@XmlRootElement +@XmlRootElement(name = "user") public class User implements Serializable { /** diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/serviceimpl/UserServiceImpl.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/serviceimpl/UserServiceImpl.java index b5e4211..086cbe8 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/serviceimpl/UserServiceImpl.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/serviceimpl/UserServiceImpl.java @@ -22,6 +22,7 @@ public class UserServiceImpl implements IUserService { @Autowired private IUserDao userDao; + @Transactional(readOnly = true) @Override public User getUserById(long userId) { return userDao.getUserById(userId); From 271bdc2d3349fdbdd6e155cbb5e9e82edf7a2283 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Wed, 18 Jul 2018 18:02:24 +0800 Subject: [PATCH 38/60] use @ImportResource --- .../SpringBootBootstrapTableApplication.java | 2 ++ src/main/resources/interceptor.xml | 14 ++++++++++++++ src/main/resources/logback-springboot.xml | 1 + 3 files changed, 17 insertions(+) create mode 100644 src/main/resources/interceptor.xml diff --git a/src/main/java/cn/com/ttblog/SpringBootBootstrapTableApplication.java b/src/main/java/cn/com/ttblog/SpringBootBootstrapTableApplication.java index b0889f1..58b3347 100644 --- a/src/main/java/cn/com/ttblog/SpringBootBootstrapTableApplication.java +++ b/src/main/java/cn/com/ttblog/SpringBootBootstrapTableApplication.java @@ -5,6 +5,7 @@ import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.context.annotation.ImportResource; /** * 使用@ServletComponentScan注解开启servlet、filter、listener的扫描支持,也可以通过代码来注册servlet等 @@ -12,6 +13,7 @@ */ @ServletComponentScan @SpringBootApplication +@ImportResource(value = {"classpath:interceptor.xml"}) public class SpringBootBootstrapTableApplication extends SpringBootServletInitializer { @Override diff --git a/src/main/resources/interceptor.xml b/src/main/resources/interceptor.xml new file mode 100644 index 0000000..b71bc39 --- /dev/null +++ b/src/main/resources/interceptor.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/logback-springboot.xml b/src/main/resources/logback-springboot.xml index 4d93506..1ec8738 100644 --- a/src/main/resources/logback-springboot.xml +++ b/src/main/resources/logback-springboot.xml @@ -50,6 +50,7 @@ --> + From 6856ecfc5608ffdf347422cea955d03ae77e4596 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 19 Jul 2018 11:15:24 +0800 Subject: [PATCH 39/60] update --- pom.xml | 13 +++++++++++++ .../ttblog/SpringBootBootstrapTableApplication.java | 7 +++++++ 2 files changed, 20 insertions(+) diff --git a/pom.xml b/pom.xml index cb67213..6f3089d 100644 --- a/pom.xml +++ b/pom.xml @@ -172,8 +172,21 @@ ${lombok.version} true + + cn.netbuffer + print-server-address + 1.0.1 + + + + netbuffer-maven-master-repository + netbuffer-maven-master-repository + https://raw.githubusercontent.com/netbuffer/maven-repo/master/repository + + + spring-boot-bootstrap_table diff --git a/src/main/java/cn/com/ttblog/SpringBootBootstrapTableApplication.java b/src/main/java/cn/com/ttblog/SpringBootBootstrapTableApplication.java index 58b3347..7499d3a 100644 --- a/src/main/java/cn/com/ttblog/SpringBootBootstrapTableApplication.java +++ b/src/main/java/cn/com/ttblog/SpringBootBootstrapTableApplication.java @@ -1,10 +1,12 @@ package cn.com.ttblog; +import cn.netbuffer.printserveraddress.listener.SpringBootAppStartedListener; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ImportResource; /** @@ -16,6 +18,11 @@ @ImportResource(value = {"classpath:interceptor.xml"}) public class SpringBootBootstrapTableApplication extends SpringBootServletInitializer { + @Bean + public SpringBootAppStartedListener buildSpringBootAppStartedListener(){ + return new SpringBootAppStartedListener(); + } + @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(SpringBootBootstrapTableApplication.class); From e2aa31c490fc67b27f70139b4f124a9abc8d7618 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 19 Jul 2018 17:54:59 +0800 Subject: [PATCH 40/60] use HibernateInterceptor --- .../interceptor/HibernateInterceptor.java | 19 +++++++++++++++++++ src/main/resources/application-dev.yaml | 6 ++++++ src/main/resources/interceptor.xml | 5 +++-- src/main/resources/logback-springboot.xml | 1 + 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/interceptor/HibernateInterceptor.java diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/interceptor/HibernateInterceptor.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/interceptor/HibernateInterceptor.java new file mode 100644 index 0000000..a494134 --- /dev/null +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/interceptor/HibernateInterceptor.java @@ -0,0 +1,19 @@ +package cn.com.ttblog.spring_boot_bootstrap_table.interceptor; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.hibernate.EmptyInterceptor; + +@Slf4j +public class HibernateInterceptor extends EmptyInterceptor { + + public HibernateInterceptor() { + log.info("register HibernateInterceptor"); + } + + @Override + public String onPrepareStatement(String sql) { + log.debug("execute sql:{},stack:{}", sql,Thread.currentThread().getStackTrace()[0]); + return sql; + } +} diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index d9fd458..4ed0953 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -33,6 +33,12 @@ spring: statement-close-after-log-enabled: false result-set-open-after-log-enabled: false result-set-close-after-log-enabled : false + jpa: + properties: + hibernate: + ejb: + interceptor: cn.com.ttblog.spring_boot_bootstrap_table.interceptor.HibernateInterceptor + #actuator访问路径前缀,便于做统一的拦截处理 # 测试发现在Config文件中配置jsp的路径才有效,这里配置不生效 diff --git a/src/main/resources/interceptor.xml b/src/main/resources/interceptor.xml index b71bc39..0dfcfaf 100644 --- a/src/main/resources/interceptor.xml +++ b/src/main/resources/interceptor.xml @@ -4,8 +4,9 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> - - + + + --> + From 4ed3ba9540f39b1a10f78e3eaaa5a4d105d3e71b Mon Sep 17 00:00:00 2001 From: netbuffer Date: Fri, 10 Aug 2018 22:01:16 +0800 Subject: [PATCH 41/60] update --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 9b61901..5600dcb 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,9 @@ * bootstrap3 * log4jdbc-log4j2 +# 微信扫码使用gitee工具 +![gitee工具](https://s1.ax1x.com/2018/08/10/P60MMF.jpg) + # other projects > `ssmbootstrap_table(spring+springmvc+mybatis)` github:[https://github.com/netbuffer/ssmbootstrap_table](https://github.com/netbuffer/ssmbootstrap_table)`/`git@osc:[https://gitee.com/netbuffer/ssmbootstrap_table](https://gitee.com/netbuffer/ssmbootstrap_table) From 22eb677214f1ae18c4d7da7a75389db034499351 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 20 Sep 2018 14:41:49 +0800 Subject: [PATCH 42/60] update print-server-address to 1.1.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6f3089d..4015652 100644 --- a/pom.xml +++ b/pom.xml @@ -175,7 +175,7 @@ cn.netbuffer print-server-address - 1.0.1 + 1.1.1 From b7a4fc160ce59f48370196215802ef8ca9c73ff8 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Wed, 19 Dec 2018 14:30:57 +0800 Subject: [PATCH 43/60] test springfox-swagger2 --- pom.xml | 17 +++++++++ .../config/SwaggerConfig.java | 35 +++++++++++++++++++ .../controller/UserController.java | 2 ++ src/main/webapp/demolist.html | 4 ++- 4 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/SwaggerConfig.java diff --git a/pom.xml b/pom.xml index 4015652..7fe287a 100644 --- a/pom.xml +++ b/pom.xml @@ -27,6 +27,7 @@ UTF-8 1.7 1.16.18 + 2.9.2 @@ -177,6 +178,22 @@ print-server-address 1.1.1 + + io.springfox + springfox-swagger2 + ${springfox-swagger2.version} + + + io.springfox + springfox-swagger-ui + ${springfox-swagger2.version} + + + + com.github.xiaoymin + swagger-bootstrap-ui + 1.8.8 + diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/SwaggerConfig.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/SwaggerConfig.java new file mode 100644 index 0000000..b44d32f --- /dev/null +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/config/SwaggerConfig.java @@ -0,0 +1,35 @@ +package cn.com.ttblog.spring_boot_bootstrap_table.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@Configuration +@EnableSwagger2 +@EnableWebMvc +@ComponentScan(basePackages = {"cn.com.ttblog"}) +public class SwaggerConfig { + + @Bean + public Docket customDocket() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()); + } + + private ApiInfo apiInfo() { + Contact contact = new Contact("netbuffer", "https://github.com/netbuffer", "javawiki@163.com"); + return new ApiInfoBuilder() + .title("spring-boot-bootstrap_table") + .description("开放api接口") + .contact(contact) + .version("1.0.0") + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/UserController.java b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/UserController.java index ccb1103..f1bf74e 100644 --- a/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/UserController.java +++ b/src/main/java/cn/com/ttblog/spring_boot_bootstrap_table/controller/UserController.java @@ -4,6 +4,7 @@ import cn.com.ttblog.spring_boot_bootstrap_table.model.User; import cn.com.ttblog.spring_boot_bootstrap_table.service.IUserService; import com.alibaba.fastjson.JSONArray; +import io.swagger.annotations.Api; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; @@ -25,6 +26,7 @@ @Controller @RequestMapping("/user") +@Api(value = "/user", tags = {"user api"}) public class UserController { @Resource diff --git a/src/main/webapp/demolist.html b/src/main/webapp/demolist.html index 3c487b3..9ddaed3 100644 --- a/src/main/webapp/demolist.html +++ b/src/main/webapp/demolist.html @@ -8,7 +8,7 @@ -
    +
    @@ -31,6 +31,8 @@

    demo list show demo!

    From 654a3325e0086444e9642cca014cf50731e93061 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Fri, 8 Mar 2019 22:47:30 +0800 Subject: [PATCH 44/60] update --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 7fe287a..db78802 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - cn.com.ttblog + cn.netbuffer spring-boot-bootstrap_table 0.0.1-SNAPSHOT - + - + @@ -67,7 +67,7 @@ - + @@ -81,7 +81,7 @@ - + diff --git a/src/test/java/cn/com/ttblog/SpringBootBootstrapTableApplicationTests.java b/src/test/java/cn/netbuffer/SpringBootBootstrapTableApplicationTests.java similarity index 82% rename from src/test/java/cn/com/ttblog/SpringBootBootstrapTableApplicationTests.java rename to src/test/java/cn/netbuffer/SpringBootBootstrapTableApplicationTests.java index e4b13f7..b900b02 100644 --- a/src/test/java/cn/com/ttblog/SpringBootBootstrapTableApplicationTests.java +++ b/src/test/java/cn/netbuffer/SpringBootBootstrapTableApplicationTests.java @@ -1,7 +1,7 @@ -package cn.com.ttblog; +package cn.netbuffer; -import cn.com.ttblog.spring_boot_bootstrap_table.model.User; -import cn.com.ttblog.spring_boot_bootstrap_table.service.IUserService; +import cn.netbuffer.spring_boot_bootstrap_table.model.User; +import cn.netbuffer.spring_boot_bootstrap_table.service.IUserService; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; From 9d8295d568dcd24c977b39ad68ccaecf8ce28867 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sat, 9 Mar 2019 21:31:06 +0800 Subject: [PATCH 46/60] test dao --- .../dao/IUserDao.java | 5 ++ src/main/resources/application-dev.yaml | 4 +- ...ingBootBootstrapTableApplicationTests.java | 71 ++++++++++++------- 3 files changed, 51 insertions(+), 29 deletions(-) diff --git a/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/dao/IUserDao.java b/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/dao/IUserDao.java index 79f0d02..5931735 100644 --- a/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/dao/IUserDao.java +++ b/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/dao/IUserDao.java @@ -104,4 +104,9 @@ public interface IUserDao extends JpaRepository,JpaSpecificationExecu // // Enabling static ORDER BY for a query // List findByLastnameOrderByFirstnameAsc(String lastname); // List findByLastnameOrderByFirstnameDesc(String lastname); + + //测试分页未生效 + @Query(value = "select * from user \n#pageable\n", + countQuery = "select count(*) from user", nativeQuery = true) + Page findAll(Pageable pageable); } \ No newline at end of file diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index dd7a332..38c3a05 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -13,10 +13,10 @@ management: spring: datasource: druid: - url: jdbc:mysql://127.0.0.1:3306/u + url: jdbc:log4jdbc:mysql://127.0.0.1:3306/u?characterEncoding=UTF-8 username: root password: root - driver-class-name: com.mysql.jdbc.Driver + driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy initial-size: 1 min-idle: 1 max-active: 5 diff --git a/src/test/java/cn/netbuffer/SpringBootBootstrapTableApplicationTests.java b/src/test/java/cn/netbuffer/SpringBootBootstrapTableApplicationTests.java index b900b02..057aa31 100644 --- a/src/test/java/cn/netbuffer/SpringBootBootstrapTableApplicationTests.java +++ b/src/test/java/cn/netbuffer/SpringBootBootstrapTableApplicationTests.java @@ -1,10 +1,14 @@ package cn.netbuffer; +import cn.netbuffer.spring_boot_bootstrap_table.dao.IUserDao; import cn.netbuffer.spring_boot_bootstrap_table.model.User; import cn.netbuffer.spring_boot_bootstrap_table.service.IUserService; +import org.apache.commons.lang3.builder.ToStringBuilder; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.test.context.junit4.SpringRunner; import javax.annotation.Resource; @@ -13,32 +17,45 @@ @SpringBootTest public class SpringBootBootstrapTableApplicationTests { - @Resource - private IUserService userService; - - @Test - public void contextLoads() { - } - - @Test - public void testFindByIdForUpdate(){ - userService.findByIdForUpdate(1L); - } - - @Test - public void test(){ - userService.getDataSum(); - } - - /** - * 添加user - */ - @Test - public void testAdduser(){ - User user=new User(); - user.setName("tt"); - user.setAge(56); - userService.addUser(user); - } + @Resource + private IUserService userService; + @Resource + private IUserDao userDao; + + @Test + public void contextLoads() { + } + + @Test + public void testFindByIdForUpdate() { + userService.findByIdForUpdate(1L); + } + + @Test + public void test() { + userService.getDataSum(); + } + + /** + * 添加user + */ + @Test + public void testAdduser() { + User user = new User(); + user.setName("tt"); + user.setAge(56); + userService.addUser(user); + } + + @Test + public void testFindAll() { + int page = 1; + int size = 1; +// Sort sort = new Sort(Sort.Direction.DESC, "adddate"); +// PageRequest pageRequest = new PageRequest(page-1, size, sort); + PageRequest pageRequest = new PageRequest(page - 1, size); + Page users = userDao.findAll(pageRequest); + System.out.println("query users:{}" + ToStringBuilder.reflectionToString(users)); + } } From 0d96fdc717532b5d7297813dc57dc5d88030e9b1 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sat, 14 Mar 2020 21:44:23 +0800 Subject: [PATCH 47/60] update --- pom.xml | 10 +--------- .../netbuffer/SpringBootBootstrapTableApplication.java | 7 ------- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/pom.xml b/pom.xml index db78802..28809cb 100644 --- a/pom.xml +++ b/pom.xml @@ -176,7 +176,7 @@ cn.netbuffer print-server-address - 1.1.1 + 2.1.0 io.springfox @@ -196,14 +196,6 @@ - - - netbuffer-maven-master-repository - netbuffer-maven-master-repository - https://raw.githubusercontent.com/netbuffer/maven-repo/master/repository - - - spring-boot-bootstrap_table diff --git a/src/main/java/cn/netbuffer/SpringBootBootstrapTableApplication.java b/src/main/java/cn/netbuffer/SpringBootBootstrapTableApplication.java index f92f7a5..be7dccd 100644 --- a/src/main/java/cn/netbuffer/SpringBootBootstrapTableApplication.java +++ b/src/main/java/cn/netbuffer/SpringBootBootstrapTableApplication.java @@ -1,12 +1,10 @@ package cn.netbuffer; -import cn.netbuffer.printserveraddress.listener.SpringBootAppStartedListener; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.boot.web.support.SpringBootServletInitializer; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ImportResource; /** @@ -18,11 +16,6 @@ @ImportResource(value = {"classpath:interceptor.xml"}) public class SpringBootBootstrapTableApplication extends SpringBootServletInitializer { - @Bean - public SpringBootAppStartedListener buildSpringBootAppStartedListener(){ - return new SpringBootAppStartedListener(); - } - @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(SpringBootBootstrapTableApplication.class); From 9398066570b54010e657dee33a6e4485a8512a0d Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sat, 14 Mar 2020 22:35:35 +0800 Subject: [PATCH 48/60] adapt spring-boot2.x --- README.md | 3 ++- pom.xml | 9 ++----- .../SpringBootBootstrapTableApplication.java | 2 +- ...sonHttpMessageConvertersConfiguration.java | 5 ++-- .../dao/IUserDao.java | 5 ---- .../serviceimpl/UserServiceImpl.java | 2 +- src/main/resources/application-dev.yaml | 25 ++++++++++-------- src/main/resources/application.yaml | 26 ++++++++++++------- src/main/resources/banner.txt | 2 +- 9 files changed, 40 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 9b61901..20c8953 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ ### spring-boot bootstrap_table demo +> https://github.com/netbuffer/spring-boot-bootstrap_table --- -* spring-boot 1.5.3 +* spring-boot 2.1.13.RELEASE * spring-boot-starter-actuator * spring-boot-devtools * spring-data-jpa diff --git a/pom.xml b/pom.xml index 28809cb..1015e7c 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ org.springframework.boot spring-boot-starter-parent - 1.5.3.RELEASE + 2.1.13.RELEASE @@ -64,7 +64,7 @@ com.alibaba druid-spring-boot-starter - 1.1.4 + 1.1.21 @@ -121,11 +121,6 @@ fastjson 1.2.56 - - com.alibaba - druid - 1.1.9 - org.apache.commons diff --git a/src/main/java/cn/netbuffer/SpringBootBootstrapTableApplication.java b/src/main/java/cn/netbuffer/SpringBootBootstrapTableApplication.java index be7dccd..c2a0606 100644 --- a/src/main/java/cn/netbuffer/SpringBootBootstrapTableApplication.java +++ b/src/main/java/cn/netbuffer/SpringBootBootstrapTableApplication.java @@ -4,7 +4,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.ServletComponentScan; -import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.context.annotation.ImportResource; /** diff --git a/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/config/FastJsonHttpMessageConvertersConfiguration.java b/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/config/FastJsonHttpMessageConvertersConfiguration.java index 11f894d..4cb0068 100644 --- a/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/config/FastJsonHttpMessageConvertersConfiguration.java +++ b/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/config/FastJsonHttpMessageConvertersConfiguration.java @@ -5,19 +5,18 @@ import com.alibaba.fastjson.support.config.FastJsonConfig; import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.web.HttpMessageConverters; +import org.springframework.boot.autoconfigure.http.HttpMessageConverters; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; @Configuration -@ConditionalOnClass({JSON.class}) //1 +@ConditionalOnClass({JSON.class}) public class FastJsonHttpMessageConvertersConfiguration { @Bean public HttpMessageConverters fastJsonHttpMessageConverters() { FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();//2 - FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures( SerializerFeature.PrettyFormat, diff --git a/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/dao/IUserDao.java b/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/dao/IUserDao.java index 5931735..ef59493 100644 --- a/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/dao/IUserDao.java +++ b/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/dao/IUserDao.java @@ -9,11 +9,9 @@ import org.springframework.data.jpa.repository.Lock; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import org.springframework.scheduling.annotation.Async; import javax.persistence.LockModeType; import java.util.List; -import java.util.concurrent.Future; /** * http://docs.spring.io/spring-data/data-jpa/docs/1.10.1.RELEASE/reference/html/#repositories.query-methods.query-creation @@ -77,9 +75,6 @@ public interface IUserDao extends JpaRepository,JpaSpecificationExecu List findByNameLike(String name); List findByNameLike(String name, Pageable pageable); - @Async - Future findById(Long id); - @Query(value = "select u from User u where u.id=?1") @Lock(value = LockModeType.PESSIMISTIC_WRITE) User findByIdForUpdate(Long id); diff --git a/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/serviceimpl/UserServiceImpl.java b/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/serviceimpl/UserServiceImpl.java index e9a8621..cb6ab56 100644 --- a/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/serviceimpl/UserServiceImpl.java +++ b/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/serviceimpl/UserServiceImpl.java @@ -106,7 +106,7 @@ public void addUMtest() throws IllegalArgumentException { @Override public void deleteById(Long id) { - userDao.delete(id); + userDao.deleteById(id); } @Transactional(readOnly = true) diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index 38c3a05..329abab 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -1,22 +1,25 @@ server: port: 8081 -endpoints: - enabled: true #可以在这里禁用actuator - shutdown: - enabled: true #启用shutdown + management: - context-path: /mge - security: - enabled: false + endpoints: + enabled-by-default: true + endpoint: + shutdown: + enabled: true + server: + servlet: + context-path: /mge # 配置:https://github.com/alibaba/druid/blob/master/druid-spring-boot-starter/src/test/resources/config-template.properties spring: datasource: + type: com.alibaba.druid.pool.DruidDataSource + url: jdbc:log4jdbc:mysql://127.0.0.1:3306/u?characterEncoding=UTF-8 + username: root + password: root + driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy druid: - url: jdbc:log4jdbc:mysql://127.0.0.1:3306/u?characterEncoding=UTF-8 - username: root - password: root - driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy initial-size: 1 min-idle: 1 max-active: 5 diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 184893b..05ba6ad 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -1,31 +1,39 @@ -banner: - image: - location: docker.jpg - location: banner.txt spring: profiles: active: dev + banner: + image: + location: docker.jpg + location: banner.txt + application: + name: spring-boot-bootstrap_table logging: # logback配置文件命名为logback.xml会导致启动不起来 config: classpath:logback-springboot.xml endpoints: - shutdown: - enabled: true + # 环境变量 +management: + endpoint: + shutdown: + enabled: true --- spring: profiles: dev server: - context-path: /dev + servlet: + context-path: /dev --- spring: profiles: test server: - context-path: /test + servlet: + context-path: /test --- spring: profiles: product server: - context-path: /product + servlet: + context-path: /product diff --git a/src/main/resources/banner.txt b/src/main/resources/banner.txt index e740cb5..2a45cb4 100644 --- a/src/main/resources/banner.txt +++ b/src/main/resources/banner.txt @@ -1,3 +1,3 @@ -${AnsiColor.RED}${AnsiStyle.BOLD}${AnsiStyle.UNDERLINE}application-title:${application.title} +${AnsiColor.RED}${AnsiStyle.BOLD}${AnsiStyle.UNDERLINE}application-title:${spring.application.name} ${AnsiColor.BLUE}${AnsiBackground.BRIGHT_BLACK}spring-boot.version:${spring-boot.version} ${AnsiColor.BRIGHT_CYAN}application.version:${application.version} \ No newline at end of file From 3d4042eda9da5ec72ab2baca07335fe7c73e5286 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 17 Mar 2020 21:31:03 +0800 Subject: [PATCH 49/60] move --- {src/main/java => sql}/db.sql | 0 {src/main/java => sql}/logback.sql | 0 {src/main/java => sql}/mysql-util.sql | 0 src/main/java/README.md | 23 ----------------------- 4 files changed, 23 deletions(-) rename {src/main/java => sql}/db.sql (100%) rename {src/main/java => sql}/logback.sql (100%) rename {src/main/java => sql}/mysql-util.sql (100%) delete mode 100644 src/main/java/README.md diff --git a/src/main/java/db.sql b/sql/db.sql similarity index 100% rename from src/main/java/db.sql rename to sql/db.sql diff --git a/src/main/java/logback.sql b/sql/logback.sql similarity index 100% rename from src/main/java/logback.sql rename to sql/logback.sql diff --git a/src/main/java/mysql-util.sql b/sql/mysql-util.sql similarity index 100% rename from src/main/java/mysql-util.sql rename to sql/mysql-util.sql diff --git a/src/main/java/README.md b/src/main/java/README.md deleted file mode 100644 index 288f24d..0000000 --- a/src/main/java/README.md +++ /dev/null @@ -1,23 +0,0 @@ -### 备注 -````html - spring-boot-starter 核心 POM,包含自动配置支持、日志库和对 YAML 配置文件的支持。 - spring-boot-starter-amqp 通过 spring-rabbit 支持 AMQP。 - spring-boot-starter-aop 包含 spring-aop 和 AspectJ 来支持面向切面编程(AOP)。 - spring-boot-starter-batch 支持 Spring Batch,包含 HSQLDB。 - spring-boot-starter-data-jpa 包含 spring-data-jpa、spring-orm 和 Hibernate 来支持 JPA。 - spring-boot-starter-data-mongodb 包含 spring-data-mongodb 来支持 MongoDB。 - spring-boot-starter-data-rest 通过 spring-data-rest-webmvc 支持以 REST 方式暴露 Spring Data 仓库。 - spring-boot-starter-jdbc 支持使用 JDBC 访问数据库。 - spring-boot-starter-security 包含 spring-security。 - spring-boot-starter-test 包含常用的测试所需的依赖,如 JUnit、Hamcrest、Mockito 和 spring-test 等。 - spring-boot-starter-velocity 支持使用 Velocity 作为模板引擎。 - spring-boot-starter-web 支持 Web 应用开发,包含 Tomcat 和 spring-mvc。 - spring-boot-starter-websocket 支持使用 Tomcat 开发 WebSocket 应用。 - spring-boot-starter-ws 支持 Spring Web Services。 - spring-boot-starter-actuator 添加适用于生产环境的功能,如性能指标和监测等功能。 - spring-boot-starter-remote-shell 添加远程 SSH 支持。 - spring-boot-starter-jetty 使用 Jetty 而不是默认的 Tomcat 作为应用服务器。 - spring-boot-starter-log4j 添加 Log4j 的支持。 - spring-boot-starter-logging 使用 Spring Boot 默认的日志框架 Logback。 - spring-boot-starter-tomcat 使用 Spring Boot 默认的 Tomcat 作为应用服务器。 -```` \ No newline at end of file From eb20e6e9da1079ed8c8a79feceb019ec43d1f50f Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 17 Mar 2020 22:01:19 +0800 Subject: [PATCH 50/60] update log --- pom.xml | 5 +++++ .../interceptor/SpringMvcInterceptor.java | 12 ++++++------ .../util/AntPathMatcherUtil.java | 2 +- src/main/resources/logback-springboot.xml | 2 +- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 1015e7c..2f9c30c 100644 --- a/pom.xml +++ b/pom.xml @@ -189,6 +189,11 @@ swagger-bootstrap-ui 1.8.8 + + org.slf4j + slf4j-api + 1.7.30 + diff --git a/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/interceptor/SpringMvcInterceptor.java b/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/interceptor/SpringMvcInterceptor.java index daebf3a..56f9269 100644 --- a/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/interceptor/SpringMvcInterceptor.java +++ b/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/interceptor/SpringMvcInterceptor.java @@ -13,24 +13,24 @@ public class SpringMvcInterceptor extends HandlerInterceptorAdapter{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - LOG.info("=============================================================prehandle interceptor"); - LOG.info("request.getRequestURI():{},request.getRemoteAddr():{}",request.getRequestURI(),request.getRemoteAddr()); - LOG.info("=============================================================prehandle interceptor"); + LOG.debug("=============================================================prehandle interceptor"); + LOG.debug("request.getRequestURI():{},request.getRemoteAddr():{}",request.getRequestURI(),request.getRemoteAddr()); + LOG.debug("=============================================================prehandle interceptor"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { - LOG.info("postHandle interceptor"); + LOG.debug("postHandle interceptor"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { - LOG.info("afterCompletion interceptor"); + LOG.debug("afterCompletion interceptor"); } @Override public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - LOG.info("afterConcurrentHandlingStarted interceptor"); + LOG.debug("afterConcurrentHandlingStarted interceptor"); } } diff --git a/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/util/AntPathMatcherUtil.java b/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/util/AntPathMatcherUtil.java index 81be269..39036bf 100644 --- a/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/util/AntPathMatcherUtil.java +++ b/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/util/AntPathMatcherUtil.java @@ -17,7 +17,7 @@ public static boolean isMatch(String[] mapping,String uri){ if(m.length()>0){ String ms=m.trim(); if(ap.match(ms,uri)){ - LOG.warn("匹配:{}---{}",ms,uri); + LOG.debug("匹配:{}---{}",ms,uri); return true; } } diff --git a/src/main/resources/logback-springboot.xml b/src/main/resources/logback-springboot.xml index e629137..58cf863 100644 --- a/src/main/resources/logback-springboot.xml +++ b/src/main/resources/logback-springboot.xml @@ -65,7 +65,7 @@ - + From 83e92ce50f840956beb26108c2654efc21bfc749 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 17 Mar 2020 22:02:24 +0800 Subject: [PATCH 51/60] test c:out escapeXml --- src/main/webapp/index.jsp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp index f43f0d6..d76e4b1 100644 --- a/src/main/webapp/index.jsp +++ b/src/main/webapp/index.jsp @@ -75,5 +75,8 @@
    metrics + + html:${html}
    + html escapeXml: From 3d90d4f300e85a9106103185178902ebc8e5b45f Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 19 Mar 2020 15:25:01 +0800 Subject: [PATCH 52/60] use logback MDCInsertingServletFilter --- .../config/MvcConfig.java | 15 +++++++++++++++ src/main/resources/logback-springboot.xml | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/config/MvcConfig.java b/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/config/MvcConfig.java index a4e5c24..3248e08 100644 --- a/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/config/MvcConfig.java +++ b/src/main/java/cn/netbuffer/spring_boot_bootstrap_table/config/MvcConfig.java @@ -1,8 +1,10 @@ package cn.netbuffer.spring_boot_bootstrap_table.config; import ch.qos.logback.classic.ViewStatusMessagesServlet; +import ch.qos.logback.classic.helpers.MDCInsertingServletFilter; import cn.netbuffer.spring_boot_bootstrap_table.interceptor.SpringMvcInterceptor; import cn.netbuffer.spring_boot_bootstrap_table.views.JsonViewResolver; +import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -16,6 +18,7 @@ import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; +import javax.servlet.Filter; import java.util.ArrayList; import java.util.List; @@ -26,6 +29,17 @@ @EnableWebMvc public class MvcConfig extends WebMvcConfigurerAdapter { + @Bean + public FilterRegistrationBean filterRegistrationBean() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + Filter mdcInsertingServletFilter = new MDCInsertingServletFilter(); + registrationBean.setFilter(mdcInsertingServletFilter); + List urlPatterns = new ArrayList<>(); + urlPatterns.add("/*"); + registrationBean.setUrlPatterns(urlPatterns); + return registrationBean; + } + @Override public void configureContentNegotiation( ContentNegotiationConfigurer configurer) { @@ -79,6 +93,7 @@ public MultipartResolver multipartResolver() { /** * 注册自定义的servlet + * * @return */ @Bean diff --git a/src/main/resources/logback-springboot.xml b/src/main/resources/logback-springboot.xml index 58cf863..20fee5e 100644 --- a/src/main/resources/logback-springboot.xml +++ b/src/main/resources/logback-springboot.xml @@ -6,7 +6,7 @@ true - %highlight(%date{yyyy-MM-dd HH:mm:ss.SSS}) %cyan([%thread]) %yellow(%-5level) %green(%logger{36}) - %blue(%msg%n) + %highlight(%date{yyyy-MM-dd HH:mm:ss}) %X{req.remoteHost} %X{req.method} %X{req.requestURI} %X{req.queryString} %X{req.xForwardedFor} %n%cyan([%thread]) %yellow(%-5level) %green(%logger{36}) - %blue(%msg%n) Date: Sun, 19 Apr 2020 15:17:20 +0800 Subject: [PATCH 53/60] update --- src/main/webapp/manage.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/manage.html b/src/main/webapp/manage.html index 7505895..fef5202 100644 --- a/src/main/webapp/manage.html +++ b/src/main/webapp/manage.html @@ -324,7 +324,7 @@ - 后台管理 + spring-boot-bootstrap-table-demo