From 8f4edca7897d9685d7124f6dbd68c787cc53517f Mon Sep 17 00:00:00 2001 From: "champion7188@163.com" Date: Thu, 10 Mar 2016 14:23:42 +0800 Subject: [PATCH 001/290] update dbcp->druid --- pom.xml | 392 +++++++++++++------------- src/main/resources/spring-mybatis.xml | 5 +- src/main/webapp/WEB-INF/web.xml | 289 ++++++++++--------- 3 files changed, 358 insertions(+), 328 deletions(-) diff --git a/pom.xml b/pom.xml index d5538db0..b0fed6db 100644 --- a/pom.xml +++ b/pom.xml @@ -1,196 +1,196 @@ - - 4.0.0 - cn.com.ttblog.ssmbootstrap-table - ssmbootstrap_table - war - 0.0.1-SNAPSHOT - ssmbootstrap_table Maven Webapp - http://netbuffer.github.io - - - netbuffer - netbuffer - javawiki@163.com - http://netbuffer.github.io - - - - 4.0.2.RELEASE - 3.3.0 - 1.7.7 - 1.1.3 - - - - - com.thoughtworks.xstream - xstream - 1.4.8 - - - jstl - jstl - 1.2 - - - javax.el - javax.el-api - 3.0.0 - provided - - - javax.servlet - javax.servlet-api - 3.1.0 - provided - - - junit - junit - 4.11 - test - - - org.springframework - spring-core - ${spring.version} - - - org.springframework - spring-web - ${spring.version} - - - org.springframework - spring-oxm - ${spring.version} - - - org.springframework - spring-tx - ${spring.version} - - - org.springframework - spring-jdbc - ${spring.version} - - - org.springframework - spring-webmvc - ${spring.version} - - - org.springframework - spring-aop - ${spring.version} - - - org.springframework - spring-context-support - ${spring.version} - - - org.springframework - spring-test - ${spring.version} - - - org.mybatis - mybatis - ${mybatis.version} - - - org.mybatis - mybatis-spring - 1.2.2 - - - mysql - mysql-connector-java - 5.1.38 - - - commons-dbcp - commons-dbcp - 1.2.2 - - - jstl - jstl - 1.2 - - - javax.servlet.jsp - jsp-api - 2.2.1-b03 - provided - - - ch.qos.logback - logback-classic - ${logback.version} - - - com.alibaba - fastjson - 1.1.41 - - - org.slf4j - slf4j-api - ${slf4j.version} - - - org.codehaus.jackson - jackson-mapper-asl - 1.9.13 - - - commons-fileupload - commons-fileupload - 1.3.1 - - - commons-io - commons-io - 2.4 - - - commons-beanutils - commons-beanutils - 1.9.2 - - - commons-lang - commons-lang - 2.6 - - - commons-codec - commons-codec - 1.10 - - - com.googlecode.log4jdbc - log4jdbc - 1.2 - - - org.apache.poi - poi - 3.13 - - - - ssmbootstrap_table - - - org.apache.tomcat.maven - tomcat7-maven-plugin - 2.2 - - - - + + 4.0.0 + cn.com.ttblog.ssmbootstrap-table + ssmbootstrap_table + war + 0.0.1-SNAPSHOT + ssmbootstrap_table Maven Webapp + http://netbuffer.github.io + + + netbuffer + netbuffer + javawiki@163.com + http://netbuffer.github.io + + + + 4.0.2.RELEASE + 3.3.0 + 1.7.7 + 1.1.3 + + + + + com.thoughtworks.xstream + xstream + 1.4.8 + + + jstl + jstl + 1.2 + + + javax.el + javax.el-api + 3.0.0 + provided + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + + + junit + junit + 4.11 + test + + + org.springframework + spring-core + ${spring.version} + + + org.springframework + spring-web + ${spring.version} + + + org.springframework + spring-oxm + ${spring.version} + + + org.springframework + spring-tx + ${spring.version} + + + org.springframework + spring-jdbc + ${spring.version} + + + org.springframework + spring-webmvc + ${spring.version} + + + org.springframework + spring-aop + ${spring.version} + + + org.springframework + spring-context-support + ${spring.version} + + + org.springframework + spring-test + ${spring.version} + + + org.mybatis + mybatis + ${mybatis.version} + + + org.mybatis + mybatis-spring + 1.2.2 + + + mysql + mysql-connector-java + 5.1.38 + + + com.alibaba + druid + 1.0.16 + + + jstl + jstl + 1.2 + + + javax.servlet.jsp + jsp-api + 2.2.1-b03 + provided + + + ch.qos.logback + logback-classic + ${logback.version} + + + com.alibaba + fastjson + 1.1.41 + + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.codehaus.jackson + jackson-mapper-asl + 1.9.13 + + + commons-fileupload + commons-fileupload + 1.3.1 + + + commons-io + commons-io + 2.4 + + + commons-beanutils + commons-beanutils + 1.9.2 + + + commons-lang + commons-lang + 2.6 + + + commons-codec + commons-codec + 1.10 + + + com.googlecode.log4jdbc + log4jdbc + 1.2 + + + org.apache.poi + poi + 3.13 + + + + ssmbootstrap_table + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.2 + + + + diff --git a/src/main/resources/spring-mybatis.xml b/src/main/resources/spring-mybatis.xml index 45bcede7..3be5a3ed 100644 --- a/src/main/resources/spring-mybatis.xml +++ b/src/main/resources/spring-mybatis.xml @@ -12,11 +12,12 @@ http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> + - @@ -27,6 +28,8 @@ + + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index ef918da9..04dd30cb 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -1,132 +1,159 @@ - - - ssmbootstrap-table - - contextConfigLocation - classpath:spring-mybatis.xml - - - encodingFilter - org.springframework.web.filter.CharacterEncodingFilter - true - - encoding - UTF-8 - - - forceEncoding - true - - - - encodingFilter - /* - - - LoginFilter - cn.com.ttblog.ssmbootstrap_table.filter.LoginFilter - - noFilterTags - index.html;login;register;captcha;.css;.js;.jpg - - - enable - true - - - - LoginFilter - /* - - - - injectionAttackFilter - cn.com.ttblog.ssmbootstrap_table.filter.InjectionAttackFilter - - - filter_xss - true - - - filter_sql_injection - true - - - - click_jacking_header - true - - - - - injectionAttackFilter - /* - - - timerFilter - cn.com.ttblog.ssmbootstrap_table.filter.TimerFilter - - enable - true - - - - timerFilter - /* - - - - trimFilter - cn.com.ttblog.ssmbootstrap_table.filter.TrimFilter - - enable - true - - - - trimFilter - /* - - - - org.springframework.web.util.IntrospectorCleanupListener - - - org.springframework.web.context.ContextLoaderListener - - - - SpringMVC - org.springframework.web.servlet.DispatcherServlet - - contextConfigLocation - classpath:spring-mvc.xml - - - debug - 0 - - 0 - true - - - SpringMVC - - - / - - - 404 - /404.html - - - index.html - index.jsp - - + + + ssmbootstrap-table + + contextConfigLocation + classpath:spring-mybatis.xml + + + + encodingFilter + org.springframework.web.filter.CharacterEncodingFilter + true + + encoding + UTF-8 + + + forceEncoding + true + + + + encodingFilter + /* + + + LoginFilter + cn.com.ttblog.ssmbootstrap_table.filter.LoginFilter + + noFilterTags + index.html;login;register;captcha;.css;.js;.jpg + + + enable + true + + + + LoginFilter + /* + + + + injectionAttackFilter + cn.com.ttblog.ssmbootstrap_table.filter.InjectionAttackFilter + + + filter_xss + true + + + filter_sql_injection + true + + + + click_jacking_header + true + + + + + injectionAttackFilter + /* + + + + druidfilter + com.alibaba.druid.support.http.WebStatFilter + + exclusions + *.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/* + + + + druidfilter + /* + + + + + timerFilter + cn.com.ttblog.ssmbootstrap_table.filter.TimerFilter + + enable + true + + + + timerFilter + /* + + + + trimFilter + cn.com.ttblog.ssmbootstrap_table.filter.TrimFilter + + enable + true + + + + trimFilter + /* + + + + + + org.springframework.web.util.IntrospectorCleanupListener + + + org.springframework.web.context.ContextLoaderListener + + + + druidstat + com.alibaba.druid.support.http.StatViewServlet + + + druidstat + /druid/* + + + + SpringMVC + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:spring-mvc.xml + + + debug + 0 + + 0 + true + + + SpringMVC + + + / + + + 404 + /404.html + + + index.html + index.jsp + + \ No newline at end of file From 205aa59ed24884373b64009319e3d58ced31b1f6 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 10 Mar 2016 22:11:01 +0800 Subject: [PATCH 002/290] add spring-ransaction --- pom.xml | 11 +++++++ .../serviceimpl/UserServiceImpl.java | 4 +-- src/main/resources/spring-mybatis.xml | 33 +++++++++++++------ .../ssmbootstrap_table/TestMyBatis.java | 12 +++++++ 4 files changed, 47 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index b0fed6db..f203bc0e 100644 --- a/pom.xml +++ b/pom.xml @@ -106,6 +106,17 @@ mybatis-spring 1.2.2 + + + org.aspectj + aspectjrt + 1.8.6 + + + org.aspectj + aspectjweaver + 1.8.6 + mysql mysql-connector-java diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/serviceimpl/UserServiceImpl.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/serviceimpl/UserServiceImpl.java index 2c34e423..5cd0fcab 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/serviceimpl/UserServiceImpl.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/serviceimpl/UserServiceImpl.java @@ -35,9 +35,7 @@ public void addUser(User user) { Random r=new Random(); sqlSession.insert(IUserDao.class.getName()+".insert",user); //事务测试 -// if(r.nextInt(6)==0){ -// int i=1/0; -// } +// int i=1/0; } @Override diff --git a/src/main/resources/spring-mybatis.xml b/src/main/resources/spring-mybatis.xml index 3be5a3ed..98dc39fb 100644 --- a/src/main/resources/spring-mybatis.xml +++ b/src/main/resources/spring-mybatis.xml @@ -2,17 +2,18 @@ + http://www.springframework.org/schema/context/spring-context-3.2.xsd + http://www.springframework.org/schema/mvc + http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd + http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"> - - + @@ -29,7 +30,7 @@ - + @@ -44,10 +45,22 @@ + + - + + + + + + + + + + diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java index 728f62d9..22250ed0 100644 --- a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java @@ -83,8 +83,20 @@ public void testdao(){ } @Test + @Ignore public void testDatacount(){ logger.info("datacount:{}",userDao.getDataSum()); } + + @Test + public void testAddUserTran(){ + User u=new User(); + u.setName("事务测试"); + u.setAge(10); + u.setSex("男"); + u.setPhone("13833422322"); + u.setAdddate((int)System.currentTimeMillis()/1000); + userService.addUser(u); + } } From ad9cb5da4afc358a7449e8f28605cb409681f056 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Fri, 11 Mar 2016 22:07:26 +0800 Subject: [PATCH 003/290] =?UTF-8?q?add=20sql=E7=9B=91=E6=8E=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/RegisterController.java | 2 +- .../serviceimpl/UserServiceImpl.java | 2 +- src/main/resources/jdbc.properties | 5 ++- src/main/resources/spring-mybatis.xml | 33 ++++++++++++++++--- 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java index 7670bf4d..d595be58 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java @@ -19,7 +19,7 @@ public class RegisterController { private Logger logger = LoggerFactory.getLogger(this.getClass()); - @RequestMapping(value={"/index","/"}) + @RequestMapping(value={"","/","/index"}) public String index() { return "redirect:/register.html"; } diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/serviceimpl/UserServiceImpl.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/serviceimpl/UserServiceImpl.java index 5cd0fcab..8cbc2457 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/serviceimpl/UserServiceImpl.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/serviceimpl/UserServiceImpl.java @@ -35,7 +35,7 @@ public void addUser(User user) { Random r=new Random(); sqlSession.insert(IUserDao.class.getName()+".insert",user); //事务测试 -// int i=1/0; + int i=1/0; } @Override diff --git a/src/main/resources/jdbc.properties b/src/main/resources/jdbc.properties index 9cc0d107..c77d97f7 100644 --- a/src/main/resources/jdbc.properties +++ b/src/main/resources/jdbc.properties @@ -6,9 +6,8 @@ password=root initialSize=1 #定义最大连接数 maxActive=2 -#定义最大空闲 -maxIdle=2 #定义最小空闲 minIdle=1 #定义最长等待时间 -maxWait=6000 \ No newline at end of file +maxWait=6000 +validationQuery=select 0 \ No newline at end of file diff --git a/src/main/resources/spring-mybatis.xml b/src/main/resources/spring-mybatis.xml index 98dc39fb..5722c8bc 100644 --- a/src/main/resources/spring-mybatis.xml +++ b/src/main/resources/spring-mybatis.xml @@ -26,12 +26,36 @@ - - - + + + + + + + + + + + + + + cn.com.ttblog.ssmbootstrap_table.service.* + cn.com.ttblog.ssmbootstrap_table.dao.* + + + + + + + + @@ -57,7 +81,8 @@ - From 4f24f5907aeb6c428e92cfe4de7d35608de84a6e Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sat, 12 Mar 2016 23:03:14 +0800 Subject: [PATCH 004/290] prepare validator --- .../controller/RegisterController.java | 15 +++++-- .../controller/UserController.java | 40 +++++++++++-------- src/main/resources/spring-mvc.xml | 2 + .../{register.html => registerinfo.html} | 0 4 files changed, 37 insertions(+), 20 deletions(-) rename src/main/webapp/{register.html => registerinfo.html} (100%) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java index d595be58..df7dc744 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java @@ -5,10 +5,14 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; +import org.springframework.validation.DataBinder; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.RequestMapping; import cn.com.ttblog.ssmbootstrap_table.model.User; import cn.com.ttblog.ssmbootstrap_table.service.IUserService; +import cn.com.ttblog.ssmbootstrap_table.validator.UserValidator; @Controller @RequestMapping("/register") @@ -19,14 +23,19 @@ public class RegisterController { private Logger logger = LoggerFactory.getLogger(this.getClass()); - @RequestMapping(value={"","/","/index"}) + @InitBinder + public void initBinder(DataBinder binder) { + binder.setValidator(new UserValidator()); + } + + @RequestMapping(value = { "", "/", "/index" }) public String index() { - return "redirect:/register.html"; + return "redirect:/registerinfo.html"; } @RequestMapping("/save") public String save(User user) { - user.setAdddate((int)(System.currentTimeMillis()/1000)); + user.setAdddate((int) (System.currentTimeMillis() / 1000)); try { userService.addUser(user); } catch (Exception e) { diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/UserController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/UserController.java index 6182a4ab..2af1cdef 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/UserController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/UserController.java @@ -12,6 +12,8 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.validation.DataBinder; +import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -20,6 +22,7 @@ import cn.com.ttblog.ssmbootstrap_table.model.User; import cn.com.ttblog.ssmbootstrap_table.service.IUserService; +import cn.com.ttblog.ssmbootstrap_table.validator.UserValidator; @Controller @RequestMapping("/user") @@ -27,31 +30,34 @@ public class UserController { @Resource private IUserService userService; - - private Logger logger=LoggerFactory.getLogger(this.getClass()); - + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + @RequestMapping("/showUser/{id}") - public String toIndex(@PathVariable("id") int id,HttpServletRequest request, Model model) { - logger.info("进入:{},参数:{}",request.getRequestURI(),model.toString()); + 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(); + ModelAndView mav = new ModelAndView(); + User u = new User(); u.setName("tianyu"); u.setAge(11); u.setDeliveryaddress("收货地址"); mav.addObject("model", u); return mav; } - + /** - * http://localhost:8080/ssmbootstrap_table/user/userlist?order=asc&limit=10&offset=0 + * http://localhost:8080/ssmbootstrap_table/user/userlist?order=asc&limit=10 + * &offset=0 + * * @param order * @param limit * @param offset @@ -59,14 +65,14 @@ public ModelAndView model() { * @return */ @RequestMapping("/userlist") - public String userlist(String order,int limit,int offset, Model model) { - logger.info("参数:{},{},{}",order,limit,offset); - List users = userService.getUserList(order,limit,offset); - long total=userService.getUserListCount(); - Map params=new HashMap(); - model.addAttribute("total",total); + public String userlist(String order, int limit, int offset, Model model) { + logger.info("参数:{},{},{}", order, limit, offset); + List users = userService.getUserList(order, limit, offset); + long total = userService.getUserListCount(); + Map params = new HashMap(); + model.addAttribute("total", total); model.addAttribute("rows", users); - logger.info("结果:{}",params); + logger.info("结果:{}", params); return "userlist"; } diff --git a/src/main/resources/spring-mvc.xml b/src/main/resources/spring-mvc.xml index feba5d61..5841df28 100644 --- a/src/main/resources/spring-mvc.xml +++ b/src/main/resources/spring-mvc.xml @@ -55,6 +55,8 @@ + + diff --git a/src/main/webapp/register.html b/src/main/webapp/registerinfo.html similarity index 100% rename from src/main/webapp/register.html rename to src/main/webapp/registerinfo.html From 112c04cb923f5d2b02167c4a653ca1d9d8e2fa89 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sun, 13 Mar 2016 13:11:52 +0800 Subject: [PATCH 005/290] exceptionhandler --- .../controller/RegisterController.java | 2 +- src/main/resources/logback.xml | 1 + src/main/resources/spring-mvc.xml | 42 ++++++++++++++----- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java index df7dc744..58a65a73 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java @@ -34,7 +34,7 @@ public String index() { } @RequestMapping("/save") - public String save(User user) { + public String save(@Validated User user) { user.setAdddate((int) (System.currentTimeMillis() / 1000)); try { userService.addUser(user); diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index a8470385..744dd6dc 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -34,6 +34,7 @@ + diff --git a/src/main/resources/spring-mvc.xml b/src/main/resources/spring-mvc.xml index 5841df28..1b3d3e22 100644 --- a/src/main/resources/spring-mvc.xml +++ b/src/main/resources/spring-mvc.xml @@ -11,19 +11,19 @@ http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> - + - + - + - + @@ -54,12 +54,12 @@ - - - - - - + + + + + + + + + + + + 500 + 500 + + + + + 500 + + + + + + + + + \ No newline at end of file From 6df9e415223e090e5965d98e1adf7004d2d1f06f Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sun, 13 Mar 2016 18:35:33 +0800 Subject: [PATCH 006/290] add hibernate validator --- pom.xml | 10 ++++++ .../controller/RegisterController.java | 25 +++++++++---- .../ttblog/ssmbootstrap_table/model/User.java | 15 ++++++-- .../validator/UserValidator.java | 35 +++++++++++++++++++ .../resources/ValidationMessages.properties | 2 ++ src/main/resources/messages.properties | 2 ++ src/main/resources/spring-mvc.xml | 24 ++++++++++++- src/main/webapp/500.jsp | 26 ++++++++++++++ 8 files changed, 130 insertions(+), 9 deletions(-) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/validator/UserValidator.java create mode 100644 src/main/resources/ValidationMessages.properties create mode 100644 src/main/resources/messages.properties create mode 100644 src/main/webapp/500.jsp diff --git a/pom.xml b/pom.xml index f203bc0e..712f6523 100644 --- a/pom.xml +++ b/pom.xml @@ -193,6 +193,16 @@ poi 3.13 + + javax.validation + validation-api + 1.1.0.Final + + + org.hibernate + hibernate-validator + 5.2.4.Final + ssmbootstrap_table diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java index 58a65a73..f6e0e106 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java @@ -1,10 +1,14 @@ package cn.com.ttblog.ssmbootstrap_table.controller; import javax.annotation.Resource; +import javax.validation.Valid; +import org.apache.commons.lang.builder.ToStringBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; import org.springframework.validation.DataBinder; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.InitBinder; @@ -22,11 +26,15 @@ public class RegisterController { private IUserService userService; private Logger logger = LoggerFactory.getLogger(this.getClass()); - - @InitBinder - public void initBinder(DataBinder binder) { - binder.setValidator(new UserValidator()); - } + + /** + * springmvc数据校验 需要为实体加@Validated标记 + * @param binder + */ +// @InitBinder +// public void initBinder(DataBinder binder) { +// binder.setValidator(new UserValidator()); +// } @RequestMapping(value = { "", "/", "/index" }) public String index() { @@ -34,7 +42,12 @@ public String index() { } @RequestMapping("/save") - public String save(@Validated User user) { + public String save(@Valid User user,BindingResult result,Model model) { + if(result.hasErrors()){ + logger.info("校验user出错:"+ToStringBuilder.reflectionToString(result)); + model.addAttribute("result", result); + return "500"; + } user.setAdddate((int) (System.currentTimeMillis() / 1000)); try { userService.addUser(user); diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/User.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/User.java index dcc9af73..bd72d23b 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/User.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/User.java @@ -1,18 +1,25 @@ package cn.com.ttblog.ssmbootstrap_table.model; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; +import org.apache.commons.lang.builder.ToStringBuilder; +import org.hibernate.validator.constraints.Range; + @XmlRootElement public class User { /** * 用户id */ private Long id; - + @Size(min = 2, max = 6, message = "{用户名长度必须在2到6个字符之间}") private String name; private String sex; - + + @NotNull(message="年龄不能为空") + @Range(min = 1, max = 150) private Integer age; private String phone; @@ -77,4 +84,8 @@ public Integer getAdddate() { public void setAdddate(Integer adddate) { this.adddate = adddate; } + + public String toString() { + return ToStringBuilder.reflectionToString(this); + } } \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/validator/UserValidator.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/validator/UserValidator.java new file mode 100644 index 00000000..a58ff347 --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/validator/UserValidator.java @@ -0,0 +1,35 @@ +package cn.com.ttblog.ssmbootstrap_table.validator; + +import org.springframework.validation.Errors; +import org.springframework.validation.ValidationUtils; +import org.springframework.validation.Validator; + +import cn.com.ttblog.ssmbootstrap_table.model.User; +/** + * spring mvc 数据较验方式 + * @author netbuffer + * + */ +public class UserValidator implements Validator { + + @Override + public boolean supports(Class clazz) { + return User.class.equals(clazz); + } + + /** + * 校验数据 + */ + @Override + public void validate(Object target, Errors errors) { + ValidationUtils.rejectIfEmpty(errors, "name", null, + "name is empty."); + User user = (User) target; + if (null == user.getName() || "".equals(user.getName())) { + errors.rejectValue("name", null, "name is empty."); + } + if(null==user.getAge()||"".equals(user.getAge())){ + errors.rejectValue("age", null, "age is empty."); + } + } +} diff --git a/src/main/resources/ValidationMessages.properties b/src/main/resources/ValidationMessages.properties new file mode 100644 index 00000000..432c8606 --- /dev/null +++ b/src/main/resources/ValidationMessages.properties @@ -0,0 +1,2 @@ +Size.u.name.len=\u59D3\u540D\u4E0D\u80FD\u4E3A\u7A7A +Range.user.age = \u5E74\u9F84\u5FC5\u987B\u57281\u5230150\u4E4B\u95F4 \ No newline at end of file diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties new file mode 100644 index 00000000..385383a3 --- /dev/null +++ b/src/main/resources/messages.properties @@ -0,0 +1,2 @@ +size.u.name.len=\u59D3\u540D\u4E0D\u80FD\u4E3A\u7A7A +Range.user.age = \u5E74\u9F84\u5FC5\u987B\u57281\u5230150\u4E4B\u95F4 \ No newline at end of file diff --git a/src/main/resources/spring-mvc.xml b/src/main/resources/spring-mvc.xml index 1b3d3e22..8d23e130 100644 --- a/src/main/resources/spring-mvc.xml +++ b/src/main/resources/spring-mvc.xml @@ -53,7 +53,8 @@ value="org.springframework.web.servlet.view.JstlView" /> - + @@ -85,6 +86,7 @@ 500 500 + 500 @@ -99,4 +101,24 @@ + + + + + + + + + classpath:messages.properties + + + + + + + + + \ 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 00000000..87f3470a --- /dev/null +++ b/src/main/webapp/500.jsp @@ -0,0 +1,26 @@ +<%@ 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 }
+
+
+ + \ No newline at end of file From fde30404252528ca8f6f625998bd9e90af2cf200 Mon Sep 17 00:00:00 2001 From: "champion7188@163.com" Date: Mon, 14 Mar 2016 17:01:23 +0800 Subject: [PATCH 007/290] test @ExceptionHandler --- .../controller/IndexController.java | 75 +++++++++++++------ src/main/webapp/500.jsp | 17 +++-- 2 files changed, 63 insertions(+), 29 deletions(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java index 7383be52..da672387 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java @@ -24,16 +24,18 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; - -import com.alibaba.fastjson.JSONArray; +import org.springframework.web.servlet.ModelAndView; import cn.com.ttblog.ssmbootstrap_table.model.User; import cn.com.ttblog.ssmbootstrap_table.service.IUserService; import cn.com.ttblog.ssmbootstrap_table.util.BeanMapUtil; import cn.com.ttblog.ssmbootstrap_table.util.POIExcelUtil; +import com.alibaba.fastjson.JSONArray; + @Controller @RequestMapping("/") public class IndexController { @@ -61,39 +63,41 @@ public String login(HttpSession session, HttpServletRequest request, } @RequestMapping("/newdata") - public String newdata(HttpSession session,Model model) { - logger.info("执行前:{}",model); + public String newdata(HttpSession session, Model model) { + 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); + logger.info("执行后:{}", model); return "newdata"; } - + @RequestMapping("/datacount") - public @ResponseBody Map datacount(HttpSession session,Model model) { + public @ResponseBody Map datacount(HttpSession session, + Model model) { List> counts = userService.getDataSum(); - - JSONArray categorys=new JSONArray(); - JSONArray nums=new JSONArray(); - for(Map m:counts){ + + JSONArray categorys = new JSONArray(); + JSONArray nums = new JSONArray(); + for (Map m : counts) { categorys.add(m.get("adddate").toString()); nums.add(m.get("num").toString()); } - Map data=new HashMap(); + Map data = new HashMap(); data.put("c", categorys); data.put("d", nums); return data; } @RequestMapping("/export") - public ResponseEntity export(HttpSession session, HttpServletRequest request, - HttpServletResponse response) { + public ResponseEntity export(HttpSession session, + HttpServletRequest request, HttpServletResponse response) { SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); List users = userService.getUserList("desc", 10, 0); - String projectPath = request.getServletContext().getRealPath("export")+File.separator; + String projectPath = request.getServletContext().getRealPath("export") + + File.separator; int userCount = users.size(); List> mps = new ArrayList>( users.size()); @@ -112,17 +116,40 @@ public ResponseEntity export(HttpSession session, HttpServletRequest re titles.add("sex"); String file = projectPath + format.format(new Date()) + "." + ConfigConstant.EXCELSTR; - logger.info("文件路径:{}",file); + logger.info("文件路径:{}", file); POIExcelUtil.export(titles, mps, file); - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); - headers.setContentDispositionFormData("attachment",file.replace(projectPath, "")); - try { - return new ResponseEntity(FileUtils.readFileToByteArray(new File(file)), - headers, HttpStatus.CREATED); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); + headers.setContentDispositionFormData("attachment", + file.replace(projectPath, "")); + try { + return new ResponseEntity( + FileUtils.readFileToByteArray(new File(file)), headers, + HttpStatus.CREATED); } catch (IOException e) { e.printStackTrace(); - } - return null; + } + return null; + } + + @RequestMapping("/testerror") + public String testthrowException() { + throw new RuntimeException("test error"); } + + @ExceptionHandler + public ModelAndView handleAllException(Exception ex) { + ModelAndView mav = new ModelAndView("500"); + mav.addObject("errMsg", ex.getMessage()); + return mav; + } + + /** + * 数据转换处理 + */ + // @InitBinder + // public void bind(WebDataBinder binder){ + // //设置不转换name,自行处理 + // binder.setDisallowedFields("name"); + // } } \ No newline at end of file diff --git a/src/main/webapp/500.jsp b/src/main/webapp/500.jsp index 87f3470a..94a3dd88 100644 --- a/src/main/webapp/500.jsp +++ b/src/main/webapp/500.jsp @@ -16,11 +16,18 @@
发生错误啦: -

错误数量:${result.errorCount}

-

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

- - ${error.code }/${error.defaultMessage }
-
+ +

校验信息错误

+
+

错误数量:${result.errorCount}

+

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

+ + ${error.code }/${error.defaultMessage }
+
+
+ +
错误信息:${errMsg } +
\ No newline at end of file From 92f4da3763831461ba5d18c3ce570996952645ea Mon Sep 17 00:00:00 2001 From: "champion7188@163.com" Date: Mon, 14 Mar 2016 18:25:48 +0800 Subject: [PATCH 008/290] test @ControllerAdvice --- .../controller/GlobalExceptionController.java | 32 +++++++++++++ .../controller/RegisterController.java | 13 +++++- .../exception/CustomGenericException.java | 46 +++++++++++++++++++ src/main/resources/spring-mvc.xml | 12 ++--- src/main/webapp/error.jsp | 30 ++++++++++++ 5 files changed, 126 insertions(+), 7 deletions(-) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/GlobalExceptionController.java create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/exception/CustomGenericException.java create mode 100644 src/main/webapp/error.jsp diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/GlobalExceptionController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/GlobalExceptionController.java new file mode 100644 index 00000000..dfc9baae --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/GlobalExceptionController.java @@ -0,0 +1,32 @@ +package cn.com.ttblog.ssmbootstrap_table.controller; + +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.servlet.ModelAndView; +import cn.com.ttblog.ssmbootstrap_table.exception.CustomGenericException; + +/** + * @ExceptionHandler只能在一个controller上添加,标记所有controller需要使用@ControllerAdvice来全局处理异常 + * @author netbuffer + */ +@ControllerAdvice +public class GlobalExceptionController { + + @ExceptionHandler(CustomGenericException.class) + public ModelAndView handleCustomException(CustomGenericException ex) { + ModelAndView model = new ModelAndView("error"); + model.addObject("errCode", ex.getErrCode()); + model.addObject("errMsg", ex.getErrMsg()); + return model; + + } + + @ExceptionHandler(Exception.class) + public ModelAndView handleAllException(Exception ex) { + ModelAndView model = new ModelAndView("error"); + model.addObject("errMsg",ex.getMessage()); + return model; + + } + +} \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java index f6e0e106..f0fcb925 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java @@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.RequestMapping; +import cn.com.ttblog.ssmbootstrap_table.exception.CustomGenericException; import cn.com.ttblog.ssmbootstrap_table.model.User; import cn.com.ttblog.ssmbootstrap_table.service.IUserService; import cn.com.ttblog.ssmbootstrap_table.validator.UserValidator; @@ -57,5 +58,15 @@ public String save(@Valid User user,BindingResult result,Model model) { } return "redirect:/register-success.html"; } - + + @RequestMapping("/testerror1") + public String testError(){ + throw new CustomGenericException(500,"错误测试"); + } + + @RequestMapping("/testerror2") + public String testError2(){ + int i=1/0; + return "index"; + } } \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/exception/CustomGenericException.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/exception/CustomGenericException.java new file mode 100644 index 00000000..4f2697c6 --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/exception/CustomGenericException.java @@ -0,0 +1,46 @@ +package cn.com.ttblog.ssmbootstrap_table.exception; + +import org.apache.commons.lang.builder.ToStringBuilder; + +/** + * 自定义异常 + * @author netbuffer + */ +public class CustomGenericException extends RuntimeException{ + + /** + * + */ + private static final long serialVersionUID = 1L; + public CustomGenericException(){ + + } + public CustomGenericException(int errCode,String errMsg){ + setErrCode(errCode); + setErrMsg(errMsg); + } + + private int errCode; + + public int getErrCode() { + return errCode; + } + + public void setErrCode(int errCode) { + this.errCode = errCode; + } + + public String getErrMsg() { + return errMsg; + } + + public void setErrMsg(String errMsg) { + this.errMsg = errMsg; + } + + private String errMsg; + + public String toString(){ + return ToStringBuilder.reflectionToString(this); + } +} diff --git a/src/main/resources/spring-mvc.xml b/src/main/resources/spring-mvc.xml index 8d23e130..6680f885 100644 --- a/src/main/resources/spring-mvc.xml +++ b/src/main/resources/spring-mvc.xml @@ -79,8 +79,8 @@ - - + + 设置日志输出级别,不定义则默认不输出警告等错误日志信息 - + 默认错误页面,当找不到上面mappings中指定的异常对应视图时,使用本默认配置 - + 默认HTTP状态码 - + --> +<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> +<%-- <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> --%> + + + + + +error + + + + +
+ 发生错误啦: + +

错误信息

+
+

错误状态码:${errCode}

+

错误详情:${errMsg}

+
+ +
错误信息:${errMsg } +
+
+ + \ No newline at end of file From 5782608507ddb65b9f2de3c8374f3be280a953f0 Mon Sep 17 00:00:00 2001 From: "champion7188@163.com" Date: Mon, 14 Mar 2016 18:37:40 +0800 Subject: [PATCH 009/290] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3ac4ba73..ad2cedb8 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ * druid * weui * log4jdbc +* hibernate-validator ##How to run 项目采用maven构建,运行前请先执行src/main/java下的sql脚本到你的mysql数据库中,然后修改src/main/resource下的jdbc.properties配置文件中的数据库配置信息,进入项目目录,执行mvn tomcat7:run来运行 From e64356d3d7c53d3d88b787f2aac398c1b47b97a7 Mon Sep 17 00:00:00 2001 From: "champion7188@163.com" Date: Mon, 14 Mar 2016 18:38:17 +0800 Subject: [PATCH 010/290] add hibernate-validator --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3ac4ba73..ad2cedb8 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ * druid * weui * log4jdbc +* hibernate-validator ##How to run 项目采用maven构建,运行前请先执行src/main/java下的sql脚本到你的mysql数据库中,然后修改src/main/resource下的jdbc.properties配置文件中的数据库配置信息,进入项目目录,执行mvn tomcat7:run来运行 From 7f30045d4290d88d15c1b0ec3bf6eb96a8e17c66 Mon Sep 17 00:00:00 2001 From: "champion7188@163.com" Date: Tue, 15 Mar 2016 09:48:53 +0800 Subject: [PATCH 011/290] =?UTF-8?q?logback=20=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/logback.sql | 34 ++++++++++++++++++++++++++++++++++ src/main/resources/logback.xml | 34 ++++++++++++++++++++++------------ 2 files changed, 56 insertions(+), 12 deletions(-) create mode 100644 src/main/java/logback.sql diff --git a/src/main/java/logback.sql b/src/main/java/logback.sql new file mode 100644 index 00000000..1a6e920e --- /dev/null +++ b/src/main/java/logback.sql @@ -0,0 +1,34 @@ +CREATE TABLE logging_event + ( + timestmp BIGINT NOT NULL, + formatted_message TEXT NOT NULL, + logger_name VARCHAR(254) NOT NULL, + level_string VARCHAR(254) NOT NULL, + thread_name VARCHAR(254), + reference_flag SMALLINT, + arg0 VARCHAR(254), + arg1 VARCHAR(254), + arg2 VARCHAR(254), + arg3 VARCHAR(254), + caller_filename VARCHAR(254) NOT NULL, + caller_class VARCHAR(254) NOT NULL, + caller_method VARCHAR(254) NOT NULL, + caller_line CHAR(4) NOT NULL, + event_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY + ); +CREATE TABLE logging_event_property + ( + event_id BIGINT NOT NULL, + mapped_key VARCHAR(254) NOT NULL, + mapped_value TEXT, + PRIMARY KEY(event_id, mapped_key), + FOREIGN KEY (event_id) REFERENCES logging_event(event_id) + ); +CREATE TABLE logging_event_exception + ( + event_id BIGINT NOT NULL, + i SMALLINT NOT NULL, + trace_line VARCHAR(254) NOT NULL, + PRIMARY KEY(event_id, i), + FOREIGN KEY (event_id) REFERENCES logging_event(event_id) + ); \ No newline at end of file diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 744dd6dc..0d281697 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -24,23 +24,33 @@ - - - - - - - - - - - + + + + + + + - + + + + + + + + \ No newline at end of file From bfc8645eea5d435289ac594692c585f53e9c8fc0 Mon Sep 17 00:00:00 2001 From: "champion7188@163.com" Date: Tue, 15 Mar 2016 11:39:22 +0800 Subject: [PATCH 012/290] spring test/springmvc fileupload --- .../controller/FileUploadController.java | 41 +++++++++++++ .../controller/RegisterController.java | 5 ++ .../listener/ApplicationListener.java | 22 +++++++ .../ssmbootstrap_table/util/AjaxUtils.java | 18 ++++++ src/main/resources/logback.xml | 5 +- src/main/webapp/WEB-INF/web.xml | 7 +++ .../SpringMvcControllerTests.java | 61 +++++++++++++++++++ 7 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/FileUploadController.java create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/listener/ApplicationListener.java create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/util/AjaxUtils.java create mode 100644 src/test/java/cn/com/ttblog/ssmbootstrap_table/SpringMvcControllerTests.java diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/FileUploadController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/FileUploadController.java new file mode 100644 index 00000000..ed69568c --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/FileUploadController.java @@ -0,0 +1,41 @@ +package cn.com.ttblog.ssmbootstrap_table.controller; + +import java.io.File; +import java.io.IOException; + +import org.apache.commons.lang.builder.ToStringBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +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.context.request.WebRequest; +import org.springframework.web.multipart.MultipartFile; + +import cn.com.ttblog.ssmbootstrap_table.util.AjaxUtils; + +@Controller +@RequestMapping("/fileupload") +public class FileUploadController { + private Logger log=LoggerFactory.getLogger(this.getClass()); + @ModelAttribute + public void ajaxAttribute(WebRequest request, Model model) { + model.addAttribute("ajaxRequest", AjaxUtils.isAjaxRequest(request)); + } + + @RequestMapping(method=RequestMethod.GET) + public void fileUploadForm() { + } + + @RequestMapping(method=RequestMethod.POST) + public void processUpload(@RequestParam MultipartFile file, Model model) throws IOException { + log.info("文件上传信息:{}",ToStringBuilder.reflectionToString(file)); + log.info("文件上传,存储路径:{}",System.getProperty("webapp.root")+file.getOriginalFilename()); + file.transferTo(new File(System.getProperty("webapp.root")+file.getOriginalFilename())); + model.addAttribute("message", "File '" + file.getOriginalFilename() + "' uploaded successfully"); + } + +} \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java index f0fcb925..311bf537 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java @@ -69,4 +69,9 @@ public String testError2(){ int i=1/0; return "index"; } + @RequestMapping("/testredirect") + public String testRedirect(Model model){ + model.addAttribute("param", "test"); + return "redirect:/register-success.html?id={param}"; + } } \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/listener/ApplicationListener.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/listener/ApplicationListener.java new file mode 100644 index 00000000..515e81fd --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/listener/ApplicationListener.java @@ -0,0 +1,22 @@ +package cn.com.ttblog.ssmbootstrap_table.listener; + +import javax.servlet.ServletContextEvent; + +import org.springframework.web.context.ContextLoaderListener; + +/** + * 设置webroot路径 + * @author netbuffer + */ +public class ApplicationListener extends ContextLoaderListener { + + public void contextDestroyed(ServletContextEvent sce) { + } + + public void contextInitialized(ServletContextEvent sce) { + String webAppRootKey = sce.getServletContext().getRealPath("/"); + String param=sce.getServletContext().getInitParameter("webAppRootKey"); + System.setProperty(param , webAppRootKey); + } + +} \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/AjaxUtils.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/AjaxUtils.java new file mode 100644 index 00000000..0fefaa2a --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/AjaxUtils.java @@ -0,0 +1,18 @@ +package cn.com.ttblog.ssmbootstrap_table.util; + +import org.springframework.web.context.request.WebRequest; + +public class AjaxUtils { + + public static boolean isAjaxRequest(WebRequest webRequest) { + String requestedWith = webRequest.getHeader("X-Requested-With"); + return requestedWith != null ? "XMLHttpRequest".equals(requestedWith) : false; + } + + public static boolean isAjaxUploadRequest(WebRequest webRequest) { + return webRequest.getParameter("ajaxUpload") != null; + } + + private AjaxUtils() {} + +} \ No newline at end of file diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 0d281697..30c7e0c3 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -24,7 +24,10 @@ - +
发生错误啦: @@ -28,6 +29,7 @@
错误信息:${errMsg }
+ ${exception}
\ No newline at end of file diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp index a34b80eb..624903bb 100644 --- a/src/main/webapp/index.jsp +++ b/src/main/webapp/index.jsp @@ -1,3 +1,6 @@ +<%@ 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!

@@ -6,5 +9,21 @@ ${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}   取得主机端的服务信息
+	
From 4f0652eb9db935d4b5cd0f4a6b2d0d46643405be Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 22 Mar 2016 22:19:58 +0800 Subject: [PATCH 015/290] mybatis interceptor test --- .../interceptor/MybatisPagerInterceptor.java | 47 ++++++++++++++ src/main/resources/mybatis-globalcfg.xml | 63 +++++++++++++++++++ src/main/resources/spring-mybatis.xml | 2 + .../ssmbootstrap_table/TestMyBatis.java | 13 +++- 4 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/MybatisPagerInterceptor.java create mode 100644 src/main/resources/mybatis-globalcfg.xml diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/MybatisPagerInterceptor.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/MybatisPagerInterceptor.java new file mode 100644 index 00000000..558aac61 --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/MybatisPagerInterceptor.java @@ -0,0 +1,47 @@ +package cn.com.ttblog.ssmbootstrap_table.interceptor; + +import java.sql.Connection; +import java.util.Properties; + +import org.apache.ibatis.executor.statement.StatementHandler; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.plugin.Interceptor; +import org.apache.ibatis.plugin.Intercepts; +import org.apache.ibatis.plugin.Invocation; +import org.apache.ibatis.plugin.Plugin; +import org.apache.ibatis.plugin.Signature; +import org.apache.ibatis.reflection.MetaObject; +import org.apache.ibatis.reflection.SystemMetaObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * mybatis拦截器 + * @author netbuffer + * + */ +@Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class})}) +public class MybatisPagerInterceptor implements Interceptor { + private Logger log=LoggerFactory.getLogger(getClass()); + @Override + public Object intercept(Invocation invocation) throws Throwable { + log.warn("执行到mybatis拦截器了"); + StatementHandler stmt=(StatementHandler)invocation.getTarget(); + MetaObject metastmt=MetaObject.forObject(stmt,SystemMetaObject.DEFAULT_OBJECT_FACTORY,SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY,null); + MappedStatement mapstmt=(MappedStatement)metastmt.getValue("delegate"); + log.debug("stmt->sqlid:{}",mapstmt.getId()); + log.debug("stmt->sql:{}",stmt.getBoundSql().getSql()); + return invocation.proceed(); + } + + @Override + public Object plugin(Object target) { + return Plugin.wrap(target, this); + } + + @Override + public void setProperties(Properties properties) { + + } + +} diff --git a/src/main/resources/mybatis-globalcfg.xml b/src/main/resources/mybatis-globalcfg.xml new file mode 100644 index 00000000..7c586495 --- /dev/null +++ b/src/main/resources/mybatis-globalcfg.xml @@ -0,0 +1,63 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/spring-mybatis.xml b/src/main/resources/spring-mybatis.xml index 5722c8bc..691e1d86 100644 --- a/src/main/resources/spring-mybatis.xml +++ b/src/main/resources/spring-mybatis.xml @@ -59,6 +59,8 @@ + + diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java index 22250ed0..a58085d8 100644 --- a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java @@ -5,6 +5,8 @@ import javax.annotation.Resource; +import org.apache.commons.lang.builder.ToStringBuilder; +import org.apache.ibatis.session.SqlSession; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -30,7 +32,8 @@ public class TestMyBatis { private IUserService userService; @Resource private IUserDao userDao; - + @Resource + private SqlSession sqlSession; // @Before // public void before() { // ac = new ClassPathXmlApplicationContext("applicationContext.xml"); @@ -89,6 +92,7 @@ public void testDatacount(){ } @Test + @Ignore public void testAddUserTran(){ User u=new User(); u.setName("事务测试"); @@ -98,5 +102,12 @@ public void testAddUserTran(){ u.setAdddate((int)System.currentTimeMillis()/1000); userService.addUser(u); } + + @Test + public void testInterceptor(){ +// logger.debug(ToStringBuilder.reflectionToString(sqlSession.getConfiguration())); +// logger.debug("测试拦截器:{}",sqlSession.selectOne("cn.com.ttblog.ssmbootstrap_table.dao.IUserDao.selectByPrimaryKey",1L)); + testDatacount(); + } } From 40d15009f52ad262c24f1bc3bfb7c09e884d506e Mon Sep 17 00:00:00 2001 From: netbuffer Date: Wed, 23 Mar 2016 11:14:37 +0800 Subject: [PATCH 016/290] mybatis interceptor demo --- .../controller/GlobalExceptionController.java | 9 +- .../controller/IndexController.java | 3 +- .../interceptor/MybatisPagerInterceptor.java | 14 ++-- .../ssmbootstrap_table/util/ReflectUtil.java | 82 +++++++++++++++++++ src/main/resources/logback.xml | 12 ++- src/main/resources/mybatis-globalcfg.xml | 54 +++++------- src/main/resources/spring-mybatis.xml | 2 +- .../ssmbootstrap_table/TestMyBatis.java | 2 +- 8 files changed, 132 insertions(+), 46 deletions(-) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/util/ReflectUtil.java diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/GlobalExceptionController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/GlobalExceptionController.java index dfc9baae..7dd351f2 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/GlobalExceptionController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/GlobalExceptionController.java @@ -1,8 +1,12 @@ package cn.com.ttblog.ssmbootstrap_table.controller; +import org.apache.commons.lang.builder.ToStringBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.servlet.ModelAndView; + import cn.com.ttblog.ssmbootstrap_table.exception.CustomGenericException; /** @@ -11,9 +15,10 @@ */ @ControllerAdvice public class GlobalExceptionController { - + Logger log=LoggerFactory.getLogger(getClass()); @ExceptionHandler(CustomGenericException.class) public ModelAndView handleCustomException(CustomGenericException ex) { + log.info("发生错误1:{}",ToStringBuilder.reflectionToString(ex)); ModelAndView model = new ModelAndView("error"); model.addObject("errCode", ex.getErrCode()); model.addObject("errMsg", ex.getErrMsg()); @@ -23,10 +28,10 @@ public ModelAndView handleCustomException(CustomGenericException ex) { @ExceptionHandler(Exception.class) public ModelAndView handleAllException(Exception ex) { + log.info("发生错误2:{}",ToStringBuilder.reflectionToString(ex)); ModelAndView model = new ModelAndView("error"); model.addObject("errMsg",ex.getMessage()); return model; - } } \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java index da672387..f88c7f7d 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java @@ -77,14 +77,15 @@ public String newdata(HttpSession session, Model model) { @RequestMapping("/datacount") public @ResponseBody Map datacount(HttpSession session, Model model) { + logger.debug("获取datacount"); List> counts = userService.getDataSum(); - JSONArray categorys = new JSONArray(); JSONArray nums = new JSONArray(); for (Map m : counts) { categorys.add(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); diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/MybatisPagerInterceptor.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/MybatisPagerInterceptor.java index 558aac61..232ab539 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/MybatisPagerInterceptor.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/MybatisPagerInterceptor.java @@ -3,6 +3,7 @@ import java.sql.Connection; import java.util.Properties; +import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.plugin.Interceptor; @@ -15,6 +16,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import cn.com.ttblog.ssmbootstrap_table.util.ReflectUtil; + /** * mybatis拦截器 * @author netbuffer @@ -25,12 +28,13 @@ public class MybatisPagerInterceptor implements Interceptor { private Logger log=LoggerFactory.getLogger(getClass()); @Override public Object intercept(Invocation invocation) throws Throwable { - log.warn("执行到mybatis拦截器了"); + log.warn("===========================执行mybatis拦截器开始==========================="); StatementHandler stmt=(StatementHandler)invocation.getTarget(); - MetaObject metastmt=MetaObject.forObject(stmt,SystemMetaObject.DEFAULT_OBJECT_FACTORY,SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY,null); - MappedStatement mapstmt=(MappedStatement)metastmt.getValue("delegate"); - log.debug("stmt->sqlid:{}",mapstmt.getId()); - log.debug("stmt->sql:{}",stmt.getBoundSql().getSql()); + StatementHandler delegate = (StatementHandler)ReflectUtil.getFieldValue(stmt, "delegate"); + MappedStatement mappedStatement = (MappedStatement)ReflectUtil.getFieldValue(delegate, "mappedStatement"); + log.info("拦截到的 执行的sql-id:{}",mappedStatement.getId()); + log.info("拦截到的 sql:{},param:{}",stmt.getBoundSql().getSql(),ToStringBuilder.reflectionToString(stmt.getBoundSql().getParameterObject())); + log.warn("===========================执行mybatis拦截器完成==========================="); return invocation.proceed(); } diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/ReflectUtil.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/ReflectUtil.java new file mode 100644 index 00000000..78ad9b37 --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/ReflectUtil.java @@ -0,0 +1,82 @@ +package cn.com.ttblog.ssmbootstrap_table.util; + +import java.lang.reflect.Field; + +public class ReflectUtil { + /** + * 利用反射获取指定对象的指定属性 + * + * @param obj + * 目标对象 + * @param fieldName + * 目标属性 + * @return 目标属性的值 + */ + public static Object getFieldValue(Object obj, String fieldName) { + Object result = null; + Field field = ReflectUtil.getField(obj, fieldName); + if (field != null) { + field.setAccessible(true); + try { + result = field.get(obj); + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return result; + } + + /** + * 利用反射获取指定对象里面的指定属性 + * + * @param obj + * 目标对象 + * @param fieldName + * 目标属性 + * @return 目标字段 + */ + private static Field getField(Object obj, String fieldName) { + Field field = null; + for (Class clazz = obj.getClass(); clazz != Object.class; clazz = clazz + .getSuperclass()) { + try { + field = clazz.getDeclaredField(fieldName); + break; + } catch (NoSuchFieldException e) { + // 这里不用做处理,子类没有该字段可能对应的父类有,都没有就返回null。 + } + } + return field; + } + + /** + * 利用反射设置指定对象的指定属性为指定的值 + * + * @param obj + * 目标对象 + * @param fieldName + * 目标属性 + * @param fieldValue + * 目标值 + */ + public static void setFieldValue(Object obj, String fieldName, + String fieldValue) { + Field field = ReflectUtil.getField(obj, fieldName); + if (field != null) { + try { + field.setAccessible(true); + field.set(obj, fieldValue); + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 30c7e0c3..5e2b318e 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -41,13 +41,19 @@ - + + + + + + + - + - + diff --git a/src/main/resources/mybatis-globalcfg.xml b/src/main/resources/mybatis-globalcfg.xml index 7c586495..6032238d 100644 --- a/src/main/resources/mybatis-globalcfg.xml +++ b/src/main/resources/mybatis-globalcfg.xml @@ -4,57 +4,45 @@ "http://mybatis.org/dtd/mybatis-3-config.dtd"> - - - 查询时,关闭关联对象即时加载以提高性能 + - - 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 + - - 允许使用列标签代替列名 + - - 不允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 + - - 给予被嵌套的resultMap以字段-属性的映射支持 FULL,PARTIAL + - - 对于批量更新操作缓存SQL以提高性能 BATCH,SIMPLE + - - 数据库超过25000秒仍未响应则超时 + - - Allows using RowBounds on nested statements + - - Enables automatic mapping from classic database column names A_COLUMN - to camel case classic Java property names aColumn. + - - MyBatis uses local cache to prevent circular references and speed + - - Specifies the JDBC type for null values when no specific JDBC type + - - Specifies which Object's methods trigger a lazy load + - - 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指 定),不会加载关联表的所有字段,以提高性能 + - --> + + + - +
diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java index a58085d8..a4c8a938 100644 --- a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java @@ -107,7 +107,7 @@ public void testAddUserTran(){ public void testInterceptor(){ // logger.debug(ToStringBuilder.reflectionToString(sqlSession.getConfiguration())); // logger.debug("测试拦截器:{}",sqlSession.selectOne("cn.com.ttblog.ssmbootstrap_table.dao.IUserDao.selectByPrimaryKey",1L)); - testDatacount(); + logger.debug("getdatasum:{}",userDao.getDataSum()); } } From c4965433f47604c31868b6a23bc79585e2fb0cbf Mon Sep 17 00:00:00 2001 From: netbuffer Date: Wed, 23 Mar 2016 13:51:14 +0800 Subject: [PATCH 017/290] mybatis logImpl --- .../interceptor/MybatisPagerInterceptor.java | 7 ++++++- src/main/resources/logback.xml | 15 ++++++--------- src/main/resources/mybatis-globalcfg.xml | 9 ++++++--- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/MybatisPagerInterceptor.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/MybatisPagerInterceptor.java index 232ab539..8a9eda38 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/MybatisPagerInterceptor.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/MybatisPagerInterceptor.java @@ -26,8 +26,12 @@ @Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class})}) public class MybatisPagerInterceptor implements Interceptor { private Logger log=LoggerFactory.getLogger(getClass()); + private Properties properties; @Override public Object intercept(Invocation invocation) throws Throwable { + if(!Boolean.parseBoolean(properties.getProperty("enable"))){ + return invocation.proceed(); + } log.warn("===========================执行mybatis拦截器开始==========================="); StatementHandler stmt=(StatementHandler)invocation.getTarget(); StatementHandler delegate = (StatementHandler)ReflectUtil.getFieldValue(stmt, "delegate"); @@ -45,7 +49,8 @@ public Object plugin(Object target) { @Override public void setProperties(Properties properties) { - + log.info("set "+getClass().getName()+" properties to:{}",properties.getProperty("enable")); + this.properties=properties; } } diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 5e2b318e..a3254b78 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -36,24 +36,21 @@ root --> - + - - - - - - + + + - + diff --git a/src/main/resources/mybatis-globalcfg.xml b/src/main/resources/mybatis-globalcfg.xml index 6032238d..fbc998bb 100644 --- a/src/main/resources/mybatis-globalcfg.xml +++ b/src/main/resources/mybatis-globalcfg.xml @@ -40,12 +40,15 @@ - - + + + + interceptor="cn.com.ttblog.ssmbootstrap_table.interceptor.MybatisPagerInterceptor"> + + \ No newline at end of file From 004fd72f8ffc5b627e2392fdc053e6801527b2bd Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 24 Mar 2016 16:58:31 +0800 Subject: [PATCH 018/290] test jvm Xms Xmx param --- .../controller/IndexController.java | 11 +++++ .../ssmbootstrap_table/TestJvmArguments.java | 40 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/test/java/cn/com/ttblog/ssmbootstrap_table/TestJvmArguments.java diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java index f88c7f7d..0262727c 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java @@ -2,6 +2,7 @@ import java.io.File; import java.io.IOException; +import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; @@ -64,6 +65,16 @@ public String login(HttpSession session, HttpServletRequest request, @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) diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestJvmArguments.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestJvmArguments.java new file mode 100644 index 00000000..b36c423e --- /dev/null +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestJvmArguments.java @@ -0,0 +1,40 @@ +package cn.com.ttblog.ssmbootstrap_table; + +import java.text.DecimalFormat; +import java.util.Iterator; +import java.util.Map.Entry; +import java.util.Properties; + +import org.junit.Ignore; +import org.junit.Test; + +public class TestJvmArguments { + @Test + @Ignore + public void testSystemProperties() { + Properties p = System.getProperties(); + Iterator> it = p.entrySet().iterator(); + while (it.hasNext()) { + Entry item = it.next(); + System.out.print(item.getKey() + "==="); + System.out.println(item.getValue()); + } + } + /** + * 发现在eclipse.ini中配置了jvm内存参数,又通过window->preferences->installed jres来设置jvm参数, + * eclipse.ini的配置就不会生效,而是以instlled jres配置为准 + */ + @Test + public void testMemparam(){ + 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"); + } +} From e46477b52f55d1b7de17dd78b07b2bb5624cd1c7 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 24 Mar 2016 18:10:43 +0800 Subject: [PATCH 019/290] test trimDirectiveWhitespaces --- src/main/webapp/WEB-INF/web.xml | 21 ++++++++++++++----- src/main/webapp/index.jsp | 5 +++++ .../ssmbootstrap_table/TestMyBatis.java | 4 ++-- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 233703b7..e9911651 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -121,10 +121,10 @@ org.springframework.web.context.ContextLoaderListener - - cn.com.ttblog.ssmbootstrap_table.listener.ApplicationListener - - + + cn.com.ttblog.ssmbootstrap_table.listener.ApplicationListener + + druidstat com.alibaba.druid.support.http.StatViewServlet @@ -133,7 +133,7 @@ druidstat /druid/* - + SpringMVC org.springframework.web.servlet.DispatcherServlet @@ -154,6 +154,17 @@ / + + + 404 /404.html diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp index 624903bb..deed997b 100644 --- a/src/main/webapp/index.jsp +++ b/src/main/webapp/index.jsp @@ -1,7 +1,12 @@ + +<%-- <%@ 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
diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java index a4c8a938..c5afa2e2 100644 --- a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java @@ -65,12 +65,11 @@ public void test1() { } @Test - @Ignore public void testAddUser() { for (int i = 0; i < 10; i++) { User u = new User(); u.setAge(i + new Random().nextInt(1)); - u.setAdddate((int)System.currentTimeMillis()); + u.setAdddate((int)(System.currentTimeMillis() / 1000)); u.setName("用户:"+i); u.setDeliveryaddress("收货地址"); u.setPhone("1324"); @@ -104,6 +103,7 @@ public void testAddUserTran(){ } @Test + @Ignore public void testInterceptor(){ // logger.debug(ToStringBuilder.reflectionToString(sqlSession.getConfiguration())); // logger.debug("测试拦截器:{}",sqlSession.selectOne("cn.com.ttblog.ssmbootstrap_table.dao.IUserDao.selectByPrimaryKey",1L)); From 0c26161734c9f5ce7e9977693f198ff5e639b8f3 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sat, 26 Mar 2016 22:35:04 +0800 Subject: [PATCH 020/290] add jquery-weui --- src/main/webapp/css/jquery-weui.css | 2006 ++++ src/main/webapp/js/city-picker.js | 13401 ++++++++++++++++++++++++++ src/main/webapp/js/jquery-weui.js | 2904 ++++++ 3 files changed, 18311 insertions(+) create mode 100644 src/main/webapp/css/jquery-weui.css create mode 100644 src/main/webapp/js/city-picker.js create mode 100644 src/main/webapp/js/jquery-weui.js diff --git a/src/main/webapp/css/jquery-weui.css b/src/main/webapp/css/jquery-weui.css new file mode 100644 index 00000000..82a3ff45 --- /dev/null +++ b/src/main/webapp/css/jquery-weui.css @@ -0,0 +1,2006 @@ +.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%; +} +.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/js/city-picker.js b/src/main/webapp/js/city-picker.js new file mode 100644 index 00000000..5dbdce95 --- /dev/null +++ b/src/main/webapp/js/city-picker.js @@ -0,0 +1,13401 @@ +// jshint ignore: start ++function($){ + +$.rawCitiesData = [ + { + "name":"北京", + "sub":[ + { + "name":"请选择" + }, + { + "name":"东城区" + }, + { + "name":"西城区" + }, + { + "name":"崇文区" + }, + { + "name":"宣武区" + }, + { + "name":"朝阳区" + }, + { + "name":"海淀区" + }, + { + "name":"丰台区" + }, + { + "name":"石景山区" + }, + { + "name":"房山区" + }, + { + "name":"通州区" + }, + { + "name":"顺义区" + }, + { + "name":"昌平区" + }, + { + "name":"大兴区" + }, + { + "name":"怀柔区" + }, + { + "name":"平谷区" + }, + { + "name":"门头沟区" + }, + { + "name":"密云县" + }, + { + "name":"延庆县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"广东", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"广州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"越秀区" + }, + { + "name":"荔湾区" + }, + { + "name":"海珠区" + }, + { + "name":"天河区" + }, + { + "name":"白云区" + }, + { + "name":"黄埔区" + }, + { + "name":"番禺区" + }, + { + "name":"花都区" + }, + { + "name":"南沙区" + }, + { + "name":"萝岗区" + }, + { + "name":"增城市" + }, + { + "name":"从化市" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"深圳", + "sub":[ + { + "name":"请选择" + }, + { + "name":"福田区" + }, + { + "name":"罗湖区" + }, + { + "name":"南山区" + }, + { + "name":"宝安区" + }, + { + "name":"龙岗区" + }, + { + "name":"盐田区" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"珠海", + "sub":[ + { + "name":"请选择" + }, + { + "name":"香洲区" + }, + { + "name":"斗门区" + }, + { + "name":"金湾区" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"汕头", + "sub":[ + { + "name":"请选择" + }, + { + "name":"金平区" + }, + { + "name":"濠江区" + }, + { + "name":"龙湖区" + }, + { + "name":"潮阳区" + }, + { + "name":"潮南区" + }, + { + "name":"澄海区" + }, + { + "name":"南澳县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"韶关", + "sub":[ + { + "name":"请选择" + }, + { + "name":"浈江区" + }, + { + "name":"武江区" + }, + { + "name":"曲江区" + }, + { + "name":"乐昌市" + }, + { + "name":"南雄市" + }, + { + "name":"始兴县" + }, + { + "name":"仁化县" + }, + { + "name":"翁源县" + }, + { + "name":"新丰县" + }, + { + "name":"乳源瑶族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"佛山", + "sub":[ + { + "name":"请选择" + }, + { + "name":"禅城区" + }, + { + "name":"南海区" + }, + { + "name":"顺德区" + }, + { + "name":"三水区" + }, + { + "name":"高明区" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"江门", + "sub":[ + { + "name":"请选择" + }, + { + "name":"蓬江区" + }, + { + "name":"江海区" + }, + { + "name":"新会区" + }, + { + "name":"恩平市" + }, + { + "name":"台山市" + }, + { + "name":"开平市" + }, + { + "name":"鹤山市" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"湛江", + "sub":[ + { + "name":"请选择" + }, + { + "name":"赤坎区" + }, + { + "name":"霞山区" + }, + { + "name":"坡头区" + }, + { + "name":"麻章区" + }, + { + "name":"吴川市" + }, + { + "name":"廉江市" + }, + { + "name":"雷州市" + }, + { + "name":"遂溪县" + }, + { + "name":"徐闻县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"茂名", + "sub":[ + { + "name":"请选择" + }, + { + "name":"茂南区" + }, + { + "name":"茂港区" + }, + { + "name":"化州市" + }, + { + "name":"信宜市" + }, + { + "name":"高州市" + }, + { + "name":"电白县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"肇庆", + "sub":[ + { + "name":"请选择" + }, + { + "name":"端州区" + }, + { + "name":"鼎湖区" + }, + { + "name":"高要市" + }, + { + "name":"四会市" + }, + { + "name":"广宁县" + }, + { + "name":"怀集县" + }, + { + "name":"封开县" + }, + { + "name":"德庆县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"惠州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"惠城区" + }, + { + "name":"惠阳区" + }, + { + "name":"博罗县" + }, + { + "name":"惠东县" + }, + { + "name":"龙门县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"梅州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"梅江区" + }, + { + "name":"兴宁市" + }, + { + "name":"梅县" + }, + { + "name":"大埔县" + }, + { + "name":"丰顺县" + }, + { + "name":"五华县" + }, + { + "name":"平远县" + }, + { + "name":"蕉岭县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"汕尾", + "sub":[ + { + "name":"请选择" + }, + { + "name":"城区" + }, + { + "name":"陆丰市" + }, + { + "name":"海丰县" + }, + { + "name":"陆河县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"河源", + "sub":[ + { + "name":"请选择" + }, + { + "name":"源城区" + }, + { + "name":"紫金县" + }, + { + "name":"龙川县" + }, + { + "name":"连平县" + }, + { + "name":"和平县" + }, + { + "name":"东源县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"阳江", + "sub":[ + { + "name":"请选择" + }, + { + "name":"江城区" + }, + { + "name":"阳春市" + }, + { + "name":"阳西县" + }, + { + "name":"阳东县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"清远", + "sub":[ + { + "name":"请选择" + }, + { + "name":"清城区" + }, + { + "name":"英德市" + }, + { + "name":"连州市" + }, + { + "name":"佛冈县" + }, + { + "name":"阳山县" + }, + { + "name":"清新县" + }, + { + "name":"连山壮族瑶族自治县" + }, + { + "name":"连南瑶族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"东莞", + "sub":[ + + ], + "type":0 + }, + { + "name":"中山", + "sub":[ + + ], + "type":0 + }, + { + "name":"潮州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"湘桥区" + }, + { + "name":"潮安县" + }, + { + "name":"饶平县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"揭阳", + "sub":[ + { + "name":"请选择" + }, + { + "name":"榕城区" + }, + { + "name":"普宁市" + }, + { + "name":"揭东县" + }, + { + "name":"揭西县" + }, + { + "name":"惠来县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"云浮", + "sub":[ + { + "name":"请选择" + }, + { + "name":"云城区" + }, + { + "name":"罗定市" + }, + { + "name":"云安县" + }, + { + "name":"新兴县" + }, + { + "name":"郁南县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"上海", + "sub":[ + { + "name":"请选择" + }, + { + "name":"黄浦区" + }, + { + "name":"卢湾区" + }, + { + "name":"徐汇区" + }, + { + "name":"长宁区" + }, + { + "name":"静安区" + }, + { + "name":"普陀区" + }, + { + "name":"闸北区" + }, + { + "name":"虹口区" + }, + { + "name":"杨浦区" + }, + { + "name":"宝山区" + }, + { + "name":"闵行区" + }, + { + "name":"嘉定区" + }, + { + "name":"松江区" + }, + { + "name":"金山区" + }, + { + "name":"青浦区" + }, + { + "name":"南汇区" + }, + { + "name":"奉贤区" + }, + { + "name":"浦东新区" + }, + { + "name":"崇明县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"天津", + "sub":[ + { + "name":"请选择" + }, + { + "name":"和平区" + }, + { + "name":"河东区" + }, + { + "name":"河西区" + }, + { + "name":"南开区" + }, + { + "name":"河北区" + }, + { + "name":"红桥区" + }, + { + "name":"塘沽区" + }, + { + "name":"汉沽区" + }, + { + "name":"大港区" + }, + { + "name":"东丽区" + }, + { + "name":"西青区" + }, + { + "name":"北辰区" + }, + { + "name":"津南区" + }, + { + "name":"武清区" + }, + { + "name":"宝坻区" + }, + { + "name":"静海县" + }, + { + "name":"宁河县" + }, + { + "name":"蓟县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"重庆", + "sub":[ + { + "name":"请选择" + }, + { + "name":"渝中区" + }, + { + "name":"大渡口区" + }, + { + "name":"江北区" + }, + { + "name":"南岸区" + }, + { + "name":"北碚区" + }, + { + "name":"渝北区" + }, + { + "name":"巴南区" + }, + { + "name":"长寿区" + }, + { + "name":"双桥区" + }, + { + "name":"沙坪坝区" + }, + { + "name":"万盛区" + }, + { + "name":"万州区" + }, + { + "name":"涪陵区" + }, + { + "name":"黔江区" + }, + { + "name":"永川区" + }, + { + "name":"合川区" + }, + { + "name":"江津区" + }, + { + "name":"九龙坡区" + }, + { + "name":"南川区" + }, + { + "name":"綦江县" + }, + { + "name":"潼南县" + }, + { + "name":"荣昌县" + }, + { + "name":"璧山县" + }, + { + "name":"大足县" + }, + { + "name":"铜梁县" + }, + { + "name":"梁平县" + }, + { + "name":"开县" + }, + { + "name":"忠县" + }, + { + "name":"城口县" + }, + { + "name":"垫江县" + }, + { + "name":"武隆县" + }, + { + "name":"丰都县" + }, + { + "name":"奉节县" + }, + { + "name":"云阳县" + }, + { + "name":"巫溪县" + }, + { + "name":"巫山县" + }, + { + "name":"石柱土家族自治县" + }, + { + "name":"秀山土家族苗族自治县" + }, + { + "name":"酉阳土家族苗族自治县" + }, + { + "name":"彭水苗族土家族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"辽宁", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"沈阳", + "sub":[ + { + "name":"请选择" + }, + { + "name":"沈河区" + }, + { + "name":"皇姑区" + }, + { + "name":"和平区" + }, + { + "name":"大东区" + }, + { + "name":"铁西区" + }, + { + "name":"苏家屯区" + }, + { + "name":"东陵区" + }, + { + "name":"于洪区" + }, + { + "name":"新民市" + }, + { + "name":"法库县" + }, + { + "name":"辽中县" + }, + { + "name":"康平县" + }, + { + "name":"新城子区" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"大连", + "sub":[ + { + "name":"请选择" + }, + { + "name":"西岗区" + }, + { + "name":"中山区" + }, + { + "name":"沙河口区" + }, + { + "name":"甘井子区" + }, + { + "name":"旅顺口区" + }, + { + "name":"金州区" + }, + { + "name":"瓦房店市" + }, + { + "name":"普兰店市" + }, + { + "name":"庄河市" + }, + { + "name":"长海县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"鞍山", + "sub":[ + { + "name":"请选择" + }, + { + "name":"铁东区" + }, + { + "name":"铁西区" + }, + { + "name":"立山区" + }, + { + "name":"千山区" + }, + { + "name":"海城市" + }, + { + "name":"台安县" + }, + { + "name":"岫岩满族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"抚顺", + "sub":[ + { + "name":"请选择" + }, + { + "name":"顺城区" + }, + { + "name":"新抚区" + }, + { + "name":"东洲区" + }, + { + "name":"望花区" + }, + { + "name":"抚顺县" + }, + { + "name":"清原满族自治县" + }, + { + "name":"新宾满族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"本溪", + "sub":[ + { + "name":"请选择" + }, + { + "name":"平山区" + }, + { + "name":"明山区" + }, + { + "name":"溪湖区" + }, + { + "name":"南芬区" + }, + { + "name":"本溪满族自治县" + }, + { + "name":"桓仁满族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"丹东", + "sub":[ + { + "name":"请选择" + }, + { + "name":"振兴区" + }, + { + "name":"元宝区" + }, + { + "name":"振安区" + }, + { + "name":"东港市" + }, + { + "name":"凤城市" + }, + { + "name":"宽甸满族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"锦州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"太和区" + }, + { + "name":"古塔区" + }, + { + "name":"凌河区" + }, + { + "name":"凌海市" + }, + { + "name":"黑山县" + }, + { + "name":"义县" + }, + { + "name":"北宁市" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"营口", + "sub":[ + { + "name":"请选择" + }, + { + "name":"站前区" + }, + { + "name":"西市区" + }, + { + "name":"鲅鱼圈区" + }, + { + "name":"老边区" + }, + { + "name":"大石桥市" + }, + { + "name":"盖州市" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"阜新", + "sub":[ + { + "name":"请选择" + }, + { + "name":"海州区" + }, + { + "name":"新邱区" + }, + { + "name":"太平区" + }, + { + "name":"清河门区" + }, + { + "name":"细河区" + }, + { + "name":"彰武县" + }, + { + "name":"阜新蒙古族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"辽阳", + "sub":[ + { + "name":"请选择" + }, + { + "name":"白塔区" + }, + { + "name":"文圣区" + }, + { + "name":"宏伟区" + }, + { + "name":"太子河区" + }, + { + "name":"弓长岭区" + }, + { + "name":"灯塔市" + }, + { + "name":"辽阳县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"盘锦", + "sub":[ + { + "name":"请选择" + }, + { + "name":"双台子区" + }, + { + "name":"兴隆台区" + }, + { + "name":"盘山县" + }, + { + "name":"大洼县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"铁岭", + "sub":[ + { + "name":"请选择" + }, + { + "name":"银州区" + }, + { + "name":"清河区" + }, + { + "name":"调兵山市" + }, + { + "name":"开原市" + }, + { + "name":"铁岭县" + }, + { + "name":"昌图县" + }, + { + "name":"西丰县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"朝阳", + "sub":[ + { + "name":"请选择" + }, + { + "name":"双塔区" + }, + { + "name":"龙城区" + }, + { + "name":"凌源市" + }, + { + "name":"北票市" + }, + { + "name":"朝阳县" + }, + { + "name":"建平县" + }, + { + "name":"喀喇沁左翼蒙古族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"葫芦岛", + "sub":[ + { + "name":"请选择" + }, + { + "name":"龙港区" + }, + { + "name":"南票区" + }, + { + "name":"连山区" + }, + { + "name":"兴城市" + }, + { + "name":"绥中县" + }, + { + "name":"建昌县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"江苏", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"南京", + "sub":[ + { + "name":"请选择" + }, + { + "name":"玄武区" + }, + { + "name":"白下区" + }, + { + "name":"秦淮区" + }, + { + "name":"建邺区" + }, + { + "name":"鼓楼区" + }, + { + "name":"下关区" + }, + { + "name":"栖霞区" + }, + { + "name":"雨花台区" + }, + { + "name":"浦口区" + }, + { + "name":"江宁区" + }, + { + "name":"六合区" + }, + { + "name":"溧水县" + }, + { + "name":"高淳县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"苏州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"金阊区" + }, + { + "name":"平江区" + }, + { + "name":"沧浪区" + }, + { + "name":"虎丘区" + }, + { + "name":"吴中区" + }, + { + "name":"相城区" + }, + { + "name":"常熟市" + }, + { + "name":"张家港市" + }, + { + "name":"昆山市" + }, + { + "name":"吴江市" + }, + { + "name":"太仓市" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"无锡", + "sub":[ + { + "name":"请选择" + }, + { + "name":"崇安区" + }, + { + "name":"南长区" + }, + { + "name":"北塘区" + }, + { + "name":"滨湖区" + }, + { + "name":"锡山区" + }, + { + "name":"惠山区" + }, + { + "name":"江阴市" + }, + { + "name":"宜兴市" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"常州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"钟楼区" + }, + { + "name":"天宁区" + }, + { + "name":"戚墅堰区" + }, + { + "name":"新北区" + }, + { + "name":"武进区" + }, + { + "name":"金坛市" + }, + { + "name":"溧阳市" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"镇江", + "sub":[ + { + "name":"请选择" + }, + { + "name":"京口区" + }, + { + "name":"润州区" + }, + { + "name":"丹徒区" + }, + { + "name":"丹阳市" + }, + { + "name":"扬中市" + }, + { + "name":"句容市" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"南通", + "sub":[ + { + "name":"请选择" + }, + { + "name":"崇川区" + }, + { + "name":"港闸区" + }, + { + "name":"通州市" + }, + { + "name":"如皋市" + }, + { + "name":"海门市" + }, + { + "name":"启东市" + }, + { + "name":"海安县" + }, + { + "name":"如东县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"泰州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"海陵区" + }, + { + "name":"高港区" + }, + { + "name":"姜堰市" + }, + { + "name":"泰兴市" + }, + { + "name":"靖江市" + }, + { + "name":"兴化市" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"扬州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"广陵区" + }, + { + "name":"维扬区" + }, + { + "name":"邗江区" + }, + { + "name":"江都市" + }, + { + "name":"仪征市" + }, + { + "name":"高邮市" + }, + { + "name":"宝应县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"盐城", + "sub":[ + { + "name":"请选择" + }, + { + "name":"亭湖区" + }, + { + "name":"盐都区" + }, + { + "name":"大丰市" + }, + { + "name":"东台市" + }, + { + "name":"建湖县" + }, + { + "name":"射阳县" + }, + { + "name":"阜宁县" + }, + { + "name":"滨海县" + }, + { + "name":"响水县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"连云港", + "sub":[ + { + "name":"请选择" + }, + { + "name":"新浦区" + }, + { + "name":"海州区" + }, + { + "name":"连云区" + }, + { + "name":"东海县" + }, + { + "name":"灌云县" + }, + { + "name":"赣榆县" + }, + { + "name":"灌南县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"徐州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"云龙区" + }, + { + "name":"鼓楼区" + }, + { + "name":"九里区" + }, + { + "name":"泉山区" + }, + { + "name":"贾汪区" + }, + { + "name":"邳州市" + }, + { + "name":"新沂市" + }, + { + "name":"铜山县" + }, + { + "name":"睢宁县" + }, + { + "name":"沛县" + }, + { + "name":"丰县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"淮安", + "sub":[ + { + "name":"请选择" + }, + { + "name":"清河区" + }, + { + "name":"清浦区" + }, + { + "name":"楚州区" + }, + { + "name":"淮阴区" + }, + { + "name":"涟水县" + }, + { + "name":"洪泽县" + }, + { + "name":"金湖县" + }, + { + "name":"盱眙县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"宿迁", + "sub":[ + { + "name":"请选择" + }, + { + "name":"宿城区" + }, + { + "name":"宿豫区" + }, + { + "name":"沭阳县" + }, + { + "name":"泗阳县" + }, + { + "name":"泗洪县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"湖北", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"武汉", + "sub":[ + { + "name":"请选择" + }, + { + "name":"江岸区" + }, + { + "name":"武昌区" + }, + { + "name":"江汉区" + }, + { + "name":"硚口区" + }, + { + "name":"汉阳区" + }, + { + "name":"青山区" + }, + { + "name":"洪山区" + }, + { + "name":"东西湖区" + }, + { + "name":"汉南区" + }, + { + "name":"蔡甸区" + }, + { + "name":"江夏区" + }, + { + "name":"黄陂区" + }, + { + "name":"新洲区" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"黄石", + "sub":[ + { + "name":"请选择" + }, + { + "name":"黄石港区" + }, + { + "name":"西塞山区" + }, + { + "name":"下陆区" + }, + { + "name":"铁山区" + }, + { + "name":"大冶市" + }, + { + "name":"阳新县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"十堰", + "sub":[ + { + "name":"请选择" + }, + { + "name":"张湾区" + }, + { + "name":"茅箭区" + }, + { + "name":"丹江口市" + }, + { + "name":"郧县" + }, + { + "name":"竹山县" + }, + { + "name":"房县" + }, + { + "name":"郧西县" + }, + { + "name":"竹溪县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"荆州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"沙市区" + }, + { + "name":"荆州区" + }, + { + "name":"洪湖市" + }, + { + "name":"石首市" + }, + { + "name":"松滋市" + }, + { + "name":"监利县" + }, + { + "name":"公安县" + }, + { + "name":"江陵县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"宜昌", + "sub":[ + { + "name":"请选择" + }, + { + "name":"西陵区" + }, + { + "name":"伍家岗区" + }, + { + "name":"点军区" + }, + { + "name":"猇亭区" + }, + { + "name":"夷陵区" + }, + { + "name":"宜都市" + }, + { + "name":"当阳市" + }, + { + "name":"枝江市" + }, + { + "name":"秭归县" + }, + { + "name":"远安县" + }, + { + "name":"兴山县" + }, + { + "name":"五峰土家族自治县" + }, + { + "name":"长阳土家族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"襄樊", + "sub":[ + { + "name":"请选择" + }, + { + "name":"襄城区" + }, + { + "name":"樊城区" + }, + { + "name":"襄阳区" + }, + { + "name":"老河口市" + }, + { + "name":"枣阳市" + }, + { + "name":"宜城市" + }, + { + "name":"南漳县" + }, + { + "name":"谷城县" + }, + { + "name":"保康县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"鄂州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"鄂城区" + }, + { + "name":"华容区" + }, + { + "name":"梁子湖区" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"荆门", + "sub":[ + { + "name":"请选择" + }, + { + "name":"东宝区" + }, + { + "name":"掇刀区" + }, + { + "name":"钟祥市" + }, + { + "name":"京山县" + }, + { + "name":"沙洋县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"孝感", + "sub":[ + { + "name":"请选择" + }, + { + "name":"孝南区" + }, + { + "name":"应城市" + }, + { + "name":"安陆市" + }, + { + "name":"汉川市" + }, + { + "name":"云梦县" + }, + { + "name":"大悟县" + }, + { + "name":"孝昌县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"黄冈", + "sub":[ + { + "name":"请选择" + }, + { + "name":"黄州区" + }, + { + "name":"麻城市" + }, + { + "name":"武穴市" + }, + { + "name":"红安县" + }, + { + "name":"罗田县" + }, + { + "name":"浠水县" + }, + { + "name":"蕲春县" + }, + { + "name":"黄梅县" + }, + { + "name":"英山县" + }, + { + "name":"团风县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"咸宁", + "sub":[ + { + "name":"请选择" + }, + { + "name":"咸安区" + }, + { + "name":"赤壁市" + }, + { + "name":"嘉鱼县" + }, + { + "name":"通山县" + }, + { + "name":"崇阳县" + }, + { + "name":"通城县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"随州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"曾都区" + }, + { + "name":"广水市" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"恩施土家族苗族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"恩施市" + }, + { + "name":"利川市" + }, + { + "name":"建始县" + }, + { + "name":"来凤县" + }, + { + "name":"巴东县" + }, + { + "name":"鹤峰县" + }, + { + "name":"宣恩县" + }, + { + "name":"咸丰县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"仙桃", + "sub":[ + + ], + "type":0 + }, + { + "name":"天门", + "sub":[ + + ], + "type":0 + }, + { + "name":"潜江", + "sub":[ + + ], + "type":0 + }, + { + "name":"神农架林区", + "sub":[ + + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"四川", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"成都", + "sub":[ + { + "name":"请选择" + }, + { + "name":"青羊区" + }, + { + "name":"锦江区" + }, + { + "name":"金牛区" + }, + { + "name":"武侯区" + }, + { + "name":"成华区" + }, + { + "name":"龙泉驿区" + }, + { + "name":"青白江区" + }, + { + "name":"新都区" + }, + { + "name":"温江区" + }, + { + "name":"都江堰市" + }, + { + "name":"彭州市" + }, + { + "name":"邛崃市" + }, + { + "name":"崇州市" + }, + { + "name":"金堂县" + }, + { + "name":"郫县" + }, + { + "name":"新津县" + }, + { + "name":"双流县" + }, + { + "name":"蒲江县" + }, + { + "name":"大邑县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"自贡", + "sub":[ + { + "name":"请选择" + }, + { + "name":"大安区" + }, + { + "name":"自流井区" + }, + { + "name":"贡井区" + }, + { + "name":"沿滩区" + }, + { + "name":"荣县" + }, + { + "name":"富顺县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"攀枝花", + "sub":[ + { + "name":"请选择" + }, + { + "name":"仁和区" + }, + { + "name":"米易县" + }, + { + "name":"盐边县" + }, + { + "name":"东区" + }, + { + "name":"西区" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"泸州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"江阳区" + }, + { + "name":"纳溪区" + }, + { + "name":"龙马潭区" + }, + { + "name":"泸县" + }, + { + "name":"合江县" + }, + { + "name":"叙永县" + }, + { + "name":"古蔺县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"德阳", + "sub":[ + { + "name":"请选择" + }, + { + "name":"旌阳区" + }, + { + "name":"广汉市" + }, + { + "name":"什邡市" + }, + { + "name":"绵竹市" + }, + { + "name":"罗江县" + }, + { + "name":"中江县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"绵阳", + "sub":[ + { + "name":"请选择" + }, + { + "name":"涪城区" + }, + { + "name":"游仙区" + }, + { + "name":"江油市" + }, + { + "name":"盐亭县" + }, + { + "name":"三台县" + }, + { + "name":"平武县" + }, + { + "name":"安县" + }, + { + "name":"梓潼县" + }, + { + "name":"北川羌族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"广元", + "sub":[ + { + "name":"请选择" + }, + { + "name":"元坝区" + }, + { + "name":"朝天区" + }, + { + "name":"青川县" + }, + { + "name":"旺苍县" + }, + { + "name":"剑阁县" + }, + { + "name":"苍溪县" + }, + { + "name":"市中区" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"遂宁", + "sub":[ + { + "name":"请选择" + }, + { + "name":"船山区" + }, + { + "name":"安居区" + }, + { + "name":"射洪县" + }, + { + "name":"蓬溪县" + }, + { + "name":"大英县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"内江", + "sub":[ + { + "name":"请选择" + }, + { + "name":"市中区" + }, + { + "name":"东兴区" + }, + { + "name":"资中县" + }, + { + "name":"隆昌县" + }, + { + "name":"威远县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"乐山", + "sub":[ + { + "name":"请选择" + }, + { + "name":"市中区" + }, + { + "name":"五通桥区" + }, + { + "name":"沙湾区" + }, + { + "name":"金口河区" + }, + { + "name":"峨眉山市" + }, + { + "name":"夹江县" + }, + { + "name":"井研县" + }, + { + "name":"犍为县" + }, + { + "name":"沐川县" + }, + { + "name":"马边彝族自治县" + }, + { + "name":"峨边彝族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"南充", + "sub":[ + { + "name":"请选择" + }, + { + "name":"顺庆区" + }, + { + "name":"高坪区" + }, + { + "name":"嘉陵区" + }, + { + "name":"阆中市" + }, + { + "name":"营山县" + }, + { + "name":"蓬安县" + }, + { + "name":"仪陇县" + }, + { + "name":"南部县" + }, + { + "name":"西充县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"眉山", + "sub":[ + { + "name":"请选择" + }, + { + "name":"东坡区" + }, + { + "name":"仁寿县" + }, + { + "name":"彭山县" + }, + { + "name":"洪雅县" + }, + { + "name":"丹棱县" + }, + { + "name":"青神县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"宜宾", + "sub":[ + { + "name":"请选择" + }, + { + "name":"翠屏区" + }, + { + "name":"宜宾县" + }, + { + "name":"兴文县" + }, + { + "name":"南溪县" + }, + { + "name":"珙县" + }, + { + "name":"长宁县" + }, + { + "name":"高县" + }, + { + "name":"江安县" + }, + { + "name":"筠连县" + }, + { + "name":"屏山县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"广安", + "sub":[ + { + "name":"请选择" + }, + { + "name":"广安区" + }, + { + "name":"华蓥市" + }, + { + "name":"岳池县" + }, + { + "name":"邻水县" + }, + { + "name":"武胜县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"达州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"通川区" + }, + { + "name":"万源市" + }, + { + "name":"达县" + }, + { + "name":"渠县" + }, + { + "name":"宣汉县" + }, + { + "name":"开江县" + }, + { + "name":"大竹县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"雅安", + "sub":[ + { + "name":"请选择" + }, + { + "name":"雨城区" + }, + { + "name":"芦山县" + }, + { + "name":"石棉县" + }, + { + "name":"名山县" + }, + { + "name":"天全县" + }, + { + "name":"荥经县" + }, + { + "name":"宝兴县" + }, + { + "name":"汉源县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"巴中", + "sub":[ + { + "name":"请选择" + }, + { + "name":"巴州区" + }, + { + "name":"南江县" + }, + { + "name":"平昌县" + }, + { + "name":"通江县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"资阳", + "sub":[ + { + "name":"请选择" + }, + { + "name":"雁江区" + }, + { + "name":"简阳市" + }, + { + "name":"安岳县" + }, + { + "name":"乐至县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"阿坝藏族羌族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"马尔康县" + }, + { + "name":"九寨沟县" + }, + { + "name":"红原县" + }, + { + "name":"汶川县" + }, + { + "name":"阿坝县" + }, + { + "name":"理县" + }, + { + "name":"若尔盖县" + }, + { + "name":"小金县" + }, + { + "name":"黑水县" + }, + { + "name":"金川县" + }, + { + "name":"松潘县" + }, + { + "name":"壤塘县" + }, + { + "name":"茂县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"甘孜藏族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"康定县" + }, + { + "name":"丹巴县" + }, + { + "name":"炉霍县" + }, + { + "name":"九龙县" + }, + { + "name":"甘孜县" + }, + { + "name":"雅江县" + }, + { + "name":"新龙县" + }, + { + "name":"道孚县" + }, + { + "name":"白玉县" + }, + { + "name":"理塘县" + }, + { + "name":"德格县" + }, + { + "name":"乡城县" + }, + { + "name":"石渠县" + }, + { + "name":"稻城县" + }, + { + "name":"色达县" + }, + { + "name":"巴塘县" + }, + { + "name":"泸定县" + }, + { + "name":"得荣县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"凉山彝族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"西昌市" + }, + { + "name":"美姑县" + }, + { + "name":"昭觉县" + }, + { + "name":"金阳县" + }, + { + "name":"甘洛县" + }, + { + "name":"布拖县" + }, + { + "name":"雷波县" + }, + { + "name":"普格县" + }, + { + "name":"宁南县" + }, + { + "name":"喜德县" + }, + { + "name":"会东县" + }, + { + "name":"越西县" + }, + { + "name":"会理县" + }, + { + "name":"盐源县" + }, + { + "name":"德昌县" + }, + { + "name":"冕宁县" + }, + { + "name":"木里藏族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"陕西", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"西安", + "sub":[ + { + "name":"请选择" + }, + { + "name":"莲湖区" + }, + { + "name":"新城区" + }, + { + "name":"碑林区" + }, + { + "name":"雁塔区" + }, + { + "name":"灞桥区" + }, + { + "name":"未央区" + }, + { + "name":"阎良区" + }, + { + "name":"临潼区" + }, + { + "name":"长安区" + }, + { + "name":"高陵县" + }, + { + "name":"蓝田县" + }, + { + "name":"户县" + }, + { + "name":"周至县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"铜川", + "sub":[ + { + "name":"请选择" + }, + { + "name":"耀州区" + }, + { + "name":"王益区" + }, + { + "name":"印台区" + }, + { + "name":"宜君县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"宝鸡", + "sub":[ + { + "name":"请选择" + }, + { + "name":"渭滨区" + }, + { + "name":"金台区" + }, + { + "name":"陈仓区" + }, + { + "name":"岐山县" + }, + { + "name":"凤翔县" + }, + { + "name":"陇县" + }, + { + "name":"太白县" + }, + { + "name":"麟游县" + }, + { + "name":"扶风县" + }, + { + "name":"千阳县" + }, + { + "name":"眉县" + }, + { + "name":"凤县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"咸阳", + "sub":[ + { + "name":"请选择" + }, + { + "name":"秦都区" + }, + { + "name":"渭城区" + }, + { + "name":"杨陵区" + }, + { + "name":"兴平市" + }, + { + "name":"礼泉县" + }, + { + "name":"泾阳县" + }, + { + "name":"永寿县" + }, + { + "name":"三原县" + }, + { + "name":"彬县" + }, + { + "name":"旬邑县" + }, + { + "name":"长武县" + }, + { + "name":"乾县" + }, + { + "name":"武功县" + }, + { + "name":"淳化县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"渭南", + "sub":[ + { + "name":"请选择" + }, + { + "name":"临渭区" + }, + { + "name":"韩城市" + }, + { + "name":"华阴市" + }, + { + "name":"蒲城县" + }, + { + "name":"潼关县" + }, + { + "name":"白水县" + }, + { + "name":"澄城县" + }, + { + "name":"华县" + }, + { + "name":"合阳县" + }, + { + "name":"富平县" + }, + { + "name":"大荔县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"延安", + "sub":[ + { + "name":"请选择" + }, + { + "name":"宝塔区" + }, + { + "name":"安塞县" + }, + { + "name":"洛川县" + }, + { + "name":"子长县" + }, + { + "name":"黄陵县" + }, + { + "name":"延川县" + }, + { + "name":"富县" + }, + { + "name":"延长县" + }, + { + "name":"甘泉县" + }, + { + "name":"宜川县" + }, + { + "name":"志丹县" + }, + { + "name":"黄龙县" + }, + { + "name":"吴起县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"汉中", + "sub":[ + { + "name":"请选择" + }, + { + "name":"汉台区" + }, + { + "name":"留坝县" + }, + { + "name":"镇巴县" + }, + { + "name":"城固县" + }, + { + "name":"南郑县" + }, + { + "name":"洋县" + }, + { + "name":"宁强县" + }, + { + "name":"佛坪县" + }, + { + "name":"勉县" + }, + { + "name":"西乡县" + }, + { + "name":"略阳县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"榆林", + "sub":[ + { + "name":"请选择" + }, + { + "name":"榆阳区" + }, + { + "name":"清涧县" + }, + { + "name":"绥德县" + }, + { + "name":"神木县" + }, + { + "name":"佳县" + }, + { + "name":"府谷县" + }, + { + "name":"子洲县" + }, + { + "name":"靖边县" + }, + { + "name":"横山县" + }, + { + "name":"米脂县" + }, + { + "name":"吴堡县" + }, + { + "name":"定边县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"安康", + "sub":[ + { + "name":"请选择" + }, + { + "name":"汉滨区" + }, + { + "name":"紫阳县" + }, + { + "name":"岚皋县" + }, + { + "name":"旬阳县" + }, + { + "name":"镇坪县" + }, + { + "name":"平利县" + }, + { + "name":"石泉县" + }, + { + "name":"宁陕县" + }, + { + "name":"白河县" + }, + { + "name":"汉阴县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"商洛", + "sub":[ + { + "name":"请选择" + }, + { + "name":"商州区" + }, + { + "name":"镇安县" + }, + { + "name":"山阳县" + }, + { + "name":"洛南县" + }, + { + "name":"商南县" + }, + { + "name":"丹凤县" + }, + { + "name":"柞水县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"河北", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"石家庄", + "sub":[ + { + "name":"请选择" + }, + { + "name":"长安区" + }, + { + "name":"桥东区" + }, + { + "name":"桥西区" + }, + { + "name":"新华区" + }, + { + "name":"裕华区" + }, + { + "name":"井陉矿区" + }, + { + "name":"鹿泉市" + }, + { + "name":"辛集市" + }, + { + "name":"藁城市" + }, + { + "name":"晋州市" + }, + { + "name":"新乐市" + }, + { + "name":"深泽县" + }, + { + "name":"无极县" + }, + { + "name":"赵县" + }, + { + "name":"灵寿县" + }, + { + "name":"高邑县" + }, + { + "name":"元氏县" + }, + { + "name":"赞皇县" + }, + { + "name":"平山县" + }, + { + "name":"井陉县" + }, + { + "name":"栾城县" + }, + { + "name":"正定县" + }, + { + "name":"行唐县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"唐山", + "sub":[ + { + "name":"请选择" + }, + { + "name":"路北区" + }, + { + "name":"路南区" + }, + { + "name":"古冶区" + }, + { + "name":"开平区" + }, + { + "name":"丰南区" + }, + { + "name":"丰润区" + }, + { + "name":"遵化市" + }, + { + "name":"迁安市" + }, + { + "name":"迁西县" + }, + { + "name":"滦南县" + }, + { + "name":"玉田县" + }, + { + "name":"唐海县" + }, + { + "name":"乐亭县" + }, + { + "name":"滦县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"秦皇岛", + "sub":[ + { + "name":"请选择" + }, + { + "name":"海港区" + }, + { + "name":"山海关区" + }, + { + "name":"北戴河区" + }, + { + "name":"昌黎县" + }, + { + "name":"抚宁县" + }, + { + "name":"卢龙县" + }, + { + "name":"青龙满族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"邯郸", + "sub":[ + { + "name":"请选择" + }, + { + "name":"邯山区" + }, + { + "name":"丛台区" + }, + { + "name":"复兴区" + }, + { + "name":"峰峰矿区" + }, + { + "name":"武安市" + }, + { + "name":"邱县" + }, + { + "name":"大名县" + }, + { + "name":"魏县" + }, + { + "name":"曲周县" + }, + { + "name":"鸡泽县" + }, + { + "name":"肥乡县" + }, + { + "name":"广平县" + }, + { + "name":"成安县" + }, + { + "name":"临漳县" + }, + { + "name":"磁县" + }, + { + "name":"涉县" + }, + { + "name":"永年县" + }, + { + "name":"馆陶县" + }, + { + "name":"邯郸县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"邢台", + "sub":[ + { + "name":"请选择" + }, + { + "name":"桥东区" + }, + { + "name":"桥西区" + }, + { + "name":"南宫市" + }, + { + "name":"沙河市" + }, + { + "name":"临城县" + }, + { + "name":"内丘县" + }, + { + "name":"柏乡县" + }, + { + "name":"隆尧县" + }, + { + "name":"任县" + }, + { + "name":"南和县" + }, + { + "name":"宁晋县" + }, + { + "name":"巨鹿县" + }, + { + "name":"新河县" + }, + { + "name":"广宗县" + }, + { + "name":"平乡县" + }, + { + "name":"威县" + }, + { + "name":"清河县" + }, + { + "name":"临西县" + }, + { + "name":"邢台县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"保定", + "sub":[ + { + "name":"请选择" + }, + { + "name":"新市区" + }, + { + "name":"北市区" + }, + { + "name":"南市区" + }, + { + "name":"定州市" + }, + { + "name":"涿州市" + }, + { + "name":"安国市" + }, + { + "name":"高碑店市" + }, + { + "name":"易县" + }, + { + "name":"徐水县" + }, + { + "name":"涞源县" + }, + { + "name":"顺平县" + }, + { + "name":"唐县" + }, + { + "name":"望都县" + }, + { + "name":"涞水县" + }, + { + "name":"高阳县" + }, + { + "name":"安新县" + }, + { + "name":"雄县" + }, + { + "name":"容城县" + }, + { + "name":"蠡县" + }, + { + "name":"曲阳县" + }, + { + "name":"阜平县" + }, + { + "name":"博野县" + }, + { + "name":"满城县" + }, + { + "name":"清苑县" + }, + { + "name":"定兴县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"张家口", + "sub":[ + { + "name":"请选择" + }, + { + "name":"桥东区" + }, + { + "name":"桥西区" + }, + { + "name":"宣化区" + }, + { + "name":"下花园区" + }, + { + "name":"张北县" + }, + { + "name":"康保县" + }, + { + "name":"沽源县" + }, + { + "name":"尚义县" + }, + { + "name":"蔚县" + }, + { + "name":"阳原县" + }, + { + "name":"怀安县" + }, + { + "name":"万全县" + }, + { + "name":"怀来县" + }, + { + "name":"赤城县" + }, + { + "name":"崇礼县" + }, + { + "name":"宣化县" + }, + { + "name":"涿鹿县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"承德", + "sub":[ + { + "name":"请选择" + }, + { + "name":"双桥区" + }, + { + "name":"双滦区" + }, + { + "name":"鹰手营子矿区" + }, + { + "name":"兴隆县" + }, + { + "name":"平泉县" + }, + { + "name":"滦平县" + }, + { + "name":"隆化县" + }, + { + "name":"承德县" + }, + { + "name":"丰宁满族自治县" + }, + { + "name":"宽城满族自治县" + }, + { + "name":"围场满族蒙古族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"沧州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"新华区" + }, + { + "name":"运河区" + }, + { + "name":"泊头市" + }, + { + "name":"任丘市" + }, + { + "name":"黄骅市" + }, + { + "name":"河间市" + }, + { + "name":"献县" + }, + { + "name":"吴桥县" + }, + { + "name":"沧县" + }, + { + "name":"东光县" + }, + { + "name":"肃宁县" + }, + { + "name":"南皮县" + }, + { + "name":"盐山县" + }, + { + "name":"青县" + }, + { + "name":"海兴县" + }, + { + "name":"孟村回族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"廊坊", + "sub":[ + { + "name":"请选择" + }, + { + "name":"安次区" + }, + { + "name":"广阳区" + }, + { + "name":"霸州市" + }, + { + "name":"三河市" + }, + { + "name":"香河县" + }, + { + "name":"永清县" + }, + { + "name":"固安县" + }, + { + "name":"文安县" + }, + { + "name":"大城县" + }, + { + "name":"大厂回族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"衡水", + "sub":[ + { + "name":"请选择" + }, + { + "name":"桃城区" + }, + { + "name":"冀州市" + }, + { + "name":"深州市" + }, + { + "name":"枣强县" + }, + { + "name":"武邑县" + }, + { + "name":"武强县" + }, + { + "name":"饶阳县" + }, + { + "name":"安平县" + }, + { + "name":"故城县" + }, + { + "name":"景县" + }, + { + "name":"阜城县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"山西", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"太原", + "sub":[ + { + "name":"请选择" + }, + { + "name":"杏花岭区" + }, + { + "name":"小店区" + }, + { + "name":"迎泽区" + }, + { + "name":"尖草坪区" + }, + { + "name":"万柏林区" + }, + { + "name":"晋源区" + }, + { + "name":"古交市" + }, + { + "name":"阳曲县" + }, + { + "name":"清徐县" + }, + { + "name":"娄烦县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"大同", + "sub":[ + { + "name":"请选择" + }, + { + "name":"城区" + }, + { + "name":"矿区" + }, + { + "name":"南郊区" + }, + { + "name":"新荣区" + }, + { + "name":"大同县" + }, + { + "name":"天镇县" + }, + { + "name":"灵丘县" + }, + { + "name":"阳高县" + }, + { + "name":"左云县" + }, + { + "name":"广灵县" + }, + { + "name":"浑源县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"阳泉", + "sub":[ + { + "name":"请选择" + }, + { + "name":"城区" + }, + { + "name":"矿区" + }, + { + "name":"郊区" + }, + { + "name":"平定县" + }, + { + "name":"盂县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"长治", + "sub":[ + { + "name":"请选择" + }, + { + "name":"城区" + }, + { + "name":"郊区" + }, + { + "name":"潞城市" + }, + { + "name":"长治县" + }, + { + "name":"长子县" + }, + { + "name":"平顺县" + }, + { + "name":"襄垣县" + }, + { + "name":"沁源县" + }, + { + "name":"屯留县" + }, + { + "name":"黎城县" + }, + { + "name":"武乡县" + }, + { + "name":"沁县" + }, + { + "name":"壶关县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"晋城", + "sub":[ + { + "name":"请选择" + }, + { + "name":"城区" + }, + { + "name":"高平市" + }, + { + "name":"泽州县" + }, + { + "name":"陵川县" + }, + { + "name":"阳城县" + }, + { + "name":"沁水县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"朔州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"朔城区" + }, + { + "name":"平鲁区" + }, + { + "name":"山阴县" + }, + { + "name":"右玉县" + }, + { + "name":"应县" + }, + { + "name":"怀仁县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"晋中", + "sub":[ + { + "name":"请选择" + }, + { + "name":"榆次区" + }, + { + "name":"介休市" + }, + { + "name":"昔阳县" + }, + { + "name":"灵石县" + }, + { + "name":"祁县" + }, + { + "name":"左权县" + }, + { + "name":"寿阳县" + }, + { + "name":"太谷县" + }, + { + "name":"和顺县" + }, + { + "name":"平遥县" + }, + { + "name":"榆社县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"运城", + "sub":[ + { + "name":"请选择" + }, + { + "name":"盐湖区" + }, + { + "name":"河津市" + }, + { + "name":"永济市" + }, + { + "name":"闻喜县" + }, + { + "name":"新绛县" + }, + { + "name":"平陆县" + }, + { + "name":"垣曲县" + }, + { + "name":"绛县" + }, + { + "name":"稷山县" + }, + { + "name":"芮城县" + }, + { + "name":"夏县" + }, + { + "name":"万荣县" + }, + { + "name":"临猗县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"忻州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"忻府区" + }, + { + "name":"原平市" + }, + { + "name":"代县" + }, + { + "name":"神池县" + }, + { + "name":"五寨县" + }, + { + "name":"五台县" + }, + { + "name":"偏关县" + }, + { + "name":"宁武县" + }, + { + "name":"静乐县" + }, + { + "name":"繁峙县" + }, + { + "name":"河曲县" + }, + { + "name":"保德县" + }, + { + "name":"定襄县" + }, + { + "name":"岢岚县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"临汾", + "sub":[ + { + "name":"请选择" + }, + { + "name":"尧都区" + }, + { + "name":"侯马市" + }, + { + "name":"霍州市" + }, + { + "name":"汾西县" + }, + { + "name":"吉县" + }, + { + "name":"安泽县" + }, + { + "name":"大宁县" + }, + { + "name":"浮山县" + }, + { + "name":"古县" + }, + { + "name":"隰县" + }, + { + "name":"襄汾县" + }, + { + "name":"翼城县" + }, + { + "name":"永和县" + }, + { + "name":"乡宁县" + }, + { + "name":"曲沃县" + }, + { + "name":"洪洞县" + }, + { + "name":"蒲县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"吕梁", + "sub":[ + { + "name":"请选择" + }, + { + "name":"离石区" + }, + { + "name":"孝义市" + }, + { + "name":"汾阳市" + }, + { + "name":"文水县" + }, + { + "name":"中阳县" + }, + { + "name":"兴县" + }, + { + "name":"临县" + }, + { + "name":"方山县" + }, + { + "name":"柳林县" + }, + { + "name":"岚县" + }, + { + "name":"交口县" + }, + { + "name":"交城县" + }, + { + "name":"石楼县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"河南", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"郑州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"中原区" + }, + { + "name":"金水区" + }, + { + "name":"二七区" + }, + { + "name":"管城回族区" + }, + { + "name":"上街区" + }, + { + "name":"惠济区" + }, + { + "name":"巩义市" + }, + { + "name":"新郑市" + }, + { + "name":"新密市" + }, + { + "name":"登封市" + }, + { + "name":"荥阳市" + }, + { + "name":"中牟县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"开封", + "sub":[ + { + "name":"请选择" + }, + { + "name":"鼓楼区" + }, + { + "name":"龙亭区" + }, + { + "name":"顺河回族区" + }, + { + "name":"禹王台区" + }, + { + "name":"金明区" + }, + { + "name":"开封县" + }, + { + "name":"尉氏县" + }, + { + "name":"兰考县" + }, + { + "name":"杞县" + }, + { + "name":"通许县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"洛阳", + "sub":[ + { + "name":"请选择" + }, + { + "name":"西工区" + }, + { + "name":"老城区" + }, + { + "name":"涧西区" + }, + { + "name":"瀍河回族区" + }, + { + "name":"洛龙区" + }, + { + "name":"吉利区" + }, + { + "name":"偃师市" + }, + { + "name":"孟津县" + }, + { + "name":"汝阳县" + }, + { + "name":"伊川县" + }, + { + "name":"洛宁县" + }, + { + "name":"嵩县" + }, + { + "name":"宜阳县" + }, + { + "name":"新安县" + }, + { + "name":"栾川县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"平顶山", + "sub":[ + { + "name":"请选择" + }, + { + "name":"新华区" + }, + { + "name":"卫东区" + }, + { + "name":"湛河区" + }, + { + "name":"石龙区" + }, + { + "name":"汝州市" + }, + { + "name":"舞钢市" + }, + { + "name":"宝丰县" + }, + { + "name":"叶县" + }, + { + "name":"郏县" + }, + { + "name":"鲁山县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"安阳", + "sub":[ + { + "name":"请选择" + }, + { + "name":"北关区" + }, + { + "name":"文峰区" + }, + { + "name":"殷都区" + }, + { + "name":"龙安区" + }, + { + "name":"林州市" + }, + { + "name":"安阳县" + }, + { + "name":"滑县" + }, + { + "name":"内黄县" + }, + { + "name":"汤阴县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"鹤壁", + "sub":[ + { + "name":"请选择" + }, + { + "name":"淇滨区" + }, + { + "name":"山城区" + }, + { + "name":"鹤山区" + }, + { + "name":"浚县" + }, + { + "name":"淇县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"新乡", + "sub":[ + { + "name":"请选择" + }, + { + "name":"卫滨区" + }, + { + "name":"红旗区" + }, + { + "name":"凤泉区" + }, + { + "name":"牧野区" + }, + { + "name":"卫辉市" + }, + { + "name":"辉县市" + }, + { + "name":"新乡县" + }, + { + "name":"获嘉县" + }, + { + "name":"原阳县" + }, + { + "name":"长垣县" + }, + { + "name":"封丘县" + }, + { + "name":"延津县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"焦作", + "sub":[ + { + "name":"请选择" + }, + { + "name":"解放区" + }, + { + "name":"中站区" + }, + { + "name":"马村区" + }, + { + "name":"山阳区" + }, + { + "name":"沁阳市" + }, + { + "name":"孟州市" + }, + { + "name":"修武县" + }, + { + "name":"温县" + }, + { + "name":"武陟县" + }, + { + "name":"博爱县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"濮阳", + "sub":[ + { + "name":"请选择" + }, + { + "name":"华龙区" + }, + { + "name":"濮阳县" + }, + { + "name":"南乐县" + }, + { + "name":"台前县" + }, + { + "name":"清丰县" + }, + { + "name":"范县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"许昌", + "sub":[ + { + "name":"请选择" + }, + { + "name":"魏都区" + }, + { + "name":"禹州市" + }, + { + "name":"长葛市" + }, + { + "name":"许昌县" + }, + { + "name":"鄢陵县" + }, + { + "name":"襄城县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"漯河", + "sub":[ + { + "name":"请选择" + }, + { + "name":"源汇区" + }, + { + "name":"郾城区" + }, + { + "name":"召陵区" + }, + { + "name":"临颍县" + }, + { + "name":"舞阳县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"三门峡", + "sub":[ + { + "name":"请选择" + }, + { + "name":"湖滨区" + }, + { + "name":"义马市" + }, + { + "name":"灵宝市" + }, + { + "name":"渑池县" + }, + { + "name":"卢氏县" + }, + { + "name":"陕县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"南阳", + "sub":[ + { + "name":"请选择" + }, + { + "name":"卧龙区" + }, + { + "name":"宛城区" + }, + { + "name":"邓州市" + }, + { + "name":"桐柏县" + }, + { + "name":"方城县" + }, + { + "name":"淅川县" + }, + { + "name":"镇平县" + }, + { + "name":"唐河县" + }, + { + "name":"南召县" + }, + { + "name":"内乡县" + }, + { + "name":"新野县" + }, + { + "name":"社旗县" + }, + { + "name":"西峡县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"商丘", + "sub":[ + { + "name":"请选择" + }, + { + "name":"梁园区" + }, + { + "name":"睢阳区" + }, + { + "name":"永城市" + }, + { + "name":"宁陵县" + }, + { + "name":"虞城县" + }, + { + "name":"民权县" + }, + { + "name":"夏邑县" + }, + { + "name":"柘城县" + }, + { + "name":"睢县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"信阳", + "sub":[ + { + "name":"请选择" + }, + { + "name":"浉河区" + }, + { + "name":"平桥区" + }, + { + "name":"潢川县" + }, + { + "name":"淮滨县" + }, + { + "name":"息县" + }, + { + "name":"新县" + }, + { + "name":"商城县" + }, + { + "name":"固始县" + }, + { + "name":"罗山县" + }, + { + "name":"光山县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"周口", + "sub":[ + { + "name":"请选择" + }, + { + "name":"川汇区" + }, + { + "name":"项城市" + }, + { + "name":"商水县" + }, + { + "name":"淮阳县" + }, + { + "name":"太康县" + }, + { + "name":"鹿邑县" + }, + { + "name":"西华县" + }, + { + "name":"扶沟县" + }, + { + "name":"沈丘县" + }, + { + "name":"郸城县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"驻马店", + "sub":[ + { + "name":"请选择" + }, + { + "name":"驿城区" + }, + { + "name":"确山县" + }, + { + "name":"新蔡县" + }, + { + "name":"上蔡县" + }, + { + "name":"西平县" + }, + { + "name":"泌阳县" + }, + { + "name":"平舆县" + }, + { + "name":"汝南县" + }, + { + "name":"遂平县" + }, + { + "name":"正阳县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"焦作", + "sub":[ + { + "name":"请选择" + }, + { + "name":"济源市" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"吉林", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"长春", + "sub":[ + { + "name":"请选择" + }, + { + "name":"朝阳区" + }, + { + "name":"宽城区" + }, + { + "name":"二道区" + }, + { + "name":"南关区" + }, + { + "name":"绿园区" + }, + { + "name":"双阳区" + }, + { + "name":"九台市" + }, + { + "name":"榆树市" + }, + { + "name":"德惠市" + }, + { + "name":"农安县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"吉林", + "sub":[ + { + "name":"请选择" + }, + { + "name":"船营区" + }, + { + "name":"昌邑区" + }, + { + "name":"龙潭区" + }, + { + "name":"丰满区" + }, + { + "name":"舒兰市" + }, + { + "name":"桦甸市" + }, + { + "name":"蛟河市" + }, + { + "name":"磐石市" + }, + { + "name":"永吉县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"四平", + "sub":[ + { + "name":"请选择" + }, + { + "name":"铁西区" + }, + { + "name":"铁东区" + }, + { + "name":"公主岭市" + }, + { + "name":"双辽市" + }, + { + "name":"梨树县" + }, + { + "name":"伊通满族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"辽源", + "sub":[ + { + "name":"请选择" + }, + { + "name":"龙山区" + }, + { + "name":"西安区" + }, + { + "name":"东辽县" + }, + { + "name":"东丰县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"通化", + "sub":[ + { + "name":"请选择" + }, + { + "name":"东昌区" + }, + { + "name":"二道江区" + }, + { + "name":"梅河口市" + }, + { + "name":"集安市" + }, + { + "name":"通化县" + }, + { + "name":"辉南县" + }, + { + "name":"柳河县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"白山", + "sub":[ + { + "name":"请选择" + }, + { + "name":"八道江区" + }, + { + "name":"江源区" + }, + { + "name":"临江市" + }, + { + "name":"靖宇县" + }, + { + "name":"抚松县" + }, + { + "name":"长白朝鲜族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"松原", + "sub":[ + { + "name":"请选择" + }, + { + "name":"宁江区" + }, + { + "name":"乾安县" + }, + { + "name":"长岭县" + }, + { + "name":"扶余县" + }, + { + "name":"前郭尔罗斯蒙古族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"白城", + "sub":[ + { + "name":"请选择" + }, + { + "name":"洮北区" + }, + { + "name":"大安市" + }, + { + "name":"洮南市" + }, + { + "name":"镇赉县" + }, + { + "name":"通榆县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"延边朝鲜族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"延吉市" + }, + { + "name":"图们市" + }, + { + "name":"敦化市" + }, + { + "name":"龙井市" + }, + { + "name":"珲春市" + }, + { + "name":"和龙市" + }, + { + "name":"安图县" + }, + { + "name":"汪清县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"黑龙江", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"哈尔滨", + "sub":[ + { + "name":"请选择" + }, + { + "name":"松北区" + }, + { + "name":"道里区" + }, + { + "name":"南岗区" + }, + { + "name":"平房区" + }, + { + "name":"香坊区" + }, + { + "name":"道外区" + }, + { + "name":"呼兰区" + }, + { + "name":"阿城区" + }, + { + "name":"双城市" + }, + { + "name":"尚志市" + }, + { + "name":"五常市" + }, + { + "name":"宾县" + }, + { + "name":"方正县" + }, + { + "name":"通河县" + }, + { + "name":"巴彦县" + }, + { + "name":"延寿县" + }, + { + "name":"木兰县" + }, + { + "name":"依兰县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"齐齐哈尔", + "sub":[ + { + "name":"请选择" + }, + { + "name":"龙沙区" + }, + { + "name":"昂昂溪区" + }, + { + "name":"铁锋区" + }, + { + "name":"建华区" + }, + { + "name":"富拉尔基区" + }, + { + "name":"碾子山区" + }, + { + "name":"梅里斯达斡尔族区" + }, + { + "name":"讷河市" + }, + { + "name":"富裕县" + }, + { + "name":"拜泉县" + }, + { + "name":"甘南县" + }, + { + "name":"依安县" + }, + { + "name":"克山县" + }, + { + "name":"泰来县" + }, + { + "name":"克东县" + }, + { + "name":"龙江县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"鹤岗", + "sub":[ + { + "name":"请选择" + }, + { + "name":"兴山区" + }, + { + "name":"工农区" + }, + { + "name":"南山区" + }, + { + "name":"兴安区" + }, + { + "name":"向阳区" + }, + { + "name":"东山区" + }, + { + "name":"萝北县" + }, + { + "name":"绥滨县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"双鸭山", + "sub":[ + { + "name":"请选择" + }, + { + "name":"尖山区" + }, + { + "name":"岭东区" + }, + { + "name":"四方台区" + }, + { + "name":"宝山区" + }, + { + "name":"集贤县" + }, + { + "name":"宝清县" + }, + { + "name":"友谊县" + }, + { + "name":"饶河县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"鸡西", + "sub":[ + { + "name":"请选择" + }, + { + "name":"鸡冠区" + }, + { + "name":"恒山区" + }, + { + "name":"城子河区" + }, + { + "name":"滴道区" + }, + { + "name":"梨树区" + }, + { + "name":"麻山区" + }, + { + "name":"密山市" + }, + { + "name":"虎林市" + }, + { + "name":"鸡东县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"大庆", + "sub":[ + { + "name":"请选择" + }, + { + "name":"萨尔图区" + }, + { + "name":"红岗区" + }, + { + "name":"龙凤区" + }, + { + "name":"让胡路区" + }, + { + "name":"大同区" + }, + { + "name":"林甸县" + }, + { + "name":"肇州县" + }, + { + "name":"肇源县" + }, + { + "name":"杜尔伯特蒙古族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"伊春", + "sub":[ + { + "name":"请选择" + }, + { + "name":"伊春区" + }, + { + "name":"带岭区" + }, + { + "name":"南岔区" + }, + { + "name":"金山屯区" + }, + { + "name":"西林区" + }, + { + "name":"美溪区" + }, + { + "name":"乌马河区" + }, + { + "name":"翠峦区" + }, + { + "name":"友好区" + }, + { + "name":"上甘岭区" + }, + { + "name":"五营区" + }, + { + "name":"红星区" + }, + { + "name":"新青区" + }, + { + "name":"汤旺河区" + }, + { + "name":"乌伊岭区" + }, + { + "name":"铁力市" + }, + { + "name":"嘉荫县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"牡丹江", + "sub":[ + { + "name":"请选择" + }, + { + "name":"爱民区" + }, + { + "name":"东安区" + }, + { + "name":"阳明区" + }, + { + "name":"西安区" + }, + { + "name":"绥芬河市" + }, + { + "name":"宁安市" + }, + { + "name":"海林市" + }, + { + "name":"穆棱市" + }, + { + "name":"林口县" + }, + { + "name":"东宁县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"佳木斯", + "sub":[ + { + "name":"请选择" + }, + { + "name":"向阳区" + }, + { + "name":"前进区" + }, + { + "name":"东风区" + }, + { + "name":"郊区" + }, + { + "name":"同江市" + }, + { + "name":"富锦市" + }, + { + "name":"桦川县" + }, + { + "name":"抚远县" + }, + { + "name":"桦南县" + }, + { + "name":"汤原县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"七台河", + "sub":[ + { + "name":"请选择" + }, + { + "name":"桃山区" + }, + { + "name":"新兴区" + }, + { + "name":"茄子河区" + }, + { + "name":"勃利县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"黑河", + "sub":[ + { + "name":"请选择" + }, + { + "name":"爱辉区" + }, + { + "name":"北安市" + }, + { + "name":"五大连池市" + }, + { + "name":"逊克县" + }, + { + "name":"嫩江县" + }, + { + "name":"孙吴县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"绥化", + "sub":[ + { + "name":"请选择" + }, + { + "name":"北林区" + }, + { + "name":"安达市" + }, + { + "name":"肇东市" + }, + { + "name":"海伦市" + }, + { + "name":"绥棱县" + }, + { + "name":"兰西县" + }, + { + "name":"明水县" + }, + { + "name":"青冈县" + }, + { + "name":"庆安县" + }, + { + "name":"望奎县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"大兴安岭地区", + "sub":[ + { + "name":"请选择" + }, + { + "name":"呼玛县" + }, + { + "name":"塔河县" + }, + { + "name":"漠河县" + }, + { + "name":"大兴安岭辖区" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"内蒙古", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"呼和浩特", + "sub":[ + { + "name":"请选择" + }, + { + "name":"回民区" + }, + { + "name":"玉泉区" + }, + { + "name":"新城区" + }, + { + "name":"赛罕区" + }, + { + "name":"托克托县" + }, + { + "name":"清水河县" + }, + { + "name":"武川县" + }, + { + "name":"和林格尔县" + }, + { + "name":"土默特左旗" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"包头", + "sub":[ + { + "name":"请选择" + }, + { + "name":"昆都仑区" + }, + { + "name":"青山区" + }, + { + "name":"东河区" + }, + { + "name":"九原区" + }, + { + "name":"石拐区" + }, + { + "name":"白云矿区" + }, + { + "name":"固阳县" + }, + { + "name":"土默特右旗" + }, + { + "name":"达尔罕茂明安联合旗" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"乌海", + "sub":[ + { + "name":"请选择" + }, + { + "name":"海勃湾区" + }, + { + "name":"乌达区" + }, + { + "name":"海南区" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"赤峰", + "sub":[ + { + "name":"请选择" + }, + { + "name":"红山区" + }, + { + "name":"元宝山区" + }, + { + "name":"松山区" + }, + { + "name":"宁城县" + }, + { + "name":"林西县" + }, + { + "name":"喀喇沁旗" + }, + { + "name":"巴林左旗" + }, + { + "name":"敖汉旗" + }, + { + "name":"阿鲁科尔沁旗" + }, + { + "name":"翁牛特旗" + }, + { + "name":"克什克腾旗" + }, + { + "name":"巴林右旗" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"通辽", + "sub":[ + { + "name":"请选择" + }, + { + "name":"科尔沁区" + }, + { + "name":"霍林郭勒市" + }, + { + "name":"开鲁县" + }, + { + "name":"科尔沁左翼中旗" + }, + { + "name":"科尔沁左翼后旗" + }, + { + "name":"库伦旗" + }, + { + "name":"奈曼旗" + }, + { + "name":"扎鲁特旗" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"鄂尔多斯", + "sub":[ + { + "name":"请选择" + }, + { + "name":"东胜区" + }, + { + "name":"准格尔旗" + }, + { + "name":"乌审旗" + }, + { + "name":"伊金霍洛旗" + }, + { + "name":"鄂托克旗" + }, + { + "name":"鄂托克前旗" + }, + { + "name":"杭锦旗" + }, + { + "name":"达拉特旗" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"呼伦贝尔", + "sub":[ + { + "name":"请选择" + }, + { + "name":"海拉尔区" + }, + { + "name":"满洲里市" + }, + { + "name":"牙克石市" + }, + { + "name":"扎兰屯市" + }, + { + "name":"根河市" + }, + { + "name":"额尔古纳市" + }, + { + "name":"陈巴尔虎旗" + }, + { + "name":"阿荣旗" + }, + { + "name":"新巴尔虎左旗" + }, + { + "name":"新巴尔虎右旗" + }, + { + "name":"鄂伦春自治旗" + }, + { + "name":"莫力达瓦达斡尔族自治旗" + }, + { + "name":"鄂温克族自治旗" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"巴彦淖尔", + "sub":[ + { + "name":"请选择" + }, + { + "name":"临河区" + }, + { + "name":"五原县" + }, + { + "name":"磴口县" + }, + { + "name":"杭锦后旗" + }, + { + "name":"乌拉特中旗" + }, + { + "name":"乌拉特前旗" + }, + { + "name":"乌拉特后旗" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"乌兰察布", + "sub":[ + { + "name":"请选择" + }, + { + "name":"集宁区" + }, + { + "name":"丰镇市" + }, + { + "name":"兴和县" + }, + { + "name":"卓资县" + }, + { + "name":"商都县" + }, + { + "name":"凉城县" + }, + { + "name":"化德县" + }, + { + "name":"四子王旗" + }, + { + "name":"察哈尔右翼前旗" + }, + { + "name":"察哈尔右翼中旗" + }, + { + "name":"察哈尔右翼后旗" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"锡林郭勒盟", + "sub":[ + { + "name":"请选择" + }, + { + "name":"锡林浩特市" + }, + { + "name":"二连浩特市" + }, + { + "name":"多伦县" + }, + { + "name":"阿巴嘎旗" + }, + { + "name":"西乌珠穆沁旗" + }, + { + "name":"东乌珠穆沁旗" + }, + { + "name":"苏尼特左旗" + }, + { + "name":"苏尼特右旗" + }, + { + "name":"太仆寺旗" + }, + { + "name":"正镶白旗" + }, + { + "name":"正蓝旗" + }, + { + "name":"镶黄旗" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"兴安盟", + "sub":[ + { + "name":"请选择" + }, + { + "name":"乌兰浩特市" + }, + { + "name":"阿尔山市" + }, + { + "name":"突泉县" + }, + { + "name":"扎赉特旗" + }, + { + "name":"科尔沁右翼前旗" + }, + { + "name":"科尔沁右翼中旗" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"阿拉善盟", + "sub":[ + { + "name":"请选择" + }, + { + "name":"阿拉善左旗" + }, + { + "name":"阿拉善右旗" + }, + { + "name":"额济纳旗" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"山东", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"济南", + "sub":[ + { + "name":"请选择" + }, + { + "name":"市中区" + }, + { + "name":"历下区" + }, + { + "name":"天桥区" + }, + { + "name":"槐荫区" + }, + { + "name":"历城区" + }, + { + "name":"长清区" + }, + { + "name":"章丘市" + }, + { + "name":"平阴县" + }, + { + "name":"济阳县" + }, + { + "name":"商河县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"青岛", + "sub":[ + { + "name":"请选择" + }, + { + "name":"市南区" + }, + { + "name":"市北区" + }, + { + "name":"城阳区" + }, + { + "name":"四方区" + }, + { + "name":"李沧区" + }, + { + "name":"黄岛区" + }, + { + "name":"崂山区" + }, + { + "name":"胶南市" + }, + { + "name":"胶州市" + }, + { + "name":"平度市" + }, + { + "name":"莱西市" + }, + { + "name":"即墨市" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"淄博", + "sub":[ + { + "name":"请选择" + }, + { + "name":"张店区" + }, + { + "name":"临淄区" + }, + { + "name":"淄川区" + }, + { + "name":"博山区" + }, + { + "name":"周村区" + }, + { + "name":"桓台县" + }, + { + "name":"高青县" + }, + { + "name":"沂源县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"枣庄", + "sub":[ + { + "name":"请选择" + }, + { + "name":"市中区" + }, + { + "name":"山亭区" + }, + { + "name":"峄城区" + }, + { + "name":"台儿庄区" + }, + { + "name":"薛城区" + }, + { + "name":"滕州市" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"东营", + "sub":[ + { + "name":"请选择" + }, + { + "name":"东营区" + }, + { + "name":"河口区" + }, + { + "name":"垦利县" + }, + { + "name":"广饶县" + }, + { + "name":"利津县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"烟台", + "sub":[ + { + "name":"请选择" + }, + { + "name":"芝罘区" + }, + { + "name":"福山区" + }, + { + "name":"牟平区" + }, + { + "name":"莱山区" + }, + { + "name":"龙口市" + }, + { + "name":"莱阳市" + }, + { + "name":"莱州市" + }, + { + "name":"招远市" + }, + { + "name":"蓬莱市" + }, + { + "name":"栖霞市" + }, + { + "name":"海阳市" + }, + { + "name":"长岛县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"潍坊", + "sub":[ + { + "name":"请选择" + }, + { + "name":"潍城区" + }, + { + "name":"寒亭区" + }, + { + "name":"坊子区" + }, + { + "name":"奎文区" + }, + { + "name":"青州市" + }, + { + "name":"诸城市" + }, + { + "name":"寿光市" + }, + { + "name":"安丘市" + }, + { + "name":"高密市" + }, + { + "name":"昌邑市" + }, + { + "name":"昌乐县" + }, + { + "name":"临朐县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"济宁", + "sub":[ + { + "name":"请选择" + }, + { + "name":"市中区" + }, + { + "name":"任城区" + }, + { + "name":"曲阜市" + }, + { + "name":"兖州市" + }, + { + "name":"邹城市" + }, + { + "name":"鱼台县" + }, + { + "name":"金乡县" + }, + { + "name":"嘉祥县" + }, + { + "name":"微山县" + }, + { + "name":"汶上县" + }, + { + "name":"泗水县" + }, + { + "name":"梁山县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"泰安", + "sub":[ + { + "name":"请选择" + }, + { + "name":"泰山区" + }, + { + "name":"岱岳区" + }, + { + "name":"新泰市" + }, + { + "name":"肥城市" + }, + { + "name":"宁阳县" + }, + { + "name":"东平县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"威海", + "sub":[ + { + "name":"请选择" + }, + { + "name":"环翠区" + }, + { + "name":"乳山市" + }, + { + "name":"文登市" + }, + { + "name":"荣成市" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"日照", + "sub":[ + { + "name":"请选择" + }, + { + "name":"东港区" + }, + { + "name":"岚山区" + }, + { + "name":"五莲县" + }, + { + "name":"莒县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"莱芜", + "sub":[ + { + "name":"请选择" + }, + { + "name":"莱城区" + }, + { + "name":"钢城区" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"临沂", + "sub":[ + { + "name":"请选择" + }, + { + "name":"兰山区" + }, + { + "name":"罗庄区" + }, + { + "name":"河东区" + }, + { + "name":"沂南县" + }, + { + "name":"郯城县" + }, + { + "name":"沂水县" + }, + { + "name":"苍山县" + }, + { + "name":"费县" + }, + { + "name":"平邑县" + }, + { + "name":"莒南县" + }, + { + "name":"蒙阴县" + }, + { + "name":"临沭县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"德州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"德城区" + }, + { + "name":"乐陵市" + }, + { + "name":"禹城市" + }, + { + "name":"陵县" + }, + { + "name":"宁津县" + }, + { + "name":"齐河县" + }, + { + "name":"武城县" + }, + { + "name":"庆云县" + }, + { + "name":"平原县" + }, + { + "name":"夏津县" + }, + { + "name":"临邑县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"聊城", + "sub":[ + { + "name":"请选择" + }, + { + "name":"东昌府区" + }, + { + "name":"临清市" + }, + { + "name":"高唐县" + }, + { + "name":"阳谷县" + }, + { + "name":"茌平县" + }, + { + "name":"莘县" + }, + { + "name":"东阿县" + }, + { + "name":"冠县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"滨州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"滨城区" + }, + { + "name":"邹平县" + }, + { + "name":"沾化县" + }, + { + "name":"惠民县" + }, + { + "name":"博兴县" + }, + { + "name":"阳信县" + }, + { + "name":"无棣县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"菏泽", + "sub":[ + { + "name":"请选择" + }, + { + "name":"牡丹区" + }, + { + "name":"鄄城县" + }, + { + "name":"单县" + }, + { + "name":"郓城县" + }, + { + "name":"曹县" + }, + { + "name":"定陶县" + }, + { + "name":"巨野县" + }, + { + "name":"东明县" + }, + { + "name":"成武县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"安徽", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"合肥", + "sub":[ + { + "name":"请选择" + }, + { + "name":"庐阳区" + }, + { + "name":"瑶海区" + }, + { + "name":"蜀山区" + }, + { + "name":"包河区" + }, + { + "name":"长丰县" + }, + { + "name":"肥东县" + }, + { + "name":"肥西县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"芜湖", + "sub":[ + { + "name":"请选择" + }, + { + "name":"镜湖区" + }, + { + "name":"弋江区" + }, + { + "name":"鸠江区" + }, + { + "name":"三山区" + }, + { + "name":"芜湖县" + }, + { + "name":"南陵县" + }, + { + "name":"繁昌县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"蚌埠", + "sub":[ + { + "name":"请选择" + }, + { + "name":"蚌山区" + }, + { + "name":"龙子湖区" + }, + { + "name":"禹会区" + }, + { + "name":"淮上区" + }, + { + "name":"怀远县" + }, + { + "name":"固镇县" + }, + { + "name":"五河县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"淮南", + "sub":[ + { + "name":"请选择" + }, + { + "name":"田家庵区" + }, + { + "name":"大通区" + }, + { + "name":"谢家集区" + }, + { + "name":"八公山区" + }, + { + "name":"潘集区" + }, + { + "name":"凤台县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"马鞍山", + "sub":[ + { + "name":"请选择" + }, + { + "name":"雨山区" + }, + { + "name":"花山区" + }, + { + "name":"金家庄区" + }, + { + "name":"当涂县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"淮北", + "sub":[ + { + "name":"请选择" + }, + { + "name":"相山区" + }, + { + "name":"杜集区" + }, + { + "name":"烈山区" + }, + { + "name":"濉溪县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"铜陵", + "sub":[ + { + "name":"请选择" + }, + { + "name":"铜官山区" + }, + { + "name":"狮子山区" + }, + { + "name":"郊区" + }, + { + "name":"铜陵县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"安庆", + "sub":[ + { + "name":"请选择" + }, + { + "name":"迎江区" + }, + { + "name":"大观区" + }, + { + "name":"宜秀区" + }, + { + "name":"桐城市" + }, + { + "name":"宿松县" + }, + { + "name":"枞阳县" + }, + { + "name":"太湖县" + }, + { + "name":"怀宁县" + }, + { + "name":"岳西县" + }, + { + "name":"望江县" + }, + { + "name":"潜山县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"黄山", + "sub":[ + { + "name":"请选择" + }, + { + "name":"屯溪区" + }, + { + "name":"黄山区" + }, + { + "name":"徽州区" + }, + { + "name":"休宁县" + }, + { + "name":"歙县" + }, + { + "name":"祁门县" + }, + { + "name":"黟县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"滁州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"琅琊区" + }, + { + "name":"南谯区" + }, + { + "name":"天长市" + }, + { + "name":"明光市" + }, + { + "name":"全椒县" + }, + { + "name":"来安县" + }, + { + "name":"定远县" + }, + { + "name":"凤阳县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"阜阳", + "sub":[ + { + "name":"请选择" + }, + { + "name":"颍州区" + }, + { + "name":"颍东区" + }, + { + "name":"颍泉区" + }, + { + "name":"界首市" + }, + { + "name":"临泉县" + }, + { + "name":"颍上县" + }, + { + "name":"阜南县" + }, + { + "name":"太和县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"宿州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"埇桥区" + }, + { + "name":"萧县" + }, + { + "name":"泗县" + }, + { + "name":"砀山县" + }, + { + "name":"灵璧县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"巢湖", + "sub":[ + { + "name":"请选择" + }, + { + "name":"居巢区" + }, + { + "name":"含山县" + }, + { + "name":"无为县" + }, + { + "name":"庐江县" + }, + { + "name":"和县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"六安", + "sub":[ + { + "name":"请选择" + }, + { + "name":"金安区" + }, + { + "name":"裕安区" + }, + { + "name":"寿县" + }, + { + "name":"霍山县" + }, + { + "name":"霍邱县" + }, + { + "name":"舒城县" + }, + { + "name":"金寨县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"亳州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"谯城区" + }, + { + "name":"利辛县" + }, + { + "name":"涡阳县" + }, + { + "name":"蒙城县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"池州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"贵池区" + }, + { + "name":"东至县" + }, + { + "name":"石台县" + }, + { + "name":"青阳县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"宣城", + "sub":[ + { + "name":"请选择" + }, + { + "name":"宣州区" + }, + { + "name":"宁国市" + }, + { + "name":"广德县" + }, + { + "name":"郎溪县" + }, + { + "name":"泾县" + }, + { + "name":"旌德县" + }, + { + "name":"绩溪县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"浙江", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"杭州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"拱墅区" + }, + { + "name":"西湖区" + }, + { + "name":"上城区" + }, + { + "name":"下城区" + }, + { + "name":"江干区" + }, + { + "name":"滨江区" + }, + { + "name":"余杭区" + }, + { + "name":"萧山区" + }, + { + "name":"建德市" + }, + { + "name":"富阳市" + }, + { + "name":"临安市" + }, + { + "name":"桐庐县" + }, + { + "name":"淳安县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"宁波", + "sub":[ + { + "name":"请选择" + }, + { + "name":"海曙区" + }, + { + "name":"江东区" + }, + { + "name":"江北区" + }, + { + "name":"镇海区" + }, + { + "name":"北仑区" + }, + { + "name":"鄞州区" + }, + { + "name":"余姚市" + }, + { + "name":"慈溪市" + }, + { + "name":"奉化市" + }, + { + "name":"宁海县" + }, + { + "name":"象山县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"温州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"鹿城区" + }, + { + "name":"龙湾区" + }, + { + "name":"瓯海区" + }, + { + "name":"瑞安市" + }, + { + "name":"乐清市" + }, + { + "name":"永嘉县" + }, + { + "name":"洞头县" + }, + { + "name":"平阳县" + }, + { + "name":"苍南县" + }, + { + "name":"文成县" + }, + { + "name":"泰顺县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"嘉兴", + "sub":[ + { + "name":"请选择" + }, + { + "name":"秀城区" + }, + { + "name":"秀洲区" + }, + { + "name":"海宁市" + }, + { + "name":"平湖市" + }, + { + "name":"桐乡市" + }, + { + "name":"嘉善县" + }, + { + "name":"海盐县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"湖州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"吴兴区" + }, + { + "name":"南浔区" + }, + { + "name":"长兴县" + }, + { + "name":"德清县" + }, + { + "name":"安吉县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"绍兴", + "sub":[ + { + "name":"请选择" + }, + { + "name":"越城区" + }, + { + "name":"诸暨市" + }, + { + "name":"上虞市" + }, + { + "name":"嵊州市" + }, + { + "name":"绍兴县" + }, + { + "name":"新昌县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"金华", + "sub":[ + { + "name":"请选择" + }, + { + "name":"婺城区" + }, + { + "name":"金东区" + }, + { + "name":"兰溪市" + }, + { + "name":"义乌市" + }, + { + "name":"东阳市" + }, + { + "name":"永康市" + }, + { + "name":"武义县" + }, + { + "name":"浦江县" + }, + { + "name":"磐安县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"衢州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"柯城区" + }, + { + "name":"衢江区" + }, + { + "name":"江山市" + }, + { + "name":"龙游县" + }, + { + "name":"常山县" + }, + { + "name":"开化县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"舟山", + "sub":[ + { + "name":"请选择" + }, + { + "name":"定海区" + }, + { + "name":"普陀区" + }, + { + "name":"岱山县" + }, + { + "name":"嵊泗县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"台州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"椒江区" + }, + { + "name":"黄岩区" + }, + { + "name":"路桥区" + }, + { + "name":"临海市" + }, + { + "name":"温岭市" + }, + { + "name":"玉环县" + }, + { + "name":"天台县" + }, + { + "name":"仙居县" + }, + { + "name":"三门县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"丽水", + "sub":[ + { + "name":"请选择" + }, + { + "name":"莲都区" + }, + { + "name":"龙泉市" + }, + { + "name":"缙云县" + }, + { + "name":"青田县" + }, + { + "name":"云和县" + }, + { + "name":"遂昌县" + }, + { + "name":"松阳县" + }, + { + "name":"庆元县" + }, + { + "name":"景宁畲族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"福建", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"福州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"鼓楼区" + }, + { + "name":"台江区" + }, + { + "name":"仓山区" + }, + { + "name":"马尾区" + }, + { + "name":"晋安区" + }, + { + "name":"福清市" + }, + { + "name":"长乐市" + }, + { + "name":"闽侯县" + }, + { + "name":"闽清县" + }, + { + "name":"永泰县" + }, + { + "name":"连江县" + }, + { + "name":"罗源县" + }, + { + "name":"平潭县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"厦门", + "sub":[ + { + "name":"请选择" + }, + { + "name":"思明区" + }, + { + "name":"海沧区" + }, + { + "name":"湖里区" + }, + { + "name":"集美区" + }, + { + "name":"同安区" + }, + { + "name":"翔安区" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"莆田", + "sub":[ + { + "name":"请选择" + }, + { + "name":"城厢区" + }, + { + "name":"涵江区" + }, + { + "name":"荔城区" + }, + { + "name":"秀屿区" + }, + { + "name":"仙游县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"三明", + "sub":[ + { + "name":"请选择" + }, + { + "name":"梅列区" + }, + { + "name":"三元区" + }, + { + "name":"永安市" + }, + { + "name":"明溪县" + }, + { + "name":"将乐县" + }, + { + "name":"大田县" + }, + { + "name":"宁化县" + }, + { + "name":"建宁县" + }, + { + "name":"沙县" + }, + { + "name":"尤溪县" + }, + { + "name":"清流县" + }, + { + "name":"泰宁县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"泉州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"鲤城区" + }, + { + "name":"丰泽区" + }, + { + "name":"洛江区" + }, + { + "name":"泉港区" + }, + { + "name":"石狮市" + }, + { + "name":"晋江市" + }, + { + "name":"南安市" + }, + { + "name":"惠安县" + }, + { + "name":"永春县" + }, + { + "name":"安溪县" + }, + { + "name":"德化县" + }, + { + "name":"金门县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"漳州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"芗城区" + }, + { + "name":"龙文区" + }, + { + "name":"龙海市" + }, + { + "name":"平和县" + }, + { + "name":"南靖县" + }, + { + "name":"诏安县" + }, + { + "name":"漳浦县" + }, + { + "name":"华安县" + }, + { + "name":"东山县" + }, + { + "name":"长泰县" + }, + { + "name":"云霄县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"南平", + "sub":[ + { + "name":"请选择" + }, + { + "name":"延平区" + }, + { + "name":"建瓯市" + }, + { + "name":"邵武市" + }, + { + "name":"武夷山市" + }, + { + "name":"建阳市" + }, + { + "name":"松溪县" + }, + { + "name":"光泽县" + }, + { + "name":"顺昌县" + }, + { + "name":"浦城县" + }, + { + "name":"政和县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"龙岩", + "sub":[ + { + "name":"请选择" + }, + { + "name":"新罗区" + }, + { + "name":"漳平市" + }, + { + "name":"长汀县" + }, + { + "name":"武平县" + }, + { + "name":"上杭县" + }, + { + "name":"永定县" + }, + { + "name":"连城县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"宁德", + "sub":[ + { + "name":"请选择" + }, + { + "name":"蕉城区" + }, + { + "name":"福安市" + }, + { + "name":"福鼎市" + }, + { + "name":"寿宁县" + }, + { + "name":"霞浦县" + }, + { + "name":"柘荣县" + }, + { + "name":"屏南县" + }, + { + "name":"古田县" + }, + { + "name":"周宁县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"湖南", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"长沙", + "sub":[ + { + "name":"请选择" + }, + { + "name":"岳麓区" + }, + { + "name":"芙蓉区" + }, + { + "name":"天心区" + }, + { + "name":"开福区" + }, + { + "name":"雨花区" + }, + { + "name":"浏阳市" + }, + { + "name":"长沙县" + }, + { + "name":"望城县" + }, + { + "name":"宁乡县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"株洲", + "sub":[ + { + "name":"请选择" + }, + { + "name":"天元区" + }, + { + "name":"荷塘区" + }, + { + "name":"芦淞区" + }, + { + "name":"石峰区" + }, + { + "name":"醴陵市" + }, + { + "name":"株洲县" + }, + { + "name":"炎陵县" + }, + { + "name":"茶陵县" + }, + { + "name":"攸县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"湘潭", + "sub":[ + { + "name":"请选择" + }, + { + "name":"岳塘区" + }, + { + "name":"雨湖区" + }, + { + "name":"湘乡市" + }, + { + "name":"韶山市" + }, + { + "name":"湘潭县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"衡阳", + "sub":[ + { + "name":"请选择" + }, + { + "name":"雁峰区" + }, + { + "name":"珠晖区" + }, + { + "name":"石鼓区" + }, + { + "name":"蒸湘区" + }, + { + "name":"南岳区" + }, + { + "name":"耒阳市" + }, + { + "name":"常宁市" + }, + { + "name":"衡阳县" + }, + { + "name":"衡东县" + }, + { + "name":"衡山县" + }, + { + "name":"衡南县" + }, + { + "name":"祁东县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"邵阳", + "sub":[ + { + "name":"请选择" + }, + { + "name":"双清区" + }, + { + "name":"大祥区" + }, + { + "name":"北塔区" + }, + { + "name":"武冈市" + }, + { + "name":"邵东县" + }, + { + "name":"洞口县" + }, + { + "name":"新邵县" + }, + { + "name":"绥宁县" + }, + { + "name":"新宁县" + }, + { + "name":"邵阳县" + }, + { + "name":"隆回县" + }, + { + "name":"城步苗族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"岳阳", + "sub":[ + { + "name":"请选择" + }, + { + "name":"岳阳楼区" + }, + { + "name":"云溪区" + }, + { + "name":"君山区" + }, + { + "name":"临湘市" + }, + { + "name":"汨罗市" + }, + { + "name":"岳阳县" + }, + { + "name":"湘阴县" + }, + { + "name":"平江县" + }, + { + "name":"华容县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"常德", + "sub":[ + { + "name":"请选择" + }, + { + "name":"武陵区" + }, + { + "name":"鼎城区" + }, + { + "name":"津市市" + }, + { + "name":"澧县" + }, + { + "name":"临澧县" + }, + { + "name":"桃源县" + }, + { + "name":"汉寿县" + }, + { + "name":"安乡县" + }, + { + "name":"石门县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"张家界", + "sub":[ + { + "name":"请选择" + }, + { + "name":"永定区" + }, + { + "name":"武陵源区" + }, + { + "name":"慈利县" + }, + { + "name":"桑植县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"益阳", + "sub":[ + { + "name":"请选择" + }, + { + "name":"赫山区" + }, + { + "name":"资阳区" + }, + { + "name":"沅江市" + }, + { + "name":"桃江县" + }, + { + "name":"南县" + }, + { + "name":"安化县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"郴州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"北湖区" + }, + { + "name":"苏仙区" + }, + { + "name":"资兴市" + }, + { + "name":"宜章县" + }, + { + "name":"汝城县" + }, + { + "name":"安仁县" + }, + { + "name":"嘉禾县" + }, + { + "name":"临武县" + }, + { + "name":"桂东县" + }, + { + "name":"永兴县" + }, + { + "name":"桂阳县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"永州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"冷水滩区" + }, + { + "name":"零陵区" + }, + { + "name":"祁阳县" + }, + { + "name":"蓝山县" + }, + { + "name":"宁远县" + }, + { + "name":"新田县" + }, + { + "name":"东安县" + }, + { + "name":"江永县" + }, + { + "name":"道县" + }, + { + "name":"双牌县" + }, + { + "name":"江华瑶族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"怀化", + "sub":[ + { + "name":"请选择" + }, + { + "name":"鹤城区" + }, + { + "name":"洪江市" + }, + { + "name":"会同县" + }, + { + "name":"沅陵县" + }, + { + "name":"辰溪县" + }, + { + "name":"溆浦县" + }, + { + "name":"中方县" + }, + { + "name":"新晃侗族自治县" + }, + { + "name":"芷江侗族自治县" + }, + { + "name":"通道侗族自治县" + }, + { + "name":"靖州苗族侗族自治县" + }, + { + "name":"麻阳苗族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"娄底", + "sub":[ + { + "name":"请选择" + }, + { + "name":"娄星区" + }, + { + "name":"冷水江市" + }, + { + "name":"涟源市" + }, + { + "name":"新化县" + }, + { + "name":"双峰县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"湘西土家族苗族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"吉首市" + }, + { + "name":"古丈县" + }, + { + "name":"龙山县" + }, + { + "name":"永顺县" + }, + { + "name":"凤凰县" + }, + { + "name":"泸溪县" + }, + { + "name":"保靖县" + }, + { + "name":"花垣县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"广西", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"南宁", + "sub":[ + { + "name":"请选择" + }, + { + "name":"青秀区" + }, + { + "name":"兴宁区" + }, + { + "name":"西乡塘区" + }, + { + "name":"良庆区" + }, + { + "name":"江南区" + }, + { + "name":"邕宁区" + }, + { + "name":"武鸣县" + }, + { + "name":"隆安县" + }, + { + "name":"马山县" + }, + { + "name":"上林县" + }, + { + "name":"宾阳县" + }, + { + "name":"横县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"柳州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"城中区" + }, + { + "name":"鱼峰区" + }, + { + "name":"柳北区" + }, + { + "name":"柳南区" + }, + { + "name":"柳江县" + }, + { + "name":"柳城县" + }, + { + "name":"鹿寨县" + }, + { + "name":"融安县" + }, + { + "name":"融水苗族自治县" + }, + { + "name":"三江侗族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"桂林", + "sub":[ + { + "name":"请选择" + }, + { + "name":"象山区" + }, + { + "name":"秀峰区" + }, + { + "name":"叠彩区" + }, + { + "name":"七星区" + }, + { + "name":"雁山区" + }, + { + "name":"阳朔县" + }, + { + "name":"临桂县" + }, + { + "name":"灵川县" + }, + { + "name":"全州县" + }, + { + "name":"平乐县" + }, + { + "name":"兴安县" + }, + { + "name":"灌阳县" + }, + { + "name":"荔浦县" + }, + { + "name":"资源县" + }, + { + "name":"永福县" + }, + { + "name":"龙胜各族自治县" + }, + { + "name":"恭城瑶族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"梧州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"万秀区" + }, + { + "name":"蝶山区" + }, + { + "name":"长洲区" + }, + { + "name":"岑溪市" + }, + { + "name":"苍梧县" + }, + { + "name":"藤县" + }, + { + "name":"蒙山县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"北海", + "sub":[ + { + "name":"请选择" + }, + { + "name":"海城区" + }, + { + "name":"银海区" + }, + { + "name":"铁山港区" + }, + { + "name":"合浦县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"防城港", + "sub":[ + { + "name":"请选择" + }, + { + "name":"港口区" + }, + { + "name":"防城区" + }, + { + "name":"东兴市" + }, + { + "name":"上思县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"钦州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"钦南区" + }, + { + "name":"钦北区" + }, + { + "name":"灵山县" + }, + { + "name":"浦北县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"贵港", + "sub":[ + { + "name":"请选择" + }, + { + "name":"港北区" + }, + { + "name":"港南区" + }, + { + "name":"覃塘区" + }, + { + "name":"桂平市" + }, + { + "name":"平南县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"玉林", + "sub":[ + { + "name":"请选择" + }, + { + "name":"玉州区" + }, + { + "name":"北流市" + }, + { + "name":"容县" + }, + { + "name":"陆川县" + }, + { + "name":"博白县" + }, + { + "name":"兴业县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"百色", + "sub":[ + { + "name":"请选择" + }, + { + "name":"右江区" + }, + { + "name":"凌云县" + }, + { + "name":"平果县" + }, + { + "name":"西林县" + }, + { + "name":"乐业县" + }, + { + "name":"德保县" + }, + { + "name":"田林县" + }, + { + "name":"田阳县" + }, + { + "name":"靖西县" + }, + { + "name":"田东县" + }, + { + "name":"那坡县" + }, + { + "name":"隆林各族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"贺州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"八步区" + }, + { + "name":"钟山县" + }, + { + "name":"昭平县" + }, + { + "name":"富川瑶族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"河池", + "sub":[ + { + "name":"请选择" + }, + { + "name":"金城江区" + }, + { + "name":"宜州市" + }, + { + "name":"天峨县" + }, + { + "name":"凤山县" + }, + { + "name":"南丹县" + }, + { + "name":"东兰县" + }, + { + "name":"都安瑶族自治县" + }, + { + "name":"罗城仫佬族自治县" + }, + { + "name":"巴马瑶族自治县" + }, + { + "name":"环江毛南族自治县" + }, + { + "name":"大化瑶族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"来宾", + "sub":[ + { + "name":"请选择" + }, + { + "name":"兴宾区" + }, + { + "name":"合山市" + }, + { + "name":"象州县" + }, + { + "name":"武宣县" + }, + { + "name":"忻城县" + }, + { + "name":"金秀瑶族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"崇左", + "sub":[ + { + "name":"请选择" + }, + { + "name":"江州区" + }, + { + "name":"凭祥市" + }, + { + "name":"宁明县" + }, + { + "name":"扶绥县" + }, + { + "name":"龙州县" + }, + { + "name":"大新县" + }, + { + "name":"天等县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"江西", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"南昌", + "sub":[ + { + "name":"请选择" + }, + { + "name":"东湖区" + }, + { + "name":"西湖区" + }, + { + "name":"青云谱区" + }, + { + "name":"湾里区" + }, + { + "name":"青山湖区" + }, + { + "name":"新建县" + }, + { + "name":"南昌县" + }, + { + "name":"进贤县" + }, + { + "name":"安义县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"景德镇", + "sub":[ + { + "name":"请选择" + }, + { + "name":"珠山区" + }, + { + "name":"昌江区" + }, + { + "name":"乐平市" + }, + { + "name":"浮梁县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"萍乡", + "sub":[ + { + "name":"请选择" + }, + { + "name":"安源区" + }, + { + "name":"湘东区" + }, + { + "name":"莲花县" + }, + { + "name":"上栗县" + }, + { + "name":"芦溪县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"九江", + "sub":[ + { + "name":"请选择" + }, + { + "name":"浔阳区" + }, + { + "name":"庐山区" + }, + { + "name":"瑞昌市" + }, + { + "name":"九江县" + }, + { + "name":"星子县" + }, + { + "name":"武宁县" + }, + { + "name":"彭泽县" + }, + { + "name":"永修县" + }, + { + "name":"修水县" + }, + { + "name":"湖口县" + }, + { + "name":"德安县" + }, + { + "name":"都昌县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"新余", + "sub":[ + { + "name":"请选择" + }, + { + "name":"渝水区" + }, + { + "name":"分宜县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"鹰潭", + "sub":[ + { + "name":"请选择" + }, + { + "name":"月湖区" + }, + { + "name":"贵溪市" + }, + { + "name":"余江县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"赣州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"章贡区" + }, + { + "name":"瑞金市" + }, + { + "name":"南康市" + }, + { + "name":"石城县" + }, + { + "name":"安远县" + }, + { + "name":"赣县" + }, + { + "name":"宁都县" + }, + { + "name":"寻乌县" + }, + { + "name":"兴国县" + }, + { + "name":"定南县" + }, + { + "name":"上犹县" + }, + { + "name":"于都县" + }, + { + "name":"龙南县" + }, + { + "name":"崇义县" + }, + { + "name":"信丰县" + }, + { + "name":"全南县" + }, + { + "name":"大余县" + }, + { + "name":"会昌县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"吉安", + "sub":[ + { + "name":"请选择" + }, + { + "name":"吉州区" + }, + { + "name":"青原区" + }, + { + "name":"井冈山市" + }, + { + "name":"吉安县" + }, + { + "name":"永丰县" + }, + { + "name":"永新县" + }, + { + "name":"新干县" + }, + { + "name":"泰和县" + }, + { + "name":"峡江县" + }, + { + "name":"遂川县" + }, + { + "name":"安福县" + }, + { + "name":"吉水县" + }, + { + "name":"万安县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"宜春", + "sub":[ + { + "name":"请选择" + }, + { + "name":"袁州区" + }, + { + "name":"丰城市" + }, + { + "name":"樟树市" + }, + { + "name":"高安市" + }, + { + "name":"铜鼓县" + }, + { + "name":"靖安县" + }, + { + "name":"宜丰县" + }, + { + "name":"奉新县" + }, + { + "name":"万载县" + }, + { + "name":"上高县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"抚州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"临川区" + }, + { + "name":"南丰县" + }, + { + "name":"乐安县" + }, + { + "name":"金溪县" + }, + { + "name":"南城县" + }, + { + "name":"东乡县" + }, + { + "name":"资溪县" + }, + { + "name":"宜黄县" + }, + { + "name":"广昌县" + }, + { + "name":"黎川县" + }, + { + "name":"崇仁县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"上饶", + "sub":[ + { + "name":"请选择" + }, + { + "name":"信州区" + }, + { + "name":"德兴市" + }, + { + "name":"上饶县" + }, + { + "name":"广丰县" + }, + { + "name":"鄱阳县" + }, + { + "name":"婺源县" + }, + { + "name":"铅山县" + }, + { + "name":"余干县" + }, + { + "name":"横峰县" + }, + { + "name":"弋阳县" + }, + { + "name":"玉山县" + }, + { + "name":"万年县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"贵州", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"贵阳", + "sub":[ + { + "name":"请选择" + }, + { + "name":"南明区" + }, + { + "name":"云岩区" + }, + { + "name":"花溪区" + }, + { + "name":"乌当区" + }, + { + "name":"白云区" + }, + { + "name":"小河区" + }, + { + "name":"清镇市" + }, + { + "name":"开阳县" + }, + { + "name":"修文县" + }, + { + "name":"息烽县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"六盘水", + "sub":[ + { + "name":"请选择" + }, + { + "name":"钟山区" + }, + { + "name":"水城县" + }, + { + "name":"盘县" + }, + { + "name":"六枝特区" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"遵义", + "sub":[ + { + "name":"请选择" + }, + { + "name":"红花岗区" + }, + { + "name":"汇川区" + }, + { + "name":"赤水市" + }, + { + "name":"仁怀市" + }, + { + "name":"遵义县" + }, + { + "name":"绥阳县" + }, + { + "name":"桐梓县" + }, + { + "name":"习水县" + }, + { + "name":"凤冈县" + }, + { + "name":"正安县" + }, + { + "name":"余庆县" + }, + { + "name":"湄潭县" + }, + { + "name":"道真仡佬族苗族自治县" + }, + { + "name":"务川仡佬族苗族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"安顺", + "sub":[ + { + "name":"请选择" + }, + { + "name":"西秀区" + }, + { + "name":"普定县" + }, + { + "name":"平坝县" + }, + { + "name":"镇宁布依族苗族自治县" + }, + { + "name":"紫云苗族布依族自治县" + }, + { + "name":"关岭布依族苗族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"铜仁地区", + "sub":[ + { + "name":"请选择" + }, + { + "name":"铜仁市" + }, + { + "name":"德江县" + }, + { + "name":"江口县" + }, + { + "name":"思南县" + }, + { + "name":"石阡县" + }, + { + "name":"玉屏侗族自治县" + }, + { + "name":"松桃苗族自治县" + }, + { + "name":"印江土家族苗族自治县" + }, + { + "name":"沿河土家族自治县" + }, + { + "name":"万山特区" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"毕节地区", + "sub":[ + { + "name":"请选择" + }, + { + "name":"毕节市" + }, + { + "name":"黔西县" + }, + { + "name":"大方县" + }, + { + "name":"织金县" + }, + { + "name":"金沙县" + }, + { + "name":"赫章县" + }, + { + "name":"纳雍县" + }, + { + "name":"威宁彝族回族苗族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"黔西南布依族苗族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"兴义市" + }, + { + "name":"望谟县" + }, + { + "name":"兴仁县" + }, + { + "name":"普安县" + }, + { + "name":"册亨县" + }, + { + "name":"晴隆县" + }, + { + "name":"贞丰县" + }, + { + "name":"安龙县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"黔东南苗族侗族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"凯里市" + }, + { + "name":"施秉县" + }, + { + "name":"从江县" + }, + { + "name":"锦屏县" + }, + { + "name":"镇远县" + }, + { + "name":"麻江县" + }, + { + "name":"台江县" + }, + { + "name":"天柱县" + }, + { + "name":"黄平县" + }, + { + "name":"榕江县" + }, + { + "name":"剑河县" + }, + { + "name":"三穗县" + }, + { + "name":"雷山县" + }, + { + "name":"黎平县" + }, + { + "name":"岑巩县" + }, + { + "name":"丹寨县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"黔南布依族苗族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"都匀市" + }, + { + "name":"福泉市" + }, + { + "name":"贵定县" + }, + { + "name":"惠水县" + }, + { + "name":"罗甸县" + }, + { + "name":"瓮安县" + }, + { + "name":"荔波县" + }, + { + "name":"龙里县" + }, + { + "name":"平塘县" + }, + { + "name":"长顺县" + }, + { + "name":"独山县" + }, + { + "name":"三都水族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"云南", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"昆明", + "sub":[ + { + "name":"请选择" + }, + { + "name":"盘龙区" + }, + { + "name":"五华区" + }, + { + "name":"官渡区" + }, + { + "name":"西山区" + }, + { + "name":"东川区" + }, + { + "name":"安宁市" + }, + { + "name":"呈贡县" + }, + { + "name":"晋宁县" + }, + { + "name":"富民县" + }, + { + "name":"宜良县" + }, + { + "name":"嵩明县" + }, + { + "name":"石林彝族自治县" + }, + { + "name":"禄劝彝族苗族自治县" + }, + { + "name":"寻甸回族彝族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"曲靖", + "sub":[ + { + "name":"请选择" + }, + { + "name":"麒麟区" + }, + { + "name":"宣威市" + }, + { + "name":"马龙县" + }, + { + "name":"沾益县" + }, + { + "name":"富源县" + }, + { + "name":"罗平县" + }, + { + "name":"师宗县" + }, + { + "name":"陆良县" + }, + { + "name":"会泽县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"玉溪", + "sub":[ + { + "name":"请选择" + }, + { + "name":"红塔区" + }, + { + "name":"江川县" + }, + { + "name":"澄江县" + }, + { + "name":"通海县" + }, + { + "name":"华宁县" + }, + { + "name":"易门县" + }, + { + "name":"峨山彝族自治县" + }, + { + "name":"新平彝族傣族自治县" + }, + { + "name":"元江哈尼族彝族傣族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"保山", + "sub":[ + { + "name":"请选择" + }, + { + "name":"隆阳区" + }, + { + "name":"施甸县" + }, + { + "name":"腾冲县" + }, + { + "name":"龙陵县" + }, + { + "name":"昌宁县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"昭通", + "sub":[ + { + "name":"请选择" + }, + { + "name":"昭阳区" + }, + { + "name":"鲁甸县" + }, + { + "name":"巧家县" + }, + { + "name":"盐津县" + }, + { + "name":"大关县" + }, + { + "name":"永善县" + }, + { + "name":"绥江县" + }, + { + "name":"镇雄县" + }, + { + "name":"彝良县" + }, + { + "name":"威信县" + }, + { + "name":"水富县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"丽江", + "sub":[ + { + "name":"请选择" + }, + { + "name":"古城区" + }, + { + "name":"永胜县" + }, + { + "name":"华坪县" + }, + { + "name":"玉龙纳西族自治县" + }, + { + "name":"宁蒗彝族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"普洱", + "sub":[ + { + "name":"请选择" + }, + { + "name":"思茅区" + }, + { + "name":"普洱哈尼族彝族自治县" + }, + { + "name":"墨江哈尼族自治县" + }, + { + "name":"景东彝族自治县" + }, + { + "name":"景谷傣族彝族自治县" + }, + { + "name":"镇沅彝族哈尼族拉祜族自治县" + }, + { + "name":"江城哈尼族彝族自治县" + }, + { + "name":"孟连傣族拉祜族佤族自治县" + }, + { + "name":"澜沧拉祜族自治县" + }, + { + "name":"西盟佤族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"临沧", + "sub":[ + { + "name":"请选择" + }, + { + "name":"临翔区" + }, + { + "name":"凤庆县" + }, + { + "name":"云县" + }, + { + "name":"永德县" + }, + { + "name":"镇康县" + }, + { + "name":"双江拉祜族佤族布朗族傣族自治县" + }, + { + "name":"耿马傣族佤族自治县" + }, + { + "name":"沧源佤族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"德宏傣族景颇族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"潞西市" + }, + { + "name":"瑞丽市" + }, + { + "name":"梁河县" + }, + { + "name":"盈江县" + }, + { + "name":"陇川县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"怒江傈僳族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"泸水县" + }, + { + "name":"福贡县" + }, + { + "name":"贡山独龙族怒族自治县" + }, + { + "name":"兰坪白族普米族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"迪庆藏族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"香格里拉县" + }, + { + "name":"德钦县" + }, + { + "name":"维西傈僳族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"大理白族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"大理市" + }, + { + "name":"祥云县" + }, + { + "name":"宾川县" + }, + { + "name":"弥渡县" + }, + { + "name":"永平县" + }, + { + "name":"云龙县" + }, + { + "name":"洱源县" + }, + { + "name":"剑川县" + }, + { + "name":"鹤庆县" + }, + { + "name":"漾濞彝族自治县" + }, + { + "name":"南涧彝族自治县" + }, + { + "name":"巍山彝族回族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"楚雄彝族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"楚雄市" + }, + { + "name":"双柏县" + }, + { + "name":"牟定县" + }, + { + "name":"南华县" + }, + { + "name":"姚安县" + }, + { + "name":"大姚县" + }, + { + "name":"永仁县" + }, + { + "name":"元谋县" + }, + { + "name":"武定县" + }, + { + "name":"禄丰县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"红河哈尼族彝族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"蒙自县" + }, + { + "name":"个旧市" + }, + { + "name":"开远市" + }, + { + "name":"绿春县" + }, + { + "name":"建水县" + }, + { + "name":"石屏县" + }, + { + "name":"弥勒县" + }, + { + "name":"泸西县" + }, + { + "name":"元阳县" + }, + { + "name":"红河县" + }, + { + "name":"金平苗族瑶族傣族自治县" + }, + { + "name":"河口瑶族自治县" + }, + { + "name":"屏边苗族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"文山壮族苗族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"文山县" + }, + { + "name":"砚山县" + }, + { + "name":"西畴县" + }, + { + "name":"麻栗坡县" + }, + { + "name":"马关县" + }, + { + "name":"丘北县" + }, + { + "name":"广南县" + }, + { + "name":"富宁县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"西双版纳傣族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"景洪市" + }, + { + "name":"勐海县" + }, + { + "name":"勐腊县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"西藏", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"拉萨", + "sub":[ + { + "name":"请选择" + }, + { + "name":"城关区" + }, + { + "name":"林周县" + }, + { + "name":"当雄县" + }, + { + "name":"尼木县" + }, + { + "name":"曲水县" + }, + { + "name":"堆龙德庆县" + }, + { + "name":"达孜县" + }, + { + "name":"墨竹工卡县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"那曲地区", + "sub":[ + { + "name":"请选择" + }, + { + "name":"那曲县" + }, + { + "name":"嘉黎县" + }, + { + "name":"比如县" + }, + { + "name":"聂荣县" + }, + { + "name":"安多县" + }, + { + "name":"申扎县" + }, + { + "name":"索县" + }, + { + "name":"班戈县" + }, + { + "name":"巴青县" + }, + { + "name":"尼玛县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"昌都地区", + "sub":[ + { + "name":"请选择" + }, + { + "name":"昌都县" + }, + { + "name":"江达县" + }, + { + "name":"贡觉县" + }, + { + "name":"类乌齐县" + }, + { + "name":"丁青县" + }, + { + "name":"察雅县" + }, + { + "name":"八宿县" + }, + { + "name":"左贡县" + }, + { + "name":"芒康县" + }, + { + "name":"洛隆县" + }, + { + "name":"边坝县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"林芝地区", + "sub":[ + { + "name":"请选择" + }, + { + "name":"林芝县" + }, + { + "name":"工布江达县" + }, + { + "name":"米林县" + }, + { + "name":"墨脱县" + }, + { + "name":"波密县" + }, + { + "name":"察隅县" + }, + { + "name":"朗县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"山南地区", + "sub":[ + { + "name":"请选择" + }, + { + "name":"乃东县" + }, + { + "name":"扎囊县" + }, + { + "name":"贡嘎县" + }, + { + "name":"桑日县" + }, + { + "name":"琼结县" + }, + { + "name":"曲松县" + }, + { + "name":"措美县" + }, + { + "name":"洛扎县" + }, + { + "name":"加查县" + }, + { + "name":"隆子县" + }, + { + "name":"错那县" + }, + { + "name":"浪卡子县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"日喀则地区", + "sub":[ + { + "name":"请选择" + }, + { + "name":"日喀则市" + }, + { + "name":"南木林县" + }, + { + "name":"江孜县" + }, + { + "name":"定日县" + }, + { + "name":"萨迦县" + }, + { + "name":"拉孜县" + }, + { + "name":"昂仁县" + }, + { + "name":"谢通门县" + }, + { + "name":"白朗县" + }, + { + "name":"仁布县" + }, + { + "name":"康马县" + }, + { + "name":"定结县" + }, + { + "name":"仲巴县" + }, + { + "name":"亚东县" + }, + { + "name":"吉隆县" + }, + { + "name":"聂拉木县" + }, + { + "name":"萨嘎县" + }, + { + "name":"岗巴县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"阿里地区", + "sub":[ + { + "name":"请选择" + }, + { + "name":"噶尔县" + }, + { + "name":"普兰县" + }, + { + "name":"札达县" + }, + { + "name":"日土县" + }, + { + "name":"革吉县" + }, + { + "name":"改则县" + }, + { + "name":"措勤县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"海南", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"海口", + "sub":[ + { + "name":"请选择" + }, + { + "name":"龙华区" + }, + { + "name":"秀英区" + }, + { + "name":"琼山区" + }, + { + "name":"美兰区" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"三亚", + "sub":[ + { + "name":"请选择" + }, + { + "name":"三亚市" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"五指山", + "sub":[ + + ], + "type":0 + }, + { + "name":"琼海", + "sub":[ + + ], + "type":0 + }, + { + "name":"儋州", + "sub":[ + + ], + "type":0 + }, + { + "name":"文昌", + "sub":[ + + ], + "type":0 + }, + { + "name":"万宁", + "sub":[ + + ], + "type":0 + }, + { + "name":"东方", + "sub":[ + + ], + "type":0 + }, + { + "name":"澄迈县", + "sub":[ + + ], + "type":0 + }, + { + "name":"定安县", + "sub":[ + + ], + "type":0 + }, + { + "name":"屯昌县", + "sub":[ + + ], + "type":0 + }, + { + "name":"临高县", + "sub":[ + + ], + "type":0 + }, + { + "name":"白沙黎族自治县", + "sub":[ + + ], + "type":0 + }, + { + "name":"昌江黎族自治县", + "sub":[ + + ], + "type":0 + }, + { + "name":"乐东黎族自治县", + "sub":[ + + ], + "type":0 + }, + { + "name":"陵水黎族自治县", + "sub":[ + + ], + "type":0 + }, + { + "name":"保亭黎族苗族自治县", + "sub":[ + + ], + "type":0 + }, + { + "name":"琼中黎族苗族自治县", + "sub":[ + + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"甘肃", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"兰州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"城关区" + }, + { + "name":"七里河区" + }, + { + "name":"西固区" + }, + { + "name":"安宁区" + }, + { + "name":"红古区" + }, + { + "name":"永登县" + }, + { + "name":"皋兰县" + }, + { + "name":"榆中县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"嘉峪关", + "sub":[ + { + "name":"请选择" + }, + { + "name":"嘉峪关市" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"金昌", + "sub":[ + { + "name":"请选择" + }, + { + "name":"金川区" + }, + { + "name":"永昌县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"白银", + "sub":[ + { + "name":"请选择" + }, + { + "name":"白银区" + }, + { + "name":"平川区" + }, + { + "name":"靖远县" + }, + { + "name":"会宁县" + }, + { + "name":"景泰县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"天水", + "sub":[ + { + "name":"请选择" + }, + { + "name":"清水县" + }, + { + "name":"秦安县" + }, + { + "name":"甘谷县" + }, + { + "name":"武山县" + }, + { + "name":"张家川回族自治县" + }, + { + "name":"北道区" + }, + { + "name":"秦城区" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"武威", + "sub":[ + { + "name":"请选择" + }, + { + "name":"凉州区" + }, + { + "name":"民勤县" + }, + { + "name":"古浪县" + }, + { + "name":"天祝藏族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"酒泉", + "sub":[ + { + "name":"请选择" + }, + { + "name":"肃州区" + }, + { + "name":"玉门市" + }, + { + "name":"敦煌市" + }, + { + "name":"金塔县" + }, + { + "name":"肃北蒙古族自治县" + }, + { + "name":"阿克塞哈萨克族自治县" + }, + { + "name":"安西县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"张掖", + "sub":[ + { + "name":"请选择" + }, + { + "name":"甘州区" + }, + { + "name":"民乐县" + }, + { + "name":"临泽县" + }, + { + "name":"高台县" + }, + { + "name":"山丹县" + }, + { + "name":"肃南裕固族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"庆阳", + "sub":[ + { + "name":"请选择" + }, + { + "name":"西峰区" + }, + { + "name":"庆城县" + }, + { + "name":"环县" + }, + { + "name":"华池县" + }, + { + "name":"合水县" + }, + { + "name":"正宁县" + }, + { + "name":"宁县" + }, + { + "name":"镇原县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"平凉", + "sub":[ + { + "name":"请选择" + }, + { + "name":"崆峒区" + }, + { + "name":"泾川县" + }, + { + "name":"灵台县" + }, + { + "name":"崇信县" + }, + { + "name":"华亭县" + }, + { + "name":"庄浪县" + }, + { + "name":"静宁县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"定西", + "sub":[ + { + "name":"请选择" + }, + { + "name":"安定区" + }, + { + "name":"通渭县" + }, + { + "name":"临洮县" + }, + { + "name":"漳县" + }, + { + "name":"岷县" + }, + { + "name":"渭源县" + }, + { + "name":"陇西县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"陇南", + "sub":[ + { + "name":"请选择" + }, + { + "name":"武都区" + }, + { + "name":"成县" + }, + { + "name":"宕昌县" + }, + { + "name":"康县" + }, + { + "name":"文县" + }, + { + "name":"西和县" + }, + { + "name":"礼县" + }, + { + "name":"两当县" + }, + { + "name":"徽县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"临夏回族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"临夏市" + }, + { + "name":"临夏县" + }, + { + "name":"康乐县" + }, + { + "name":"永靖县" + }, + { + "name":"广河县" + }, + { + "name":"和政县" + }, + { + "name":"东乡族自治县" + }, + { + "name":"积石山保安族东乡族撒拉族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"甘南藏族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"合作市" + }, + { + "name":"临潭县" + }, + { + "name":"卓尼县" + }, + { + "name":"舟曲县" + }, + { + "name":"迭部县" + }, + { + "name":"玛曲县" + }, + { + "name":"碌曲县" + }, + { + "name":"夏河县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"宁夏", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"银川", + "sub":[ + { + "name":"请选择" + }, + { + "name":"兴庆区" + }, + { + "name":"西夏区" + }, + { + "name":"金凤区" + }, + { + "name":"灵武市" + }, + { + "name":"永宁县" + }, + { + "name":"贺兰县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"石嘴山", + "sub":[ + { + "name":"请选择" + }, + { + "name":"大武口区" + }, + { + "name":"惠农区" + }, + { + "name":"平罗县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"吴忠", + "sub":[ + { + "name":"请选择" + }, + { + "name":"利通区" + }, + { + "name":"青铜峡市" + }, + { + "name":"盐池县" + }, + { + "name":"同心县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"固原", + "sub":[ + { + "name":"请选择" + }, + { + "name":"原州区" + }, + { + "name":"西吉县" + }, + { + "name":"隆德县" + }, + { + "name":"泾源县" + }, + { + "name":"彭阳县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"中卫", + "sub":[ + { + "name":"请选择" + }, + { + "name":"沙坡头区" + }, + { + "name":"中宁县" + }, + { + "name":"海原县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"青海", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"西宁", + "sub":[ + { + "name":"请选择" + }, + { + "name":"城中区" + }, + { + "name":"城东区" + }, + { + "name":"城西区" + }, + { + "name":"城北区" + }, + { + "name":"湟源县" + }, + { + "name":"湟中县" + }, + { + "name":"大通回族土族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"海东地区", + "sub":[ + { + "name":"请选择" + }, + { + "name":"平安县" + }, + { + "name":"乐都县" + }, + { + "name":"民和回族土族自治县" + }, + { + "name":"互助土族自治县" + }, + { + "name":"化隆回族自治县" + }, + { + "name":"循化撒拉族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"海北藏族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"海晏县" + }, + { + "name":"祁连县" + }, + { + "name":"刚察县" + }, + { + "name":"门源回族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"海南藏族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"共和县" + }, + { + "name":"同德县" + }, + { + "name":"贵德县" + }, + { + "name":"兴海县" + }, + { + "name":"贵南县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"黄南藏族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"同仁县" + }, + { + "name":"尖扎县" + }, + { + "name":"泽库县" + }, + { + "name":"河南蒙古族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"果洛藏族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"玛沁县" + }, + { + "name":"班玛县" + }, + { + "name":"甘德县" + }, + { + "name":"达日县" + }, + { + "name":"久治县" + }, + { + "name":"玛多县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"玉树藏族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"玉树县" + }, + { + "name":"杂多县" + }, + { + "name":"称多县" + }, + { + "name":"治多县" + }, + { + "name":"囊谦县" + }, + { + "name":"曲麻莱县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"海西蒙古族藏族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"德令哈市" + }, + { + "name":"格尔木市" + }, + { + "name":"乌兰县" + }, + { + "name":"都兰县" + }, + { + "name":"天峻县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"新疆", + "sub":[ + { + "name":"请选择", + "sub":[ + + ] + }, + { + "name":"乌鲁木齐", + "sub":[ + { + "name":"请选择" + }, + { + "name":"天山区" + }, + { + "name":"沙依巴克区" + }, + { + "name":"新市区" + }, + { + "name":"水磨沟区" + }, + { + "name":"头屯河区" + }, + { + "name":"达坂城区" + }, + { + "name":"东山区" + }, + { + "name":"乌鲁木齐县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"克拉玛依", + "sub":[ + { + "name":"请选择" + }, + { + "name":"克拉玛依区" + }, + { + "name":"独山子区" + }, + { + "name":"白碱滩区" + }, + { + "name":"乌尔禾区" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"吐鲁番地区", + "sub":[ + { + "name":"请选择" + }, + { + "name":"吐鲁番市" + }, + { + "name":"托克逊县" + }, + { + "name":"鄯善县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"哈密地区", + "sub":[ + { + "name":"请选择" + }, + { + "name":"哈密市" + }, + { + "name":"伊吾县" + }, + { + "name":"巴里坤哈萨克自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"和田地区", + "sub":[ + { + "name":"请选择" + }, + { + "name":"和田市" + }, + { + "name":"和田县" + }, + { + "name":"洛浦县" + }, + { + "name":"民丰县" + }, + { + "name":"皮山县" + }, + { + "name":"策勒县" + }, + { + "name":"于田县" + }, + { + "name":"墨玉县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"阿克苏地区", + "sub":[ + { + "name":"请选择" + }, + { + "name":"阿克苏市" + }, + { + "name":"温宿县" + }, + { + "name":"沙雅县" + }, + { + "name":"拜城县" + }, + { + "name":"阿瓦提县" + }, + { + "name":"库车县" + }, + { + "name":"柯坪县" + }, + { + "name":"新和县" + }, + { + "name":"乌什县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"喀什地区", + "sub":[ + { + "name":"请选择" + }, + { + "name":"喀什市" + }, + { + "name":"巴楚县" + }, + { + "name":"泽普县" + }, + { + "name":"伽师县" + }, + { + "name":"叶城县" + }, + { + "name":"岳普湖县" + }, + { + "name":"疏勒县" + }, + { + "name":"麦盖提县" + }, + { + "name":"英吉沙县" + }, + { + "name":"莎车县" + }, + { + "name":"疏附县" + }, + { + "name":"塔什库尔干塔吉克自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"克孜勒苏柯尔克孜自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"阿图什市" + }, + { + "name":"阿合奇县" + }, + { + "name":"乌恰县" + }, + { + "name":"阿克陶县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"巴音郭楞蒙古自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"库尔勒市" + }, + { + "name":"和静县" + }, + { + "name":"尉犁县" + }, + { + "name":"和硕县" + }, + { + "name":"且末县" + }, + { + "name":"博湖县" + }, + { + "name":"轮台县" + }, + { + "name":"若羌县" + }, + { + "name":"焉耆回族自治县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"昌吉回族自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"昌吉市" + }, + { + "name":"阜康市" + }, + { + "name":"奇台县" + }, + { + "name":"玛纳斯县" + }, + { + "name":"吉木萨尔县" + }, + { + "name":"呼图壁县" + }, + { + "name":"木垒哈萨克自治县" + }, + { + "name":"米泉市" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"博尔塔拉蒙古自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"博乐市" + }, + { + "name":"精河县" + }, + { + "name":"温泉县" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"石河子", + "sub":[ + + ], + "type":0 + }, + { + "name":"阿拉尔", + "sub":[ + + ], + "type":0 + }, + { + "name":"图木舒克", + "sub":[ + + ], + "type":0 + }, + { + "name":"五家渠", + "sub":[ + + ], + "type":0 + }, + { + "name":"伊犁哈萨克自治州", + "sub":[ + { + "name":"请选择" + }, + { + "name":"伊宁市" + }, + { + "name":"奎屯市" + }, + { + "name":"伊宁县" + }, + { + "name":"特克斯县" + }, + { + "name":"尼勒克县" + }, + { + "name":"昭苏县" + }, + { + "name":"新源县" + }, + { + "name":"霍城县" + }, + { + "name":"巩留县" + }, + { + "name":"察布查尔锡伯自治县" + }, + { + "name":"塔城地区" + }, + { + "name":"阿勒泰地区" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"其他" + } + ], + "type":1 + }, + { + "name":"香港", + "sub":[ + { + "name":"请选择" + }, + { + "name":"中西区" + }, + { + "name":"湾仔区" + }, + { + "name":"东区" + }, + { + "name":"南区" + }, + { + "name":"深水埗区" + }, + { + "name":"油尖旺区" + }, + { + "name":"九龙城区" + }, + { + "name":"黄大仙区" + }, + { + "name":"观塘区" + }, + { + "name":"北区" + }, + { + "name":"大埔区" + }, + { + "name":"沙田区" + }, + { + "name":"西贡区" + }, + { + "name":"元朗区" + }, + { + "name":"屯门区" + }, + { + "name":"荃湾区" + }, + { + "name":"葵青区" + }, + { + "name":"离岛区" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"澳门", + "sub":[ + { + "name":"请选择" + }, + { + "name":"花地玛堂区" + }, + { + "name":"圣安多尼堂区" + }, + { + "name":"大堂区" + }, + { + "name":"望德堂区" + }, + { + "name":"风顺堂区" + }, + { + "name":"嘉模堂区" + }, + { + "name":"圣方济各堂区" + }, + { + "name":"路凼" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"台湾", + "sub":[ + { + "name":"请选择" + }, + { + "name":"台北市" + }, + { + "name":"高雄市" + }, + { + "name":"台北县" + }, + { + "name":"桃园县" + }, + { + "name":"新竹县" + }, + { + "name":"苗栗县" + }, + { + "name":"台中县" + }, + { + "name":"彰化县" + }, + { + "name":"南投县" + }, + { + "name":"云林县" + }, + { + "name":"嘉义县" + }, + { + "name":"台南县" + }, + { + "name":"高雄县" + }, + { + "name":"屏东县" + }, + { + "name":"宜兰县" + }, + { + "name":"花莲县" + }, + { + "name":"台东县" + }, + { + "name":"澎湖县" + }, + { + "name":"基隆市" + }, + { + "name":"新竹市" + }, + { + "name":"台中市" + }, + { + "name":"嘉义市" + }, + { + "name":"台南市" + }, + { + "name":"其他" + } + ], + "type":0 + }, + { + "name":"海外", + "sub":[ + { + "name":"请选择" + }, + { + "name":"其他" + } + ], + "type":0 + } +]; + +}($); +// jshint ignore: end + +/* global $:true */ +/* jshint unused:false*/ + ++ function($) { + "use strict"; + + + + $.fn.cityPicker = function(params) { + return this.each(function() { + + var format = function(data) { + var result = []; + for(var i=0;i= 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}}' + + '
' + + '
' + + '
' + }; + +}($); From 32a27eb7d029ed7ff002b832f7ee1f76a71102d8 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sun, 27 Mar 2016 08:51:17 +0800 Subject: [PATCH 021/290] =?UTF-8?q?=E4=BD=BF=E7=94=A8moment.js=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=8C=96=E6=97=A5=E6=9C=9F=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/webapp/js/moment.min.js | 7 ++ src/main/webapp/js/moment.zh-cn.js | 127 +++++++++++++++++++++++++++++ src/main/webapp/manage.html | 8 +- 3 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 src/main/webapp/js/moment.min.js create mode 100644 src/main/webapp/js/moment.zh-cn.js diff --git a/src/main/webapp/js/moment.min.js b/src/main/webapp/js/moment.min.js new file mode 100644 index 00000000..caaf8b3c --- /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 00000000..aec5ede4 --- /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/manage.html b/src/main/webapp/manage.html index 49615e87..f1bf1039 100644 --- a/src/main/webapp/manage.html +++ b/src/main/webapp/manage.html @@ -21,6 +21,8 @@ + + @@ -334,7 +340,7 @@ 年龄 手机号 收货地址 - 添加时间 + 添加时间 操作 From 3c872a253231f3836bfb8f6fd2fbd8babea0a31e Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sun, 27 Mar 2016 20:55:31 +0800 Subject: [PATCH 022/290] test jsp-property-group --- src/main/webapp/WEB-INF/web.xml | 39 ++++++++++++++++++++++++------- src/main/webapp/coda.jspf | 3 +++ src/main/webapp/prelude.jspf | 3 +++ src/main/webapp/registerinfo.html | 26 ++++++++++++++++++++- 4 files changed, 61 insertions(+), 10 deletions(-) create mode 100644 src/main/webapp/coda.jspf create mode 100644 src/main/webapp/prelude.jspf diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index e9911651..7ae01b7f 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -3,6 +3,7 @@ xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> + ssmbootstrap-table webAppRootKey @@ -154,17 +155,37 @@ / - - + - + --> + + + 404 /404.html diff --git a/src/main/webapp/coda.jspf b/src/main/webapp/coda.jspf new file mode 100644 index 00000000..2c7a7242 --- /dev/null +++ b/src/main/webapp/coda.jspf @@ -0,0 +1,3 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +

这是结尾部分-可以做公共的footer处理

\ No newline at end of file diff --git a/src/main/webapp/prelude.jspf b/src/main/webapp/prelude.jspf new file mode 100644 index 00000000..887e0b22 --- /dev/null +++ b/src/main/webapp/prelude.jspf @@ -0,0 +1,3 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +

这是抬头部分-可以做公共的header处理

\ No newline at end of file diff --git a/src/main/webapp/registerinfo.html b/src/main/webapp/registerinfo.html index 609a7ae1..5e8b55a0 100644 --- a/src/main/webapp/registerinfo.html +++ b/src/main/webapp/registerinfo.html @@ -4,10 +4,34 @@ 注册页 - + + + + + +

请填写注册信息

From 5a7d1adec7683c6de3d261d47c9a7141d13d5547 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Mon, 28 Mar 2016 17:33:51 +0800 Subject: [PATCH 023/290] add laytpl.js demo --- src/main/webapp/js/laytpl.js | 9 ++++++ src/main/webapp/registerlist.html | 52 +++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 src/main/webapp/js/laytpl.js create mode 100644 src/main/webapp/registerlist.html diff --git a/src/main/webapp/js/laytpl.js b/src/main/webapp/js/laytpl.js new file mode 100644 index 00000000..8ed64c6f --- /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/registerlist.html b/src/main/webapp/registerlist.html new file mode 100644 index 00000000..723d198f --- /dev/null +++ b/src/main/webapp/registerlist.html @@ -0,0 +1,52 @@ + + + + + +用户列表 + + + + + + + + + + +
+
+ + + \ No newline at end of file From 8bf34f8d44aa1073d92c46021d001e6a881ee6a2 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Fri, 1 Apr 2016 18:23:56 +0800 Subject: [PATCH 024/290] test spring mvc with list --- .../controller/RegisterController.java | 7 ++ .../model/UserListModel.java | 24 +++++++ .../serviceimpl/UserServiceImpl.java | 2 +- src/main/webapp/testregisters.html | 66 +++++++++++++++++++ 4 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/model/UserListModel.java create mode 100644 src/main/webapp/testregisters.html diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java index 311bf537..9f5e4427 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java @@ -16,6 +16,7 @@ import cn.com.ttblog.ssmbootstrap_table.exception.CustomGenericException; import cn.com.ttblog.ssmbootstrap_table.model.User; +import cn.com.ttblog.ssmbootstrap_table.model.UserListModel; import cn.com.ttblog.ssmbootstrap_table.service.IUserService; import cn.com.ttblog.ssmbootstrap_table.validator.UserValidator; @@ -59,6 +60,12 @@ public String save(@Valid User user,BindingResult result,Model model) { return "redirect:/register-success.html"; } + @RequestMapping("/saves") + public String save(UserListModel users) { + logger.debug("user lists:{}",users); + return "redirect:/register-success.html"; + } + @RequestMapping("/testerror1") public String testError(){ throw new CustomGenericException(500,"错误测试"); diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/UserListModel.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/UserListModel.java new file mode 100644 index 00000000..b2d64ef1 --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/UserListModel.java @@ -0,0 +1,24 @@ +package cn.com.ttblog.ssmbootstrap_table.model; + +import java.util.List; + +import javax.xml.bind.annotation.XmlRootElement; + +import org.apache.commons.lang.builder.ToStringBuilder; + +@XmlRootElement +public class UserListModel { + private List users; + + public List getUsers() { + return users; + } + + public void setUsers(List users) { + this.users = users; + } + + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/serviceimpl/UserServiceImpl.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/serviceimpl/UserServiceImpl.java index 8cbc2457..5cd0fcab 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/serviceimpl/UserServiceImpl.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/serviceimpl/UserServiceImpl.java @@ -35,7 +35,7 @@ public void addUser(User user) { Random r=new Random(); sqlSession.insert(IUserDao.class.getName()+".insert",user); //事务测试 - int i=1/0; +// int i=1/0; } @Override diff --git a/src/main/webapp/testregisters.html b/src/main/webapp/testregisters.html new file mode 100644 index 00000000..3551a4e3 --- /dev/null +++ b/src/main/webapp/testregisters.html @@ -0,0 +1,66 @@ + + + + + +注册页 + + + + + + + + + +
+
+

请填写注册信息

+
+
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+ +
+ +
+
+
+
+ + \ No newline at end of file From afdab74ae2e9c98c0887186b160ad9fe5f741a22 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sun, 3 Apr 2016 23:02:36 +0800 Subject: [PATCH 025/290] list model --- .../ssmbootstrap_table/controller/RegisterController.java | 6 +++++- src/main/webapp/testregisters.html | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java index 9f5e4427..2a42ab82 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java @@ -62,7 +62,11 @@ public String save(@Valid User user,BindingResult result,Model model) { @RequestMapping("/saves") public String save(UserListModel users) { - logger.debug("user lists:{}",users); + logger.debug("user lists-size:{}",users.getUsers().size()); + for(User u:users.getUsers()){ + logger.debug("userinfo:{}",u); + userService.addUser(u); + } return "redirect:/register-success.html"; } diff --git a/src/main/webapp/testregisters.html b/src/main/webapp/testregisters.html index 3551a4e3..ff4fe1b0 100644 --- a/src/main/webapp/testregisters.html +++ b/src/main/webapp/testregisters.html @@ -27,7 +27,7 @@

请填写注册信息

- +
From 5d34ce689b2aae312737e351614a44c1278f482b Mon Sep 17 00:00:00 2001 From: netbuffer Date: Mon, 4 Apr 2016 15:49:06 +0800 Subject: [PATCH 026/290] fix cookie filter --- .../filter/InjectionAttackWrapper.java | 1 + src/main/webapp/WEB-INF/web.xml | 36 +++++++++---------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/InjectionAttackWrapper.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/InjectionAttackWrapper.java index 0d1eea69..30f14a08 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/InjectionAttackWrapper.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/InjectionAttackWrapper.java @@ -102,6 +102,7 @@ public Cookie[] getCookies() { for (int i = 0; i < existingCookies.length; ++i) { Cookie cookie = existingCookies[i]; cookie.setValue(filterParamString(cookie.getValue())); + existingCookies[i]=cookie; } } return existingCookies; diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 7ae01b7f..264eb1eb 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -31,22 +31,6 @@ encodingFilter /* - - LoginFilter - cn.com.ttblog.ssmbootstrap_table.filter.LoginFilter - - noFilterTags - index.html;login;register;captcha;.css;.js;.jpg - - - enable - true - - - - LoginFilter - /* - injectionAttackFilter @@ -68,11 +52,27 @@ true - injectionAttackFilter /* + + + LoginFilter + cn.com.ttblog.ssmbootstrap_table.filter.LoginFilter + + noFilterTags + index.html;login;register;captcha;.css;.js;.jpg + + + enable + true + + + + LoginFilter + /* + druidfilter @@ -114,8 +114,6 @@ /* - - org.springframework.web.util.IntrospectorCleanupListener From d013af8c54d3a3f0b708a043024d52df7414226a Mon Sep 17 00:00:00 2001 From: netbuffer Date: Mon, 4 Apr 2016 22:09:45 +0800 Subject: [PATCH 027/290] test jquery-cloneya.js/jquery.serializejson.js --- src/main/webapp/css/jquery-weui.css | 1 + src/main/webapp/js/jquery-cloneya.min.js | 1 + src/main/webapp/testregisters.html | 144 ++++++++++++++++------- 3 files changed, 102 insertions(+), 44 deletions(-) create mode 100644 src/main/webapp/js/jquery-cloneya.min.js diff --git a/src/main/webapp/css/jquery-weui.css b/src/main/webapp/css/jquery-weui.css index 82a3ff45..88e2c4ad 100644 --- a/src/main/webapp/css/jquery-weui.css +++ b/src/main/webapp/css/jquery-weui.css @@ -616,6 +616,7 @@ body { 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 { diff --git a/src/main/webapp/js/jquery-cloneya.min.js b/src/main/webapp/js/jquery-cloneya.min.js new file mode 100644 index 00000000..d849cc2a --- /dev/null +++ b/src/main/webapp/js/jquery-cloneya.min.js @@ -0,0 +1 @@ +!function(a){"use strict";function b(b,c){this.regex=/^(.*)(\d)+$/i,this.elem=b,this.$elem=a(b),"undefined"!=typeof c&&"undefined"!=typeof c.limit&&c.limit>0&&(c.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 - + 注册页 - + + + + + +
+ +
+
+
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
-
-
-

请填写注册信息

-
-
- -
-
- -
-
- -
-
-
-
- -
-
- +
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+ +
+ +
+
+ +
+
- -
-
- -
-
- +
+
+

Simple Cloning

+
+
+

+ +

+ + + +

+ +

+ clone delete +
+

+ +

+
-
-
- -
-
- -
+
+

页面三

- -
- -
- +
-
\ No newline at end of file From 22017b2ad0a433b237832bfb915a650b6da25a7e Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 5 Apr 2016 14:56:17 +0800 Subject: [PATCH 028/290] request json to list --- .../controller/RegisterController.java | 13 ++++ src/main/webapp/testregisters.html | 70 +++++++++++++++---- 2 files changed, 70 insertions(+), 13 deletions(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java index 2a42ab82..32491b22 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java @@ -1,5 +1,7 @@ package cn.com.ttblog.ssmbootstrap_table.controller; +import java.util.List; + import javax.annotation.Resource; import javax.validation.Valid; @@ -12,6 +14,7 @@ import org.springframework.validation.DataBinder; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.InitBinder; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import cn.com.ttblog.ssmbootstrap_table.exception.CustomGenericException; @@ -70,6 +73,16 @@ public String save(UserListModel users) { return "redirect:/register-success.html"; } + @RequestMapping("/savesjson") + public String savesjson(@RequestBody List users) { + logger.debug("user lists-size:{}",users.size()); + for(User u:users){ + logger.debug("userinfo:{}",u); + userService.addUser(u); + } + return "redirect:/register-success.html"; + } + @RequestMapping("/testerror1") public String testError(){ throw new CustomGenericException(500,"错误测试"); diff --git a/src/main/webapp/testregisters.html b/src/main/webapp/testregisters.html index 99d50452..dd4c3bca 100644 --- a/src/main/webapp/testregisters.html +++ b/src/main/webapp/testregisters.html @@ -15,15 +15,65 @@ + + @@ -90,20 +140,14 @@

Simple Cloning

-
+

- +

- - - -

- +

+

clone delete
From c9eafa0ac8bcfd69ee6206734c7b11b40bbed987 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Wed, 6 Apr 2016 22:31:39 +0800 Subject: [PATCH 029/290] test SpringMVCInterceptor --- .../interceptor/SpringMVCInterceptor.java | 63 +++++++++++++++++++ src/main/resources/spring-mvc.xml | 38 +++++------ src/main/resources/spring-mybatis.xml | 1 - 3 files changed, 80 insertions(+), 22 deletions(-) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/SpringMVCInterceptor.java diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/SpringMVCInterceptor.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/SpringMVCInterceptor.java new file mode 100644 index 00000000..47ad682e --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/SpringMVCInterceptor.java @@ -0,0 +1,63 @@ +package cn.com.ttblog.ssmbootstrap_table.interceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +/** + * http://haohaoxuexi.iteye.com/blog/1750680 拦截器测试 + */ +public class SpringMVCInterceptor implements HandlerInterceptor { + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + /** + * preHandle方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用, + * SpringMVC中的Interceptor拦截器是链式的,可以同时存在 + * 多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的执行 + * ,而且所有的Interceptor中的preHandle方法都会在 + * Controller方法调用之前调用。SpringMVC的这种Interceptor链式结构也是可以进行中断的 + * ,这种中断方式是令preHandle的返 回值为false,当preHandle的返回值为false的时候整个请求就结束了。 + */ + @Override + public boolean preHandle(HttpServletRequest request, + HttpServletResponse response, Object handler) throws Exception { + // 拿到requet数据处理,response处理 + logger.debug("执行拦截器:{}", getClass().getName()); + return true; + } + + /** + * 这个方法只会在当前这个Interceptor的preHandle方法返回值为true的时候才会执行。postHandle是进行处理器拦截用的, + * 它的执行时间是在处理器进行处理之 + * 后,也就是在Controller的方法调用之后执行,但是它会在DispatcherServlet进行视图的渲染之前执行 + * ,也就是说在这个方法中你可以对ModelAndView进行操 + * 作。这个方法的链式结构跟正常访问的方向是相反的,也就是说先声明的Interceptor拦截器该方法反而会后调用 + * ,这跟Struts2里面的拦截器的执行过程有点像, + * 只是Struts2里面的intercept方法中要手动的调用ActionInvocation的invoke方法 + * ,Struts2中调用ActionInvocation的invoke方法就是调用下一个Interceptor + * 或者是调用action,然后要在Interceptor之前调用的内容都写在调用invoke之前 + * ,要在Interceptor之后调用的内容都写在调用invoke方法之后。 + */ + @Override + public void postHandle(HttpServletRequest request, + HttpServletResponse response, Object handler, + ModelAndView modelAndView) throws Exception { + } + + /** + * 该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。该方法将在整个请求完成之后, + * 也就是DispatcherServlet渲染了视图执行, + * 这个方法的主要作用是用于清理资源的,当然这个方法也只能在当前这个Interceptor的preHandle方法的返回值为true时才会执行。 + */ + @Override + public void afterCompletion(HttpServletRequest request, + HttpServletResponse response, Object handler, Exception ex) + throws Exception { + } + +} diff --git a/src/main/resources/spring-mvc.xml b/src/main/resources/spring-mvc.xml index 6680f885..2e24829f 100644 --- a/src/main/resources/spring-mvc.xml +++ b/src/main/resources/spring-mvc.xml @@ -80,27 +80,14 @@ - + + + + + + + \ No newline at end of file diff --git a/src/main/resources/spring-mybatis.xml b/src/main/resources/spring-mybatis.xml index 4c344bca..d631dfc3 100644 --- a/src/main/resources/spring-mybatis.xml +++ b/src/main/resources/spring-mybatis.xml @@ -13,7 +13,6 @@ http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"> - From e82dd95c7b25040dc9a7c606f98f0ab408d2a851 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 7 Apr 2016 14:15:44 +0800 Subject: [PATCH 030/290] test spring aop --- .../ssmbootstrap_table/aop/SimpleAspect.java | 57 +++++++++++++++++++ src/main/resources/spring-mybatis.xml | 3 +- 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/aop/SimpleAspect.java diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/aop/SimpleAspect.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/aop/SimpleAspect.java new file mode 100644 index 00000000..29af226f --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/aop/SimpleAspect.java @@ -0,0 +1,57 @@ +package cn.com.ttblog.ssmbootstrap_table.aop; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.After; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; + +@Component +@Aspect +public class SimpleAspect { + @Pointcut("execution(* cn.com.ttblog.ssmbootstrap_table.service.*Service*.*(..))") + public void pointCut() { + } + + @After("pointCut()") + public void after(JoinPoint joinPoint) { + System.out.println("after aspect executed"); + } + + @Before("pointCut()") + public void before(JoinPoint joinPoint) { + // 如果需要这里可以取出参数进行处理 + // Object[] args = joinPoint.getArgs(); + System.out.println("before aspect executing"); + } + + @AfterReturning(pointcut = "pointCut()", returning = "returnVal") + public void afterReturning(JoinPoint joinPoint, Object returnVal) { + System.out.println("afterReturning executed, return result is " + + returnVal); + } + + @Around("pointCut()") + public Object around(ProceedingJoinPoint pjp) throws Throwable { + System.out.println("around start.."); + Object obj=null; + try { + obj=pjp.proceed(); + } catch (Throwable ex) { + System.out.println("error in around"); + throw ex; + } + System.out.println("around end"); + return obj; + } + + @AfterThrowing(pointcut = "pointCut()", throwing = "error") + public void afterThrowing(JoinPoint jp, Throwable error) { + System.out.println("error:" + error); + } +} diff --git a/src/main/resources/spring-mybatis.xml b/src/main/resources/spring-mybatis.xml index 4c344bca..4a72625d 100644 --- a/src/main/resources/spring-mybatis.xml +++ b/src/main/resources/spring-mybatis.xml @@ -13,7 +13,8 @@ http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"> - + + From 643deffc2dff8140f998ef3226ce503a19629c58 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Fri, 8 Apr 2016 21:41:05 +0800 Subject: [PATCH 031/290] test response str --- .../controller/IndexController.java | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java index 0262727c..901a86d7 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java @@ -65,16 +65,17 @@ public String login(HttpSession session, HttpServletRequest request, @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"); + 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) @@ -85,6 +86,11 @@ public String newdata(HttpSession session, Model model) { return "newdata"; } + @RequestMapping("teststr") + public @ResponseBody String teststr() { + return "this is str"; + } + @RequestMapping("/datacount") public @ResponseBody Map datacount(HttpSession session, Model model) { @@ -96,7 +102,7 @@ public String newdata(HttpSession session, Model model) { categorys.add(m.get("adddate").toString()); nums.add(m.get("num").toString()); } - logger.debug("categorys:{},nums:{}",categorys,nums); + logger.debug("categorys:{},nums:{}", categorys, nums); Map data = new HashMap(); data.put("c", categorys); data.put("d", nums); From f996ad868f96adb6d13e35a1093ad09de25853fa Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sat, 9 Apr 2016 17:59:45 +0800 Subject: [PATCH 032/290] test spring BeanPostProcessor --- .../util/TestBeanPostProcessor.java | 81 +++++++++++++++++++ src/main/resources/spring-mvc.xml | 4 +- 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/util/TestBeanPostProcessor.java diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/TestBeanPostProcessor.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/TestBeanPostProcessor.java new file mode 100644 index 00000000..09b8025b --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/TestBeanPostProcessor.java @@ -0,0 +1,81 @@ +package cn.com.ttblog.ssmbootstrap_table.util; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; + +public class TestBeanPostProcessor implements BeanPostProcessor { + private static final Logger log = LoggerFactory + .getLogger(TestBeanPostProcessor.class); + + public Object postProcessAfterInitialization(Object bean, String beanName) + throws BeansException { + log.info("postProcessAfterInitialization"); + return bean; + } + + public Object postProcessBeforeInitialization(Object bean, String beanName) + throws BeansException { + log.info("postProcessBeforeInitialization"); + List> clazzes = getAllClasses(bean); + + for (Class clazz : clazzes) { + initializeLog(bean, clazz); + } + + return bean; + } + + /** + * 取得指定bean的class以及所有父类的列表, 该列表排列顺序为从父类到当前类 + * + * @param bean + * @return + */ + private List> getAllClasses(Object bean) { + log.info("getAllClasses"); + Class clazz = bean.getClass(); + List> clazzes = new ArrayList>(); + while (clazz != null) { + clazzes.add(clazz); + clazz = clazz.getSuperclass(); + } + Collections.reverse(clazzes); + return clazzes; + } + + /** + * 对logger变量进行初始化 + * + * @param bean + * @param clazz + */ + private void initializeLog(Object bean, Class clazz) { + Field[] fields = clazz.getDeclaredFields(); + // for (Field field : fields) { + // if (field.getAnnotation(Logger.class) == null) { + // continue; + // } + // + // if (!field.getType().isAssignableFrom(Log.class)) { + // continue; + // } + // + // field.setAccessible(true); + // try { + // field.set(bean, LogFactory.getLog(clazz)); + // } catch (Exception e) { + // throw new BeanInitializationException(String.format( + // "初始化logger失败!bean=%s;field=%s", bean, field)); + // } + // + // } + } + +} \ No newline at end of file diff --git a/src/main/resources/spring-mvc.xml b/src/main/resources/spring-mvc.xml index 2e24829f..a5666b5e 100644 --- a/src/main/resources/spring-mvc.xml +++ b/src/main/resources/spring-mvc.xml @@ -11,7 +11,9 @@ http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> - + + + From a02c70e863afe515a95cbd2c7a320c9f207064c5 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sun, 10 Apr 2016 19:49:27 +0800 Subject: [PATCH 033/290] spring config --- src/main/resources/spring-context.xml | 19 +++++++++++++++++++ src/main/resources/spring-mvc.xml | 3 +-- src/main/resources/spring-mybatis.xml | 3 --- src/main/webapp/WEB-INF/web.xml | 2 +- 4 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 src/main/resources/spring-context.xml diff --git a/src/main/resources/spring-context.xml b/src/main/resources/spring-context.xml new file mode 100644 index 00000000..e88b0859 --- /dev/null +++ b/src/main/resources/spring-context.xml @@ -0,0 +1,19 @@ + + + + + + + diff --git a/src/main/resources/spring-mvc.xml b/src/main/resources/spring-mvc.xml index a5666b5e..e3195fae 100644 --- a/src/main/resources/spring-mvc.xml +++ b/src/main/resources/spring-mvc.xml @@ -11,7 +11,7 @@ http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> - + @@ -118,5 +118,4 @@ --> - \ No newline at end of file diff --git a/src/main/resources/spring-mybatis.xml b/src/main/resources/spring-mybatis.xml index 9a9633b7..6c38c7b3 100644 --- a/src/main/resources/spring-mybatis.xml +++ b/src/main/resources/spring-mybatis.xml @@ -12,9 +12,6 @@ http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"> - - - diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 264eb1eb..3fea6959 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -11,7 +11,7 @@ contextConfigLocation - classpath:spring-mybatis.xml + classpath:spring-context.xml From 31456af40fe52ec40b416a9e0d0b9a869bf4076c Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sun, 17 Apr 2016 19:30:24 +0800 Subject: [PATCH 034/290] test aop param --- .../ssmbootstrap_table/aop/SimpleAspect.java | 27 +++++++++++-------- .../ssmbootstrap_table/TestMyBatis.java | 3 ++- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/aop/SimpleAspect.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/aop/SimpleAspect.java index 29af226f..e22cc5f9 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/aop/SimpleAspect.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/aop/SimpleAspect.java @@ -1,5 +1,6 @@ package cn.com.ttblog.ssmbootstrap_table.aop; +import org.apache.commons.lang.builder.ToStringBuilder; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; @@ -9,49 +10,53 @@ import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component @Aspect public class SimpleAspect { + private Logger log = LoggerFactory.getLogger(getClass()); + @Pointcut("execution(* cn.com.ttblog.ssmbootstrap_table.service.*Service*.*(..))") public void pointCut() { } @After("pointCut()") public void after(JoinPoint joinPoint) { - System.out.println("after aspect executed"); + log.debug("after aspect executed"); } @Before("pointCut()") public void before(JoinPoint joinPoint) { // 如果需要这里可以取出参数进行处理 // Object[] args = joinPoint.getArgs(); - System.out.println("before aspect executing"); + log.debug("before aspect executing param:{}",ToStringBuilder.reflectionToString(joinPoint)); + log.debug("method param:{}",ToStringBuilder.reflectionToString(joinPoint.getArgs()[0])); } @AfterReturning(pointcut = "pointCut()", returning = "returnVal") public void afterReturning(JoinPoint joinPoint, Object returnVal) { - System.out.println("afterReturning executed, return result is " - + returnVal); + log.debug("afterReturning executed, return result is " + returnVal); } @Around("pointCut()") public Object around(ProceedingJoinPoint pjp) throws Throwable { - System.out.println("around start.."); - Object obj=null; + log.debug("around start.."); + Object obj = null; try { - obj=pjp.proceed(); + obj = pjp.proceed(); } catch (Throwable ex) { - System.out.println("error in around"); + log.debug("error in around"); throw ex; } - System.out.println("around end"); + log.debug("around end"); return obj; } @AfterThrowing(pointcut = "pointCut()", throwing = "error") public void afterThrowing(JoinPoint jp, Throwable error) { - System.out.println("error:" + error); + log.error("error:" + error); } -} +} \ No newline at end of file diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java index c5afa2e2..7756e2a2 100644 --- a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java @@ -65,6 +65,7 @@ public void test1() { } @Test +// @Ignore public void testAddUser() { for (int i = 0; i < 10; i++) { User u = new User(); @@ -87,7 +88,7 @@ public void testdao(){ @Test @Ignore public void testDatacount(){ - logger.info("datacount:{}",userDao.getDataSum()); + logger.info("datacount:{}",userService.getDataSum()); } @Test From ddc6c2710257c2bebf41e32fe64f68a329742089 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sun, 17 Apr 2016 19:38:18 +0800 Subject: [PATCH 035/290] fix param bug --- .../cn/com/ttblog/ssmbootstrap_table/aop/SimpleAspect.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/aop/SimpleAspect.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/aop/SimpleAspect.java index e22cc5f9..95aeff9c 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/aop/SimpleAspect.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/aop/SimpleAspect.java @@ -33,7 +33,10 @@ public void before(JoinPoint joinPoint) { // 如果需要这里可以取出参数进行处理 // Object[] args = joinPoint.getArgs(); log.debug("before aspect executing param:{}",ToStringBuilder.reflectionToString(joinPoint)); - log.debug("method param:{}",ToStringBuilder.reflectionToString(joinPoint.getArgs()[0])); + Object[] arr=joinPoint.getArgs(); + if(arr.length>0){ + log.debug("method param:{}",ToStringBuilder.reflectionToString(joinPoint.getArgs()[0])); + } } @AfterReturning(pointcut = "pointCut()", returning = "returnVal") From c377a89d6e8d261007a16a784c94a52680a258f4 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sat, 23 Apr 2016 22:20:35 +0800 Subject: [PATCH 036/290] jsonp test --- .../controller/JsonpController.java | 91 +++++++++++++++++++ src/main/webapp/WEB-INF/web.xml | 2 +- 2 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/JsonpController.java diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/JsonpController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/JsonpController.java new file mode 100644 index 00000000..37e3c605 --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/JsonpController.java @@ -0,0 +1,91 @@ +package cn.com.ttblog.ssmbootstrap_table.controller; + + +import java.io.IOException; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.lang.builder.ToStringBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import com.alibaba.fastjson.JSON; +import cn.com.ttblog.ssmbootstrap_table.service.IUserService; + +/** + * jsonp测试 + */ +@Controller +@RequestMapping("/jsonp") +public class JsonpController { + + @Resource + private IUserService userService; + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + /** + * 前端使用jquery调用demo + $.getJSON("http://localhost:8080/ssmbootstrap_table/jsonp/test/1?callback=?",function(data){ + $("body").append(data.name); + console.log(data); + }); + * + * + $.ajax({ + type: "GET", + url:"http://localhost:8080/ssmbootstrap_table/jsonp/test/1", + dataType: "jsonp", + jsonp: "callback", + success: function(data) { + console.log(data); + }, + error: function(jqXHR){ + console.log(jqXHR); + }, + }); + * + * + * @param id + * @param callback + * @param request + * @param response + * @return + */ + @RequestMapping("/test/{id}") + public @ResponseBody String test(@PathVariable Long id,@RequestParam String callback,HttpServletRequest request,HttpServletResponse response) { + response.setContentType("application/javascript"); + response.setCharacterEncoding("utf-8"); + logger.info("request:{}",ToStringBuilder.reflectionToString(request)); + logger.info("id:{}",id); + String result=callback+"("+JSON.toJSONString(userService.getUserById(id))+")"; + logger.debug("返回结果:{}",result); + return result; + } + + @RequestMapping("/t/{id}") + public void t(@PathVariable Long id,@RequestParam String callback,HttpServletRequest request,HttpServletResponse response) { + response.setContentType("application/javascript"); + response.setCharacterEncoding("utf-8"); + logger.info("request:{}",ToStringBuilder.reflectionToString(request)); + logger.info("id:{}",id); + String result=callback+"("+JSON.toJSONString(userService.getUserById(id))+")"; + logger.debug("返回结果:{}",result); + try { + response.getWriter().write(result); + } catch (IOException e) { + e.printStackTrace(); + logger.debug("发生错误:{}",e); + } + } + + @RequestMapping("/str") + public@ResponseBody String str() { + return "你好"; + } +} \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 3fea6959..63076343 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -62,7 +62,7 @@ cn.com.ttblog.ssmbootstrap_table.filter.LoginFilter noFilterTags - index.html;login;register;captcha;.css;.js;.jpg + index.html;login;register;captcha;.css;.js;.jpg;jsonp enable From 12e4579e2b96dd0ebc90e1d51ce19ab6bb045d14 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sun, 24 Apr 2016 19:57:11 +0800 Subject: [PATCH 037/290] spring-jsonp --- README.md | 1 + .../controller/JsonpController.java | 9 +++ .../filter/FilterServletOutputStream.java | 40 ++++++++++++ .../filter/GenericResponseWrapper.java | 51 +++++++++++++++ .../servlet/filter/JsonpCallbackFilter.java | 63 +++++++++++++++++++ src/main/resources/spring-context.xml | 6 +- src/main/webapp/WEB-INF/web.xml | 10 +++ 7 files changed, 178 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/intera/util/web/servlet/filter/FilterServletOutputStream.java create mode 100644 src/main/java/com/intera/util/web/servlet/filter/GenericResponseWrapper.java create mode 100644 src/main/java/com/intera/util/web/servlet/filter/JsonpCallbackFilter.java diff --git a/README.md b/README.md index ad2cedb8..666ddc12 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ * weui * log4jdbc * hibernate-validator +* [spring-jsonp-support](https://github.com/bhagyas/spring-jsonp-support) ##How to run 项目采用maven构建,运行前请先执行src/main/java下的sql脚本到你的mysql数据库中,然后修改src/main/resource下的jdbc.properties配置文件中的数据库配置信息,进入项目目录,执行mvn tomcat7:run来运行 diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/JsonpController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/JsonpController.java index 37e3c605..db9ea284 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/JsonpController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/JsonpController.java @@ -6,6 +6,7 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; + import org.apache.commons.lang.builder.ToStringBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,7 +15,10 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; + import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; + import cn.com.ttblog.ssmbootstrap_table.service.IUserService; /** @@ -84,6 +88,11 @@ public void t(@PathVariable Long id,@RequestParam String callback,HttpServletReq } } + @RequestMapping("/tj/{id}") + public JSONObject t(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) { + return (JSONObject)JSON.toJSON(userService.getUserById(id)); + } + @RequestMapping("/str") public@ResponseBody String str() { return "你好"; diff --git a/src/main/java/com/intera/util/web/servlet/filter/FilterServletOutputStream.java b/src/main/java/com/intera/util/web/servlet/filter/FilterServletOutputStream.java new file mode 100644 index 00000000..1455660c --- /dev/null +++ b/src/main/java/com/intera/util/web/servlet/filter/FilterServletOutputStream.java @@ -0,0 +1,40 @@ +package com.intera.util.web.servlet.filter; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; + +public class FilterServletOutputStream extends ServletOutputStream { + + private DataOutputStream stream; + + public FilterServletOutputStream(OutputStream output) { + stream = new DataOutputStream(output); + } + + public void write(int b) throws IOException { + stream.write(b); + } + + public void write(byte[] b) throws IOException { + stream.write(b); + } + + public void write(byte[] b, int off, int len) throws IOException { + stream.write(b, off, len); + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setWriteListener(WriteListener writeListener) { + + } + +} \ No newline at end of file diff --git a/src/main/java/com/intera/util/web/servlet/filter/GenericResponseWrapper.java b/src/main/java/com/intera/util/web/servlet/filter/GenericResponseWrapper.java new file mode 100644 index 00000000..ea3adf4f --- /dev/null +++ b/src/main/java/com/intera/util/web/servlet/filter/GenericResponseWrapper.java @@ -0,0 +1,51 @@ +package com.intera.util.web.servlet.filter; + +import java.io.ByteArrayOutputStream; +import java.io.PrintWriter; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; + +public class GenericResponseWrapper extends HttpServletResponseWrapper { + + private ByteArrayOutputStream output; + private int contentLength; + private String contentType; + + public GenericResponseWrapper(HttpServletResponse response) { + super(response); + + output = new ByteArrayOutputStream(); + } + + public byte[] getData() { + return output.toByteArray(); + } + + public ServletOutputStream getOutputStream() { + return new FilterServletOutputStream(output); + } + + public PrintWriter getWriter() { + return new PrintWriter(getOutputStream(), true); + } + + public void setContentLength(int length) { + this.contentLength = length; + super.setContentLength(length); + } + + public int getContentLength() { + return contentLength; + } + + public void setContentType(String type) { + this.contentType = type; + super.setContentType(type); + } + + public String getContentType() { + return contentType; + } +} \ No newline at end of file diff --git a/src/main/java/com/intera/util/web/servlet/filter/JsonpCallbackFilter.java b/src/main/java/com/intera/util/web/servlet/filter/JsonpCallbackFilter.java new file mode 100644 index 00000000..63dd4dea --- /dev/null +++ b/src/main/java/com/intera/util/web/servlet/filter/JsonpCallbackFilter.java @@ -0,0 +1,63 @@ +package com.intera.util.web.servlet.filter; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Map; + +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.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class JsonpCallbackFilter implements Filter { + + private static Logger log = LoggerFactory.getLogger(JsonpCallbackFilter.class); + + public void init(FilterConfig fConfig) throws ServletException {} + + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + HttpServletRequest httpRequest = (HttpServletRequest) request; + HttpServletResponse httpResponse = (HttpServletResponse) response; + + @SuppressWarnings("unchecked") + Map parms = httpRequest.getParameterMap(); + + if(parms.containsKey("callback")) { + if(log.isDebugEnabled()) + log.debug("Wrapping response with JSONP callback '" + parms.get("callback")[0] + "'"); + + OutputStream out = httpResponse.getOutputStream(); + + GenericResponseWrapper wrapper = new GenericResponseWrapper(httpResponse); + + chain.doFilter(request, wrapper); + + //handles the content-size truncation + ByteArrayOutputStream outputStream = new ByteArrayOutputStream( ); + outputStream.write( new String(parms.get("callback")[0] + "(").getBytes() ); + outputStream.write(wrapper.getData()); + outputStream.write(new String(");").getBytes()); + byte jsonpResponse[] = outputStream.toByteArray( ); + + wrapper.setContentType("text/javascript;charset=UTF-8"); + wrapper.setContentLength(jsonpResponse.length); + + out.write(jsonpResponse); + + out.close(); + + } else { + chain.doFilter(request, response); + } + } + + public void destroy() {} +} \ No newline at end of file diff --git a/src/main/resources/spring-context.xml b/src/main/resources/spring-context.xml index e88b0859..700a1a4b 100644 --- a/src/main/resources/spring-context.xml +++ b/src/main/resources/spring-context.xml @@ -13,7 +13,9 @@ http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"> - - + + + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 63076343..23c78412 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -86,7 +86,17 @@ druidfilter /* + + + + jsonpCallbackFilter + org.springframework.web.filter.DelegatingFilterProxy + + + jsonpCallbackFilter + *.json + timerFilter From 2a732e9465dff337ad81291606cc32e18972f0a8 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 26 Apr 2016 10:53:04 +0800 Subject: [PATCH 038/290] update test --- src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java index 7756e2a2..9e45d4e8 100644 --- a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java @@ -24,7 +24,7 @@ @RunWith(SpringJUnit4ClassRunner.class) // 表示继承了SpringJUnit4ClassRunner类 -@ContextConfiguration(locations = { "classpath:spring-mybatis.xml" }) +@ContextConfiguration(locations = { "classpath:spring-mybatis.xml","classpath:spring-context.xml" }) public class TestMyBatis { private static Logger logger = LoggerFactory.getLogger(TestMyBatis.class); From 68426a26d9395a07296404495cd3cf5ab6bb33fc Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 26 Apr 2016 16:18:37 +0800 Subject: [PATCH 039/290] test springmvc & jq arr --- .../controller/JsonpController.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/JsonpController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/JsonpController.java index db9ea284..bcd2f7ea 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/JsonpController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/JsonpController.java @@ -2,6 +2,8 @@ import java.io.IOException; +import java.lang.reflect.Array; +import java.util.Arrays; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; @@ -97,4 +99,28 @@ public JSONObject t(@PathVariable Long id,HttpServletRequest request,HttpServlet public@ResponseBody String str() { return "你好"; } + /** + * http://localhost:8080/ssmbootstrap_table/jsonp/testarr?v[]=1&v[]=2&v[]=3 + * var arr=["a","b","c"]; + 前端jquery发送数组,需要traditional置为 true + $.ajax({ + url:"http://localhost:8080/ssmbootstrap_table/jsonp/testarr", + data:{"v":arr}, + type:"post", + traditional: true, + success:function(data){ + console.log(data); + }, + error:function(xhr){ + console.log(xhr); + } + }); + * @param values + * @return + */ + @RequestMapping("/testarr") + public @ResponseBody String[] testarr(@RequestParam(value="v")String[] values) { + logger.debug("接收到的数组参数:{}",Arrays.deepToString(values)); + return values; + } } \ No newline at end of file From 7d75226bd9109ca7ce62657b032db83c1898bdd2 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 26 Apr 2016 21:49:15 +0800 Subject: [PATCH 040/290] test --- .../com/intera/util/web/servlet/filter/JsonpCallbackFilter.java | 2 -- src/main/resources/spring-context.xml | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/intera/util/web/servlet/filter/JsonpCallbackFilter.java b/src/main/java/com/intera/util/web/servlet/filter/JsonpCallbackFilter.java index 63dd4dea..46969f0a 100644 --- a/src/main/java/com/intera/util/web/servlet/filter/JsonpCallbackFilter.java +++ b/src/main/java/com/intera/util/web/servlet/filter/JsonpCallbackFilter.java @@ -4,7 +4,6 @@ import java.io.IOException; import java.io.OutputStream; import java.util.Map; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -13,7 +12,6 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/resources/spring-context.xml b/src/main/resources/spring-context.xml index 700a1a4b..a6d5ec7c 100644 --- a/src/main/resources/spring-context.xml +++ b/src/main/resources/spring-context.xml @@ -16,6 +16,7 @@ + From 0debc48d76a19cb7bbd79b33cb0df613f7f56a66 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Fri, 29 Apr 2016 17:12:55 +0800 Subject: [PATCH 041/290] =?UTF-8?q?springmvc=20=E5=A4=9A=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ssmbootstrap_table/dao2/IUserDaoTest.java | 5 ++++ .../ssmbootstrap_table/dao2/UserMapper.xml | 7 ++++++ .../interceptor/MybatisPagerInterceptor.java | 2 +- src/main/resources/jdbc.properties | 15 +++++++---- src/main/resources/mybatis-globalcfg.xml | 2 +- src/main/resources/spring-mybatis.xml | 25 +++++++++++++++++-- .../ssmbootstrap_table/TestMyBatis.java | 12 +++++++-- 7 files changed, 57 insertions(+), 11 deletions(-) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/dao2/IUserDaoTest.java create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/dao2/UserMapper.xml diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao2/IUserDaoTest.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao2/IUserDaoTest.java new file mode 100644 index 00000000..bb2f9713 --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao2/IUserDaoTest.java @@ -0,0 +1,5 @@ +package cn.com.ttblog.ssmbootstrap_table.dao2; + +public interface IUserDaoTest { + int getSum(); +} \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao2/UserMapper.xml b/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao2/UserMapper.xml new file mode 100644 index 00000000..e5ac3927 --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao2/UserMapper.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/MybatisPagerInterceptor.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/MybatisPagerInterceptor.java index 8a9eda38..223cfbea 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/MybatisPagerInterceptor.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/MybatisPagerInterceptor.java @@ -29,10 +29,10 @@ public class MybatisPagerInterceptor implements Interceptor { private Properties properties; @Override public Object intercept(Invocation invocation) throws Throwable { + log.warn("===========================执行mybatis拦截器开始==========================="); if(!Boolean.parseBoolean(properties.getProperty("enable"))){ return invocation.proceed(); } - log.warn("===========================执行mybatis拦截器开始==========================="); StatementHandler stmt=(StatementHandler)invocation.getTarget(); StatementHandler delegate = (StatementHandler)ReflectUtil.getFieldValue(stmt, "delegate"); MappedStatement mappedStatement = (MappedStatement)ReflectUtil.getFieldValue(delegate, "mappedStatement"); diff --git a/src/main/resources/jdbc.properties b/src/main/resources/jdbc.properties index c77d97f7..22e7532f 100644 --- a/src/main/resources/jdbc.properties +++ b/src/main/resources/jdbc.properties @@ -2,12 +2,17 @@ driver=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/u username=root password=root -#定义初始连接数 +#\u5b9a\u4e49\u521d\u59cb\u8fde\u63a5\u6570 initialSize=1 -#定义最大连接数 +#\u5b9a\u4e49\u6700\u5927\u8fde\u63a5\u6570 maxActive=2 -#定义最小空闲 +#\u5b9a\u4e49\u6700\u5c0f\u7a7a\u95f2 minIdle=1 -#定义最长等待时间 +#\u5b9a\u4e49\u6700\u957f\u7b49\u5f85\u65f6\u95f4 maxWait=6000 -validationQuery=select 0 \ No newline at end of file +validationQuery=select 0 +#-------------------- +driver2=com.mysql.jdbc.Driver +url2=jdbc:mysql://127.0.0.1:3306/u2 +username2=root +password2=root \ No newline at end of file diff --git a/src/main/resources/mybatis-globalcfg.xml b/src/main/resources/mybatis-globalcfg.xml index fbc998bb..07fdbc2d 100644 --- a/src/main/resources/mybatis-globalcfg.xml +++ b/src/main/resources/mybatis-globalcfg.xml @@ -48,7 +48,7 @@ - + \ No newline at end of file diff --git a/src/main/resources/spring-mybatis.xml b/src/main/resources/spring-mybatis.xml index 6c38c7b3..a7ea91b8 100644 --- a/src/main/resources/spring-mybatis.xml +++ b/src/main/resources/spring-mybatis.xml @@ -36,6 +36,15 @@ + + + + + + + + @@ -55,19 +64,31 @@ - + + + + + + + + - + + + + + diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java index 9e45d4e8..e688ae9d 100644 --- a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java @@ -14,8 +14,10 @@ import org.slf4j.LoggerFactory; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.web.bind.annotation.ResponseBody; import cn.com.ttblog.ssmbootstrap_table.dao.IUserDao; +import cn.com.ttblog.ssmbootstrap_table.dao2.IUserDaoTest; import cn.com.ttblog.ssmbootstrap_table.model.User; import cn.com.ttblog.ssmbootstrap_table.service.IUserService; import cn.com.ttblog.ssmbootstrap_table.serviceimpl.UserServiceImpl; @@ -34,6 +36,8 @@ public class TestMyBatis { private IUserDao userDao; @Resource private SqlSession sqlSession; + @Resource + private IUserDaoTest userDaoTest; // @Before // public void before() { // ac = new ClassPathXmlApplicationContext("applicationContext.xml"); @@ -65,7 +69,7 @@ public void test1() { } @Test -// @Ignore + @Ignore public void testAddUser() { for (int i = 0; i < 10; i++) { User u = new User(); @@ -110,5 +114,9 @@ public void testInterceptor(){ // logger.debug("测试拦截器:{}",sqlSession.selectOne("cn.com.ttblog.ssmbootstrap_table.dao.IUserDao.selectByPrimaryKey",1L)); logger.debug("getdatasum:{}",userDao.getDataSum()); } - + + @Test + public void testDataSource2(){ + logger.debug("test2:{}",userDaoTest.getSum()); + } } From f7992b583e21b782ee94b23b0eb3f0c2333380d4 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Fri, 29 Apr 2016 21:48:15 +0800 Subject: [PATCH 042/290] =?UTF-8?q?=E5=A4=9A=E5=8C=85=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E6=89=AB=E6=8F=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IndexController.java | 5 +--- .../com/other/controller/IndexController.java | 26 +++++++++++++++++++ src/main/resources/spring-mvc.xml | 3 ++- src/main/webapp/test.jsp | 12 +++++++++ .../ssmbootstrap_table/TestMyBatis.java | 2 +- 5 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/other/controller/IndexController.java create mode 100644 src/main/webapp/test.jsp diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java index 901a86d7..11797680 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java @@ -9,13 +9,11 @@ import java.util.HashMap; import java.util.List; import java.util.Map; - 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 org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,7 +27,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; - import cn.com.ttblog.ssmbootstrap_table.model.User; import cn.com.ttblog.ssmbootstrap_table.service.IUserService; import cn.com.ttblog.ssmbootstrap_table.util.BeanMapUtil; @@ -37,7 +34,7 @@ import com.alibaba.fastjson.JSONArray; -@Controller +@Controller(value="mainindex") @RequestMapping("/") public class IndexController { diff --git a/src/main/java/com/other/controller/IndexController.java b/src/main/java/com/other/controller/IndexController.java new file mode 100644 index 00000000..48bf3e44 --- /dev/null +++ b/src/main/java/com/other/controller/IndexController.java @@ -0,0 +1,26 @@ +package com.other.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.servlet.ModelAndView; + +/** + * 同名bean指定别名 + */ +@Controller(value="otherindex") +@RequestMapping("/other") +public class IndexController { + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + @RequestMapping("index") + public ModelAndView index(){ + logger.debug("index..."); + ModelAndView mav=new ModelAndView("test"); + mav.addObject("test", "test"); + return mav; + } + +} \ No newline at end of file diff --git a/src/main/resources/spring-mvc.xml b/src/main/resources/spring-mvc.xml index e3195fae..a4799b20 100644 --- a/src/main/resources/spring-mvc.xml +++ b/src/main/resources/spring-mvc.xml @@ -10,7 +10,8 @@ http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> - + + diff --git a/src/main/webapp/test.jsp b/src/main/webapp/test.jsp new file mode 100644 index 00000000..a0cddb14 --- /dev/null +++ b/src/main/webapp/test.jsp @@ -0,0 +1,12 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> + + + + +${test } + + + ${test } + + \ No newline at end of file diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java index e688ae9d..02507617 100644 --- a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java @@ -117,6 +117,6 @@ public void testInterceptor(){ @Test public void testDataSource2(){ - logger.debug("test2:{}",userDaoTest.getSum()); + logger.debug("testDataSource2:{}",userDaoTest.getSum()); } } From 7f124f3d247f6097a1ed69f541eb67e0ee476c2a Mon Sep 17 00:00:00 2001 From: netbuffer Date: Fri, 29 Apr 2016 21:49:19 +0800 Subject: [PATCH 043/290] test --- .../java/cn/com/ttblog/ssmbootstrap_table/dao2/UserMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao2/UserMapper.xml b/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao2/UserMapper.xml index e5ac3927..c531b8a7 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao2/UserMapper.xml +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao2/UserMapper.xml @@ -2,6 +2,6 @@ \ No newline at end of file From 866cb10b083f42b33de73b862709c9ba3a1984ce Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 3 May 2016 11:40:00 +0800 Subject: [PATCH 044/290] test pinyin4j --- pom.xml | 7 +++ .../ssmbootstrap_table/TestPinyin4j.java | 62 +++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 src/test/java/cn/com/ttblog/ssmbootstrap_table/TestPinyin4j.java diff --git a/pom.xml b/pom.xml index 712f6523..e8ea5208 100644 --- a/pom.xml +++ b/pom.xml @@ -203,6 +203,13 @@ hibernate-validator 5.2.4.Final + + + com.belerweb + pinyin4j + 2.5.1 + + ssmbootstrap_table diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestPinyin4j.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestPinyin4j.java new file mode 100644 index 00000000..179acac7 --- /dev/null +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestPinyin4j.java @@ -0,0 +1,62 @@ +package cn.com.ttblog.ssmbootstrap_table; + +import net.sourceforge.pinyin4j.PinyinHelper; +import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; +import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; +import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; +import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType; +import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; + +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TestPinyin4j { + + private static Logger logger = LoggerFactory.getLogger(TestMyBatis.class); + + /** + * 提取每个汉字的首字母 + * @param str + * @return String + */ + public static String getPinYinHeadChar(String str) { + String convert = ""; + for (int j = 0; j < str.length(); j++) { + char word = str.charAt(j); + // 提取汉字的首字母 + String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word); + if (pinyinArray != null) { + convert += pinyinArray[0].charAt(0); + } else { + convert += word; + } + } + return convert; + } + + /** + * 提取汉字的全拼 + * @param str + * @return + */ + public static String getPinYin(String str) { + HanyuPinyinOutputFormat format=new HanyuPinyinOutputFormat(); + format.setCaseType(HanyuPinyinCaseType.LOWERCASE); + format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); + format.setVCharType(HanyuPinyinVCharType.WITH_V); + try { + return PinyinHelper.toHanYuPinyinString(str,format, "",true); + } catch (BadHanyuPinyinOutputFormatCombination e) { + e.printStackTrace(); + } + return ""; + } + + @Test + public void testSystemProperties() { + logger.debug("pinyin:{}\r\n",getPinYin("联系人a")); + logger.debug("toHanyuPinyinStringArray:{}\r\n",PinyinHelper.toHanyuPinyinStringArray('天').length); + logger.debug("getPinYinHeadChar:{}\r\n",getPinYinHeadChar("百度网络")); + } +} From 3fa43e068453b9f59546d11763da46fa919d640a Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 3 May 2016 22:13:28 +0800 Subject: [PATCH 045/290] search --- .../controller/UserController.java | 17 +++++++-- .../ssmbootstrap_table/dao/UserMapper.xml | 6 ++++ .../service/IUserService.java | 2 ++ .../serviceimpl/UserServiceImpl.java | 35 +++++++++++++------ 4 files changed, 48 insertions(+), 12 deletions(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/UserController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/UserController.java index 2af1cdef..16cb34e6 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/UserController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/UserController.java @@ -1,5 +1,7 @@ package cn.com.ttblog.ssmbootstrap_table.controller; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -17,6 +19,7 @@ import org.springframework.web.bind.annotation.PathVariable; 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.ModelAndView; @@ -65,9 +68,19 @@ public ModelAndView model() { * @return */ @RequestMapping("/userlist") - public String userlist(String order, int limit, int offset, Model model) { + public String userlist(@RequestParam(value="search",required=false)String search,String order, int limit, int offset, Model model) { logger.info("参数:{},{},{}", order, limit, offset); - List users = userService.getUserList(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 = userService.getUserListCount(); Map params = new HashMap(); model.addAttribute("total", total); diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/UserMapper.xml b/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/UserMapper.xml index 1e6f03b6..34c72aef 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/UserMapper.xml +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/UserMapper.xml @@ -31,6 +31,12 @@ from user order by adddate ${order} limit #{offset},#{limit} + + delete from user diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/service/IUserService.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/service/IUserService.java index 9a633aa1..6dee6f49 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/service/IUserService.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/service/IUserService.java @@ -9,6 +9,8 @@ public interface IUserService { public User getUserById(long userId); public void addUser(User user); public List getUserList(String order, int limit, int offset); + //带有查询条件 + public List getUserList(String search, String order, int limit,int offset); public long getUserListCount(); public int getNewData(); public List> getDataSum(); diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/serviceimpl/UserServiceImpl.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/serviceimpl/UserServiceImpl.java index 5cd0fcab..33fd724d 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/serviceimpl/UserServiceImpl.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/serviceimpl/UserServiceImpl.java @@ -24,27 +24,41 @@ public class UserServiceImpl implements IUserService { private IUserDao userDao; @Resource private SqlSessionTemplate sqlSession; + @Override public User getUserById(long userId) { return this.userDao.selectByPrimaryKey(userId); } - + @Transactional @Override public void addUser(User user) { - Random r=new Random(); - sqlSession.insert(IUserDao.class.getName()+".insert",user); - //事务测试 -// int i=1/0; + Random r = new Random(); + sqlSession.insert(IUserDao.class.getName() + ".insert", user); + // 事务测试 + // int i=1/0; } @Override public List getUserList(String order, int limit, int offset) { - Map params=new HashMap(); - params.put("order", order); - params.put("limit", limit); - params.put("offset", offset); - return sqlSession.selectList(IUserDao.class.getName()+".selectList",params); + Map params = new HashMap(); + params.put("order", order); + params.put("limit", limit); + params.put("offset", offset); + return sqlSession.selectList(IUserDao.class.getName() + ".selectList", + params); + } + + @Override + public List getUserList(String search, String order, int limit, + int offset) { + Map params = new HashMap(); + params.put("order", order); + params.put("limit", limit); + params.put("offset", offset); + params.put("search", search); + return sqlSession.selectList(IUserDao.class.getName() + ".selectListWithQuery", + params); } @Override @@ -61,4 +75,5 @@ public int getNewData() { public List> getDataSum() { return userDao.getDataSum(); } + } \ No newline at end of file From 783a60f7ea1d55fe1bdb659753bfcf99371d824e Mon Sep 17 00:00:00 2001 From: netbuffer Date: Wed, 4 May 2016 22:10:19 +0800 Subject: [PATCH 046/290] =?UTF-8?q?mysql=E6=8B=BC=E9=9F=B3=E9=A6=96?= =?UTF-8?q?=E5=AD=97=E6=AF=8D=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ssmbootstrap_table/dao/UserMapper.xml | 2 +- src/main/java/user.sql | 18 ++++++++++++++++++ src/main/webapp/manage.html | 1 + 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/UserMapper.xml b/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/UserMapper.xml index 34c72aef..b7d955d9 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/UserMapper.xml +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/UserMapper.xml @@ -35,7 +35,7 @@ diff --git a/src/main/java/user.sql b/src/main/java/user.sql index 7d74d472..c4f1e2f5 100644 --- a/src/main/java/user.sql +++ b/src/main/java/user.sql @@ -8,3 +8,21 @@ CREATE TABLE `user` ( `adddate` int(11) NOT NULL COMMENT '添加时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Function structure for `fristPinyin` +-- ---------------------------- +DROP FUNCTION IF EXISTS `fristPinyin`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `fristPinyin`(P_NAME VARCHAR(255)) RETURNS varchar(255) CHARSET utf8 +BEGIN + DECLARE V_RETURN VARCHAR(255); + SET V_RETURN = ELT(INTERVAL(CONV(HEX(left(CONVERT(P_NAME USING gbk),1)),16,10), + 0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7, + 0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB, + 0xC8F6,0xCBFA,0xCDDA,0xCEF4,0xD1B9,0xD4D1), + 'A','B','C','D','E','F','G','H','J','K','L','M','N','O','P','Q','R','S','T','W','X','Y','Z'); + RETURN V_RETURN; +END +;; +DELIMITER ; \ No newline at end of file diff --git a/src/main/webapp/manage.html b/src/main/webapp/manage.html index f1bf1039..ec60bb56 100644 --- a/src/main/webapp/manage.html +++ b/src/main/webapp/manage.html @@ -324,6 +324,7 @@ +

支持中文首字母查询

Date: Fri, 6 May 2016 16:11:31 +0800 Subject: [PATCH 047/290] test joda-time --- pom.xml | 6 +- .../ssmbootstrap_table/util/DateUtils.java | 457 ++++++++++++++++++ .../ssmbootstrap_table/util/JodaTimeUtil.java | 110 +++++ .../ssmbootstrap_table/TestJodaTime.java | 45 ++ 4 files changed, 617 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/util/DateUtils.java create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/util/JodaTimeUtil.java create mode 100644 src/test/java/cn/com/ttblog/ssmbootstrap_table/TestJodaTime.java diff --git a/pom.xml b/pom.xml index e8ea5208..38e693a1 100644 --- a/pom.xml +++ b/pom.xml @@ -209,7 +209,11 @@ pinyin4j2.5.1 - + + joda-time + joda-time + 2.9.3 + ssmbootstrap_table diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/DateUtils.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/DateUtils.java new file mode 100644 index 00000000..3e0a8c6e --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/DateUtils.java @@ -0,0 +1,457 @@ +package cn.com.ttblog.ssmbootstrap_table.util; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * http://blog.csdn.net/dreamthen/article/details/8447332 + * @author zengms + * @date 2012-12-27 + * + */ +public class DateUtils { + + private static final Log logger = LogFactory.getLog(DateUtils.class); + + public static final String YYYYMMDD = "yyyy-MM-dd"; + + public static final String YYYYMMDD_ZH = "yyyy年MM月dd日"; + + public static final int FIRST_DAY_OF_WEEK = Calendar.MONDAY; // 中国周一是一周的第一天 + + /** + * + * @param strDate + * @return + */ + public static Date parseDate(String strDate) { + return parseDate(strDate, null); + } + + /** + * parseDate + * + * @param strDate + * @param pattern + * @return + */ + public static Date parseDate(String strDate, String pattern) { + Date date = null; + try { + if (pattern == null) { + pattern = YYYYMMDD; + } + SimpleDateFormat format = new SimpleDateFormat(pattern); + date = format.parse(strDate); + } catch (Exception e) { + logger.error("parseDate error:" + e); + } + return date; + } + + /** + * format date + * + * @param date + * @return + */ + public static String formatDate(Date date) { + return formatDate(date, null); + } + + /** + * format date + * + * @param date + * @param pattern + * @return + */ + public static String formatDate(Date date, String pattern) { + String strDate = null; + try { + if (pattern == null) { + pattern = YYYYMMDD; + } + SimpleDateFormat format = new SimpleDateFormat(pattern); + strDate = format.format(date); + } catch (Exception e) { + logger.error("formatDate error:", e); + } + return strDate; + } + + /** + * 取得日期:年 + * + * @param date + * @return + */ + public static int getYear(Date date) { + Calendar c = Calendar.getInstance(); + c.setTime(date); + int year = c.get(Calendar.YEAR); + return year; + } + + /** + * 取得日期:年 + * + * @param date + * @return + */ + public static int getMonth(Date date) { + Calendar c = Calendar.getInstance(); + c.setTime(date); + int month = c.get(Calendar.MONTH); + return month + 1; + } + + /** + * 取得日期:年 + * + * @param date + * @return + */ + public static int getDay(Date date) { + Calendar c = Calendar.getInstance(); + c.setTime(date); + int da = c.get(Calendar.DAY_OF_MONTH); + return da; + } + + /** + * 取得当天日期是周几 + * + * @param date + * @return + */ + public static int getWeekDay(Date date) { + Calendar c = Calendar.getInstance(); + c.setTime(date); + int week_of_year = c.get(Calendar.DAY_OF_WEEK); + return week_of_year - 1; + } + + /** + * 取得一年的第几周 + * + * @param date + * @return + */ + public static int getWeekOfYear(Date date) { + Calendar c = Calendar.getInstance(); + c.setTime(date); + int week_of_year = c.get(Calendar.WEEK_OF_YEAR); + return week_of_year; + } + + /** + * getWeekBeginAndEndDate + * + * @param date + * @param pattern + * @return + */ + public static String getWeekBeginAndEndDate(Date date, String pattern) { + Date monday = getMondayOfWeek(date); + Date sunday = getSundayOfWeek(date); + return formatDate(monday, pattern) + " - " + + formatDate(sunday, pattern); + } + + /** + * 根据日期取得对应周周一日期 + * + * @param date + * @return + */ + public static Date getMondayOfWeek(Date date) { + Calendar monday = Calendar.getInstance(); + monday.setTime(date); + monday.setFirstDayOfWeek(FIRST_DAY_OF_WEEK); + monday.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); + return monday.getTime(); + } + + /** + * 根据日期取得对应周周日日期 + * + * @param date + * @return + */ + public static Date getSundayOfWeek(Date date) { + Calendar sunday = Calendar.getInstance(); + sunday.setTime(date); + sunday.setFirstDayOfWeek(FIRST_DAY_OF_WEEK); + sunday.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); + return sunday.getTime(); + } + + /** + * 取得月的剩余天数 + * + * @param date + * @return + */ + public static int getRemainDayOfMonth(Date date) { + int dayOfMonth = getDayOfMonth(date); + int day = getPassDayOfMonth(date); + return dayOfMonth - day; + } + + /** + * 取得月已经过的天数 + * + * @param date + * @return + */ + public static int getPassDayOfMonth(Date date) { + Calendar c = Calendar.getInstance(); + c.setTime(date); + return c.get(Calendar.DAY_OF_MONTH); + } + + /** + * 取得月天数 + * + * @param date + * @return + */ + public static int getDayOfMonth(Date date) { + Calendar c = Calendar.getInstance(); + c.setTime(date); + return c.getActualMaximum(Calendar.DAY_OF_MONTH); + } + + /** + * 取得月第一天 + * + * @param date + * @return + */ + public static Date getFirstDateOfMonth(Date date) { + Calendar c = Calendar.getInstance(); + c.setTime(date); + c.set(Calendar.DAY_OF_MONTH, c.getActualMinimum(Calendar.DAY_OF_MONTH)); + return c.getTime(); + } + + /** + * 取得月最后一天 + * + * @param date + * @return + */ + public static Date getLastDateOfMonth(Date date) { + Calendar c = Calendar.getInstance(); + c.setTime(date); + c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH)); + return c.getTime(); + } + + /** + * 取得季度第一天 + * + * @param date + * @return + */ + public static Date getFirstDateOfSeason(Date date) { + return getFirstDateOfMonth(getSeasonDate(date)[0]); + } + + /** + * 取得季度最后一天 + * + * @param date + * @return + */ + public static Date getLastDateOfSeason(Date date) { + return getLastDateOfMonth(getSeasonDate(date)[2]); + } + + /** + * 取得季度天数 + * + * @param date + * @return + */ + public static int getDayOfSeason(Date date) { + int day = 0; + Date[] seasonDates = getSeasonDate(date); + for (Date date2 : seasonDates) { + day += getDayOfMonth(date2); + } + return day; + } + + /** + * 取得季度剩余天数 + * + * @param date + * @return + */ + public static int getRemainDayOfSeason(Date date) { + return getDayOfSeason(date) - getPassDayOfSeason(date); + } + + /** + * 取得季度已过天数 + * + * @param date + * @return + */ + public static int getPassDayOfSeason(Date date) { + int day = 0; + + Date[] seasonDates = getSeasonDate(date); + + Calendar c = Calendar.getInstance(); + c.setTime(date); + int month = c.get(Calendar.MONTH); + + if (month == Calendar.JANUARY || month == Calendar.APRIL + || month == Calendar.JULY || month == Calendar.OCTOBER) {// 季度第一个月 + day = getPassDayOfMonth(seasonDates[0]); + } else if (month == Calendar.FEBRUARY || month == Calendar.MAY + || month == Calendar.AUGUST || month == Calendar.NOVEMBER) {// 季度第二个月 + day = getDayOfMonth(seasonDates[0]) + + getPassDayOfMonth(seasonDates[1]); + } else if (month == Calendar.MARCH || month == Calendar.JUNE + || month == Calendar.SEPTEMBER || month == Calendar.DECEMBER) {// 季度第三个月 + day = getDayOfMonth(seasonDates[0]) + getDayOfMonth(seasonDates[1]) + + getPassDayOfMonth(seasonDates[2]); + } + return day; + } + + /** + * 取得季度月 + * + * @param date + * @return + */ + public static Date[] getSeasonDate(Date date) { + Date[] season = new Date[3]; + + Calendar c = Calendar.getInstance(); + c.setTime(date); + + int nSeason = getSeason(date); + if (nSeason == 1) {// 第一季度 + c.set(Calendar.MONTH, Calendar.JANUARY); + season[0] = c.getTime(); + c.set(Calendar.MONTH, Calendar.FEBRUARY); + season[1] = c.getTime(); + c.set(Calendar.MONTH, Calendar.MARCH); + season[2] = c.getTime(); + } else if (nSeason == 2) {// 第二季度 + c.set(Calendar.MONTH, Calendar.APRIL); + season[0] = c.getTime(); + c.set(Calendar.MONTH, Calendar.MAY); + season[1] = c.getTime(); + c.set(Calendar.MONTH, Calendar.JUNE); + season[2] = c.getTime(); + } else if (nSeason == 3) {// 第三季度 + c.set(Calendar.MONTH, Calendar.JULY); + season[0] = c.getTime(); + c.set(Calendar.MONTH, Calendar.AUGUST); + season[1] = c.getTime(); + c.set(Calendar.MONTH, Calendar.SEPTEMBER); + season[2] = c.getTime(); + } else if (nSeason == 4) {// 第四季度 + c.set(Calendar.MONTH, Calendar.OCTOBER); + season[0] = c.getTime(); + c.set(Calendar.MONTH, Calendar.NOVEMBER); + season[1] = c.getTime(); + c.set(Calendar.MONTH, Calendar.DECEMBER); + season[2] = c.getTime(); + } + return season; + } + + /** + * + * 1 第一季度 2 第二季度 3 第三季度 4 第四季度 + * + * @param date + * @return + */ + public static int getSeason(Date date) { + + int season = 0; + + Calendar c = Calendar.getInstance(); + c.setTime(date); + int month = c.get(Calendar.MONTH); + switch (month) { + case Calendar.JANUARY: + case Calendar.FEBRUARY: + case Calendar.MARCH: + season = 1; + break; + case Calendar.APRIL: + case Calendar.MAY: + case Calendar.JUNE: + season = 2; + break; + case Calendar.JULY: + case Calendar.AUGUST: + case Calendar.SEPTEMBER: + season = 3; + break; + case Calendar.OCTOBER: + case Calendar.NOVEMBER: + case Calendar.DECEMBER: + season = 4; + break; + default: + break; + } + return season; + } + + public static void main(String[] args) { + + String strDate = "2013-01-01"; + + Date date = parseDate(strDate); + + System.out.println(strDate + " 今天是哪一年?" + getYear(date)); + System.out.println(strDate + " 今天是哪个月?" + getMonth(date)); + System.out.println(strDate + " 今天是几号?" + getDay(date)); + System.out.println(strDate + " 今天是周几?" + getWeekDay(date)); + System.out.println(strDate + " 是一年的第几周?" + getWeekOfYear(date)); + System.out.println(strDate + " 所在周起始结束日期?" + + getWeekBeginAndEndDate(date, "yyyy年MM月dd日")); + System.out.println(strDate + " 所在周周一是?" + + formatDate(getMondayOfWeek(date))); + System.out.println(strDate + " 所在周周日是?" + + formatDate(getSundayOfWeek(date))); + + System.out.println(strDate + " 当月第一天日期?" + + formatDate(getFirstDateOfMonth(date))); + System.out.println(strDate + " 当月最后一天日期?" + + formatDate(getLastDateOfMonth(date))); + System.out.println(strDate + " 当月天数?" + getDayOfMonth(date)); + System.out.println(strDate + " 当月已过多少天?" + getPassDayOfMonth(date)); + System.out.println(strDate + " 当月剩余多少天?" + getRemainDayOfMonth(date)); + + System.out.println(strDate + " 所在季度第一天日期?" + + formatDate(getFirstDateOfSeason(date))); + System.out.println(strDate + " 所在季度最后一天日期?" + + formatDate(getLastDateOfSeason(date))); + System.out.println(strDate + " 所在季度天数?" + getDayOfSeason(date)); + System.out.println(strDate + " 所在季度已过多少天?" + getPassDayOfSeason(date)); + System.out + .println(strDate + " 所在季度剩余多少天?" + getRemainDayOfSeason(date)); + System.out.println(strDate + " 是第几季度?" + getSeason(date)); + System.out.println(strDate + " 所在季度月份?" + + formatDate(getSeasonDate(date)[0], "yyyy年MM月") + "/" + + formatDate(getSeasonDate(date)[1], "yyyy年MM月") + "/" + + formatDate(getSeasonDate(date)[2], "yyyy年MM月")); + } +} \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/JodaTimeUtil.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/JodaTimeUtil.java new file mode 100644 index 00000000..89c06455 --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/JodaTimeUtil.java @@ -0,0 +1,110 @@ +package cn.com.ttblog.ssmbootstrap_table.util; + +import org.joda.time.DateTime; + +/** + * @author netbuffer + */ +public class JodaTimeUtil { + + /** + * 本周开始时间 + * + * @param d + * @return + */ + public static DateTime getWeekStart(DateTime d) { + int day = d.getDayOfWeek(); + int min = d.dayOfWeek().getMinimumValue(); + return d.plusDays(-(day - min)); + } + + /** + * 本周结束时间 + * + * @param d + * @return + */ + public static DateTime getWeekEnd(DateTime d) { + int day = d.getDayOfWeek(); + int max = d.dayOfWeek().getMaximumValue(); + return d.plusDays((max - day)); + } + + /** + * 本月开始时间 + * + * @param d + * @return + */ + public static DateTime getMonthStart(DateTime d) { + int day = d.getDayOfMonth(); + int min = d.dayOfMonth().getMinimumValue(); + return d.plusDays(-(day - min)); + } + + /** + * 本月结束时间 + * + * @param d + * @return + */ + public static DateTime getMonthEnd(DateTime d) { + int day = d.getDayOfMonth(); + int max = d.dayOfMonth().getMaximumValue(); + return d.plusDays((max - day)); + } + + public static DateTime getSeasonStart(DateTime d) { + int season=getSeason(d); + switch (season) { + case 1: + return new DateTime(d.getYear(),1,1,d.getHourOfDay(),d.getMinuteOfHour(),d.getSecondOfMinute()); + case 2: + return new DateTime(d.getYear(),4,1,d.getHourOfDay(),d.getMinuteOfHour(),d.getSecondOfMinute()); + case 3: + return new DateTime(d.getYear(),7,1,d.getHourOfDay(),d.getMinuteOfHour(),d.getSecondOfMinute()); + case 4: + return new DateTime(d.getYear(),10,1,d.getHourOfDay(),d.getMinuteOfHour(),d.getSecondOfMinute()); + default: + return new DateTime(d.getYear(),1,1,d.getHourOfDay(),d.getMinuteOfHour(),d.getSecondOfMinute()); + } + } + + public static DateTime getSeasonEnd(DateTime d) { + int season=getSeason(d); + switch (season) { + case 1: + return new DateTime(d.getYear(),3,31,d.getHourOfDay(),d.getMinuteOfHour(),d.getSecondOfMinute()); + case 2: + return new DateTime(d.getYear(),6,30,d.getHourOfDay(),d.getMinuteOfHour(),d.getSecondOfMinute()); + case 3: + return new DateTime(d.getYear(),9,30,d.getHourOfDay(),d.getMinuteOfHour(),d.getSecondOfMinute()); + case 4: + return new DateTime(d.getYear(),12,31,d.getHourOfDay(),d.getMinuteOfHour(),d.getSecondOfMinute()); + default: + return new DateTime(d.getYear(),3,31,d.getHourOfDay(),d.getMinuteOfHour(),d.getSecondOfMinute()); + } + } + + /* + * 获取季度 + */ + public static int getSeason(DateTime d) { + int season=0; + int month=d.getMonthOfYear(); + if (month >= 1 && month <= 3) { + season = 1; + } + if (month >= 4 && month <= 6) { + season = 2; + } + if (month >= 7 && month <= 9) { + season = 3; + } + if (month >= 10 && month <= 12) { + season = 4; + } + return season; + } +} diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestJodaTime.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestJodaTime.java new file mode 100644 index 00000000..dfa16243 --- /dev/null +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestJodaTime.java @@ -0,0 +1,45 @@ +package cn.com.ttblog.ssmbootstrap_table; + +import org.joda.time.DateTime; +import org.junit.Ignore; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import cn.com.ttblog.ssmbootstrap_table.util.JodaTimeUtil; + +public class TestJodaTime { + Logger log = LoggerFactory.getLogger(this.getClass()); + private final static String FORMAT="yyyy-MM-dd"; + + @Test + public void test(){ + DateTime d=new DateTime(); + System.out.println("aa:"+d.getMonthOfYear()); + } + + @Test + public void testWeekStart(){ + log.debug("本周开始时间:{}",JodaTimeUtil.getWeekStart(new DateTime()).toString(FORMAT)); + } + @Test + public void testWeekEnd(){ + log.debug("本周结束时间:{}",JodaTimeUtil.getWeekEnd(new DateTime()).toString(FORMAT)); + } + @Test + public void testMonthStart(){ + log.debug("本月开始时间:{}",JodaTimeUtil.getMonthStart(new DateTime()).toString(FORMAT)); + } + @Test + public void testMonthEnd(){ + log.debug("本月结束时间:{}",JodaTimeUtil.getMonthEnd(new DateTime()).toString(FORMAT)); + } + @Test + public void testSeasonStart(){ + log.debug("本季度开始时间:{}",JodaTimeUtil.getSeasonStart(new DateTime()).toString(FORMAT)); + } + @Test + public void testSeasonEnd(){ + log.debug("本季度结束时间:{}",JodaTimeUtil.getSeasonEnd(new DateTime()).toString(FORMAT)); + } +} From a9472383fb581c07248d88da387d332cfe4f0bc8 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Mon, 9 May 2016 13:49:41 +0800 Subject: [PATCH 048/290] jodatime test --- .../ssmbootstrap_table/util/JodaTimeUtil.java | 28 +++++++++++++++++++ .../ssmbootstrap_table/TestJodaTime.java | 8 ++++++ 2 files changed, 36 insertions(+) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/JodaTimeUtil.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/JodaTimeUtil.java index 89c06455..8fec5af5 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/JodaTimeUtil.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/JodaTimeUtil.java @@ -55,6 +55,11 @@ public static DateTime getMonthEnd(DateTime d) { return d.plusDays((max - day)); } + /** + * 本季度开始时间 + * @param d + * @return + */ public static DateTime getSeasonStart(DateTime d) { int season=getSeason(d); switch (season) { @@ -71,6 +76,11 @@ public static DateTime getSeasonStart(DateTime d) { } } + /** + * 本季度结束时间 + * @param d + * @return + */ public static DateTime getSeasonEnd(DateTime d) { int season=getSeason(d); switch (season) { @@ -107,4 +117,22 @@ public static int getSeason(DateTime d) { } return season; } + + /** + * 本年开始时间 + * @param d + * @return + */ + public static DateTime getYearStart(DateTime d) { + return new DateTime(d.getYear(),1,1,0,0,0); + } + + /** + * 本年结束时间 + * @param d + * @return + */ + public static DateTime getYearEnd(DateTime d) { + return new DateTime(d.getYear(),12,31,23,59,59); + } } diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestJodaTime.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestJodaTime.java index dfa16243..eab62c9f 100644 --- a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestJodaTime.java +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestJodaTime.java @@ -42,4 +42,12 @@ public void testSeasonStart(){ public void testSeasonEnd(){ log.debug("本季度结束时间:{}",JodaTimeUtil.getSeasonEnd(new DateTime()).toString(FORMAT)); } + @Test + public void testYearStart(){ + log.debug("本年度开始时间:{}",JodaTimeUtil.getYearStart(new DateTime()).toString(FORMAT)); + } + @Test + public void testYearEnd(){ + log.debug("本年度结束时间:{}",JodaTimeUtil.getYearEnd(new DateTime()).toString(FORMAT)); + } } From 528dee3f6a72172b616a21625a622302f7f4efc6 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Mon, 9 May 2016 18:11:03 +0800 Subject: [PATCH 049/290] test del list content --- .../TestDelListContent.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/test/java/cn/com/ttblog/ssmbootstrap_table/TestDelListContent.java diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestDelListContent.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestDelListContent.java new file mode 100644 index 00000000..441ced5d --- /dev/null +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestDelListContent.java @@ -0,0 +1,51 @@ +package cn.com.ttblog.ssmbootstrap_table; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import net.sourceforge.pinyin4j.PinyinHelper; +import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; +import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; +import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; +import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType; +import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; + +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TestDelListContent { + + private static Logger logger = LoggerFactory.getLogger(TestMyBatis.class); + + @Test + public void testSystemProperties() { + List arr=new ArrayList(); + arr.add("1");//删除第0个 + arr.add("2"); + arr.add("3"); + arr.add("4");//删除第3个 + arr.add("5"); + arr.add("6"); + Iterator arri=arr.iterator(); + int count=0; + Set delids=new HashSet(); + delids.add(0); + delids.add(3); + while(arri.hasNext()){ + arri.next(); +// System.out.println("元素:"+arri.next()); +// System.out.println("count:"+count); + for(int i:delids){ + if(count==i){ + arri.remove(); + } + } + count++; + } + System.out.println(arr.toString()); + } +} From c460947c36e8743961b34631f52c25f32cd5ffbc Mon Sep 17 00:00:00 2001 From: netbuffer Date: Mon, 9 May 2016 21:18:28 +0800 Subject: [PATCH 050/290] test --- pom.xml | 2 +- .../com/ttblog/ssmbootstrap_table/TestDelListContent.java | 2 +- .../java/cn/com/ttblog/ssmbootstrap_table/TestJodaTime.java | 6 ------ 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 38e693a1..5fcd5ea0 100644 --- a/pom.xml +++ b/pom.xml @@ -212,7 +212,7 @@ joda-time joda-time - 2.9.3 + 2.9.2 diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestDelListContent.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestDelListContent.java index 441ced5d..00d00f8e 100644 --- a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestDelListContent.java +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestDelListContent.java @@ -36,7 +36,7 @@ public void testSystemProperties() { delids.add(0); delids.add(3); while(arri.hasNext()){ - arri.next(); + arri.next();//必须先调用next方法再调用remove // System.out.println("元素:"+arri.next()); // System.out.println("count:"+count); for(int i:delids){ diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestJodaTime.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestJodaTime.java index eab62c9f..212ce14d 100644 --- a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestJodaTime.java +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestJodaTime.java @@ -11,12 +11,6 @@ public class TestJodaTime { Logger log = LoggerFactory.getLogger(this.getClass()); private final static String FORMAT="yyyy-MM-dd"; - - @Test - public void test(){ - DateTime d=new DateTime(); - System.out.println("aa:"+d.getMonthOfYear()); - } @Test public void testWeekStart(){ From d6856a0ebf039b3ea60f1332a9b32e44847a29da Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 10 May 2016 10:42:52 +0800 Subject: [PATCH 051/290] jquery json->bean --- .../controller/UserController.java | 14 ++++ .../model/query/QueryUser.java | 72 +++++++++++++++++++ src/main/webapp/testquery.jsp | 34 +++++++++ 3 files changed, 120 insertions(+) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/model/query/QueryUser.java create mode 100644 src/main/webapp/testquery.jsp diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/UserController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/UserController.java index 16cb34e6..64767a50 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/UserController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/UserController.java @@ -14,6 +14,7 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.ui.ModelMap; import org.springframework.validation.DataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.PathVariable; @@ -23,7 +24,10 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; +import com.alibaba.fastjson.JSON; + import cn.com.ttblog.ssmbootstrap_table.model.User; +import cn.com.ttblog.ssmbootstrap_table.model.query.QueryUser; import cn.com.ttblog.ssmbootstrap_table.service.IUserService; import cn.com.ttblog.ssmbootstrap_table.validator.UserValidator; @@ -88,6 +92,16 @@ public String userlist(@RequestParam(value="search",required=false)String search logger.info("结果:{}", params); return "userlist"; } + + @RequestMapping("/userlistq") + public String userlist(QueryUser query,ModelMap map) { + logger.info("查询参数:{}", query); + map.addAttribute("query", query); + String querystr=JSON.toJSONString(query); + map.addAttribute("querystr",querystr); + logger.debug("querystr:{}",querystr); + return "testquery"; + } @RequestMapping("/showUserXML") public ModelAndView showUserXML(HttpServletRequest request, Model model) { diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/query/QueryUser.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/query/QueryUser.java new file mode 100644 index 00000000..b183c2c3 --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/query/QueryUser.java @@ -0,0 +1,72 @@ +package cn.com.ttblog.ssmbootstrap_table.model.query; + +import org.apache.commons.lang.builder.ToStringBuilder; + +/** + * 查询User实体 + * @author netbuffer + */ +public class QueryUser { + + private Long id; + private String name; + private String sex; + private Integer age; + private String phone; + private String deliveryaddress; + private Integer beginDate; + private Integer endDate; + + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getSex() { + return sex; + } + public void setSex(String sex) { + this.sex = sex; + } + public Integer getAge() { + return age; + } + public void setAge(Integer age) { + this.age = age; + } + public String getPhone() { + return phone; + } + public void setPhone(String phone) { + this.phone = phone; + } + public String getDeliveryaddress() { + return deliveryaddress; + } + public void setDeliveryaddress(String deliveryaddress) { + this.deliveryaddress = deliveryaddress; + } + public Integer getBeginDate() { + return beginDate; + } + public void setBeginDate(Integer beginDate) { + this.beginDate = beginDate; + } + public Integer getEndDate() { + return endDate; + } + public void setEndDate(Integer endDate) { + this.endDate = endDate; + } + + public String toString(){ + return ToStringBuilder.reflectionToString(this); + } +} diff --git a/src/main/webapp/testquery.jsp b/src/main/webapp/testquery.jsp new file mode 100644 index 00000000..f62e2fac --- /dev/null +++ b/src/main/webapp/testquery.jsp @@ -0,0 +1,34 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> + + + + +测试jquery-ajax发送bean到后端 + + + + + ${query}
+ ${querystr} + +

+ + \ No newline at end of file From 185a7f7087096742fc0f3aad46e3435dde9fd95e Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 10 May 2016 19:32:17 +0800 Subject: [PATCH 052/290] test query --- src/main/webapp/testquery.jsp | 2 +- .../TestDelListContent.java | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/webapp/testquery.jsp b/src/main/webapp/testquery.jsp index f62e2fac..19690365 100644 --- a/src/main/webapp/testquery.jsp +++ b/src/main/webapp/testquery.jsp @@ -11,7 +11,7 @@ $("#btn").click(function(e){ console.log(e); $.ajax({ - url:"", + url:"userlistq?name=aa", type:"POST", data:${querystr}, success:function(){ diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestDelListContent.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestDelListContent.java index 00d00f8e..1a066e37 100644 --- a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestDelListContent.java +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestDelListContent.java @@ -13,6 +13,7 @@ import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType; import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; +import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,6 +23,7 @@ public class TestDelListContent { private static Logger logger = LoggerFactory.getLogger(TestMyBatis.class); @Test + @Ignore public void testSystemProperties() { List arr=new ArrayList(); arr.add("1");//删除第0个 @@ -48,4 +50,23 @@ public void testSystemProperties() { } System.out.println(arr.toString()); } + + @Test + public void testAddToIndex() { + List arr=new ArrayList(); + arr.add("1"); + arr.add("2"); + arr.add("3"); + arr.add("4"); + arr.add("5"); + arr.add("6"); + List arr2=new ArrayList(); + arr2.add("7"); + arr2.add("8"); + //插入到第3个索引位上,从0开始 + System.out.println("add?:"+arr.addAll(3,arr2)); + System.out.println(arr.toString()); + arr.add(5, "test"); + System.out.println(arr.toString()); + } } From 435cfed8aef4c79bfc2e7bbcd24d1196d7075466 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Wed, 11 May 2016 15:10:34 +0800 Subject: [PATCH 053/290] test sui infinite scroll --- src/main/webapp/testsui-infinite-scroll.html | 107 +++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 src/main/webapp/testsui-infinite-scroll.html diff --git a/src/main/webapp/testsui-infinite-scroll.html b/src/main/webapp/testsui-infinite-scroll.html new file mode 100644 index 00000000..cd6fd64d --- /dev/null +++ b/src/main/webapp/testsui-infinite-scroll.html @@ -0,0 +1,107 @@ + + + + + +SUI 无限滚动demo + + + + + + + + + + + + + + + +
+
+
+ + +

无限滚动

+
+
+
+
    + +
    +
    +
    +
    + +
    +
    + +
    +
    + + + + \ No newline at end of file From 3ab8a5e047efd7363e228b098915fc26e6c1f854 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Wed, 11 May 2016 20:55:18 +0800 Subject: [PATCH 054/290] test scroll --- src/main/webapp/testsui-infinite-scroll.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/webapp/testsui-infinite-scroll.html b/src/main/webapp/testsui-infinite-scroll.html index cd6fd64d..74de6e88 100644 --- a/src/main/webapp/testsui-infinite-scroll.html +++ b/src/main/webapp/testsui-infinite-scroll.html @@ -72,8 +72,7 @@
    - +

    无限滚动

    From e76090037250fe1dc745a32b441cf7e37bdda515 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sat, 14 May 2016 11:49:35 +0800 Subject: [PATCH 055/290] mybatis collection --- .../ssmbootstrap_table/dao/UserMapper.xml | 18 +++++++++ .../ssmbootstrap_table/model/Address.java | 40 +++++++++++++++++++ .../ttblog/ssmbootstrap_table/model/User.java | 12 ++++++ .../ssmbootstrap_table/TestMyBatis.java | 17 ++++---- 4 files changed, 80 insertions(+), 7 deletions(-) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/model/Address.java diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/UserMapper.xml b/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/UserMapper.xml index b7d955d9..914daf7a 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/UserMapper.xml +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/UserMapper.xml @@ -10,7 +10,25 @@ + + + + + + + id, name, sex, age, phone, deliveryaddress, adddate diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/Address.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/Address.java new file mode 100644 index 00000000..6a1b9226 --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/Address.java @@ -0,0 +1,40 @@ +package cn.com.ttblog.ssmbootstrap_table.model; + +import org.apache.commons.lang.builder.ToStringBuilder; + +public class Address { + + private Long userId; + + private String province; + + private String city; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province == null ? null : province.trim(); + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city == null ? null : city.trim(); + } + + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/User.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/User.java index bd72d23b..845581ac 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/User.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/User.java @@ -1,5 +1,7 @@ package cn.com.ttblog.ssmbootstrap_table.model; +import java.util.List; + import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; @@ -27,6 +29,16 @@ public class User { private String deliveryaddress; private Integer adddate; + //用户使用的地址 + List
    addresses; + + public List
    getAddresses() { + return addresses; + } + + public void setAddresses(List
    addresses) { + this.addresses = addresses; + } public Long getId() { return id; diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java index 02507617..f980ef72 100644 --- a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java @@ -45,7 +45,7 @@ public class TestMyBatis { // } @Test - @Ignore +// @Ignore public void test1() { // for(int i=0;i<10;i++){ @@ -54,8 +54,11 @@ public void test1() { // @Override // public void run() { // System.out.println("执行了"+index); - // User user = userService.getUserById(1); - // System.out.println("数据:"+user.getUserName()); + User user = userService.getUserById(1); + logger.debug("user:"+user); + + User user2 = userDao.selectByPrimaryKey(1L); + logger.debug("user2:"+user); // logger.info(JSON.toJSONString(user)); // } // }).start(); @@ -63,9 +66,9 @@ public void test1() { // User user = userService.getUserById(1); // System.out.println("数据:"+user.getUserName()); // logger.info(JSON.toJSONString(user)); - for (int i = 0; i < 10; i++) { - System.out.println("\r\n" + new Random().nextInt(3)); - } +// for (int i = 0; i < 10; i++) { +// System.out.println("\r\n" + new Random().nextInt(3)); +// } } @Test @@ -114,7 +117,7 @@ public void testInterceptor(){ // logger.debug("测试拦截器:{}",sqlSession.selectOne("cn.com.ttblog.ssmbootstrap_table.dao.IUserDao.selectByPrimaryKey",1L)); logger.debug("getdatasum:{}",userDao.getDataSum()); } - + @Ignore @Test public void testDataSource2(){ logger.debug("testDataSource2:{}",userDaoTest.getSum()); From 842fea20b557972fd2426e78ca9f8594916049a5 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sat, 14 May 2016 11:51:49 +0800 Subject: [PATCH 056/290] update db.sql --- src/main/java/{user.sql => db.sql} | 7 +++++++ 1 file changed, 7 insertions(+) rename src/main/java/{user.sql => db.sql} (82%) diff --git a/src/main/java/user.sql b/src/main/java/db.sql similarity index 82% rename from src/main/java/user.sql rename to src/main/java/db.sql index c4f1e2f5..62a90de9 100644 --- a/src/main/java/user.sql +++ b/src/main/java/db.sql @@ -9,6 +9,13 @@ CREATE TABLE `user` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; +DROP TABLE IF EXISTS `address`; +CREATE TABLE `address` ( + `user_id` bigint(20) DEFAULT NULL, + `province` varchar(255) DEFAULT NULL, + `city` varchar(255) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + -- ---------------------------- -- Function structure for `fristPinyin` -- ---------------------------- From fefd29655733dad5055cc71f75b0423af53fe8e9 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sat, 14 May 2016 17:25:01 +0800 Subject: [PATCH 057/290] mybatis collection --- .../ssmbootstrap_table/dao/IMenuDao.java | 7 +++ .../ssmbootstrap_table/dao/MenuMapper.xml | 21 ++++++++ .../ttblog/ssmbootstrap_table/model/Menu.java | 52 +++++++++++++++++++ src/main/java/db.sql | 14 +++++ .../ssmbootstrap_table/TestMyBatis.java | 15 +++++- 5 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/IMenuDao.java create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/MenuMapper.xml create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/model/Menu.java diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/IMenuDao.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/IMenuDao.java new file mode 100644 index 00000000..7a6bdcd6 --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/IMenuDao.java @@ -0,0 +1,7 @@ +package cn.com.ttblog.ssmbootstrap_table.dao; + +import cn.com.ttblog.ssmbootstrap_table.model.Menu; + +public interface IMenuDao { + Menu getMenuById(Long l); +} \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/MenuMapper.xml b/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/MenuMapper.xml new file mode 100644 index 00000000..023db55d --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/MenuMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/Menu.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/Menu.java new file mode 100644 index 00000000..c9441200 --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/Menu.java @@ -0,0 +1,52 @@ +package cn.com.ttblog.ssmbootstrap_table.model; + +import java.util.List; + +import org.apache.commons.lang.builder.ToStringBuilder; + +public class Menu { + + private Long id; + + private String name; + + private Long parentId; + + List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name == null ? null : name.trim(); + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} \ No newline at end of file diff --git a/src/main/java/db.sql b/src/main/java/db.sql index 62a90de9..53ce5b88 100644 --- a/src/main/java/db.sql +++ b/src/main/java/db.sql @@ -16,6 +16,20 @@ CREATE TABLE `address` ( `city` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +DROP TABLE IF EXISTS `menu`; +CREATE TABLE `menu` ( + `id` bigint(20) NOT NULL DEFAULT '0', + `name` varchar(255) DEFAULT NULL COMMENT '菜单名', + `parent_id` bigint(20) DEFAULT NULL COMMENT '父id', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of menu +-- ---------------------------- +INSERT INTO `menu` VALUES ('1', 'menu', '0'); +INSERT INTO `menu` VALUES ('2', 'submenu', '1'); + -- ---------------------------- -- Function structure for `fristPinyin` -- ---------------------------- diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java index f980ef72..29d73d53 100644 --- a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java @@ -16,8 +16,10 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.web.bind.annotation.ResponseBody; +import cn.com.ttblog.ssmbootstrap_table.dao.IMenuDao; import cn.com.ttblog.ssmbootstrap_table.dao.IUserDao; import cn.com.ttblog.ssmbootstrap_table.dao2.IUserDaoTest; +import cn.com.ttblog.ssmbootstrap_table.model.Menu; import cn.com.ttblog.ssmbootstrap_table.model.User; import cn.com.ttblog.ssmbootstrap_table.service.IUserService; import cn.com.ttblog.ssmbootstrap_table.serviceimpl.UserServiceImpl; @@ -38,14 +40,23 @@ public class TestMyBatis { private SqlSession sqlSession; @Resource private IUserDaoTest userDaoTest; + @Resource + private IMenuDao menuDao; // @Before // public void before() { // ac = new ClassPathXmlApplicationContext("applicationContext.xml"); // userService = (IUserService) ac.getBean("userService"); // } - + @Test -// @Ignore + public void testMenu(){ + Menu m=menuDao.getMenuById(1L); + logger.debug("menu:{}",m); + logger.debug("submenu:{}",m.getMenus().get(0)); + } + + @Test + @Ignore public void test1() { // for(int i=0;i<10;i++){ From 2e9cde2b497c957e720007f671ba22abce89d02c Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sun, 15 May 2016 21:48:34 +0800 Subject: [PATCH 058/290] mybatis association --- .../ssmbootstrap_table/dao/UserMapper.xml | 6 ++++ .../ttblog/ssmbootstrap_table/model/Card.java | 29 +++++++++++++++++++ .../ttblog/ssmbootstrap_table/model/User.java | 10 +++++++ src/main/java/db.sql | 12 ++++++++ .../ssmbootstrap_table/TestMyBatis.java | 9 +++--- 5 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/model/Card.java diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/UserMapper.xml b/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/UserMapper.xml index 914daf7a..a91ffa84 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/UserMapper.xml +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/dao/UserMapper.xml @@ -10,6 +10,7 @@ + - + diff --git a/src/main/webapp/test.jsp b/src/main/webapp/test.jsp index a0cddb14..2b8c3551 100644 --- a/src/main/webapp/test.jsp +++ b/src/main/webapp/test.jsp @@ -7,6 +7,6 @@ ${test } - ${test } + ${test }
    ${uri} \ No newline at end of file diff --git a/src/main/webapp/testsui-infinite-scroll.html b/src/main/webapp/testsui-infinite-scroll.html index 74de6e88..5679fed0 100644 --- a/src/main/webapp/testsui-infinite-scroll.html +++ b/src/main/webapp/testsui-infinite-scroll.html @@ -21,13 +21,18 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    +
    + + diff --git a/src/main/webapp/swagger-ui/lang/en.js b/src/main/webapp/swagger-ui/lang/en.js new file mode 100644 index 00000000..91831366 --- /dev/null +++ b/src/main/webapp/swagger-ui/lang/en.js @@ -0,0 +1,56 @@ +'use strict'; + +/* jshint quotmark: double */ +window.SwaggerTranslator.learn({ + "Warning: Deprecated":"Warning: Deprecated", + "Implementation Notes":"Implementation Notes", + "Response Class":"Response Class", + "Status":"Status", + "Parameters":"Parameters", + "Parameter":"Parameter", + "Value":"Value", + "Description":"Description", + "Parameter Type":"Parameter Type", + "Data Type":"Data Type", + "Response Messages":"Response Messages", + "HTTP Status Code":"HTTP Status Code", + "Reason":"Reason", + "Response Model":"Response Model", + "Request URL":"Request URL", + "Response Body":"Response Body", + "Response Code":"Response Code", + "Response Headers":"Response Headers", + "Hide Response":"Hide Response", + "Headers":"Headers", + "Try it out!":"Try it out!", + "Show/Hide":"Show/Hide", + "List Operations":"List Operations", + "Expand Operations":"Expand Operations", + "Raw":"Raw", + "can't parse JSON. Raw result":"can't parse JSON. Raw result", + "Example Value":"Example Value", + "Model Schema":"Model Schema", + "Model":"Model", + "Click to set as parameter value":"Click to set as parameter value", + "apply":"apply", + "Username":"Username", + "Password":"Password", + "Terms of service":"Terms of service", + "Created by":"Created by", + "See more at":"See more at", + "Contact the developer":"Contact the developer", + "api version":"api version", + "Response Content Type":"Response Content Type", + "Parameter content type:":"Parameter content type:", + "fetching resource":"fetching resource", + "fetching resource list":"fetching resource list", + "Explore":"Explore", + "Show Swagger Petstore Example Apis":"Show Swagger Petstore Example Apis", + "Can't read from server. It may not have the appropriate access-control-origin settings.":"Can't read from server. It may not have the appropriate access-control-origin settings.", + "Please specify the protocol for":"Please specify the protocol for", + "Can't read swagger JSON from":"Can't read swagger JSON from", + "Finished Loading Resource Information. Rendering Swagger UI":"Finished Loading Resource Information. Rendering Swagger UI", + "Unable to read api":"Unable to read api", + "from path":"from path", + "server returned":"server returned" +}); diff --git a/src/main/webapp/swagger-ui/lang/es.js b/src/main/webapp/swagger-ui/lang/es.js new file mode 100644 index 00000000..13fa015e --- /dev/null +++ b/src/main/webapp/swagger-ui/lang/es.js @@ -0,0 +1,53 @@ +'use strict'; + +/* jshint quotmark: double */ +window.SwaggerTranslator.learn({ + "Warning: Deprecated":"Advertencia: Obsoleto", + "Implementation Notes":"Notas de implementación", + "Response Class":"Clase de la Respuesta", + "Status":"Status", + "Parameters":"Parámetros", + "Parameter":"Parámetro", + "Value":"Valor", + "Description":"Descripción", + "Parameter Type":"Tipo del Parámetro", + "Data Type":"Tipo del Dato", + "Response Messages":"Mensajes de la Respuesta", + "HTTP Status Code":"Código de Status HTTP", + "Reason":"Razón", + "Response Model":"Modelo de la Respuesta", + "Request URL":"URL de la Solicitud", + "Response Body":"Cuerpo de la Respuesta", + "Response Code":"Código de la Respuesta", + "Response Headers":"Encabezados de la Respuesta", + "Hide Response":"Ocultar Respuesta", + "Try it out!":"Pruébalo!", + "Show/Hide":"Mostrar/Ocultar", + "List Operations":"Listar Operaciones", + "Expand Operations":"Expandir Operaciones", + "Raw":"Crudo", + "can't parse JSON. Raw result":"no puede parsear el JSON. Resultado crudo", + "Example Value":"Valor de Ejemplo", + "Model Schema":"Esquema del Modelo", + "Model":"Modelo", + "apply":"aplicar", + "Username":"Nombre de usuario", + "Password":"Contraseña", + "Terms of service":"Términos de Servicio", + "Created by":"Creado por", + "See more at":"Ver más en", + "Contact the developer":"Contactar al desarrollador", + "api version":"versión de la api", + "Response Content Type":"Tipo de Contenido (Content Type) de la Respuesta", + "fetching resource":"buscando recurso", + "fetching resource list":"buscando lista del recurso", + "Explore":"Explorar", + "Show Swagger Petstore Example Apis":"Mostrar Api Ejemplo de Swagger Petstore", + "Can't read from server. It may not have the appropriate access-control-origin settings.":"No se puede leer del servidor. Tal vez no tiene la configuración de control de acceso de origen (access-control-origin) apropiado.", + "Please specify the protocol for":"Por favor, especificar el protocola para", + "Can't read swagger JSON from":"No se puede leer el JSON de swagger desde", + "Finished Loading Resource Information. Rendering Swagger UI":"Finalizada la carga del recurso de Información. Mostrando Swagger UI", + "Unable to read api":"No se puede leer la api", + "from path":"desde ruta", + "server returned":"el servidor retornó" +}); diff --git a/src/main/webapp/swagger-ui/lang/fr.js b/src/main/webapp/swagger-ui/lang/fr.js new file mode 100644 index 00000000..388dff14 --- /dev/null +++ b/src/main/webapp/swagger-ui/lang/fr.js @@ -0,0 +1,54 @@ +'use strict'; + +/* jshint quotmark: double */ +window.SwaggerTranslator.learn({ + "Warning: Deprecated":"Avertissement : Obsolète", + "Implementation Notes":"Notes d'implémentation", + "Response Class":"Classe de la réponse", + "Status":"Statut", + "Parameters":"Paramètres", + "Parameter":"Paramètre", + "Value":"Valeur", + "Description":"Description", + "Parameter Type":"Type du paramètre", + "Data Type":"Type de données", + "Response Messages":"Messages de la réponse", + "HTTP Status Code":"Code de statut HTTP", + "Reason":"Raison", + "Response Model":"Modèle de réponse", + "Request URL":"URL appelée", + "Response Body":"Corps de la réponse", + "Response Code":"Code de la réponse", + "Response Headers":"En-têtes de la réponse", + "Hide Response":"Cacher la réponse", + "Headers":"En-têtes", + "Try it out!":"Testez !", + "Show/Hide":"Afficher/Masquer", + "List Operations":"Liste des opérations", + "Expand Operations":"Développer les opérations", + "Raw":"Brut", + "can't parse JSON. Raw result":"impossible de décoder le JSON. Résultat brut", + "Example Value":"Exemple la valeur", + "Model Schema":"Définition du modèle", + "Model":"Modèle", + "apply":"appliquer", + "Username":"Nom d'utilisateur", + "Password":"Mot de passe", + "Terms of service":"Conditions de service", + "Created by":"Créé par", + "See more at":"Voir plus sur", + "Contact the developer":"Contacter le développeur", + "api version":"version de l'api", + "Response Content Type":"Content Type de la réponse", + "fetching resource":"récupération de la ressource", + "fetching resource list":"récupération de la liste de ressources", + "Explore":"Explorer", + "Show Swagger Petstore Example Apis":"Montrer les Apis de l'exemple Petstore de Swagger", + "Can't read from server. It may not have the appropriate access-control-origin settings.":"Impossible de lire à partir du serveur. Il se peut que les réglages access-control-origin ne soient pas appropriés.", + "Please specify the protocol for":"Veuillez spécifier un protocole pour", + "Can't read swagger JSON from":"Impossible de lire le JSON swagger à partir de", + "Finished Loading Resource Information. Rendering Swagger UI":"Chargement des informations terminé. Affichage de Swagger UI", + "Unable to read api":"Impossible de lire l'api", + "from path":"à partir du chemin", + "server returned":"réponse du serveur" +}); diff --git a/src/main/webapp/swagger-ui/lang/geo.js b/src/main/webapp/swagger-ui/lang/geo.js new file mode 100644 index 00000000..609c20d9 --- /dev/null +++ b/src/main/webapp/swagger-ui/lang/geo.js @@ -0,0 +1,56 @@ +'use strict'; + +/* jshint quotmark: double */ +window.SwaggerTranslator.learn({ + "Warning: Deprecated":"ყურადღება: აღარ გამოიყენება", + "Implementation Notes":"იმპლემენტაციის აღწერა", + "Response Class":"რესპონს კლასი", + "Status":"სტატუსი", + "Parameters":"პარამეტრები", + "Parameter":"პარამეტრი", + "Value":"მნიშვნელობა", + "Description":"აღწერა", + "Parameter Type":"პარამეტრის ტიპი", + "Data Type":"მონაცემის ტიპი", + "Response Messages":"პასუხი", + "HTTP Status Code":"HTTP სტატუსი", + "Reason":"მიზეზი", + "Response Model":"რესპონს მოდელი", + "Request URL":"მოთხოვნის URL", + "Response Body":"პასუხის სხეული", + "Response Code":"პასუხის კოდი", + "Response Headers":"პასუხის ჰედერები", + "Hide Response":"დამალე პასუხი", + "Headers":"ჰედერები", + "Try it out!":"ცადე !", + "Show/Hide":"გამოჩენა/დამალვა", + "List Operations":"ოპერაციების სია", + "Expand Operations":"ოპერაციები ვრცლად", + "Raw":"ნედლი", + "can't parse JSON. Raw result":"JSON-ის დამუშავება ვერ მოხერხდა. ნედლი პასუხი", + "Example Value":"მაგალითი", + "Model Schema":"მოდელის სტრუქტურა", + "Model":"მოდელი", + "Click to set as parameter value":"პარამეტრისთვის მნიშვნელობის მისანიჭებლად, დააკლიკე", + "apply":"გამოყენება", + "Username":"მოხმარებელი", + "Password":"პაროლი", + "Terms of service":"მომსახურების პირობები", + "Created by":"შექმნა", + "See more at":"ნახე ვრცლად", + "Contact the developer":"დაუკავშირდი დეველოპერს", + "api version":"api ვერსია", + "Response Content Type":"პასუხის კონტენტის ტიპი", + "Parameter content type:":"პარამეტრის კონტენტის ტიპი:", + "fetching resource":"რესურსების მიღება", + "fetching resource list":"რესურსების სიის მიღება", + "Explore":"ნახვა", + "Show Swagger Petstore Example Apis":"ნახე Swagger Petstore სამაგალითო Api", + "Can't read from server. It may not have the appropriate access-control-origin settings.":"სერვერთან დაკავშირება ვერ ხერხდება. შეამოწმეთ access-control-origin.", + "Please specify the protocol for":"მიუთითეთ პროტოკოლი", + "Can't read swagger JSON from":"swagger JSON წაკითხვა ვერ მოხერხდა", + "Finished Loading Resource Information. Rendering Swagger UI":"რესურსების ჩატვირთვა სრულდება. Swagger UI რენდერდება", + "Unable to read api":"api წაკითხვა ვერ მოხერხდა", + "from path":"მისამართიდან", + "server returned":"სერვერმა დააბრუნა" +}); diff --git a/src/main/webapp/swagger-ui/lang/it.js b/src/main/webapp/swagger-ui/lang/it.js new file mode 100644 index 00000000..8529c2a9 --- /dev/null +++ b/src/main/webapp/swagger-ui/lang/it.js @@ -0,0 +1,52 @@ +'use strict'; + +/* jshint quotmark: double */ +window.SwaggerTranslator.learn({ + "Warning: Deprecated":"Attenzione: Deprecato", + "Implementation Notes":"Note di implementazione", + "Response Class":"Classe della risposta", + "Status":"Stato", + "Parameters":"Parametri", + "Parameter":"Parametro", + "Value":"Valore", + "Description":"Descrizione", + "Parameter Type":"Tipo di parametro", + "Data Type":"Tipo di dato", + "Response Messages":"Messaggi della risposta", + "HTTP Status Code":"Codice stato HTTP", + "Reason":"Motivo", + "Response Model":"Modello di risposta", + "Request URL":"URL della richiesta", + "Response Body":"Corpo della risposta", + "Response Code":"Oggetto della risposta", + "Response Headers":"Intestazioni della risposta", + "Hide Response":"Nascondi risposta", + "Try it out!":"Provalo!", + "Show/Hide":"Mostra/Nascondi", + "List Operations":"Mostra operazioni", + "Expand Operations":"Espandi operazioni", + "Raw":"Grezzo (raw)", + "can't parse JSON. Raw result":"non è possibile parsare il JSON. Risultato grezzo (raw).", + "Model Schema":"Schema del modello", + "Model":"Modello", + "apply":"applica", + "Username":"Nome utente", + "Password":"Password", + "Terms of service":"Condizioni del servizio", + "Created by":"Creato da", + "See more at":"Informazioni aggiuntive:", + "Contact the developer":"Contatta lo sviluppatore", + "api version":"versione api", + "Response Content Type":"Tipo di contenuto (content type) della risposta", + "fetching resource":"recuperando la risorsa", + "fetching resource list":"recuperando lista risorse", + "Explore":"Esplora", + "Show Swagger Petstore Example Apis":"Mostra le api di esempio di Swagger Petstore", + "Can't read from server. It may not have the appropriate access-control-origin settings.":"Non è possibile leggere dal server. Potrebbe non avere le impostazioni di controllo accesso origine (access-control-origin) appropriate.", + "Please specify the protocol for":"Si prega di specificare il protocollo per", + "Can't read swagger JSON from":"Impossibile leggere JSON swagger da:", + "Finished Loading Resource Information. Rendering Swagger UI":"Lettura informazioni risorse termianta. Swagger UI viene mostrata", + "Unable to read api":"Impossibile leggere la api", + "from path":"da cartella", + "server returned":"il server ha restituito" +}); diff --git a/src/main/webapp/swagger-ui/lang/ja.js b/src/main/webapp/swagger-ui/lang/ja.js new file mode 100644 index 00000000..3207bfc0 --- /dev/null +++ b/src/main/webapp/swagger-ui/lang/ja.js @@ -0,0 +1,53 @@ +'use strict'; + +/* jshint quotmark: double */ +window.SwaggerTranslator.learn({ + "Warning: Deprecated":"警告: 廃止予定", + "Implementation Notes":"実装メモ", + "Response Class":"レスポンスクラス", + "Status":"ステータス", + "Parameters":"パラメータ群", + "Parameter":"パラメータ", + "Value":"値", + "Description":"説明", + "Parameter Type":"パラメータタイプ", + "Data Type":"データタイプ", + "Response Messages":"レスポンスメッセージ", + "HTTP Status Code":"HTTPステータスコード", + "Reason":"理由", + "Response Model":"レスポンスモデル", + "Request URL":"リクエストURL", + "Response Body":"レスポンスボディ", + "Response Code":"レスポンスコード", + "Response Headers":"レスポンスヘッダ", + "Hide Response":"レスポンスを隠す", + "Headers":"ヘッダ", + "Try it out!":"実際に実行!", + "Show/Hide":"表示/非表示", + "List Operations":"操作一覧", + "Expand Operations":"操作の展開", + "Raw":"Raw", + "can't parse JSON. Raw result":"JSONへ解釈できません. 未加工の結果", + "Model Schema":"モデルスキーマ", + "Model":"モデル", + "apply":"実行", + "Username":"ユーザ名", + "Password":"パスワード", + "Terms of service":"サービス利用規約", + "Created by":"Created by", + "See more at":"See more at", + "Contact the developer":"開発者に連絡", + "api version":"APIバージョン", + "Response Content Type":"レスポンス コンテンツタイプ", + "fetching resource":"リソースの取得", + "fetching resource list":"リソース一覧の取得", + "Explore":"Explore", + "Show Swagger Petstore Example Apis":"SwaggerペットストアAPIの表示", + "Can't read from server. It may not have the appropriate access-control-origin settings.":"サーバから読み込めません. 適切なaccess-control-origin設定を持っていない可能性があります.", + "Please specify the protocol for":"プロトコルを指定してください", + "Can't read swagger JSON from":"次からswagger JSONを読み込めません", + "Finished Loading Resource Information. Rendering Swagger UI":"リソース情報の読み込みが完了しました. Swagger UIを描画しています", + "Unable to read api":"APIを読み込めません", + "from path":"次のパスから", + "server returned":"サーバからの返答" +}); diff --git a/src/main/webapp/swagger-ui/lang/pl.js b/src/main/webapp/swagger-ui/lang/pl.js new file mode 100644 index 00000000..ce41e917 --- /dev/null +++ b/src/main/webapp/swagger-ui/lang/pl.js @@ -0,0 +1,53 @@ +'use strict'; + +/* jshint quotmark: double */ +window.SwaggerTranslator.learn({ + "Warning: Deprecated":"Uwaga: Wycofane", + "Implementation Notes":"Uwagi Implementacji", + "Response Class":"Klasa Odpowiedzi", + "Status":"Status", + "Parameters":"Parametry", + "Parameter":"Parametr", + "Value":"Wartość", + "Description":"Opis", + "Parameter Type":"Typ Parametru", + "Data Type":"Typ Danych", + "Response Messages":"Wiadomości Odpowiedzi", + "HTTP Status Code":"Kod Statusu HTTP", + "Reason":"Przyczyna", + "Response Model":"Model Odpowiedzi", + "Request URL":"URL Wywołania", + "Response Body":"Treść Odpowiedzi", + "Response Code":"Kod Odpowiedzi", + "Response Headers":"Nagłówki Odpowiedzi", + "Hide Response":"Ukryj Odpowiedź", + "Headers":"Nagłówki", + "Try it out!":"Wypróbuj!", + "Show/Hide":"Pokaż/Ukryj", + "List Operations":"Lista Operacji", + "Expand Operations":"Rozwiń Operacje", + "Raw":"Nieprzetworzone", + "can't parse JSON. Raw result":"nie można przetworzyć pliku JSON. Nieprzetworzone dane", + "Model Schema":"Schemat Modelu", + "Model":"Model", + "apply":"użyj", + "Username":"Nazwa użytkownika", + "Password":"Hasło", + "Terms of service":"Warunki używania", + "Created by":"Utworzone przez", + "See more at":"Zobacz więcej na", + "Contact the developer":"Kontakt z deweloperem", + "api version":"wersja api", + "Response Content Type":"Typ Zasobu Odpowiedzi", + "fetching resource":"ładowanie zasobu", + "fetching resource list":"ładowanie listy zasobów", + "Explore":"Eksploruj", + "Show Swagger Petstore Example Apis":"Pokaż Przykładowe Api Swagger Petstore", + "Can't read from server. It may not have the appropriate access-control-origin settings.":"Brak połączenia z serwerem. Może on nie mieć odpowiednich ustawień access-control-origin.", + "Please specify the protocol for":"Proszę podać protokół dla", + "Can't read swagger JSON from":"Nie można odczytać swagger JSON z", + "Finished Loading Resource Information. Rendering Swagger UI":"Ukończono Ładowanie Informacji o Zasobie. Renderowanie Swagger UI", + "Unable to read api":"Nie można odczytać api", + "from path":"ze ścieżki", + "server returned":"serwer zwrócił" +}); diff --git a/src/main/webapp/swagger-ui/lang/pt.js b/src/main/webapp/swagger-ui/lang/pt.js new file mode 100644 index 00000000..f2e7c13d --- /dev/null +++ b/src/main/webapp/swagger-ui/lang/pt.js @@ -0,0 +1,53 @@ +'use strict'; + +/* jshint quotmark: double */ +window.SwaggerTranslator.learn({ + "Warning: Deprecated":"Aviso: Depreciado", + "Implementation Notes":"Notas de Implementação", + "Response Class":"Classe de resposta", + "Status":"Status", + "Parameters":"Parâmetros", + "Parameter":"Parâmetro", + "Value":"Valor", + "Description":"Descrição", + "Parameter Type":"Tipo de parâmetro", + "Data Type":"Tipo de dados", + "Response Messages":"Mensagens de resposta", + "HTTP Status Code":"Código de status HTTP", + "Reason":"Razão", + "Response Model":"Modelo resposta", + "Request URL":"URL requisição", + "Response Body":"Corpo da resposta", + "Response Code":"Código da resposta", + "Response Headers":"Cabeçalho da resposta", + "Headers":"Cabeçalhos", + "Hide Response":"Esconder resposta", + "Try it out!":"Tente agora!", + "Show/Hide":"Mostrar/Esconder", + "List Operations":"Listar operações", + "Expand Operations":"Expandir operações", + "Raw":"Cru", + "can't parse JSON. Raw result":"Falha ao analisar JSON. Resulto cru", + "Model Schema":"Modelo esquema", + "Model":"Modelo", + "apply":"Aplicar", + "Username":"Usuário", + "Password":"Senha", + "Terms of service":"Termos do serviço", + "Created by":"Criado por", + "See more at":"Veja mais em", + "Contact the developer":"Contate o desenvolvedor", + "api version":"Versão api", + "Response Content Type":"Tipo de conteúdo da resposta", + "fetching resource":"busca recurso", + "fetching resource list":"buscando lista de recursos", + "Explore":"Explorar", + "Show Swagger Petstore Example Apis":"Show Swagger Petstore Example Apis", + "Can't read from server. It may not have the appropriate access-control-origin settings.":"Não é possível ler do servidor. Pode não ter as apropriadas configurações access-control-origin", + "Please specify the protocol for":"Por favor especifique o protocolo", + "Can't read swagger JSON from":"Não é possível ler o JSON Swagger de", + "Finished Loading Resource Information. Rendering Swagger UI":"Carregar informação de recurso finalizada. Renderizando Swagger UI", + "Unable to read api":"Não foi possível ler api", + "from path":"do caminho", + "server returned":"servidor retornou" +}); diff --git a/src/main/webapp/swagger-ui/lang/ru.js b/src/main/webapp/swagger-ui/lang/ru.js new file mode 100644 index 00000000..592744e9 --- /dev/null +++ b/src/main/webapp/swagger-ui/lang/ru.js @@ -0,0 +1,56 @@ +'use strict'; + +/* jshint quotmark: double */ +window.SwaggerTranslator.learn({ + "Warning: Deprecated":"Предупреждение: Устарело", + "Implementation Notes":"Заметки", + "Response Class":"Пример ответа", + "Status":"Статус", + "Parameters":"Параметры", + "Parameter":"Параметр", + "Value":"Значение", + "Description":"Описание", + "Parameter Type":"Тип параметра", + "Data Type":"Тип данных", + "HTTP Status Code":"HTTP код", + "Reason":"Причина", + "Response Model":"Структура ответа", + "Request URL":"URL запроса", + "Response Body":"Тело ответа", + "Response Code":"HTTP код ответа", + "Response Headers":"Заголовки ответа", + "Hide Response":"Спрятать ответ", + "Headers":"Заголовки", + "Response Messages":"Что может прийти в ответ", + "Try it out!":"Попробовать!", + "Show/Hide":"Показать/Скрыть", + "List Operations":"Операции кратко", + "Expand Operations":"Операции подробно", + "Raw":"В сыром виде", + "can't parse JSON. Raw result":"Не удается распарсить ответ:", + "Example Value":"Пример", + "Model Schema":"Структура", + "Model":"Описание", + "Click to set as parameter value":"Нажмите, чтобы испльзовать в качестве значения параметра", + "apply":"применить", + "Username":"Имя пользователя", + "Password":"Пароль", + "Terms of service":"Условия использования", + "Created by":"Разработано", + "See more at":"Еще тут", + "Contact the developer":"Связаться с разработчиком", + "api version":"Версия API", + "Response Content Type":"Content Type ответа", + "Parameter content type:":"Content Type параметра:", + "fetching resource":"Получение ресурса", + "fetching resource list":"Получение ресурсов", + "Explore":"Показать", + "Show Swagger Petstore Example Apis":"Показать примеры АПИ", + "Can't read from server. It may not have the appropriate access-control-origin settings.":"Не удается получить ответ от сервера. Возможно, проблема с настройками доступа", + "Please specify the protocol for":"Пожалуйста, укажите протокол для", + "Can't read swagger JSON from":"Не получается прочитать swagger json из", + "Finished Loading Resource Information. Rendering Swagger UI":"Загрузка информации о ресурсах завершена. Рендерим", + "Unable to read api":"Не удалось прочитать api", + "from path":"по адресу", + "server returned":"сервер сказал" +}); diff --git a/src/main/webapp/swagger-ui/lang/tr.js b/src/main/webapp/swagger-ui/lang/tr.js new file mode 100644 index 00000000..16426a9c --- /dev/null +++ b/src/main/webapp/swagger-ui/lang/tr.js @@ -0,0 +1,53 @@ +'use strict'; + +/* jshint quotmark: double */ +window.SwaggerTranslator.learn({ + "Warning: Deprecated":"Uyarı: Deprecated", + "Implementation Notes":"Gerçekleştirim Notları", + "Response Class":"Dönen Sınıf", + "Status":"Statü", + "Parameters":"Parametreler", + "Parameter":"Parametre", + "Value":"Değer", + "Description":"Açıklama", + "Parameter Type":"Parametre Tipi", + "Data Type":"Veri Tipi", + "Response Messages":"Dönüş Mesajı", + "HTTP Status Code":"HTTP Statü Kodu", + "Reason":"Gerekçe", + "Response Model":"Dönüş Modeli", + "Request URL":"İstek URL", + "Response Body":"Dönüş İçeriği", + "Response Code":"Dönüş Kodu", + "Response Headers":"Dönüş Üst Bilgileri", + "Hide Response":"Dönüşü Gizle", + "Headers":"Üst Bilgiler", + "Try it out!":"Dene!", + "Show/Hide":"Göster/Gizle", + "List Operations":"Operasyonları Listele", + "Expand Operations":"Operasyonları Aç", + "Raw":"Ham", + "can't parse JSON. Raw result":"JSON çözümlenemiyor. Ham sonuç", + "Model Schema":"Model Şema", + "Model":"Model", + "apply":"uygula", + "Username":"Kullanıcı Adı", + "Password":"Parola", + "Terms of service":"Servis şartları", + "Created by":"Oluşturan", + "See more at":"Daha fazlası için", + "Contact the developer":"Geliştirici ile İletişime Geçin", + "api version":"api versiyon", + "Response Content Type":"Dönüş İçerik Tipi", + "fetching resource":"kaynak getiriliyor", + "fetching resource list":"kaynak listesi getiriliyor", + "Explore":"Keşfet", + "Show Swagger Petstore Example Apis":"Swagger Petstore Örnek Api'yi Gör", + "Can't read from server. It may not have the appropriate access-control-origin settings.":"Sunucudan okuma yapılamıyor. Sunucu access-control-origin ayarlarınızı kontrol edin.", + "Please specify the protocol for":"Lütfen istenen adres için protokol belirtiniz", + "Can't read swagger JSON from":"Swagger JSON bu kaynaktan okunamıyor", + "Finished Loading Resource Information. Rendering Swagger UI":"Kaynak baglantısı tamamlandı. Swagger UI gösterime hazırlanıyor", + "Unable to read api":"api okunamadı", + "from path":"yoldan", + "server returned":"sunucuya dönüldü" +}); diff --git a/src/main/webapp/swagger-ui/lang/translator.js b/src/main/webapp/swagger-ui/lang/translator.js new file mode 100644 index 00000000..ffb879f9 --- /dev/null +++ b/src/main/webapp/swagger-ui/lang/translator.js @@ -0,0 +1,39 @@ +'use strict'; + +/** + * Translator for documentation pages. + * + * To enable translation you should include one of language-files in your index.html + * after . + * For example - + * + * If you wish to translate some new texts you should do two things: + * 1. Add a new phrase pair ("New Phrase": "New Translation") into your language file (for example lang/ru.js). It will be great if you add it in other language files too. + * 2. Mark that text it templates this way New Phrase or . + * The main thing here is attribute data-sw-translate. Only inner html, title-attribute and value-attribute are going to translate. + * + */ +window.SwaggerTranslator = { + + _words:[], + + translate: function(sel) { + var $this = this; + sel = sel || '[data-sw-translate]'; + + $(sel).each(function() { + $(this).html($this._tryTranslate($(this).html())); + + $(this).val($this._tryTranslate($(this).val())); + $(this).attr('title', $this._tryTranslate($(this).attr('title'))); + }); + }, + + _tryTranslate: function(word) { + return this._words[$.trim(word)] !== undefined ? this._words[$.trim(word)] : word; + }, + + learn: function(wordsMap) { + this._words = wordsMap; + } +}; diff --git a/src/main/webapp/swagger-ui/lang/zh-cn.js b/src/main/webapp/swagger-ui/lang/zh-cn.js new file mode 100644 index 00000000..570319ba --- /dev/null +++ b/src/main/webapp/swagger-ui/lang/zh-cn.js @@ -0,0 +1,53 @@ +'use strict'; + +/* jshint quotmark: double */ +window.SwaggerTranslator.learn({ + "Warning: Deprecated":"警告:已过时", + "Implementation Notes":"实现备注", + "Response Class":"响应类", + "Status":"状态", + "Parameters":"参数", + "Parameter":"参数", + "Value":"值", + "Description":"描述", + "Parameter Type":"参数类型", + "Data Type":"数据类型", + "Response Messages":"响应消息", + "HTTP Status Code":"HTTP状态码", + "Reason":"原因", + "Response Model":"响应模型", + "Request URL":"请求URL", + "Response Body":"响应体", + "Response Code":"响应码", + "Response Headers":"响应头", + "Hide Response":"隐藏响应", + "Headers":"头", + "Try it out!":"试一下!", + "Show/Hide":"显示/隐藏", + "List Operations":"显示操作", + "Expand Operations":"展开操作", + "Raw":"原始", + "can't parse JSON. Raw result":"无法解析JSON. 原始结果", + "Model Schema":"模型架构", + "Model":"模型", + "apply":"应用", + "Username":"用户名", + "Password":"密码", + "Terms of service":"服务条款", + "Created by":"创建者", + "See more at":"查看更多:", + "Contact the developer":"联系开发者", + "api version":"api版本", + "Response Content Type":"响应Content Type", + "fetching resource":"正在获取资源", + "fetching resource list":"正在获取资源列表", + "Explore":"浏览", + "Show Swagger Petstore Example Apis":"显示 Swagger Petstore 示例 Apis", + "Can't read from server. It may not have the appropriate access-control-origin settings.":"无法从服务器读取。可能没有正确设置access-control-origin。", + "Please specify the protocol for":"请指定协议:", + "Can't read swagger JSON from":"无法读取swagger JSON于", + "Finished Loading Resource Information. Rendering Swagger UI":"已加载资源信息。正在渲染Swagger UI", + "Unable to read api":"无法读取api", + "from path":"从路径", + "server returned":"服务器返回" +}); diff --git a/src/main/webapp/swagger-ui/lib/backbone-min.js b/src/main/webapp/swagger-ui/lib/backbone-min.js new file mode 100644 index 00000000..a3f544be --- /dev/null +++ b/src/main/webapp/swagger-ui/lib/backbone-min.js @@ -0,0 +1,15 @@ +// Backbone.js 1.1.2 + +(function(t,e){if(typeof define==="function"&&define.amd){define(["underscore","jquery","exports"],function(i,r,s){t.Backbone=e(t,s,i,r)})}else if(typeof exports!=="undefined"){var i=require("underscore");e(t,exports,i)}else{t.Backbone=e(t,{},t._,t.jQuery||t.Zepto||t.ender||t.$)}})(this,function(t,e,i,r){var s=t.Backbone;var n=[];var a=n.push;var o=n.slice;var h=n.splice;e.VERSION="1.1.2";e.$=r;e.noConflict=function(){t.Backbone=s;return this};e.emulateHTTP=false;e.emulateJSON=false;var u=e.Events={on:function(t,e,i){if(!c(this,"on",t,[e,i])||!e)return this;this._events||(this._events={});var r=this._events[t]||(this._events[t]=[]);r.push({callback:e,context:i,ctx:i||this});return this},once:function(t,e,r){if(!c(this,"once",t,[e,r])||!e)return this;var s=this;var n=i.once(function(){s.off(t,n);e.apply(this,arguments)});n._callback=e;return this.on(t,n,r)},off:function(t,e,r){var s,n,a,o,h,u,l,f;if(!this._events||!c(this,"off",t,[e,r]))return this;if(!t&&!e&&!r){this._events=void 0;return this}o=t?[t]:i.keys(this._events);for(h=0,u=o.length;h").attr(t);this.setElement(r,false)}else{this.setElement(i.result(this,"el"),false)}}});e.sync=function(t,r,s){var n=T[t];i.defaults(s||(s={}),{emulateHTTP:e.emulateHTTP,emulateJSON:e.emulateJSON});var a={type:n,dataType:"json"};if(!s.url){a.url=i.result(r,"url")||M()}if(s.data==null&&r&&(t==="create"||t==="update"||t==="patch")){a.contentType="application/json";a.data=JSON.stringify(s.attrs||r.toJSON(s))}if(s.emulateJSON){a.contentType="application/x-www-form-urlencoded";a.data=a.data?{model:a.data}:{}}if(s.emulateHTTP&&(n==="PUT"||n==="DELETE"||n==="PATCH")){a.type="POST";if(s.emulateJSON)a.data._method=n;var o=s.beforeSend;s.beforeSend=function(t){t.setRequestHeader("X-HTTP-Method-Override",n);if(o)return o.apply(this,arguments)}}if(a.type!=="GET"&&!s.emulateJSON){a.processData=false}if(a.type==="PATCH"&&k){a.xhr=function(){return new ActiveXObject("Microsoft.XMLHTTP")}}var h=s.xhr=e.ajax(i.extend(a,s));r.trigger("request",r,h,s);return h};var k=typeof window!=="undefined"&&!!window.ActiveXObject&&!(window.XMLHttpRequest&&(new XMLHttpRequest).dispatchEvent);var T={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};e.ajax=function(){return e.$.ajax.apply(e.$,arguments)};var $=e.Router=function(t){t||(t={});if(t.routes)this.routes=t.routes;this._bindRoutes();this.initialize.apply(this,arguments)};var S=/\((.*?)\)/g;var H=/(\(\?)?:\w+/g;var A=/\*\w+/g;var I=/[\-{}\[\]+?.,\\\^$|#\s]/g;i.extend($.prototype,u,{initialize:function(){},route:function(t,r,s){if(!i.isRegExp(t))t=this._routeToRegExp(t);if(i.isFunction(r)){s=r;r=""}if(!s)s=this[r];var n=this;e.history.route(t,function(i){var a=n._extractParameters(t,i);n.execute(s,a);n.trigger.apply(n,["route:"+r].concat(a));n.trigger("route",r,a);e.history.trigger("route",n,r,a)});return this},execute:function(t,e){if(t)t.apply(this,e)},navigate:function(t,i){e.history.navigate(t,i);return this},_bindRoutes:function(){if(!this.routes)return;this.routes=i.result(this,"routes");var t,e=i.keys(this.routes);while((t=e.pop())!=null){this.route(t,this.routes[t])}},_routeToRegExp:function(t){t=t.replace(I,"\\$&").replace(S,"(?:$1)?").replace(H,function(t,e){return e?t:"([^/?]+)"}).replace(A,"([^?]*?)");return new RegExp("^"+t+"(?:\\?([\\s\\S]*))?$")},_extractParameters:function(t,e){var r=t.exec(e).slice(1);return i.map(r,function(t,e){if(e===r.length-1)return t||null;return t?decodeURIComponent(t):null})}});var N=e.History=function(){this.handlers=[];i.bindAll(this,"checkUrl");if(typeof window!=="undefined"){this.location=window.location;this.history=window.history}};var R=/^[#\/]|\s+$/g;var O=/^\/+|\/+$/g;var P=/msie [\w.]+/;var C=/\/$/;var j=/#.*$/;N.started=false;i.extend(N.prototype,u,{interval:50,atRoot:function(){return this.location.pathname.replace(/[^\/]$/,"$&/")===this.root},getHash:function(t){var e=(t||this).location.href.match(/#(.*)$/);return e?e[1]:""},getFragment:function(t,e){if(t==null){if(this._hasPushState||!this._wantsHashChange||e){t=decodeURI(this.location.pathname+this.location.search);var i=this.root.replace(C,"");if(!t.indexOf(i))t=t.slice(i.length)}else{t=this.getHash()}}return t.replace(R,"")},start:function(t){if(N.started)throw new Error("Backbone.history has already been started");N.started=true;this.options=i.extend({root:"/"},this.options,t);this.root=this.options.root;this._wantsHashChange=this.options.hashChange!==false;this._wantsPushState=!!this.options.pushState;this._hasPushState=!!(this.options.pushState&&this.history&&this.history.pushState);var r=this.getFragment();var s=document.documentMode;var n=P.exec(navigator.userAgent.toLowerCase())&&(!s||s<=7);this.root=("/"+this.root+"/").replace(O,"/");if(n&&this._wantsHashChange){var a=e.$(''; +// } +// +// 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 00000000..b21a66c1 --- /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 00000000..cec8e25a --- /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 00000000..4d740422 --- /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 00000000..2804ccec --- /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 + + + + +ueditor + + + + +
    + test +
    + + + + + + + + +
    +
    +
    +
    +
    +
    + + \ No newline at end of file From 6cedc7e1f0f89f67188ed3170c43d9cfea87c9df Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 26 Jul 2016 09:03:05 +0800 Subject: [PATCH 165/290] update readme --- README.md | 2 +- src/main/webapp/image/demo.gif | Bin 0 -> 602021 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 src/main/webapp/image/demo.gif diff --git a/README.md b/README.md index 8cc59c97..1feb3ac0 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,6 @@ git->clone;eclipse->File->Import->Existing Maven projects,导入到eclipse后,等maven依赖下载完,右键项目,run as->maven build->tomcat7:run -#![登陆页面](src/main/webapp/image/sys1.png) +#![demo](src/main/webapp/image/demo.gif) #![数据列表页面](src/main/webapp/image/sys2.png) #![metrics-servlet](src/main/webapp/image/metrics.png) \ No newline at end of file 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 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

    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 From 135a6f72d69465eea577f74c636a39e12d852c4d Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 26 Jul 2016 16:22:31 +0800 Subject: [PATCH 166/290] remember uri --- .../controller/IndexController.java | 16 +++++++++++++--- .../ssmbootstrap_table/filter/LoginFilter.java | 8 +++++++- src/main/webapp/index.html | 8 ++++++++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java index 291a7103..5d96c2f7 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java @@ -16,6 +16,7 @@ import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.FileUtils; import org.joda.time.DateTime; import org.slf4j.Logger; @@ -30,6 +31,7 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.support.RequestContextUtils; @@ -58,9 +60,9 @@ public class IndexController { @RequestMapping("/login") public String login(HttpSession session, HttpServletRequest request, - HttpServletResponse response, String username, String password) { + HttpServletResponse response, String username, String password,@RequestParam(value="requri",required=false) String requri) { // RequestContextUtils.getWebApplicationContext(request) - logger.info("进入username:{},pwd:{}", username, password); + logger.info("进入username:{},pwd:{},requri:{}", username, password,requri); if (username.equals(ConfigConstant.VAL_USERNAME) && password.equals(ConfigConstant.VAL_PWD)) { session.setAttribute(ConfigConstant.ISLOGIN, true); @@ -73,9 +75,17 @@ public String login(HttpSession session, HttpServletRequest request, param.put("logintime", new DateTime().toString("yyyy-MM-dd HH:mm:ss")); param.put("loginip", request.getRemoteAddr()); applicationContext.publishEvent(new LoginEvent(param)); + 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); +// /ssmbootstrap_table +// /ssmbootstrap_table/test/form?null + return "redirect:/"+touri; + } return "redirect:/manage.html"; } else { - return "redirect:/index.html"; + return "redirect:/index.html?requri="+requri; } } diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/LoginFilter.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/LoginFilter.java index e4f21ff2..df3680f5 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/LoginFilter.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/LoginFilter.java @@ -10,6 +10,9 @@ import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.codec.binary.Base64; + import com.github.jscookie.javacookie.Cookies; import cn.com.ttblog.ssmbootstrap_table.Constant.ConfigConstant; @@ -90,8 +93,11 @@ public void doFilter(ServletRequest servletRequest, 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"); + .getContextPath() + "/index.html?requri="+requri); } return ; } diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html index 0b64c22d..3780bcb6 100644 --- a/src/main/webapp/index.html +++ b/src/main/webapp/index.html @@ -12,6 +12,13 @@ + + +

    + From 68e130e0a63f99d276284c1816905114bb58a43c Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 26 Jul 2016 18:46:21 +0800 Subject: [PATCH 167/290] update --- .../controller/TestController.java | 6 ++++ src/main/webapp/index.jsp | 21 +++++++++++++ .../ttblog/ssmbootstrap_table/TestInt.java | 30 +++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 src/test/java/cn/com/ttblog/ssmbootstrap_table/TestInt.java diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java index 068c83fd..4bcb38c5 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java @@ -267,4 +267,10 @@ public String ue(ModelMap model){ logger.debug("open ueditor"); return "ueditor/index"; } + + @RequestMapping(value={"/{no}/uri"}) + public String uri(ModelMap model){ + return "redirect:/{no}/index";//springmvc会对模板变量中的值解析处理 +// return "{no}/index"; + } } diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp index 7408b963..ce9b9226 100644 --- a/src/main/webapp/index.jsp +++ b/src/main/webapp/index.jsp @@ -27,6 +27,27 @@ console.log(jqXHR); } }); + var head = document.head || $('head')[0] || document.documentElement; // code from jquery + var script = $(head).find('script')[0]; + script.onerror = function(evt) { + alert("网络超时,请稍后再试!"); + // do some clean + // delete script node + if (script.parentNode) { + script.parentNode.removeChild(script); + } + // delete jsonCallback global function + var src = script.src || ''; + var idx = src.indexOf('callback='); + if (idx != -1) { + var idx2 = src.indexOf('&'); + if (idx2 == -1) { + idx2 = src.length; + } + var jsonCallback = src.substring(idx + 13, idx2); + delete window[jsonCallback]; + } + }; } diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestInt.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestInt.java new file mode 100644 index 00000000..4bcbf2c7 --- /dev/null +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestInt.java @@ -0,0 +1,30 @@ +package cn.com.ttblog.ssmbootstrap_table; + +import java.math.BigInteger; + +import org.junit.Ignore; +import org.junit.Test; + +public class TestInt { + + /** + * 整形溢出问题 + */ + @Test + @Ignore + public void testint() { + int a = Integer.MAX_VALUE; + System.out.println(a); + int b = a + 1; + System.out.println(b); + } + + @Test + public void testBigInteger() { + BigInteger a=BigInteger.valueOf(Integer.MAX_VALUE); + System.out.println(a); + BigInteger b = a.add(new BigInteger("1")); + System.out.println(b); + } + +} \ No newline at end of file From 979077222f3296700d1731ea9f5e25afb23848b0 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Wed, 27 Jul 2016 13:52:14 +0800 Subject: [PATCH 168/290] test --- src/main/resources/logback.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 8f8b668c..b0a518fa 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -56,10 +56,10 @@ --> - - + + - + @@ -68,8 +68,8 @@ - - + + From 9ba7d51910337fec1bec9ab20726cb47161b2c1d Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 28 Jul 2016 11:08:37 +0800 Subject: [PATCH 169/290] test --- src/main/resources/logback.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index b0a518fa..8f8b668c 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -56,10 +56,10 @@ --> - - + + - + @@ -68,8 +68,8 @@ - - + + From 4f00d4156c9f337efe9aced47b52b9c73ffa4d6b Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sat, 30 Jul 2016 20:59:58 +0800 Subject: [PATCH 170/290] test download --- .../controller/IndexController.java | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java index 5d96c2f7..d885efda 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java @@ -2,6 +2,8 @@ import java.io.File; import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -23,6 +25,7 @@ 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.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -30,15 +33,15 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.PathVariable; 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.ModelAndView; -import org.springframework.web.servlet.support.RequestContextUtils; import com.alibaba.fastjson.JSONArray; import com.codahale.metrics.annotation.Timed; -import com.github.jscookie.javacookie.Cookies; import cn.com.ttblog.ssmbootstrap_table.event.LoginEvent; import cn.com.ttblog.ssmbootstrap_table.model.User; @@ -177,18 +180,32 @@ public ResponseEntity export(HttpSession session, POIExcelUtil.export(titles, mps, file); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); - headers.setContentDispositionFormData("attachment", - file.replace(projectPath, "")); + String filename="test"; try { + filename = URLEncoder.encode(file.replace(projectPath, ""),"UTF-8"); + } catch (UnsupportedEncodingException e1) { + e1.printStackTrace(); + } + logger.debug("下载文件名字:{}",filename); + headers.setContentDispositionFormData("attachment",filename); + try { +// http://stackoverflow.com/questions/11203111/downloading-a-spring-mvc-generated-file-not-working-in-ie ie下载问题 return new ResponseEntity( FileUtils.readFileToByteArray(new File(file)), headers, - HttpStatus.CREATED); + HttpStatus.OK); +// HttpStatus.CREATED } catch (IOException e) { e.printStackTrace(); } return null; } - + + @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"); From 67fdc394c4aff2feb78f181067930e0e1471cf9b Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sat, 30 Jul 2016 22:32:30 +0800 Subject: [PATCH 171/290] update --- .../controller/IndexController.java | 13 +++++++++---- .../controller/TestController.java | 3 ++- src/main/resources/logback.xml | 1 + 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java index d885efda..8b7b3c9e 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java @@ -11,13 +11,11 @@ import java.util.HashMap; import java.util.List; import java.util.Map; - 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 org.apache.commons.codec.binary.Base64; import org.apache.commons.io.FileUtils; import org.joda.time.DateTime; @@ -39,10 +37,8 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; - import com.alibaba.fastjson.JSONArray; import com.codahale.metrics.annotation.Timed; - import cn.com.ttblog.ssmbootstrap_table.event.LoginEvent; import cn.com.ttblog.ssmbootstrap_table.model.User; import cn.com.ttblog.ssmbootstrap_table.service.IUserService; @@ -158,6 +154,15 @@ public ResponseEntity export(HttpSession session, List users = userService.getUserList("desc", 10, 0); String projectPath = request.getServletContext().getRealPath("export") + File.separator; + File dir=new File(projectPath); + if(!dir.exists()){ + if(dir.mkdir()){ + logger.debug("创建目录:{}",dir.getAbsolutePath()); + }else{ + logger.debug("创建目录:{}失败!,请检查权限!",dir.getAbsolutePath()); + throw new RuntimeException("没有创建:"+dir.getAbsolutePath()+"目录的权限!"); + } + } int userCount = users.size(); List> mps = new ArrayList>( users.size()); diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java index 4bcb38c5..a26ea8b6 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java @@ -45,8 +45,9 @@ @RequestMapping("/test") @SessionAttributes("name") public class TestController { - private Logger logger = LoggerFactory.getLogger(this.getClass()); private Logger loggerAccess = LoggerFactory.getLogger("access"); +// private Logger logger = LoggerFactory.getLogger(this.getClass()); + private Logger logger = loggerAccess; @Autowired private ApplicationContext applicationContext; diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 8f8b668c..a64c78b4 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -79,6 +79,7 @@ +
    From ef6d03c42f80f697791647d02041cbc6f452f440 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Mon, 1 Aug 2016 10:26:54 +0800 Subject: [PATCH 172/290] test --- .../controller/IndexController.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java index 8b7b3c9e..0ec25150 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java @@ -11,7 +11,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; + import javax.annotation.Resource; +import javax.mail.internet.MimeUtility; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -185,12 +188,29 @@ public ResponseEntity export(HttpSession session, POIExcelUtil.export(titles, mps, file); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); - String filename="test"; +// String filename="中文"; + String filename=""; try { filename = URLEncoder.encode(file.replace(projectPath, ""),"UTF-8"); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } + +// try { +// filename=MimeUtility.encodeWord(filename); +// } catch (UnsupportedEncodingException e1) { +// // TODO Auto-generated catch block +// e1.printStackTrace(); +// } + +// try { +//// "gbk" +// filename=new String(filename.getBytes(),"iso-8859-1"); +// } catch (UnsupportedEncodingException e1) { +// e1.printStackTrace(); +// throw new RuntimeException(e1.getMessage()); +// } + logger.debug("下载文件名字:{}",filename); headers.setContentDispositionFormData("attachment",filename); try { From fc95883d6b7ac89fe89389f44f19cddd75917d71 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 2 Aug 2016 12:45:55 +0800 Subject: [PATCH 173/290] springfox --- README.md | 1 + pom.xml | 13 +++- .../util/SwaggerConfig.java | 61 +++++++++++++++++++ src/main/resources/spring/spring-mvc.xml | 2 + 4 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/util/SwaggerConfig.java diff --git a/README.md b/README.md index 1feb3ac0..ab980c6f 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ * lombok * ehcache * metrics +* springfox ## How to run 项目采用maven构建,运行前请先执行src/main/java下的sql脚本到你的mysql数据库中,然后修改src/main/resource下的jdbc.properties配置文件中的数据库配置信息,进入项目目录,执行mvn tomcat7:run来运行 diff --git a/pom.xml b/pom.xml index 38e78815..8ea8ac32 100644 --- a/pom.xml +++ b/pom.xml @@ -171,7 +171,7 @@ com.alibaba fastjson - 1.2.11 + 1.2.15 org.slf4j @@ -330,6 +330,17 @@ json 20160212 + + io.springfox + springfox-swagger2 + 2.5.0 + + + + io.springfox + springfox-swagger-ui + 2.5.0 + diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/SwaggerConfig.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/SwaggerConfig.java new file mode 100644 index 00000000..e0b5635a --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/SwaggerConfig.java @@ -0,0 +1,61 @@ +package cn.com.ttblog.ssmbootstrap_table.util; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import com.google.common.base.Predicate; + +import springfox.documentation.builders.PathSelectors; +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 在线文档:http://springfox.github.io/springfox/docs/current/ +//前端访问http://localhost:8080/ssmbootstrap_table/swagger-ui.html +@EnableWebMvc +@EnableSwagger2 +@ComponentScan(basePackages = { "cn.com.ttblog.ssmbootstrap_table" }) +public class SwaggerConfig { + /** + + * Every SwaggerSpringMvcPlugin bean is picked up by the swagger-mvc + + * framework - allowing for multiple swagger groups i.e. same code base + + * multiple swagger resource listings. + + * + + * @return SwaggerSpringMvcPlugin + + */ + @Bean + public Docket customImplementation() { + + return new Docket(DocumentationType.SWAGGER_2).apiInfo(getApiInfo()) + .select().paths(paths()).build().pathMapping("/"); + } + + private Predicate paths() { + return PathSelectors.any(); + } + + /** + + * A method that returns the API Info + + * + + * @return ApiInfo The Information including description + + */ + public ApiInfo getApiInfo() { + return new ApiInfo("ssmbootstrap_table-api", + "api接口列表", "版本号", + "https://github.com/netbuffer/", new Contact("netbuffer", "https://github.com/netbuffer/", "javawiki@163.com"), null, null); + } +} + diff --git a/src/main/resources/spring/spring-mvc.xml b/src/main/resources/spring/spring-mvc.xml index 00f529ac..86a5b88f 100644 --- a/src/main/resources/spring/spring-mvc.xml +++ b/src/main/resources/spring/spring-mvc.xml @@ -194,4 +194,6 @@ /> --> + + \ No newline at end of file From 25f5568ca18c43abf9cab694ce6780810e048400 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 2 Aug 2016 18:50:32 +0800 Subject: [PATCH 174/290] test --- .../ttblog/ssmbootstrap_table/TestStringFormat.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestStringFormat.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestStringFormat.java index 32d493e4..f1a9d356 100644 --- a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestStringFormat.java +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestStringFormat.java @@ -1,5 +1,7 @@ package cn.com.ttblog.ssmbootstrap_table; +import java.util.Arrays; + import org.junit.Test; /** @@ -26,4 +28,12 @@ public void test() { System.out.printf("上面的折扣是%d%% %n", 85); System.out.printf("字母A的散列码是:%h %n", 'A'); } + + @Test + public void testStringCompare(){ + String[] str=new String[]{"01","04","03","02"}; + System.out.println("01".compareTo("02")); + Arrays.sort(str); + System.out.println(Arrays.deepToString(str)); + } } From 338e1caf158651baabcd0aaf51cbaf408ec678e2 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 2 Aug 2016 21:14:41 +0800 Subject: [PATCH 175/290] update readme --- README.md | 6 +++++- src/main/webapp/image/swagger.png | Bin 0 -> 121211 bytes 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 src/main/webapp/image/swagger.png diff --git a/README.md b/README.md index ab980c6f..a8b13353 100644 --- a/README.md +++ b/README.md @@ -22,5 +22,9 @@ git->clone;eclipse->File->Import->Existing Maven projects,导入到eclipse后,等maven依赖下载完,右键项目,run as->maven build->tomcat7:run #![demo](src/main/webapp/image/demo.gif) + #![数据列表页面](src/main/webapp/image/sys2.png) -#![metrics-servlet](src/main/webapp/image/metrics.png) \ No newline at end of file + +#![metrics-servlet](src/main/webapp/image/metrics.png) + +#![springfox](src/main/webapp/image/swagger.png) diff --git a/src/main/webapp/image/swagger.png b/src/main/webapp/image/swagger.png new file mode 100644 index 0000000000000000000000000000000000000000..58802a983ef81a8ac10853512cb4fa60aec48c1a GIT binary patch literal 121211 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

    uixUW;nJUY@d-==z zm%JKMxV0;(Hk zSCRvK*K{}?Nx2<9D1e5dH1Y7Nj=v+5AiGjui(tSG*}cw{Owu8jO!*Gh^;~dR^A60UNYfpk>`= zw+~9%%(VV}XK_k6Hq7NFv@vnPb8G61Yf;h@>YnfTeI*o+ZMG}T<8QY!C2AVW3@l@Z z5~co{_LG{ZWXM>}(@aZ+i=Q*iwx?FY$2Mi<>@s8?mmA;aj>2oRblrd2Hh1aZYUY#7 zvU1nVx}cu7q#O*JGl49E=Z$J%yQCmQcIP2z6&L^67wWuX{sS9Z?hnuYjJEuEY5)uT zlEW7q@P@nP;?t z@JoH!C$SV@;r-9aBzSH%)N^YeHrEIY)B|xADZ;pa?bXzI?JkGc)BPDIi)&X%!a|`# z{VBo3u#g87ihMjPpX^Xr2QhPm+Ke9Pak(@!Uy&uNG)jzsy`a!G>G@p>f_AIZJ+6t9 z)Lhi-Mz7=&a(VZz{u(*8(l+ZsJOg_&)EkW;_XMkEvf}4{)0H$CWR^}lYf*otF-uYX zvleQP>&&X!ys+7!Cn3P7POo7GWudcSj#WBW>s6%oko9<%SZ zO$(*v)-*LxkVWIB+1Wa76i&W5sA!cIs^}mg(eiejqNHVcSd*6U@1$b4xiJ@Ewu&db z9x}tA*#wt&2&>=nzC6^h*R(s;g+pi6uyZl7P3e^?=mMi+Y+3ah(XN#=U#c!m-v~So zJ|Tpj;9wq)k?NP30cRHCK5X_-3AA!IS3GpzN!Sc^K?zU%kPO?y5iH;+8Wqd`%Sy4$ zNlPptd(2SuM+rZKx?A-N$MTp&b5F%hGCVxgT++-NuxB5u29c)smFG(+;xqP_>Tnu; zA&D$&Yf%Jo21kD21&BUz-PRHTib(rF;GiTS3H7jBASC`eyyi2_(5-b{zYM z`r2Os$tzRC@v!9(U`jJsad&>teG=0!XyXvTyE1B};Lu%@vm3vXW&H&ypQ8HH`gxqq z^RfBrevmphsUNhNYr{m*LDw5%N;Svg=|0#TcPPzO0 z`QPqh|MsL4j`6Q@>Nm#zSD%QHz4-q}m+%>NMKwjm$N~-Cmh1wZx%FT2YBi~};X9km zrlTC(N~gANk1L2;rDcx6Uz_0cM;4QAf0_1Gr;y-aXEVt7-qZ7OpGus(9Kf+SL&+Oa zvIJ0hxqeWP8V|dYqKCF|yGg4?Ve^qVsUl4wIMRmwPxF4=bdC;Z){3JctF+DhA*e+c z={X`)Pq3MI5L=XgkpAQFqjRqYZ+BS56tQzy@&UV$nx`ihDev8^JzMm#W_lObaU36) z%^m)q-X7;!OY>#Q=Ph0 zKm!MG1J+BYkH{Y~>1uhYCm8R5oHvc11RK>KI(PL#oD*zD8!r&6o5Idfo4Da6uRf;n zjkFt#fvp~fgr}Rc#kq7dKHaeP@R>82MYJWl5H@TqYVCo24xPIh*wU>F=vGb$doKETD9~_i&wmC8g4g;C`cmGmdm}*MwrUDGexFiv&UKHB7DjnTTghk$7kgU& zkcdI3oBpZ;q~1i6_Eh(dH+8Xh`W?qh_rYpyw}Z7|XJD`dI|mPkX3@(xE@7!eBiA-v z=`tR%g~=;YJOYA_!Dqa>5UTFb$Z~EY?Y6-*VsURIw>1;XkkTX1J>@<=NXkqZ%`=<~ z8MTBhVidJp9oVr+w$)Ag%iwnwE<`1Om1uC5g{~gb;&L_&-1GpoLTzidUsTY^|49Dv zDSwOz*k1zmA4l4_TyasuBWLwU-x{UfH7A+Wd#F4-7w|&8MV*$feJE5=^iJO;o?}Eq zx5dixbV&!CmKVDGYy#AO6(MzufKq@~`}?{LLwowq>d?62yi&0tss)T9$Evi83cxWt zr-o+!nKzKI=6hJ{a)Fc?r)2`wj)zf%sD6n~PCPTCWc;N356z+@0c+7Prdj7gp5|=b zy?I}NHU*rQBS20%qK;0`;_areO4tib^&mS}iF~l58ltjfb)^Tp;>bv_Z4!ssv|u!Q zUL>V)S^$`yCLv6%22Ju3&2#g^8Twi-7b8|p0EM*l5HiRmGM&9w(D4*AGY^uLwMzGs zdEos=KXhd09AkTwDL2pKBYftYcJPLVjF*O}R)!nM$ORa*a+@QHZM2w~@Kb5XCmw0F z83b(LV=a_41lD^(oh+HBrW$*=>^E%qXVzqyUJp?f7Gu6oEmj6Y?T&H2-;jG0T{!S4 zz1SNqg$B#8Bua_qz2wwS)7H%3{$V3{s=Ga}9Lo0i^eRjI{Rs1G{~u$2w$K0xYD_>4 zUc9K#@_K~p8MS$|=kRkP_ad8si>8qY%8?z7$5I1XzA# z6!Fr-PEsed+k7&i>}E_in*W%XZiEB;SL+i>rZaUMqqAmdm>~M}Zg?5@1dAr0HR!%B z@UqQecVNtRCOdElc~&Uo!<*`%;a9AV{kL6h)hNlbCuXeuVUQ+828a1m%VWpop91DK z=AdA~0?yJ&Dn`8)dPg~X58IvVV~C_%PFCwX=RT;#z@Qg8Q_L0XEidb2x87GQ19uM> ztNAxI(A5xzzdOe}0hIu9gS3ueJ-)KKU6K!Eb`Gqg6YFdTk0AuOBu$v6ETG)xZk-ol z@*g}vlLg%me_ex{5O{@=VP(qBsGh(SH;ZIsXgl-ATsqU{nkGp>V)76N&C!U|7Dy}m zLwvnP{NP$Z#!rO^g9Y+G8lYoK9W&zy$g-y>q@}XTPW*|MgR82|eh`r~oJhNq{-#H#SnP)V`^sKG-yo^Cw z)gZq-h&I`XE8^WsQsA7M!*>nju2|eIynbtL*D~`kcBF|u4(i6WWGLQ|NMC#|QA=5s z(^K1yR_&9GAYIL=u zAxylmtWJ32T%T|UYz05Y;;Vg zMoh{BsDF`!R+#I^CY`z2bNTGS-7YT&t6*Xw)U$|a@7{{CF6BS;|G06Y90|n}`ZztEG z5;Rq7IkAdQtEu>1F!qzD&hquY=7bC#Cao^yHTJ5h`=~g@L(t^E?eevI{=Q-K8xMc} zZ?5*YyaBZJ^7kJBf4ThI?f!pnun<0vZ#L14WQ3#?XwWRgeU(b_t+&hYv#4*k&aj%x z;;D-YEUo{w6%sYo(7700B1!!vx=9r!!W)IE1_IVi;;?o@niouu0BT0| zv3lBtsrdNuf*xsjv$bs4*S~utR7hv(0Hr15URP71HoJ}lpz-9*`|4XTPjzh9Z&#jp z>%S~?sThhBd$kV8uL>5e{ZCWq%71tz?p||Z+E*|)NW>^x08=pgKPoQY{o{j?NRc&mulo^d zB&sbMOjD4;)-KP}mWb6*mR3N$+p~8bEG=qMLfqXZ)knv7d&3BMjjVZS``y}F@?#`R z+E;B~PBjJEeD^lo8E5bKSJVqFdYHf7KwTT)AI{2yYDz=Wtg={LK2DtP;n8!&xhe#S zn^3yurez98+ZsbOkN1y)pLpSwK}3tF`rgf@Wc%Vb49sjM^{DBd8Yfc@^J8ngVgS8< ztDz+~w71L{4W|Q$HbK@zNC2@W>6v?j?Wq;V8lk6@*8E3TB@!iT4dw!}qTESrY)6c9Zmv5{Ke<0+lW z-4F)RtyTQ-52*13ppSKP3+znr^pZb~5bVom)qw)f!X!(DG6)1_W45#Mom0u z`^iMxVuaYhIK&<8y0LFs0O=;VM`+G=>5i;tqbu!620cF~6~DEq9%-xZ!|@wm@a&F2 z8&~D}XFBogtW5E-)w8QX=%&u8#B)e+G9I7Q64x9L+Eh!$-?x!-X{Y&+#Bl^1W%J(G z-J&A24&G%;U2iqV!r%(8<$N2*G2`t=u=0bXI?2H-d{S93TzhN(9!Y59O8UcB&rv*^ z`-lp_{+_EJp8dluQNF$LWqhoVTmBV5w)pK}j*P=v-I8EA$-&D<$*18d#VutB4w}6s zm{-qzesB8-Y= z*r(yD48VvnT3OJbomkK|)|T{LD0tMxn22o|204x>yT zEaD6+TWiW5t=Hr6Pj4Ad2|+A(5Hjxtbfr3v8g|ANu6gl`;@~`r&h{_F2_iyLn|w9z zQz!Gp9G?yYXN?M!Qw3rN2X0qiy@TUp-O!I`FnDJIqh8jHv6QX%i0VZM_T+G z&lB(5S#!kk;Zp*>K*P<89YObZKGl~m{;b#IF*NM3ZV8-zxU%<{V|%CORJSSbXE~TP z^%?5&iQA=2P!5H9K5e~o&5UEWSqLjShf4bgR<&z8eXsX69$Z50W8M;+`|{w9va#c0 zA8o~|PsytOrzEXhTG>Epxu>ek@UhD>=U9E~(vbmSw$gt>!aIB+9JoZ zCvWuY0HetHHp}9G%Zs;6?2T5eK-$I&xG`3XkoSYNhWm+@*%Vm(tT&$XV7#{Fc-d6Y zYo~j36&x^InYVNR{AuTcy7c+Q@8@+S3D8D*n`#HUT!T)SKB|7-aYJ?pk$C}7>*I7j z#=&bQ4;OZwWxrE>#jO67VNUDOxsX|K6YsJ6D~9*&T-{~6Spm)#a*GZ}TWOxfGF}F8 zLXWZ0a}JRB$b^3&H2MbG8{Nw^7$<5QXz!|{XcUKv(vq*=*s=)%BVt0cB6{?QJP=zNcCKEO<+W3aZjFn%{`ZgB5% zzRMBc`3;da*Q&&{ywz$-oy?dxNl4(dq`7Ws^1rgGJpMg+440GC6Pfdbf?_r~2+Y#i zVbxNvTSTC`cfJcTqsC(o@x?c=O^orcuQmS7482aT`!nj=XgDH)=~=!s(x(xeM@aDgv( zc4|2fJW1wv>LUs7j?xA$OM%$6#wO_orwJ~v>{b`&n{KU0Yg>SxpN)*#2(O0i_JaeP zI>A4fnZ3nt*O^DyU{kXBBU)ro>)SQh=156VO^gC^DH=?l)%j)PkxOtZFO%D}`CEk% zI2`!iND9=cDhQdn+=M&l^ZaVw-c4@Ky1dmb+5QhF#L-T|So$1C zaU-eLi<>80X^nv6{kJz{M`iMq27x)nP&IsX?vq*4407@uDe}$-)b;at$z`~52qEDS zLr70AJvd0jn9Sc|`&3@yPuE01MhT(#{AfT zrt&{TpYqbpVRd5%qm65{Iwm65EI7#M#`Xb5HVtg}a`i2g`gr?s`EO~WWcmp=z&{2a z?#Qlc(w{OSqi|m+RH&zjn?<+al~9Q6QZJorPx}ygfk46VB)8No8(saZgy;4=n%+-{ zYNBKpjAknf>IVY28{Estnr&UL#@US3hE)L~<~L;@lU6_fxph@Xa>_!MWHpmkb4_ z1*PUaM`TY$Y=E~izq$La$0Y@W0}W!BmkTy^rZtF{=#+L1kCTx&@PnYRcqS>uAho{U z5r)mz->SgeMr!eZvB=}M3i_o#rQAhCNx<>%So;&$?bY9vos7;I`E@O{qI)5dn?XT z20_uwwv_n7p>k)`I6!9#+i~N%yV=;Gx};Lo7u8&8$BUT?h4rseq0M0T;dw_uys1xb zETb*}f)NJ%o;r%m3wX22xw0JxrE+7&-H#W@a0SEwwZf)9OtKe84tL-EbWw z8?v*L|GOTBi%5C_7STI(57zXzE{}hg1dM*h6QX`Pe65Y~1FwdK>vtKo?1O^5zTWp^el0tr zbYw;xc}sG!uAVMq^0`!bt-syD;;un?YDH=>7V3L3ct{IMd){ixkRmj6tz1+^9^^Xn zYSWCXaJI|#_FhjLoy#8XopnL=K`jAiMF{+t#Zk(|*~=xR3555iwX%47+|Gnfm-OR_~gXCIby} zL${n!$0R1ajM{Bj^%lHG1HaiVG0rT`GbujXY$0TP+{QZa z=D@uSHA8pyMlG!{z9Y3slsjt+ zrJB&+bOXw(s;*V-bKM6H^oo9Y8fox`xzsGyha=o-%FHf5o<=C*sHB~xj5kS)(eqR< zwQ_V^os#{yWDLmD?5mpHURpKF`Ey~^s^($EHL3OZZKK99T;WmqtCLdZs6fZ)lDE6s z4>iooHSk-N$6Ej-WxUPtwm`dXPR+ZhCNcWSs5#9NO;66wJU*9q+%CpavxcaC1~-%m z%h_<93o8vdJ6NpO5$bg4tGBm1Cn};^U~Df66G8HI8tX5;n@iXp=h@J|5iD1MrcesT zwF+*y{#pMY2muuwK+1Edb`6Pm%9m(0gly?SLKaJ@s;{g39_v>x!T3)E`}J))1m3(- znWdi7<%Gj*udUk;Mm3AZ`lsphaD3BVl^VI%R@*|!nDnpR<{i{3M6p22K53Bq>hh7y z&LH9&mQ!-I?F5I`U{-j!7Z+xUr-+In&7ME97(O&-wI@4t+-I6|gS^EOsZd#a`qp;# z%t4G4Ahx8KVygw`na@v`q@JG`5dS#(f4QV#Ok+%NIkZ_8b)>cJ0D3#@L2_N z#X0Tc3Mzl609ZkY5-~rP3}0Kh3py&=Wln9H425ISz-<_eS{G-mZ+RrF%cN)f4n*i& zN`+|5$?m4tyazy);ls>H`iEnxZ1ZGVBU`xjO+jnVok{DXT3X30H7JrEU8LBNxLPkw>ig(y;v4Eqfnn71}nugabzJ8`;w#y4%`ZK&3Y!?j^ zkce-p}&ftPT;BS4X}X5BFQ7THIN~ zsYO<9Y$O@gMtknf?*CJJ0s(qxoxKoLLN;wyD680}qYiXEkeo`>nM2bHH8hz719?V?yzR-o=3Z=iDJ~0vdM6L7B z`j>#g!Jgw&B%goBGaZ@U((<`4uz$Z~>CKdT_EYi;!UdxM>gQm_zAG(cn&kvdjqE(B z!LCa~tCd9tJ4&;uOKvDF2y6HU%>LuK9t2@k1S{X#W(%w;`ylF*r>M0>EIi9(gP2Us zEc+0sMh- zk&AVwa!FK>htnli30qN4nwbjEMCJz1$mPA1O&Zowv-VeSmk8*}AooY0=3SG4$FB8J zIwP>=#EMt?Idj&7E~wJ##`HIQf8*65F^U?W&8cd%hk(!-s1~na+M#$%Bg<=&3(q+u z^CSYTL&e*G2ooF) zIROnD9=FHO1bujG5baHs%ACHI5c{Op*Qq6}KsK#cPHh7X97#_J!Dk5m#J^E`3-3Q6 zeCz<(2E5vIEd=zgUx`rD1|EWZ1mCo34ubN82 z;;(9W6Fl}W9Ig|NC-kQZ`nZ|Oe+S0@Q}}-ZhW~Bzqxb**fdE&u?L$4g;|fWdJdHI! zlWiTHXct8_-sWd{OY`lFsfsFPU%!P;E8%GX$YH}m`y;XnL(D2cs8SctTr#D-Z&I}3 zBFYz0@m}j?QKvKHgz&72NVUT)5t@Y}iAfmG6@sKfPuT8c>f@%bv`MgseL2+RT*Ep9 zWg|8oPbu1bZ}!3Oxo;_Bd)OBH<YEkH4= zyed^m(=$j|~h2DIYU|v?s2(725aBGSxY)%a-|EaqL{c{!sDb8y=W9zK|ly z79JjHCza|c8Rjn}eQsav_nNxg+MWVFP9X5hcHt@#T#BshCY&tH^s~CDRohR(-mjI1 zEuX62iYjXO$%!<3mzCVAgMyWe4UrRdASXg<<(EU~>(hPYC)NgBdbYU$Z`+#1+v%&S z%_lh`e@^85hhL6XX6 z4|~XzHa0#Ymaux;(OE!(>p^F^i%(>^;y+(_=eeR`J9im0Mjr-_Z zW7Gw?Y?5-eL40hj*~+<##>@+^@hhKm0F(6*jr+D}g@DA3iOBS<= zT9!Ut-*wo~;T__Z&m`(qAl2AKUm4M+6X~n68_!*Bri^lH|3lH{mAS7^g(swS@5Yq4 z&3;yp4(wYE#$~E)THy_9srW8A+IHld&%30c<-2d5L98!UbWY@b0U1$pwxwL4d zZC+wMR64Bu6+_V}x>z$drUAiEu?{WnDxAq7KW5yzk4x~PRhD-<@WWLYrw>FiBRhM!R@ zWtwdvVQ4Ng@C{zi*$p=(BBka|uO+{&J@Smop)~7X*#c&(k?6SEoD@<-dYvj!|#ejRkC7({11(5`3ZJqQPG)K9Okh zfKzLikE3}d-Pzddkk3rOe@a=w+ryg#;jJHaV^#h$kbR=!MP@_f>CegLGLPDF-8#W$ z%k^`fogBkmXjBY>b(#bsR4~Y@2oGxaW0)1Wqk!M)7oOAQhxwh=QY}i(9n?@1T3t{$ z*YS>+@LKwp`T32?qzkN>d(9H;KiUK&WvfYNaE4=jDRo^~|V6cs-AX*Ixd}tXY@f@vJ$W zH5^uVr3TeS*j-IB&s3U8b3azIC!j(Q?Wfe}S!=P6A8o>CjyGryoH`&Pe~X zqzQC?S8M`ur?Ib5p}9_CWES~hR~L(dhD|Efy3&Jc0ty)*DKK3Mvhh!-t7*c@NtN2nWrnrt!X9w zaE6Ia7k;WyR($<6Vl0OPifWSIvb;= zf^dhZi}AZ1>ARDCSueh8`((xi)%4D>dS<~BnD;owPLhd|y4LB`!<)!R@W!KD+rj&@ zS676-N9YfGJU67-m;P#$Nzm%V*!C!kiO0U!D3K$5XGY18^2b%7yU<-6tgTfEzz)l| zjv^f+p8d~RfJQgJ9GaEFlWUl%_k})zJvh6yU}yA7pXlzPZl*8lv{LQ61+`}_E+KW1 z3E{b|)3nNteJc<^H{G6iZSN`K+al#ZbNI1CFyWr7*U=2YEXl*Jwk*2>8sTQC+cCek zbAp@8Vh1ibv&Q{eqtiR9ukIb}!c*S;i9A=VOvQIkkWWPCatZEQq^M#M#*kev&ouy! zDH?*!x>uGWD5+Milf`{&xc|OL6TiG_)EQY4Y4>1^AId()qgL?Eu=A@l6Ser9bnGCg zuKf8DpSoK+h5f88x&W6AQ0j$Kie6ly?1W-}#`n6gs6zq1l1z1@{>r+;?s zd^L0na``f2KEB=z@lsc8F;w!35b_HJF7VZCOJayz$Sn{I*}BI}bkg5|2hbfAErOUh$+I(L zd6rLaFC8-G*Yr>C8FD(${mertQnQ^TZS6$x@EwgoyIjj~Y+kp8Z!>}Nc+VlFtzEzZ zRJY2fjB@y;*Oj_`yAJ3cPOjdev{A(^GE=F1Q)Tq=RGiI}wVs>gm%MH#34!(tb@RsU zHdn9JbBHBq=6uupRO*5ug4W3@=JK|=XkSa#zz{Z8owvW5h8bq{PROVjH0F(#> z&12g5=O0}PXPp~*s1F$~SY|FU*~7Q*c!OQ+tjY6lKb663k173=oFq1_#iNf?4Y-f` zx9V;#*lbHEa ze+9i0vLUL&FCR}U(O2-_!X>Rp0WpVBa-S6#T1n}@P*`p(>V*4|JQ^-mMV^GXNH|K@ zf=`J@nS&qFZ5FY(H`7{$k<_AQ{oQ}zo_U`+A@_r;__h=8E9FkEUfXfM1ZQ{`WpJIF zYHp$N%mgIUM&F1t+~8g?HJ$I(cA>(f$=Ehm1gTREw=2g*o8MddE5OLH|A1J~G;Zs) zjSGh_a2Q&LGj7#_^gVJNg@;J-Rru<+N9FnYo-D8ye%K5ZTz%xbZ>Sh$)9eq8^`f6K zYEc>wFJ9Dlzv1ya@@(USTdPgH&6pxhsDQ22Fz(Vx(N?TQ(G}CX0qYHwIQ(Dg4!E72 z^O)4Se{QxOn*#B?hF=)Y)gxs-jVK94K;G*xS6XXu5jsW%)X1oYZ*E_dn1&OR|dBfd75{q6z!7I%@s|Bev2rP zg+#aaxNLoH6kIFV+jmZ*FXOHJJ)+~qYi)mDR2huVbW*XEj(?ex^6}Avx373;##Q0$ z%`Ggih2N&bLgATv@KH$e@pd6*pWDgcb2PBNGk-9O?M8&YzBz2-)qf?Dma2jFt&2;# z2?l8d0rxF&6E)=jNs`TvHSleEWrP0nYSVe2f=PY}znaU)7n{-nZlevJ!NG#MrXK~~ z?cK<=PlO>cD;dMI>6KWJhHsK1jIHf#0_QqbR~82WBAk%>kLrh#(+cO@rn^s4A{~v% z8@{oqdm3nS9oJj5a&Y01MykhJ^V#TBY;Dl5r$0lTJ(L*P%yh@9zJZq1@Uj!K#8V|# zthC*8-JdNRsF5+uE{MbzIFPc{rSpX`-F@&KxN|#SbIqYB*Fy-E-G2CE6aDYP^-OG6h`@e9FH!R;4a!<@w&OkbaQ3hE#RAF z3bmYA3F)h^hpYgziUjvumu|WJ$yZ&~v`AFzUiQo#M~j3DZCgq${d_id{J?dbmgyhV zwf$_32Hxv6}<-yPMH|8QjKef%t-|(yW<8@|Z5 ziz&YF62lLzF5M}v*Ify|P-BG==(tPdN;Wdp$f5(*!{S6teZ!=QZEHNQ+=_Kh=}b$` z-*R#3{dnKB?K4i77dUc1GcOt@$}{5Y^6O2Vo4Vm79{2O0@!q~Z_e!a)K$TGRB{M`> zLrj^KYSDE);*Iq1fliI~4#^RjT*NtA(rc0Twx?cxmyhE3$!K!Zmeg2cJw#JX3v>qr zH0jK54 zw%rWm%wzxs#4s>^4)NpdL9zmiN*k6cZ^~ND z42SQ9jCu9B=~>lT+t?jJq(%i;LsoDfWk*=M|I)QNClJ;*Wl4_7j9u7lGT{+fZv8@G zLRzAm=ipj)+SByvtPbw75T^$n_9dP>-)O!Hxt)c#8@54mRCX#yA{_^oqnR!6AC6&+)PetOoUMRXKg92-H-*p*meWEb=$nVw9OR1SSL`7 zVQLSGrEMwABuE0buhyNmwe%%RWxW zpY-4btT(d*sdH=hYP@VMhK}GQ<~zlQPb0_)$JC!xoK@obn{J`?IJR0HtoHOpKjRiZq%yZ zu}{`%dOp1(ae5j<9RJcg?Qoq}=p6=zjGSZtmB3t9$^8_ayqxU8tGBdHAv1~%A|$Y! z#vrz|19pLM2nB3|fQD7`l_`QzpXMf9FWI={oXSUVcJb4ohWI$gG>rU)C3Y$3ZG770 zSBb(hPNV-p+j|E!)%I(nD0Z4YK7fdTih_cGNQuW_{l0rWxZ^P}sMghmU*SD5+)~V!HRk@NIdhd5#(tmV;=5mjzY$n!be)5Pj~Ox8K#T zX~PgKw`C5cmSy|*vMn^tiKOKQt?9*u#_ZGca3d~!%fK2{J7{Fg_L)nEJK7)V?lex- z>ULi`Ei9B&xSiwZ)qte(bbNWZfOobk$| zIYYOzHMesVBCMuzeI=x2_Ho>x{7pGTKR6V4IelR2l!ThDM`R=X-hjj|E7X%%KQa?S4k zqWHPUXflrzy|#8EeEz8TeNzpS{P6M0rtzIltE;H76mtmNg2_78V<^}aUMk1tCM+D+;?x_|X)M2k3E2{6G(R?Ot!KeER^DY^px_y3OXI<$lAJ8CM5r z=X_oGT~a{Hko(G||&r9f=Eo`M3Y9(pT3Gq!FGu&YFzRa5>Cm>a|iA+pY+S>f8 zgA~k!2RnLior&XL;?4 z)LvX)u!9${@J_<{!vtSYlpcskVXOHQjM_-O0-%zo?-b29rNNP_vWm16qzrDvx#GpjV`V!Xa!*fKEZOnNE4g}0lU`keZFpSS z7|T0b{=-FYoD}_9%EBSnKBB+w$ojLiZ{Y*>OA>M|cPEUe!yi0g?8sZKZJ6dU;JaC5 zA7#2tORBK9^WL6;o4XUJojBlB)|6RB11G1f)_Lx3f{p!rQxw*`_m1_QngjzZ4lkB) zV&vD;4$7h7o{ME5TrE&$MDBsqqTKS9X>b4XF2G`mQW8%h6~NxlBf{sq6eR7Q54=I7 zuX;P7)2z|ng_xz5FG~rYYrri5m#3$<7Ccv$nwEf~`YF)Q?0tR!ESG^PTknlf4QD@y z`-S6+nl_)%!7mS;COLet-}OrtO`()JG*#!^Y2OWulSo&4$Xv9ep-W~!s3KTcEQ`>LL(x0OuLew(X4>gseWRU4ao=M zM>5f9@vF41i}RmK$mMSeY))-ZJQ|R3dT{v>XwF+rX6vyT#%3H^__72UjBT08hrJ#Hm{$OK-_#SeNK5?m+Wk#HW&z zG|e9o0c&WQR8Um(r}^?Bx6NEBWms8Hk}CatP|b|f4s*9qp=!N1QbZGO8#fa5Eyxy< zkrkwacP>OV0%DYdl*Y;zplc^s#B$Wwy4hkElIK!CepP`^&ce=Bo+i!Q)3Dwt(0nVK zP=e(P{9&P_H1)T3X8F)A>vaaH3O`Aub8gkh6>yiQ#eLgq!ic_a1X}DI3wN0kmYZJ! zH7j?DDTv(m>P$H}MlUo+InZbd(7*5lR&m#@3*%H|Zijl9#$MlgzO=h#SmHA3uugCg zqZzb!^#!r>wVnwnTq&12<5L1M=MK#e2`UCHHbi@oNh!C1!c8xuJE= zNr(zjY+zjx>hAQ|#a`f<$B9U))CRe$)^5UJ;@Wpbp2ZQ3)c{0j;XHC?FZ-UnvHFg8 zr${iaQ)zt;S;%Abj4sZSqNR&D%{R#eY-cJEG#_L>o!Hu@F*HakP3xzNhR|C}0%i8Z zoiDTnJ`0@Fd^|?q`q`w)dLYd#H&&@-7-%nnqVpEfcHP2oK>zr1bxF`}F?Eri>=7+6 z4phpOrUw;2`51o2X(6|%h%z9)HdC6C<@ce2fL( zSLkiV{tnr)ex2OimHmn7n)kaH3)x?5g1~bH;_;$6{iD&|ZR~-<+*4iSp10V$ZXOoc zr9kIqs+MP(S6z28rC7@}`jy_g9fx~A(Oj)e9)Hjkt7>&oFxL3ytm@dA{w7eN<2Ep6 zFe^9SsNPXWjcmi9o9bfRrxX3zpblP}clyij{?zM&Cfj-{?xM}c@;70Ei)A0G{huun zUT-d6J6};ooG$SVw3)t%Nh2Z7^}Tq9sa@^kpPjz)>fQC9a`x7D+7HyCm(tILz98m( zZA>bt*VL2o`24|RvEfePwIT3Min6tXn;tifpS{Kf;yR;c?;u9l6h2{XnB zlEo4uFWa>owTmg4%(VqF8d4X$ptm4n)7-DNh z=b`tzW}&yqWF^S?6S-aBl)xg&+)7hb%8LrC!ve({IXORt^D5#`X~f}+$s(C7e?FmH znx%>ap-l-*2wT^qnxeCRAfEkT*Y#zUr5yWk*vo&7tEjk09)9C7cx{L^=m;_b^DC_3 z79sDgZjiaA9{SlsFY^Gt@J=g$dj(TUTEgeHecvZuQ?OG0!8=p7T06oE_@P`aeS&=D zgJJUz<)*v@lm$ZNm}*s(^!%%0%Bran$nU)Y9TMNacQ>v_8kJ+y9nw`j0f5|No^gN`GlJptd&|Ek0g<^5Qr`@-WxulUwm>k3t** zD~W=NzB7~nC%PN7f_6g(P}m2h_dppm!5}jo#+*^opIp4Dtm>7C_z!4&ad`hEeb`=u zF^17SF)1`_i6}2xn){RF%#p>fY8F5$QUk1tk{vCnjaD1c7Kjr>aA<-s>4H6qp8GZ8q>v&Xe$HHkh>eQ5!?*AKQTmt&i&wJB;%=axd)SFIIM8*5FPHYBW+2BA(P zcB&Y7q$hm3m+l$7V%{qW*#6M|w2yVpT*kM|aP^Q_vVpUUV5hR!uVRQ(1~O&#Z9&ZK!uVXm0{Q zO^X4$8G=9UcHMOA%Y8<94BFDN9}IWi5#D_SY*|q0i`&{Lfp2f=Pbm}Tl{6ZARok}J zyu5ETFt&;f*)NSB<>@-!KW3an2u<^+-CIXhzCY_0M@3Nsk*QeW(-gkhhfk7J9m<=K zP%Mc+x1E4=eoLhzXG&O%%@>}dBj#Pm+b*THF;_v+d*#06p0~b`usbQZa=PYSk(2`vG3El9(`88c|RI7Zb|rfa=}A!z3*wU}iRj!isQBcp79&G7wr z+8OR`Z?~uhcP1?*OVlPA14q(TFT1afPCb#{oMzr9Sa?<#R>EEpkVLC`r zn~%GOpnaV|DaDvNKf-4gj5SRi&04ZZ;u+j%K&kI;Z;kbnA18uNKLN%c@WDbDemFE1 zXd>>@f;gN($OZ$QU4hT_@@~lu9a%Onx?Yd0S*Hc4Ow~kw3Nbkw|&b}mJT@D%Qn@#Qitq|9&MF%XWsU? z^gBBqIO)JYQPy!l!O8wAW3w*ZWGTqqMXUI_hNJ$u;aWjH zvqcZyBbT+WF?veQ!@Eaurt>GNp}Sf#N2LEu&n8t7!$Da^MJhEavgz{uRXs43GYo+2Jo92!t zK06a1leMm-ciEM^1i)DtdrH3YZ-?A!BB;77lbZV&i!$cAVc)i&y;}87k~j6|+_*o` zawaIq8MgWX6Ka~JK2ao(lgI9KxL{U5o)O>cu9p5Pu;kz{b9@GdBI8r)Wt*-oP1EZs zl?{FA*_A}4muSQ|IVDMP<-G_sfrs^NTI`peB(2RDzmDDm-@3~waop|wf!A8C?{37% z?>A`MpLqVIeyM>>uvd@3&e$E$v#8vEEm74vwVPz?!KsG(NsYD`Q|b~SMgTM&Yq< z5-NVNksbur#ErTgTJK%*57_PR3MgS6m3}9PX>UQ6WNvp~pLOt^-@*xC<=4=^r;4dV zAF?I)zHLmCx*5HmTct8|ff+|)p2FDZ;;76PFKPz`V)P4#(x=K=NTLQVhj-3!nV#C( zqvY__u6z|jr6$Nv-F9+kbziM0i~)5d3fAt<+`bKqIj6re2)zw^-C)P8Q{aTgYgb#5v)!;7&Y79R7 zRoa~TuQRR7-b1G0*}7jCdY1k#iW2_(A;+DXD=sfbm&7Ih`Co1wap!+j*shKr{|AZw zIJNJe?CrP{{}&Ekb^+1o4$n( zUQg1Ye*zF(vO6=dc{)=ur{oX3d@{;5JUy}{w&+|<3&FGuDk&EeIR*RHO95^>%!Uap;2y7j<_wUMH4vv04aj6i1LBQniX@X;_Q=Wa{A2YRj-2Mku zN7^1>%eegdgk0DDKOPJza>Wl7+a_kPUi)bIe<@C)DKo|3#&VfwHhvmy8^8}y#yM@e zPMS;(WsZxEP<_lM%1osWsaXBK0k^_|<$gJ2MvP3B_cZ;$W)8PGkIwsr@kvcRe_*lc zCjuD~(8ZDdM?uPl-NRVrKayA-7K5(@gG!Zdd+iwGm0GKBwz#26SU9}+?D}wzoHKlN zZM#~ylt$0k939;&VQMPu1zddTp;hEry*|E9y0$lqMdHwIGpOAW9%w^6(Mom4h+mlAD)!SH=x>@Cu$5k z37z>)8BcI`#nCK)I77~lzS0~1b7b=;+fa%cz%5?;*Mr_5Ee1g|tM--*V_&BvADPOI zucH8f(utzMlVTMsz5e!$PpfNjT!6haU+adoBP|f@UX88T)^v(kpC^@nmSMNvUljyq zKG=LZ6Gz$7vl^>l5=ca9t0xBN{tTl=`S?gKD{Jk&?0V}iD-$3r| zMkuzX)F>$p|Bm7x@A)ZTeD9n$^&|2|bvsP@p?Mhn5#JxOasI)ng#+Bdgt5KuGcyOD zZ{1Q0Mw*h8rXTQ4uoY*gIr$pbQj}XR?yS<>2WmVD6@!DRML$#uZ20&SMWI*6m%lCr z1bhRvGvgFEb(nfReXO1AgRD1=BrMe+U{h@8woKoX#PyA?*d=TRGZux=Qz-u?4{kOx2AJLnS=F4c8tb(}}@~R)UJXSW5>|XRNgLJ987h79iGvPl+j{BKs z?LYrW8cfLI0{WF6>|=7VZF=g5mRm<|A% z+Q20pYndernYCe&7GPHX`>y^cCXsKgSe|Cj>H9J+_0)!^m#-A82vtXrd~3XWWMS93 zyU+!IBKt$r&7sPkqy(R!?pH%A4>TAGYM17?j85CF@R{h*3R!(|V*cG;=nU2bmf;{C zFSqNA%(%wXV63i}(cfTiW4%R{uxA2h{hQnFR5xe7JmmU&N{M`>@|u}4dwGlr^8FfU zRlY%w7<;T_O%w>ujztpHAr}`2vw&&foJsSLB;Kl+^y=8o(61YEFo!#k@*FP7>I>bnEbS1bgYNe!c|Ou;$6vVZ_#R1{3sIg#HWj z0V~}6RuydF+*T7RmT^B>OV|fxyG~`@>vymA?6o${XVKjt*U8Pqmu0{nkj^RHF*!Tc zlM?D;ACeZ?{2)FJxmVBBK7k=I;F+D8VpG$?Vf*boKf2nZ7GGlm0RH>KvfE9_lwz`S zMEanb4$S@BQ9k#SL%kOrey$`6u9jv*foRLz@v(ZoD4hStz%~Lo=x=oMZtJ;khY^$4ODE7G&27lPv6}1i5q&cOvk&|I)!Wo$x+|H4x=Z>r>aHFl z;OPMZAGQ*Unou~LS-IDeDIXTdDb}oTqLl)VD3Agrv7?Skd{7Qd zsc1!jn@+VOWs70nPfje&53Jt_?kr`*s4O3P zIQ3Luw%KntyY@S|RXFZE&%haO_EPnjf&E$^dAlb1{%E^dm|*?&V$-@WK06r!(VIN| z;~uv=)EqLtow>jD#Bo!*lwOOVtjD)F^|?5fA1Eyn+>VS5*5_3?zO|Jcpz^yKZOUk1 z`%UjzFm}wy4ik@mX-&Yw__m#%PT{wbbO)Lh>}klOVb{EH(V~9Pn%uUc<)gN>U+eR4 zk^B}k@-@AU)Z}<pGBA)CVnVj~0dQf#$0@3);3l>HLS*27lwDvp$4`0ItcDMNxmcI-PVdP@T)( zk8s=dq!R66u6s~(+YJr`ViKKY5Q~TM@p#`V&lO=8ljpQ?9lzt$7dD&2m5(bagwCXM z$u6clz4s$KMNhqMT!njv`L0A-ze+@54v&J-DpPd_58|5PLx)m*_iTN#6y82b4K{vK zZJOq*AHyCSx|C3lAElGurx>h7(M)i{QC za-Pyp1DsypTGpE@gN8dAEj}9aA8*4V07oX>=|@Lk#Ow^K1) z4@qPZu^;QkDsOa1b1_<9Pice+RQfq(hfjDpWr#X)S#P{(d1Z`y*8>1V>`ondMbKb8 zwD0dmo_f=`(a{x3&-CZiHL1X~IKENw%|K0XQ&Wh2=W@hcXr4CZl$B*#xp`NzG%1L* zaMWJzz`#(t8{Sp(M%VGD3d?qVhu1g6jKSN@FF!B3^@+?)kiOy5`ngk~T~xF6S;{^} z5of4_;qKNOOG97d-gcS>y_nG| z3*PM4leE2?Y+G|8gFwV^k7}si<+>WfZGWSm`%B7A9R6?}Ag3{>f*?G|{g}5~s{VHi zzC@H@HStxY-)w?&+0ynwtFn4enaN(fLrY>VMHRl6=wS!`RIP{$vT4hXJ#RFF$AQ{) z{$h}1t#33+YU!1rX14EdC66a}enC5q2KmQyVYI5ALmHy+En=ZKRQ0!pAV>Qtjeo;^ zKJ^$!PNK^ncj}X=fj=I34vzm9PQa!U^?uAR*}9*-0e{i|{K`XINPk~*u)o)C^WSFRc+zn0 zAKvyqlf?g#IsUH>{<4y#9Gm|}sQ$|xf8$P1l|;mZ=F|Ot1(i{`j6q1Es^vsZU0iv# zE+z}H8jPb$r$ee?0h?~qmbSGEGYR^OPy@sjg>uwllByC1{!ioD5ARc7 z>nWE!ESu$RyL@0XV_dXm;$%p)>Jz~kZvz@mnxE4{^>>qw*RzQXJ0qeP+CZJ$^yHI>DkQufEPz^{vqP5a$UqOQPZwPw8eIkeJ`x;(ylv9FGCdFBDb$7 zv?)kkr5I&#KYyIPL=hXI$Vo`ghWI*JYVq8LAY2JyZM>6~W_M_1w;6IafbqMtT@Cy< z57U%kb59*2BP}!WemoFS*xXhk0(yM=PMPS7jL8?@!(#%-K@Z}Wk?Y$aHRe5EUO`4W z$eF=uWw^ta8|<+wdpMit~Y4Qn8Ix^s<+`tz#q zc@Wq3rF;JI26BUr-iC#Im$TRcr{p$=xPl$Y?&}Lk`@s2Z$VgK_;MBP!&7s-)Jn-(0 zOsW9&<17s;GU6>PGNCn<-IDjZU$Un zi`cBC!upY*F{9XwXtk1{oX*2oD6P=F4;jn1g({1#x{-&Wka^$-HWMk}A~qKp2M@5R-oKbbiswMb-(RZ*DvofEvM0HC6FrZscT)NK*%aYz z<~^*~%USocg!VVVdkuiA-LHPDWQV+8bV*&}Mvkx6w(4qULbDC;57h79?|L~^ZD13n z>yQ=;l(_gUxP-e;If9_*l>&Hr%(DIv$i8Zafmmu&s`f;^jafb$?rvULV(?a=Xjun8$5P4ww5h0iSw;nud4Pfa&r%@zmZK} z^2ZKEi;_8OAb*WH$&Ey}EXXWn*i_j`dMW<|V3)_9phe#Y*96FG*FXKUKZCd-GjH;h zuLM$OQXRYPyH5=JO30e2N4(RgHZ+$e=6>}!n;F;36&X!?lh_XIcNE7iWk}JSr+#Vo z>CV){fCu^qtIm63#2v8uf)_zqG9OM__-vXaR{EJFF3CJ5Py#~=7KtBE8lNY-j7TVe z+!s(Hp)Gz9^WjCBHVoxOXpqM5$>RxMvFp&57A7`B)K`<~K``udUC=HGC(B)YQA&WrtoxdQSa!)c+Uu>UhSh z#GMSjs~>%931w*-oAtBwYVtsIdeEOmI&rZ$;7N{(J1p34Yyy#qN8UsdZrfs|x4dhFrtN2K8ndjLB=k073g@s)KCM z3B{H){^N>F{~m7KgdI&BLTx4`5$T^@C!V`uhv>80o+F^gq0JtmyA#GcKTSL3fyf7> z`Z~Y3`Rw(HsoukmviDb_s*+MX$wK}X=l$ujp5;i#aK>-08*=0qTo(%7wrI@ocgw8p zI3tC09TakX?z8wCu1^*Q%*D3)FXKq=|AE&39saO6$T&3k2rP7n`EjMVVKoQW66jcz zAb+7(e(VSq$?+vu|4Q6|FOlK3;9H}_#urzp#O3Kob*{iGe%}*rn$P^%(8iL_I1^g_ z%cH;BdEER-zrSGN)rfgk#If}xrD6QSw^P?^PW@RiAG1MO7{)S|c~Zl@&t|}^~vU%+$vX#RP#i2n$m1Wei7 zsW$0=dKVe~LDk2F{sYzj1FZiO#VfO2|IrShGrwX4;_}$vf5`#(zz(@=CFzjklS54I z8@x(1RruGLQ)oAKfM__XLG-P(9Pd8?g^$WlstgJMK@BMiaj`Q8Uz1+whHsQdl{A;${%o|`o>(wP*7qtSIdvK1YX}Qx{gHV&_ggO7iGreBt z%`ei>1-ZM&M)=O~FUW3(F^%d7V1ud}7E=0W6ZP_$d*f2u?V_8}fwgGlXa12FVs1Op zx=Ox6px%2;t{vJk*q;MJz<_dm2KDAIlbw?F<3gQC*K|Kfdx$SjH=Qs$(c1oQ&e@l; zF)&?H+E~Pl(={u5Y4qwtXRN97n3vtmWbvZYz1y(f(S`|C(s;fboo3Zn0#}is?8Nr zWxZIcPA_nYjx;cZ@upMCb^zc__9(IVZ4!xJEi!n?DC=vy4SU-#WMYv0 zc1&BEW7U|YS2){=GpKq%OHwXUctW{!@xpjsdAZB3jFUnlU~#{?>;&C)+H;~DpYy?r z2Cq3+q1cxZa}?nH4V<3)QCY#=G0Zo-Btg>H3evG*@z%}y>X#_?!1X99FE_EbpJj*g zUc6<7{-S(tdahCkmt*s&*EjWiZ*1LP*lt7W16%?o4P@jzE)xPjd)30r7aF>|cO~ou zF4-MPP(3p&GFtdSHF()=xNj)2-mCGL<+rNnYF*>5o@at&y(Ig@aURp~>%ZNz9@D}p z`k`JNzWbDqM0>~2s>%+Jc-`vQ z0_qzl00T{Z*OX8`!@J1f7stDPu79g{8ktQ@eQaHn1Hu#yq#Is+W)mf=1iM}oX6N9Y z-8bY`s@U++yX&tBLgB4NGo3!L_uSC^5lctI2>+XKnC?h#soJd`!0h$`iUA|k*T`}* zFD|XqsS`%2QGWaFZ@6xTaW$eS*2k>Egp%HM@q)DY76m7HOV-%auZ7oiWZnQd5vP4I z#&97`Xn*T|#51vwyzkSdJf4Sni!p9wN`pI2x`z@ef#X|>_t9EXp<9I@Og{$_g6kjLG zhV14%>C5m4iss#$$&xy~I9+xPmICLOUge|?#HF^g9<028t#{DIj2g*G#^%Aknh|Ga z0A)A!rrQFcK3?&fSIUO$6rkt09&kTLF)G-0&wbBLITKG`8`n1ZYY=Zwm^N&gw z=YSt~P`_7*vp(W-A$a4m93V8yunfPyK8@~WpfIkZ zZdvQ~wvdn!gzj$~q@r7{=D@OkiY$pxFRz zEyW)Ao5rdE5-Ip5BXGgz`WBGr|hAt0*B$?t6v>TilzI*y$>FK8b=)KhMEbWJ1SGS}*uOE6zO1i}yXXvivyjr9|Var2L~%%mQkhdE(z9CTsEtWf9q9+>^1oH9hhJ z32nndX1lE*(-bDv_Yh56dO#}v0GM+T?PcDv6{n?pJB`Tu>(cUsDaXc%q!MH6v6)R} z-IH!9<@5D1_)}fqrzM1m1;osI-@eQCmvoC8p8$U@vx$wHg4Iu4U`ZQ!cQNNf)C>+i z9e#QDP27#%xu0Hk6V_RqVOfi6b1eCOg(#@Wz1rk)1G=Cu(6)Y>SSxs$whp4*h%)r_t%SEi<{bDDcQ*_b0=yOmoNO_0+@-yvyHB zy3nlnK=w*-|Gu|VP}@>>(~Lc~dOp=01kL*#ndl3nDsZ$$8d}$AS@?+R@90TB(;K0D z)fLawnz;=-{^VH+Fb8H)7ir90y_vJyr(^P!dTJ=&$M+2;SOyQi zWGv~811NjM6wJ8yk9GL)!Q)mn##q@FvxMHMq007yFJ*M+NiV*yNjE$xm^o=|wOnwK zy(#W^USdYZjZGmj$DYX{lm1d4K0$Trss>|J=TGNX z`kXt&?Q%vz1}uz|t%JyWe{{j(_-5*)jSAyMOhR2=w2=Mbti1c|fcGP5K-pT&P@r94 zg%$*4QCrZNYM>;`TYt<6v>A25R7GW^X-?#p8ZB-zVxM)B6q(!c@-#%_GotK{@osqb zM-|d=`+8q(xSx-b$S~8jYw6ltsWG9;xO-js*XY+Ztv$B>u?Qn3V%p|RQ#jY8{&BC* zVm}kLJ9UdK&YcV^^{q=RYJ2|L6jNOCFqPP2u8>rI=wrdt%b1YtUfY7p!R_WUb;8Bn z>(56be8flchq}BPTJ!J5!}JZ^@tr*2`Z3?00pFUkyf#m<+LHY82i;e(Dftkb9iiP_ zE?_7<&&juxO9U-8l{zAOQqsY>?bVgO)Q@>_ZlEIQS&EXBtJLMaG{lbiIwOp0i9GuG z`Nfv%M;Co&<}JT;Q+l9>I6{gowJf@a=f*!S4pto&xSWBrh6Ae%JE$+ZCu%HJX0*l( ze6-5#_#E~1&i94b68LpkeXTbtEv8=rocu9*dChybR{w70))Zh*W~OO}#KTO?)GTyf zj=qcs`)r|qm=_!l2j$p4B?&K`BPO^Hs}D&`fBt%GYQ)kg8jxe#{2YWeoAuKNU3IIo zv{UmzXyWJibYt$B&OY5+{+gF=*{4c1@rQ4gSv(TNeB~}*BRA;zfY6$U1-Z%2a;%{b z>W`|=9F}~B8Las^<{Du(VU zcq836EM65{NzI+-7xcoEBuO_thG6{k(MpTnhW5|Q+K~M<50*0P!!;x%Y-3iT9}oqnPn2)G!^1P1BsVhn^Hadl zC?6k2ts>kTL%JK=rCT8B=WyRZmwH9SH;K6J>YH#L=%ej4R;q<&YRCg`CpcSg4@J@kY9;ra+wp|BWbA)vMi2ZG_bY5Vi?X=*2}B_%PjeY(#^XwXj!Fisnu6Hr(S)(MZCC|#2gyi8k>*Y3L-c$ z7w)r@Y5B%Zy8WeseMTn}fxZ_!nOujdpU&qzCr+sAV zpqI|+{4}?P`6lR9CGqVCetO7zN8f(3%S&!wGG97tw{BP4G=e?Vb?~4G(ORp#PHv{S zPVfDy!n?mtmS%TDkE$K4%YF9f$n#UFr$(>-bQOYX$d1n83`ATP*F=&&)tgH{jfxW< zFG~{fJg;2za}Qnc;mB6d=8PaJLry*$kxwXT?b5v~p14;zRMvAsc)ss`#?MP(uk|@K zvA6CwNiQZIF0sy?bsMqk>c@wF*n{KGn`WHHO)?tTPz~^DRa+?)Wx6V&fqePN#jsgx zU$^v(8(@eK0hn6T3V1S<6ACgMzl+Z~tbCbu<`aBiv3c0SA!_x!wB84SVNZGJ0H?V` zbr)V|uKF?%=3ncr?pLOn9~V5o*)E zxISf?6_CF27ioBOabvRF)0lrDHBHSi5jXHc|GW52jl1^^Mla8tr;0YOm))0-o;GMe z!9I9AV*sJ!NLg>mqK?VbxUSC{5+ zj;FQ3@d`D{s>l%E;^Nu71p&EO8{U>tufP?5#MTALgC7f6mg(8CM*12)y&RJ)FA=y=vbY*k* zB`8FmPwh1h;tIMS>(%(VFNLClOQJNK2^Y3M;;PpK^&VI_74W#OV*~P2-OMgy(ZD2` zG$`2kaaPuFXft3s+Ul~>Tc-XCuT(GSto;2lt#q81I={j(r@VehaG?IVd9NRqA=l z39=&42<>_!R(?u-QL*7nDJiYMF@^H>Ei_iutH}QA@<@Yl5cM)ZWoTyJpCS$1LcUCL zN>_V1@wyH^^|BfNHI|)3&eq6gW<;T*_~K zmU-!xGP@tfU{Z6(EIySfH9||3b8QeU4sKuWiz#7(PKW@$3p~oy)bxsovbp6gBC?M! zVbaU%0Bs33Q}lLPV&ZSX2j#Dw0DVhgr<))2SRo*@+NDad!rdF8(#F%V?9!>VXU?c8 zbp@B~f*32>aiQMnOy+&(@j^X!vNSxPZA)`%3Y1F++5rWM=^(*I}Hy>~dXdUee+Pp&azf&BSbW6>T9IR3oQM>f9G^yuIe!ftbA`D=i zIHch@M9?toEp{2}%#v`(Dj zA%OAL6o#|?`@jSD2Fj}9_ zt`SSpyd4eJSPg_ICSehR>s!N=4lH0YUy7T4u`_kyqW(T(|H+?ri)y)6H{A3kM1!@2 zmDAOst^`;eFBOR}Ur4P{!eLo^0hg_o%p8RRvaV%oS&t);nBF3}1S7GD_K7 zI1AA*6|5XTuhV!{G%)QFARzN7#DZ8K>Nq<~98MPkJkN(~JhNilYd_Mp8&2h;_K)OG zoV^%dYTo2^T+<9$X_S z?L|^NC3?GcKL%O7EDb%VsF}*|p}35vP38|zjpgk_Zn&e0J3k#dLf8ZQ@ z<5amuEQJ4gGMjV`F(Fv(^++uJW%{@DVbP{Go7_umCuS<^GHYRa(6+IU*kXPBX4)w9 zVB~%AHGju&x!GrC1!|s)zofI9n0y+X%d)D`+8XyL*J4C>b2d^-&3g!I&a!!{i`I#= zIoBfwD}}rU?QJS9kU+FTLP)n26_(w1VASZh;>UkkydyW(%d`&>3j6X)GRAC$*=ofKyux=R67~uG+hPtWt1od|M(_GgGw5m*u?Ay0t?1q72p)Do*qgUT^{j zq%zO5F3Kwhp^Drm^nhwxGm9#FBLuyz`LhHVfE#&XV%-g@|*8K%aT|e^@<)mcc7a=x>^sAF&uW2T?l@!|D10IkH z*9S+HugvguXPz5IO!&2nycP!Bqd4(D$!3-giiE*>#uj+Hcfo*#HVCiSaT zyUADz<$ozJClVogs4ku->~~^7xVZxaB**JqT{{B8jz7Z;_AE-F`nnDmKyPSdYBiYn zJlM-Ff5lwc%MJss4*f?i7@gBJcl2w2Sv;taJ@2Uvw;nG=Q3goLL|7r0h85l zC?}4MGoE&qfbfHj#}Tt3!Z{A7qmj~@H<^xWRQqg3^cSZ#$Un!_OI~a1pNj`FtvhS) zlkW-A@*JMz5P)fJNeB2&Ww-o|35gO3Ueh>;1uZ1~k$<#WS8_>rd5bk?(NAC)^Un5C z5{t&d#hDjfl>P0!ia#C*M3@HLG0xxR@iG?6!ESi8bS^S$*tG2?&tf#sRQBF4KaP1L z!|AnNxed}>$KocyLYxZ(NjwG{Weox&%< zhryBZPDP!O3EP;#$u+7^c9W0jk~UzupZMzVgcGQQ|Heb}eK)X^^RUe^-8fNmt?15X znyNYRA<+)-sWBapV9I6oV0Bu~S<3sSQeP;ITQ+?VNW1E=y+h&8Nb*w^-A zBCd72__ZHU;&*|WB?l{xI}eyx`)SbD6vbgQEp|*2%z}uFTXDA^ZH-cRZW@B+P-cb-dL)(ZU@DtO8R+M zJuPFnCyrXf{f5!BA|-~C>3ihYK&9!de#+-KWf?1i`m|5uHCVyNLTVBn_-stCZLU(S_~zp-<_uG- z$TSMHSj~Pq=Z0XFn^>+|djG&H?{Lb@Nu7kFD~b@)D+%j4w!Orb7!rt{-`(;JtLgXhi*qN`D#TDG z`{j0!B6VN>g1+tZxO%fZHP}H|c~0-hOFiYd=~1uOkUJ^5@%XdcO6v>Q156F3MfTv1 zB>B_~2}b>47hpLmgT~=A_u6+d+9__zL&P;dUTPV;qO67O6=`j3ze=nyAMgQf^2g!O zNMhNF%7P9|MWv>kT_*)tr|6&$>TkwLgE%NSl@g6=yL1C^FRdNGH#I+7T%%IgPFO+T zhk|sS4@PgI~wE9+LeefP+H;>M83*hg8P4j_`-9m8^1w^4?=9;mF!|LiyTHpwW-xXeh!NVdRn34MVZ zM(TVR5-ygXQz3^hk`~@`XA(zj_60~zs31Y$qG5K;n7~3P2D|YcGa)-4_IM=KD-8l& zH$6Gein~Tm!fu9{ki1((Cl4i#c{rhxIf^&8AVpUz=*3l|&;HQVgO=ZT;MW1unHt4AzNvWI76XuiIr$Hn*1vHeoM0Q_=vsV zN=nW?-TDBYOr&I8C*&>M%_FX%X5>AFB4?Cp>oh*5B2j;Ba&&^KebavI~v1XrAN~%-F#8f=`~iUl?pw;8nbTb zRk-t+%_cXF`$Rsh$w<1Fj3^j>dP>A!Zc=1F7RGzTDVf*Ocrv?vB$hxM)h}`)AL;y1 zr%2vz$~*+5E+q9ULAPnSwPzR7y2x$jI4SUqTBmfmh14rzMkXL=fIU+s%t+ zhz)K&w^5FM1s#kVvi}sJ*QXnz)Un?{eO@RrUx&zy?Mr8{MAwvS<*!W6 zx?xpB%QRdY?n`sA)Mn>|s}S1xT?0Lyir=SR-(1E3;_n=9UQfE7*1#zz zud3Xnx}T#4d&_7RnR&YVRzP&YR<9XJYAp-*-1W{u_vX5tR$keBZ3~oyT0MOvxeMco z?f7hRVFSzH975Fc41=yx~v0Y9@%L{y1)+K6m|AW2I{R6&uId4D% zs^`&3Taq?nLGbR}JE!rWdDK@WirLR-K*D6VsY}=WAj~D@il4V)o%bWds$k6LoMi`V zDxmN;UzP3|SuJj%g6L zYW%RVx_o{Sa&+c^s)i5|iN-Ukgu0eECiXs#CJyQP8S4dPuA!)@a<)K|NteD%jF(VOs-M1f+ z?{2-iF>@%hwLM+@n+4Fm!$n!k8&}IF9Gq<(O_!0Wj>4=zFtNj#3?s^8X)l|)Z+Q+k zj+1N3w6OJu{s$Ai^~~s&g_?wB7PeYVPrXR+8sfwLN8!L)YEwi0o(Sa=?cDLbHNYva znIT`l^(j{UpuzRaa<6H7n93efkF20wWRtgv)It(o} z>)OY#E1oJPR4XJ)K*s6>#b_5(+SAR&AtL(H-8sQK#t3$x8T4n!713nZJ8jWsh17Di z2ySxwaxHT>YBw3-IrWlMZde?T8&{zUM$YK9n>DWk_o&f2h5mkZ_dE@~EV8L{v4i%+ z@n-&`y9G>!s5H$+pySj?wRJ#!u5FwR0X}Cg*75tZnB%@_X!W|b$Haz#p;d)2apgvX z!GS}H#$c#E!7G-nm5>+B%Ad&!qqMeT%HAL8{{#>T6*M)0V`F1E(gWGm2P>^RC$k!Q zm?!tTlL?LmK|1Hwf@!!K#8zMbW$&zm`M+fB_5c0kKte{B@-e*lmEgGTy?{VWoR z>qC8B>5coS>LVnO7IWtFoy2f!<#91D<8!z5#MqY^h4yCnk8JJ)i~FQ_D&YG$TyupR zT+jgGeCB$AS0Fmh!?8 zzj{zh%lL76Y&?TQVa>T}E~n8wOOis8Y1F$A4CO@0(+IN}O|eZ0V?wK5z;%&7KC0A6a>>(ESo}U`g#aR&ml8lI;zVtAe%j>07AqsU92OjI z=Mg6ijmM>0gZOA@CGUB(8!p4FBiHPJepjBE(J4TAPX>1LH;3u%qCi$@%>fvxX_*5x zPt2tNTJ(oAkY^U*H`(#*%p;@~ul<<}#)ju(IgKdDjX!!{kjhHWV^@F-HM89M(wT7R z2IN1>B4PL93~3i1l%*F!cJw?>I*bXdG|c$b63?F(xKmG?WL0Ki(Jnp&l_H0JuTL-D zuE@PyyhBO-gA4=AHj-=>Dy6BI>bc~E^04O#*GBkLQR&VthWK%)IxZ|igP59f&HbuR zi=WEAdZ?A8!dp1L&>hlAq?D!roct3j)58QL6}ms1WuLO}<};Bbl$@5!Z#E8c{wG4F zL1)MNko+t`-+WS2DuF{@zO)uG$)VqLGV`!IA7MN_t5OK?zRQ74al2RpH$PVoT|bL3 zuK9{c9jRzl-C&i4p5SF%H#?hkTmvvdUMV4F?Ku3sUf>953?%cYy@7)O8!42=8O@)W z-G_|)QU%{;aY%|P3*RpSWmGk#IBYJnMcse~qIZvu`&A#TuGDJt&)Ahv=bs zohpoc77HUG`xI2q zf=1Zm4c}X;{9Qf>xKs;kH{1r|pjG_c3On5`rXMsIE0VbQuxfjG7xl)G{vIydW}l%i z)fBHc924doKi?LgoS#e;xbE&B*J973nSXJYL!1FLN?a_myB69z9gEx5f9-q;xE@CG$Zl<&5k?gH?qTVAt0ng7M&K$7;=R4Qn@2xiUCmFVA6-jr7F(|bm2!{wD2@VFUqw7zl6xc@|ZH|y!J%24j?TG{;X|M`@H6B$Jaj3xD!2# z61XT_WrN2wrdRG=F@gOU*Jd;LI?wT*sgK(1sGdflU02Y(9cZoD75I8@YY^D3b@B8! zwM*9)AWiGwXU490^d&u9+154Dk~W!k(O=Ll==|$^BI>a<(uJRtAs8WPkB`q6Jp7}P zQD4fXjL~GLl*41&A?p??Aue78?=@yWK4#YzGv2NaFv&a9@`x)mdA>bP%}hMYx+$xb zCgUwR*<^-b%xjUZg~_P)(lJz2caijIHkr=hAC!1H`cq)EUg7&h^AuL8Od=G7_I7HY z_7wxF<0wj667JXP-@wjqp??579eb%a`Rv!Gh1)YGXcwI5?1&bYoX)Hq(=F1zyEI1~ ziooj`n#o3+RO>Lg_kZI$GL5JGkCNhFoqUvcp*kt}FDGzQnrMGG8{OZ-nM-7payH1o zti>>V%S#lXu>VXXOjbmBdJi$~Bo(b`v3^oaEhpC}{83=a`(}pF-Aah6;8r2OEi%!t z$3C%0I$-=f#wAi^R&hQd&Unw@b|*E%REC&Oz6`J;@9rQ)pq@qaL zNjYbs2c$!sW5x_jWCI%oxl+XwR15bh`uf@MbNzzCb8*nfDLwCB-nvC?#$gR-T)EFV z(nHy$i!m9(JYge29E4p%ie7@8jpoRWTbJ}bu3JjSai#DbU1B2^l=UVBMXchUfjmn! zDn;X%!cKXn;yCqeGqIt0q`ywnqKpHU(Q@~TH-Hs)b8LoOQkZ34&5rQEf)Kvz*`M6-d#wGWj8g)tNG$O8ykB{ zd2HJ5bKwsOBfSBB?z)Xtlrdas4Pe>qTaI5tEJelxRIL2J5TG*6e<47QZ;lIz$GfHO zz*L;=mR*gOhw1qdF$TAe$5~70vVRglaVh^n0A0t2${SVAw&0T)o-Q!k{ka2!u>U}S z{+}Gs?ar{u0E~Lw zqUEh=Il0pAP63>X#o`zOiL~;8FVsjXvzQp(`X|0|+2)bqk_DlQZ!6$~f}97F7S@$Ffq3!iURI`Z`aA zh9ZdFZTYDkvsGMq(O|#vi{TK61zEwU4#vCJPT5QEy; z3jq_S|KyHp!YTpWsM_8YE$H>n9R;S+K6aQ!v4sYcPUk=c#EAE8|2V@F$4$27&r$#; zky%Qbp-4Ne>3(lf@$7gkfbt~`6G;B$5U3j!GMtQn#?>SZ)lGXpe>itU*+(xvsc}Z& zn-rh71{mC@X{_8_x92nZ6S(}mn{N6Ru~FOrh$M7|9Z6@F8ZKJ>qoN-6?sdP>-&}IK z_VS_UukY_qy9A+4*YnM%i!IU*wp-dlzQ^acTIw8`)L{nW&C7VotK66iC*Hv=XzVoe zb%v$r_FL>y2rRiH?x6CwB^}3btAu?VbpGmq8}%0=P`g9z9(>}}!>o;8e)~fUx7qOI z;$*GzwQgHIDi3V&)9T5A+WfKI5)1hJ zUkI0jNH?&cIG5S)mutk^;)F_dz5Ze`qGl-u2jLp>&7Q2T%P#p6#8dk%KUfG4cxhDd z_#-TZd*>l1;^#p*`d6hjtqap~`nusWT{~E36uabzjxRb}&jtuTTOD<^LhQx%;6PPq zSR50+>G>f;j5V1U{T+5P*m#y~eLK@ARDvvRG9$KNH*URwM7@ZKdlAU%MGyE8kWHTK zCKn;+3T`r+f4HHkLrqoLcH|mBg1RGI?YhY{jr(c+q!NVX%2(RJ)LJ`~osYOL&V|9b zxaP~TrE3PV^60c1!(&{5JQ|Km`g1i5t?B1%c^o%kQFO$*umuL>q&oNwr=mRO@X0cU zxA*dFDvDA2KZ;~5!zOPw88vcGpYRPvRrKqjW@6IEsACk z@Ud#h23x&?M%TqEG*!EzB+$~$$&q9 z-I0-xe3y~GNyX+B%VE_;j#B0lBN4DG|>4vVoF6gqYN}y6&9| zn^464F1t3DsZ}tfTKBR4Lizx-ux>oU;YT{^%aWpGPVYP9Suq!Q;i;HNRx>C)ke&q)I%h#^#8Pe`RJSePrD*dyDT&9W< zfi-KiGw(Hj$;LfxJbqCQb9%jzT3uGtcj|euMp)Gf?n4Xh>xYuQAnZT#!iM+lhK|_J z$Wcix1Bph#6sV0{Vu!2~pMM@L`r;h}nk+zM~1sA~`;*H=3+>UyP8C^g?}=IJ-n&eYGO3t*9NP*#wmEn7T}gHo8Ppqyc0Dpd`;gusEts^BZu;)7tajlqaNWhrMXFWommAJqI&GYgScPJ@ zIl5~q`KC0$dn6b}nO#q)CqncJXR9mpbEzWQ-ad*EXnM)Ys<7(S1)n{Nk)xE=hSGOjRCNuwF~31@riP;+F@=D*_?>?>MzCzi8y zkoY%kr^1z&&}9w^sQ)OryxIKSjZR4WB}luk$c7tY-dD?HO?ZwdBa4xJyra{4Zj(S7su3{ z$`QbnRz+3*BC~CN-7Rn)>nHNJ5ZiEWT{{1`v(L?C3h={-_9v!F?@GMc!JdD*)c^_l zbdxLgbFQ;1&#qKJgxVbk_7a|7A;GIOE3T$VM@Ysrroj%8{V_&Lg$-rJlV0yekL<`l zaw;oG?}rbP+n#=`FM>tr;S>(Lj7+$9uE?$Zv8u4$_c%o4$0vH(&{+1SzT%(gYk&V4 zSK#+Xe{U*PLd);>FFd=>Bad81(W4gALWH#$n0@)^SD7<|_!=N8x*{HEk}J>OCA%&P zc!)b;HAty2Ag#ukuk3JT{fX{Yf(oaoJ_7hF=yx3Z0HCpmWY(9~i_0N{hG2&J7N@#i z!(uV>`|o(Y82pArBym=k!+Q1l+Vt4YkD1gWhxnCgi0HM|?wZZ_&Ng+EVhF z_!y21XPag15AY3^>L-Q%W^p6$1$I@7y8S@?Tuh$fCD0Tp~29xcAIcRL6 zTDsk@Cn?PXWfKGbGE`9B41w?~t@@VCOv|<{;;hHU&bX;nBM4gX`ObNb4EsG@;LJLL zhXofex)ud$A_3jFAxb3bu#eW(%=8u~5aOm!>}{XK(=UT5z2}temX<9?W+K0&FlG4x z>;oT*h_#<~&j+*v|A*u_9!6GvEdUt=b{@LvVUM^Vgai~53ejx5eDuT%Snh*gAgr+? z7uT`mU;D|7dl}=GL7AD4MwcoEHi&k-f=7zeg(ci`5oSxB=h^-RS5&1G8r2j+gga2& zdm1=O-c1IT;Gs$kBUDV3c0M#ZVdfyq_V}hH)MXd8xyX(GmRYUaxznZ63rUX6oLA_C z-OsVlA=klJq4sIJsezP7j7O=|hZGn4^u)3>koMpQl2xa_H*RyT%X-0Gz4dcIZFxPJ z85aDnP69SuSG;v8DJ-5p&^3{!l+uX-vT$j*G-%--o4?>-S4|a(6QA3A98uo{B?2tx z%uDL<>!o=)@;#k}cty-`zx@1$xv!|}hp_F~O&%_N?b6@Lh=oM^T;ToP0SirWP0AQy z2tu4}U`?1%y~3Kd4wWwA1YpJOzBN z#gaBXBjW9ZnM}0ibZgBEl=W%pQc- zm)PeXv~+wB(I)ssz7XMf^2xO=rmPq9>{9P%X})T88Q0aj6IQK5m`U!~2OHj-6C3U# zWXZC6q~^4=M%QJRlwgoq3(oq(9q`F6RKi+^{f=2KpuJ@}O!t&ey=|JZ2+fGj+~mi= z?m$q}H9?Zilh+5?`vQ0SE%jt_X)Mv(&-DOZgtc3oGk_LMNB^RPjI=X;_>bkYvAK?< zi2ZN(Z1$8HO|y}Ln)ujBbg{~}$#@Phl+idI+(ACH@8Jy{Hg<1Df!0N}h+Z!{j<@aY z`>nSQM1|T#t*tp}&R;_%lr6U@)W@eoZ+MAT-04La(+b?=Dr9DonH{j#!EX)8WE)z2 zO{!{b93`NwPkNrseYM3WZgu(hLiTx&`$A1^>Zp!>%v0=y@rXMm$il~>n2R9Zc5mw`nd}uGZS%F4Ads9SowZ`_2uZujzaQTtLx7b}X)BRNGz{&%23d9YvQmQI%c25i9t-RcKc zMfihWqhLR~7zk4Gck?uOpR6<4yKDes$4l}X?Z zvyXy#N-$2U#&bVvDKRhB5gnE?cZTb60lT}{#5PV)%Vlz5NMs@ zkjsVGTcg++ifw|cnWy%0KsN1lL%Tx;lemUUHF0`_Xb{*o;a9mclo7PU)8B*m)?&;P zKiGnFuEc4tOY4|IM$Ys4=6z%&cfdmC`R-}h;B+}p+;md~Z;FCoX8LC=SIU}P^kLhF0~{de`P&D(sxQC8C3yAe+B@Sauc);yWOVlb#?OKv-lF1hUDu>2n7%a! zHPjQE50Ybs%#vX%kFYIWr8CE?89Eg9!A;Sp6uvDFO~BQvj%_iW=J_(@YdB`*ZI;VW zPI{7q&SHS8aAB8(ON~d58Brb1hr-7AM;J7hEJ~kp%fW1EMVnF($k6d!d_&?Y7NgL| z_IIe1)TrW0{5V;+Fp&{t;nCQbXw@MO1Dld($guN9KKHB4k(n4{EMwdYCz~vCh#aeoKc~)9Gy61LKkUf?~TPLV$5T zf9}R@i8>!oQn2vyr<;RA=*3mivE|+3_e8m?0v?v-7BAu4y;=iu22FP}CxYbD+fD^{ zCr#;Y#Aw~c^|SPN{&a8{iI7M$WuewE)KIe;mL%i;Kbbr-{O>hZ#PG7)`3FC9%19tPtwZuEgRXQkoy_&5cUSUY`Hy7k~>VZB2u`4lckt%LV2l11OY0OyGhpfMGr!04#>6c*e#B)L&B- zn>u53vSX-geWh}F`sIMv9Tua{Xh3$p2CIk$sAjf}nE#~GE0oUp^nD~W4p9Z#pgf+R zb)xMCe_}zoJ0=Up?qOM0ahu;mDzIHe)z9uili#luLa0Fl2$~w`4bcyJNTX?t&+04K zOcwywerZ@6npaa_M{K&?V4nj!a4*_2=LmyN>XqG4-dhQ+YIR;@$Rstt9CxxQ>5h=s zColy8xgT)aR%Po;Ph4|e5H?&cz`!)_&}1zpX~#+=oC-GsUc;PXFNj7sQ)5b*lHzN7 ze1Ka9ta_s(V| z=}kYt?Q5q?`F*PV&X*?wWAd^MblgzuX)#51lAGfYQgCCXyMFhyRkoq) z_Kj{-b$MC+CGf@ecxHWbI*9Hx(I=h}#ejk-hdCWsc8~Wigy|vWXv{a|sv;`pAxV^vFUt4=obubfDxi0crZU^M~KT zAA;PcH>Bt@g#`YlG};2$sacmmWcbjij>yJ-nU;KPR->C2(UmsQke$)pJ}jdZkHkpL zqF;zgh!??GW9Q;Uc-7@gnFi_{ae>ssdJ8Gq#M@_FHn1O=C!da29zsEiOh%LRZSM=! z1>z&#l8d857Pe`d!q23cEgr{9!a1#2N%D_4DJw|@kH56M)L--61Ss4j*c-52+^i*+ z#9Hzi)1SbnR)5}Nh(%rdtWf1(6eEjc9@f!1%MA9Igjq^i^EXB&@B1?GDZ`9<$nOB- zChjAjFnV$tp>N+Va>)!T9G8Lx_zQt48u1|`b;VkDqw*C}!eboMI+3k3^dIaOQxyvZC977E{_ zDu8-JN|13D2SzBaDKk^+1NUE5-bd3(Sx zSr&qcv$mrxckFk<{K9$Rua(7`eu{!FQBA^IrXqC}HM^TfXM92QVNx3s;>}}iNSS%A z8If3s#$-@9qD_q%Gf4*=qoCQ!uwbZ@rqg4ut6wHfH9w4NVm|MdV)&ovbru_$z0T}q4-&}@glQvQH`uJt;^QWcH;ptFIpoCpcp{m&tk4Fni3vx z6h;Fgz^DkyD4rh+3YGBiuoy9i_P;z|V&#nzk@X9kOIVr_r*q?_ka-P^18=j0(j>>h z4M5EcyRg*^uKzz9p@p7}Ex5F_^sZtcHRr4z!=A>BmcC}=KIc3EU6Sy?QqVZgY?O2j zGU{Imz^S4mAfdSanfxDl)L_E>t&RNSJNVBZ`v39tklo--2Mj&{s}8AVI@=q3#PRP3 zMbUdv)&48ZH~#-A6V$)8|9|H?toQ5R-S+pdvHh}L;92P3$$y6B{NJ+{`1GHzOBD!# z|39)K1R(skw;y#?*#dx@p=m?u$A4r>uB4;{ySaHCw}rJB@Ly$t3n!J#A^DHz{@)e; z-m5Ld&Afub^ZfK(}15?tp&5 z%DGsUYbMId)3FA%&cySZMVdG6&5{DgMUdOktXqv_vo{l#tx zF37s86DyNn^@%RLWSS5mFLVN$aFU#Kn-EKQnlF})s{rofi;S+lF=nxCg$*@IOk}WB zj+=o$a`f}m{9;tj@L&8lG6_!mypO6*=v{K>{CA^4)nrx~Wn%x7N0;+ue~3&NCuqbS z%}6MhW^_Pz?*s$u*^bwQM?Yo@NJKQUi?U3x-&HxuT&u@v>WcS)p7I^=xC51L3v>zy z_MHv!=oe@LA(10H8zg8DW=ixBKR#P!^)TWyyj6<`zx&DPm})#>;imKzXtQ=z(><0!1C&dAX+1|iFM#{4it}MT|18Ob0(b#2(xBznOFr%J<0R%0;(9ExZ#SzI z3;yz4-KNvMa0E{#-A?S8saro(Ylyw>_3^oV_vWB6z(cjcAK4Sz12S?X^$zW#tKRn? zVjex-1uiD@{ZDA&kVg*Paly~D{QvqI&$sQ?XF+vcP?8`pNdOsE42cWpcdi41NJADpPyfGX{p+U zX*5;9Js%5pns^t^#mn~$j|X}qXREqX1{$aCx()1&wlIIEftphN| zJMLp}Xxa8CPpsucE6|64xV?bUXl-SW{>ec5*An{M9ch=+f}Ya8_9ocDgyX ziZaUNTB#{igxV!z6C_biO3B?t=$~WNIpFjrFl{4yR*`QTF+d0v2x&&dvNF2>JvoKo zo2#b|6k2k7WNx!*bH~y~&&_D;=mNUsB_oar07$5mQ5A82OKEazgkZpmdT2Izc%iM@mQS#xcJ+C;}lnh4PztY5n0X@d6? zbIyVA#f(&O=;~NsJ4ru&nz;s^?iOlOGQ4eQ9RFML2lN$Soi$n8G1Ye&3R^#Lyg>MT zL+qIz7omqxMgBMIfjK$IOdr>E!_)B@N9U)D)4O3IDAUgaZo9rBcj}g~Z<7Rsh3bmV_=OW`o6k z<7CjhM>gHW{^LP=n)`cgR+4;>r+uUtW=U(X-5^R>aSFp6m?Ce;YMq}Y*} zTX2wm(Ur7<($00FxeNsUeGetn+;xvalUpl>l+v=Jj=&DMd!_M%yuRwzom*%WyWPih zhnU}%a22)kc5m8&V_c`qk#hy#Bk>NdC&M;ie$^8{5m=r2CY{oS zB1O88I7Kzk#(Ft@^m)U%5vy=tJbwQEaB|8@W7U`EcJmQ)mSlCd($2pXi4J>C8y&Y; zz)(ti;<>o?X(1HN(~8FE-?KL4wFVjCfV`qsR{4%Kt3rCx~uTb@66 z(|f=)`+DeFvJuV1*X-Td%;Y8vPH9EX1fGr5G^C)l!+kf|XpDCF+6UKZix%?mjml2H z>8SNo%A|xaVD1LW`+kU%t-sW&$^grr@mnlRn0$r>m=c`Mn4QLXoIBDOi6OkcYksaU zzRBZ$ybX+R8)6r87-~Gg9+3m2OVXeWN~JVsLSU@S*B0q%O{;M?`T5jTmO;sdjQ7=UobP zE5?me_O8NhU)`){F1EBo%G}^?Li8X_JS454??g7@}KMR?D zM$^g)oOE|YZ((Q`r^B{yV(IOd7&|Jsd+n|OCAgX9hjDI6!SpXLVQlNRYGJ4)Ld%E1 zCY~RhKf*2%?|Phe09k6ue(owid#J;^jXgdy_8uj9GaSyyq?~pHZ5L-74*IZq24qp@ z{M3E4dPgI;llm38`5FxK(WDZ_2!qH<;10!G8{A=yO~fkP+4u3bM5#g7olAi7K4LmNpchq>K7IqmB4V|S13t{T!AGop(A9)1qBgR|E;M=cBc!IHO2 z@sCC$h!3=CweA1i6vOvnCF`=_C$BkjEhKl7(qUi7A9X!IhV$E^(e^|b@B^ZdEU3?G z{|y7z`6&Y4nO&b#vv0QOL`ySBn*$+9K#?dNlKFio{d<#z4E2WRsXsO~=Jn1>R)_zJ zKLFu&jX&e&vvNb(B5q4N?~j>&ahH{*?ML0E_iN;q!Tm(2tIJH0B_W4EkXX+Kc2fqi zD;y{$)j+YGV3Fowusy>i)tu;jJIxJcDk*r@m>syRX@SLK)&A8XR}u87X`Wae=s`E-EWBgXr!3+Hiu5{ZI5TK7Zh^)8Rc zAtRl@=aAq*)=cZ?<;WyeE@yh6@q(QDlNWEGissKPR_gEHpM#8USNmIDg#WB(ocCz+ zoD4K=PvzPtd+2@XL}An|VtjK`spG+3W-{wHb+@9?2aovZ@~*IZWhD23MssPV%t{fK z3=yUU7c{(Bw0UYNYq!0OnD&4$zV>&W+o&!**xo4?j8q z=MO;HbPYP9;`53zUW5NzW_$5Ho;}OX>p+RUaIqcnw}%dpiv^;+EzWEOBDp(Q0lpTdxOz6yN??(6+t&n`m&}ZDus8}B@$zPR+blf!QKM&$eqEu8LGh(SIj)|1)u!t zqxQdvX|naQ#4F=P70LqoIvH zzqG^J@@7u;$8fQhKHTwLn-Xtj{SGC~AO4$&*;@ej(_EAxkmFR_U(cXP- zN+f17@^Er?_l>H7<`3r1Y!DtHRl1WrdFx8LoA@};On%9!p7)gg=9BxhCnli*gGf0$ z_iXsTwvEG*Q{$<3r((efJ6=#Gxwij^K1|+A5+L-{Cj0d(>6{Qm_b_s`Exx}=La_GF zDgp4vSmWox0KJ9mRTxFo$*JYG4Q^>u#1)JymnO$p5ToL2Zn?e3+%lJ0KZS>tVVg2| z2kx2|;w0QH?HK9NQ2zbmPmJjjf%iBd46(G^0IlZ7ksTGaF-1?#B-LkfJvkA|R{%NB zke*@GV}TBF2zyz809xZ>E4CSe1%q3*ccZDK&O|g24YMh76mqyiv#agQentOl4qX)o zGB0$4MbP-s+LFamhg3-@|1T!;&gMRWzJ9neo4)vX5=R{)d;u$dbKa5vi@CRqu4L!d z_1bM_W@^8QUnVH>YW@ct)wzKx$-*@iG$v8>w$jwOVNBycQElG1p zb4t&AB^@`XVXCyFe}kyNOu$os$;}9J;r4W8*UB~02n{{r${@9v)hHwrI~mOuX03^= zl}>@|7{a9b9iznub0j6qon-fPg>?(6+&qE7n%7d1`hIT@yZ1`Z13*VxSF1sja-48O>Foj=gS5UC($_paRzQ zkUDsu_m7h_1dUSKA!$~MzPr5tTn%0;~1(TH^i>pbso7Z!f< zo>{8~A&E-u8<>B%GYiB#pZ+uzHg^d}GVHsK)cp}5ZQC}J=nN*E3~J3-4(KRah+-z( zPAis?u|Rh&;`H~$+xPinB11N{)%1I#Wus6LBRQ<5A+Mdz8fljXCdbJ={C1vv_Tr9Z ziJWgIxK8GMF#%B)$qX)<@>r?^Pef2IdK{+CRZzM3@lt3K)jZ|nF_iDr*fP~H!PgZj zVQy=7dT$c&*wLD<{gm-u@nUY*!eGG!F5-1ZHj-ZEP*z333_)Zk?{%3ate6$C3@qCk z@p1cG>1TC+87Py%U}8}U`zjd{ZoYw(rDP&wQK1jm_!MK|s7ThCV#nhF$04Mm8IiFi z3+jUd>1vQxJKO4Mg;bw(oB+1s)v?+*h5|fKQZdzFQRd)d z;B9L+M)c$l&O8y^>@v)ht~BS9BaQAJH9DGG)>YqAOC`2mN)r5ZxAuq&wnl2-+Em#d zIBy!Ud9otYk&jcYTbysJMlLJFpdBo|^4^HWaHMCOIBKZAf@?uurthf1kZkz6K(Y9J z8E&X?ECHy9Py>em&8x)e`n#RQX5corly>MURh>S2S4^v98!xX`s%SyxU0lG4dOi|v zg_UCW<^f?z7cY>>#nZ?}yV;?;9WN9hv$rPAdXg$QmNs}LP_?8}9A zg}--cZW-_chMchnC>^d#k>3-)n9Ep;==*8KcLv5~S?$oyQK;@S&|cUAA;ssH;#(8b zK3_4$Oth(HKQ@U0TO!|@f#G7o6=caMB^24+fW+B*dm*hj=&Iy1Wv3QoP%ttClso1! z4OuELD0A3TY}j#j@xE&8k|Y~DPv(bF+_^&iyaYlXbAIQz&F#$NTJ0Q5M))*qjH-9o zVW8qgZ?UBP`O#t60CA;e9(zQ|30=p7Diak;&4>{MV(Zzy+FdAZMj>V@`-cH!Ka-?l zM4=RVKX#ibrZ{RU5UzC{O&f)AE&QjH1>zNj_j%94%pl;hNo*j)(K{SasDZEkFt?vfueqFtoH`yFkkeJi-9Z7!s9z?CSR>s zi)_?&P?_on&XS5T{2sdk=nu2r+}f(kB8z7OxZCSTNr>TisJC`QlcmQ{OL*~ zcxlP%gz~^*H1dDzGQ!f$!aj@JiiGLeXDyYgNuEWjneP;%7E@_O01# zpoM381u(kSf=|TE1GlzA@3C$3$_m7;=KiK?1o2Dhzt1*5bGF4@2*1#JYoUjL+s)y( zdi>443=d`)B;u&)WbQ7v4KQ;Y`DVm?a^b`@mnWXngl-0b!oaTwZ3fvmZ7m7MWb7hU zv_K{cF7HiS^4S;TZp_`J1P_u#Ramf30Ty^Z@ZYb-Qf~0O-;h_4$Ge>iE$Hq^2!rrF zRuOcCS3X1HE|Kh8tYUkT@$;S%@Vu=A1)opxpJ3vfL6Myydxx`u(EwL;rzR)UITjH$YGl|JQS?tQhy+Ar);n_ zd=xcN(6mlyAZqLDSu2p&%@ON;G@Ax#XQ_}~m?)u`E_QeAO4ePB&t;$w9z~4ZO zd+M+>|Cv8mBvjte)Reb@?HGL>6>Z~KN<*4%L|VeWAA^zI$PXEQ(^KAsP*r?rCJ^0F zuMVAP`TeK0w(5UF_ehwEtEsYhh?2=S$O`>{DEN4rX_M3NH!vngj@r{eHYDqn%W?U= zYFO6t<2+~HExfD^L@E=@RB`hgyB28Mng59+{fBXvgOp1P|u zw}nzNFZwv5u0%wsmMYCHO}vb4ecC{6zhMFxgS-Ri;YgwI3g@^ZXOXQc?CO464@8IZ z{x%i(4B3N$0Nfw74B;SGAfE0a zi$0hjLY}st0aR14mZrse$!*N`Wd$c@fPwe(wX1fGTGJ04)+>?}%}W7m_0yvhM=M0= zTtI$goF=;b*s1YQ9-Bv6&F%9xep820(*v|qXpMPvN!v`AfcfEtr@nvkb&ay zIN+|12m4^F<3@w%zlMGz;M@Yw1v1%4N#TA-8ErpmYVlP(Wv1(wpuSb|;x^d6MS@5# z8{Fpbi3w2MGLYBP^<{L1jrnzWKojpampsm>{FhX$v9J?241FzM~_ zILt;xL&5>0*|YhU&Q7CbtkGu)a-gRHNu5-%Q6LId78*r!Mb>N(?C=cO)I268qMj_< zVJ8T}UAH3RInudZ%vFG=xKMCSoQD1VdB6Opb9eK=UqsBcnJ_$ROqN|qNU&hx>#s|Uk)O^97g@H3qOB%e+oGAv(}z~8bSJBpO|O6)}@ zbR7TiIYC(!&FCy|67)Hc=xSatU&Dr#Zs-;fAv143X2zRy4)-N7UW+fq_%h*3^8{=# zwTvB)Q<9N;Nmj2<<)wUXcu13uuwI!FA36WU#pE0l8)yj<+%2@W$L!9Z2$r+w{s;b( z;nSJTw3V!DBLFNTqth1+etL)2N06Ex_b>Wq!QB5~+B_r6CqR~G4`KwA7uLYS3$y&q zQDkStgc*dlM>UWMU~8h+(G^C)c6ldOxZiy*2F1t;;UPU^7)(}peIMx>OF_{kfg)VE zd*`hn7-sQDEp&vP!HRaQ-Z3pqcz;&6i5=gu3QWQ&Wtk0%3yNHArg@WNP6y%4gbaNm zKKLQminLlp(67J!;N{endt9||5#bZ;CN&VT)?9zuja;+$)#J|Rb0SAs+*u#M(fZ1! zh2ddcr#bxe8V#i}_12=m_N-J(zmgV!SaB;cxA&Rra*{+uk574~BngoIg=_b6uc^s^ zm2@=Ls}uSwq`1UHrMRnlQv$A9OUBQVS-eywlUO(>GhZT9PM4`ls>D8nqEXGvi;()beF6hq8z7t-)!b*;r_fK%is9?K-zu2LR|G^H$7HyeQWkS1q#_T*a z#}uk-6kUWDBCweHMgmS^QL>hD0H-C*{BhFI^F93zWRhLgHW*oe|RBXG)sLE8AGFd55d#QcPrWRliE5r(hP;{g^a;s z96JIW4@>^7FIo?ULyOR8v(k=Vxm6J@h>pLJ!k2gau{!dUd)H#hfmB^Y4@QbrUvWY> z-{$)&2(e9nKYo*(ftz7l;AQc+vfz&uViv(2a1ETY>n%pVsBJ2+y4^xVMkKCk$MU1f zgdopO1BiJ3P98OX?<*snB%P>JqRK7!A3&Cxb#UY(tM{ujVl6+eE6)cV9to@}8i+LOFFmb?06Fb*^arcx`Dr_kS}CtB zOV}QTPAm=zw^9bh;Qe{euaP$%)?G?Ym|_gmF4-I`aWo3a0XKo;deTRf)#2sIlDwpy z?TF*>QJ%~a@`a(H!wQjFH(h*QLnrn9g5@yl5o_z9`eLHH{i&ALq|bV@gi`lp*46{E z9xUz@BOrw}{Cw<@zRTW~r}Q1IB`idNx`@kI`&LUOPx+8Ne64YMtoXn90b)-~92_BK z^E&bs!=-4Bzav}CbG zxYCQ*mPNkeu9|kc#}5;BB77I$s4?yMc-p=jc-p+n6;*rSzSdjr*^e9J1mqBQBYcw9&^f==QW?%@0}LWsO@XgmTaq_uBHNLUtBcNxgdWVUT+MTV& zuBlSN>I#hcYK>LDnd(KS+fKCPp#o&D{@vY1tyYXc@OD`qqVE;1G{bc*uGr1sq6jEo z4Oi@Kn~m;p_IWoK^))`u(5@jS2oWWUnw56vToJ1YLyL_rD?Q9@U!Ra3Lq`*~M{0U2 zNFvYX_pt1gmW!$#$m7miJ(-Bvgv_5xZIelVm*zeQ0|%E^R%X#z{<98c6@10aiWBH+ zB_WXJR-T|Xmy_7=QhYDMO>_}1av~hr)IWzI$>j-Ai}UW5iJa%{X!JN*c7~@c(v^d2 zRDNzch_hH)U8>Jte*Nt3&mFLwvZ-!&1m$=S*Xh*ZCGo$E`4?%r%pXZx!3XYh+gG-X z%?BP%&aOaaOuvqSg~fF*cCG5|2}SUDGt2VnX&Nt=JJvyyqZ{U-@0RwcIyM#kF}QKw zCn!Pm_ZLggRlX3&js(WByzX=~p5i20bea8QNgn2Nx?jG})titL6jMKEW}2_hLh6o> z^4UIvy1n^OKROBywck&T^gS|>AM?BGu{+@hZ^%m)1!Jg3>(O&7ZXqnrw8@)NtG_-E zrQPtP^k`93MwMQNPkJTEbVZD{$S~n3$V+?Py2}RcE2r%4CR;qZ*G)l_N^ERIDrN za1F_wOaAz$an83#sCowkeS93BUk(J$sDmVaZzfzyj;;G(DT%z$#ju_YL7#d@D~9eg zv-|>k^8U#k{1^2^w7>yB*STcZs3@>qyuj07>^Pa^+47+$f!^;hCik=mI*(~nyF6<5 z%<@8}{t!&#YY+XDx0ekZ+4v0=94WT@*zEmAqkERb{Vo04w%B#&Ee6huOuFpJc0#zT zFIaVxJ2)^T2JUUZ&FcpC^2PbZ27qVv-z$=HeFDuFPSsrHUI=HrT$rPHtWAGTcs~co zBI8gahJ3xHx16{mT=+J^O}2dM(g+A{?Veq|GB7iQ0&+GDq$z(Eo{?mDwK7h2F=_+< z+xm%WPCz>DA$q<9u|Iw4@k8{mxihl|Qj1}Ib!xUdNsCWnu5;YJ>V3vV-VX-o1G;?H zpWU!X))bRiqA$NbsoF%x-^@om%_m|W^6#<*F)BT=(V3I}N+syv7_70%lnAA?W4f3RZ+hQK#8iNATy0lVKTN-Vzl-P9pl?{Knd`b(x0o zjREpR5&*fefB>Rlmor7WN+!H{rX$2r8uB$W1DWXNwno~G3VP?uxwvARvAr~#ae-g` z?D#h3DV;V=n!A^PJpxZ8E~1A-)M7~07>MGZh!fF3b{46@fF?e z68pml&#smu4&J813<3IXuFRp$Qby($)SUGMvEj_e@J2E#Pje+Y} z*ml|Nf!xLgGZV1UblU*PnWAS%@5nf*UW0+VQCXJIW>;|qnS9r(Y(WrdTeGJENY(7_ zm)oESQ#P>sbLl?l$-Gy;g`gw15&EAVCWzy#xm`AT8zWuqmlScg!lE_iSRW*ngnJz1 zx7?J&_!-+EUQX8N7><>w&${>l;enlu6FOLoo-0U zs=rMVIkO+GM&oM4%bH&9mN$8d<1@@{g?pMux=zJRFskCk$P%D<8;2U&sz;O?LU`JJ zK=4L|yys1(2^wA}^h$rs=EQL9p(ct}(8Q{QJP3uBC-10s|Q{H(* zT_Ljqz=7qz9@I`*`~cJ8h)KsqrCH}{cga2jLCWO-iZ#pXj51VMU2t&EnnHE8kn zpg*D;MGdF!Q1w(>JejDa_h!Tya9Vx~ee?*y&DO9_iUMDV>HXU|U6+6IoJHBL6Ck-z z{;9=|1lb;bYdt-Tv;PrYR`g2n9}uN*SQtOV!<&63$2weh(NFQR*6j5!c86_kke(BZ zf&`poVM2`U8E!`hhI?Kx(&1LyZEwSb28lY#&k4MbPU&pW;ffVcO4y+`;_;9Qvu8i}X*belWgh^{6B38(#@RVN|;zNq~=CAN*BibdbVLn%?KhxGdMd`AZl-Ht%nx_r-Ev8?~Pb_u5kN|m?pFf@%tz#vZB6)e%|(i;4BwC;yi zv=?>u!G`t1F;D#slVIlRN4DooWN;SUN+et)I!?B_S`7BG)}H1C3}zCpVhq%r1$X)sUP&oeMW!<()-S*DvOr~`p^6fDc{I9Q$}pebFf0jJwxEKp$mF${!YVB@t8OQR4tkoV56 z?cEENv-iY-zn{j<3?)j9viQz=zGAwZJ+2V!?P-OPswkO}h6e^iYoXpp(K7TIa)nAj z15v7rj&5|sc`>j4J6BvvR5`(#+?5S$mYv1`v20Mk?;sG~`&A$5AKjSWWB=&JRL}B7 zUdyhBp4*WTnojY~iz-+_2P<}!WAE*)hQP|o9q`SWniHr zC}5`5b`-mr4yFsd=e4l>maN|gV{~ZOM&+I&p~IMJdqS^I67UL@$?iX1Z`VsUm%zm{ z@73;Qf4o%4ri5b5fa9>%s$eV;Cqzq2_i^uv{Hg!~xM{;}dH)9@2ce7q|5DW^rTf3C z+W3FhQ7|C1a%j?%{6$432sWUf4*NnXTLqV;^Ts zESXk@$L1>rV=4EwCh#F0J{uYE^S@FGkgN#NS8{v~8ScAr!(6V!t zPfhp38E^VdJPsglX5H9)T>mC-)Seku93|wMF3HkKcRA9iD25w{Yc(MIKXTjO0yhcTvQ}G3K=A&|J|gOZ9g$_OJ!_OOj;fi3^NNOeE#UTRl1?9TIFgNhd5)1C+l9J3 ze{RS|a;O)n0uhueZnHucS^#1Iwnaq4@*5xs`PDg|I(v^K`X-cTs1#*x9j-9gFhAw@ zqF$u5GVJIbvDC#q#H|lyU0_vNl&3Q(q^WNCB%+y_WZnX)U}kuViyMh4c$!gB9gDH(JM3VO&43v@SuwMm4i%E<+m6ThC8s1 z?pVzb%{)B=Md6{l>ol<3Ft_X@$NPkyKZ7YGI$yG<$g(%9T2K3-b;gEqRw%qF@&-sQ zJQYzZ+&4tFRjvIfNddp*-q?OEfRdm;&i z9oi+rWzxK~hAA~JD2bghHVkF}8wan@*iN&CgenGCqDDjtbkS*&y^L;G=@uxIg(}JV zujLv@8*m&v_<}4MrNkn;>+iqpf`XBk9dxwvIkU6MGs)@MgUj5CxrQt>)|C0}X*cZH z`*}X~cPLXVJm*T|DQ=r^fnI`OE`BooyeaA{2GK%l{LF~4+w(v<~Eg<=m)AM@_!H=sS2GYqA+CKpKeD>VN zUU*K!2TjL$aVs(~1`3gGvL}Y{RW4|$iui%Q-1u_lZ#qh2z;1+Bz$XG-sx{3+ae@~N zB)i!1N}VJA5WrhUdSu>Ks5B52$p&q>y6rP+3jNmD;9AvZn*WI=;gl=f(2A>0yg8DX z*R=@QZDuEH8hlK)l1#G07U?p8;Wssx+aQd~+vvMDIB2A5u<5qCo*T1+Yi^^ zK0jjLXId_#`OgO zP=iT%$z_JlJnKQ{AqwNuV+aG!1Oy%aY={daTE%ufNxSMr9^?8pkU-V_S+Qm<)9YH} z1^5GoeL7zpT+nrN-~Un+;>bIVK&toqQ_%{#BPt7{p7BzXQqk}SibIUXg0P4G+uA@t za`Z@zrS#%dk`fO2Px~c^`3q$9{{)@v2>ILCsR6*7BdKS^ER5NZJ5?LIa@la)*NRwO zB9Vy%yub8o)ckN?{q|<|IClIBxV8Z^gIE(0&V)s_9ZIm`GUb5ix)36q;rxzs-$CMb zLO`6ab_5PeZiH1E5gk|c!q1)UCr?zMsS7&@z&e1b)p9la^};oOgvdn6Nv24xOsh=d zRaChOKYLZ>C>n=7G4}!QE59&1^WwsW60Gj{PrOYZNFWXe;k!1;Gs~TOXj64d*+oV) zxkm_B_Iu8@^fX4VVHhLa1(giygFF;gj#omAw=Q`Uq^5-u5$Xre;0yBC@MNfsk`)DW z9*ayLC$W#~2%nfmb_B5>^rNM{V3@rZ0g4!z`*#t(ri^$x_mV&)r;L;(E$P!3aiEDZ zQLWJeO?Bsfic`J+M3?9S&xmN=OCx$h_j(d{xO8&-9Z0EtYN~Q;UdWbms6nTyF4F= z=SF0Rf+rN}DztSn-UfX@#r;QMaRmOt{y4#U7jCt^c#jS`S`bTpgT3fv)AE_`>y452 zYv}5___62S+8}y)+Hv4-3?xJpemjz{IoEbw?F7LjGRV6mx1?tFqAIM?fY~)yvY-NUZGRE;f91S;&#D!i@T(3EQ8dDg3kB z<+kj6$v1=wo=fP6)_{OHwpiSjJ4_Ys@#kr#-0Ury>D$dplKuTee|ywsYx=3W~Wtp2TVa*UOv94ahz?;S)1+jIY8o;Jn;9tYn_ zY`QNZ9|zk0A+-T-#nHDEOoiMFG7J0bPnHrzYKW6DzU`;XHKFK+7t~Vy@b$^Ub_SZq zOM$NAjQ^x+gN|Nv@nw3Y(~;J8_p#Fr8!yfSlH1 zzNmhb;hgNNv~=}Uq5knPX}jo=QC!ZH8H3wM(@^WuuTWMh&o6}-CsKvP5G-&B@AE;QqouN2bbKn9q1@TS%8|{) z*u^}PJS^QG+pR>2-Gle*8xb38zFest_iqf;?l7Sm<1LQ){lzp$LPEm1{R188(v*Qh zWL%KqZa)+?s1i>lX+jJX;6)Yl(zPGwIuro$m|AA0A)T0IbyP`?4g(5vWz)AG#GuUH zgZMO(i3I71f;8t2JVjeav@FgXyHZv$#yBj006|uv+@48<_&BOX@21YL;4(%A#M|D8 zThMH?05ARsZS`b|BZ?H+fau8#SWFXB6Ved?bJ75n*K;FPJ;7=|3e_YIc3qc;RDJHK z|9pohRXTP?xKqPjKBREZo#lH;>mmBf_ENd78DD)s2G6Q}D;F%BQ4{aj${VwNsH-2|aFlCGv=^c{qd+liF!=+c-3|0Ah6tKz543 zjGFGBojzo@+u!g+`laJp1}0v__DwfsP=DU+nTHGRoWOcMWwc{sPvM;H#erGUmM+w}`+>2W!+gb`(u?xu#6GIz zL=_S>JvufU#_r@6_{^EdC&{K16^+4_kZ_V5T2m(#(}rf1T7{CxRXIK^^4cNR&)7@t zWCCYWvqvFW6y+yXt}UQ_BLrFPBJ*aV)Eer!D6?ysW@ffFStF78rX+?Y@jI0wX$MH_ zWHrk*yM}@2h-j5Uxw~6=rHh`KX866FdddmER**}gtL<}ncne(N8g*x7!p%M%4Omr0 zV3!g2ej0Egpe8oF`N!>F0YX_={b(=7b==b$k;!vcyQ#%!F@)F#BQ8*^srZjLokC?21n)odzfRi^$6DnU>~1}-(t zc@|$39iHRBrlq(q?x%egJ{vT}c8_X;Xn_>F5z22ji``lMRF@Wss{sDvE&La}=mlPf zQuaiGdvjjTMUZw|+_35ibo+GNfU9mrpjfDA?ADHpr zIX_7tOx>vV6gbTBxy=(VQi?|VlUFE!?|#SWX8p{cfKzzt8+&YPECBqm*9XYWBWNzP z`wBij3X}(!FslL+&nSs6P?MjT4iJL+NqiMRu_UCR=1;SVsUf30W5gvi%XB^Xm30I# z6-)w7hnbiz4#K8>xzF<2IEb5e?K^=!b9q6m4qS~4W!eQ50Mj5LV{UCG0i-^S^X?JN zuR01<{PoSf6T{!&){Kgho27XjnXa*9vm{%CrdJ;ECL0Ui2{t8P1ck%jer%%XLSn@L zRG39%Dr&gW?S;GwRUxLreM8AMxEApHx|is#St(ZJ=DdWwetWew;XLE3oUf9*}3SZQBgnRiLl16lnpbFL9z1Eq6J20cO6a2^zuy4j zROb0UpQwvwB>mlU&jcj=NE@QZ*aS>TPTit%{&!oVB44^B>|~LaaVfEYj>IXfQ@$cG zwa0GpFEUw?`kI23=%1mi_406T;jETZjfVuc#rMLEQG0jzsPma!WnH8`BAWCr{DB?- zj6#=z@@ftZ;VBYMK7B^fYz|K^*C1VMTB2#hl-5raFf0L@L!)4YOeY(C7N~)NLN-rY zR-+Emyw${tj^ZE=vd^zgK%EvFLV`^26fXs=wabrNP)uC~o2R3<9!3(ekY`uJA9_Q-@hCXTH7Zoi4ru zMimMIYgO!*#{zB8>#cnJiMEVE>NBm5Mq(&v2ABQbKQ@pNvAHZltZ z+gejWM|0==(WL8{DcAP5FJ05fy-J;Q)tj(d$P)=*<^^0DEFT{qC6$%h7e>_B?$w=` zM|qD(`3pAqqdMkH<^ipih->?|yLfJYx7c4djwm4Re_kad%)=S{hKKmCOCE0TfA<*E zb=bcz2MplbC(b<;f~Uv|ADHsB$dj^Wcj_n%dS+Tnb~Tg@ns6ZyN<@>mWrBeh`-^xSab z-A}#{qu}AgL@hAQ2ox~C$KUj%m}&wuNTHy@SUrREt366SiD@fL~JLf|4!E|6?#ds9Ck&vQQgC zedxMWxNs9oPpZ~hcu<0vPfk)I7Gz*~Bndw*THFfp74HUz?kZH?k-~pG+V!Z+S6W=d zDTwx5tO-KYkdXdtv zyip_VK2BS0fj6_-C7PXyqeUNm7{;OmfL8nU@br}5)a25b@RK9rB5*McFy^FO{`hWA z&ucdkS>@S>k*)I7QU`DmmcwXRxN04Bc`U33pCY3^{mNCnTb}H&^j|>Thv^*toOmF< zJuUvYJPDCrw_bza*@8>i0k1~i0v|+3^QP3viX{w%rt9?i=G^q0V)2$>ZQ%yrefJ(z zP3Ik%wT)tut)aKkf;rW_91(c=YaE)C+wZFD1&;@q5O+s?mkjxfvj zV$AXwJ4;~}*8U^FKFuETcutrkq`EuyshaAmdfgRH0u^lf zvp6y?a_Eyg=6#1=;{D?I`H?n&Nj3qn_1<#~uWG;G3J;&}OjFzgxfJ~+E)kzmX=rK#jsAK;dyZ#5v&{WCAw2HBRdxHwhp49F zf7nEJ%eP0oApF!WeDs-!ed{snlpHV#?5qH5q?*!eiSnXx^*ejFb0iu|IIIM7I~0Qr`cNe7BusGvlIBnc;^Ma-RT5c%Y-@(6|H|P z!o^wrKuqna#1vH}%PX=Zx2(40faNj$^20B8FoC^^j+ei|O?)k4zG=Vd78xuA`{poQ zgc!ayTEC$kI{URPhpz74>sqph>&1f!qvMX}d$c4srfNfi?3W7<0j#WPpF^uR+bc+S zDNjs@S}sjv#t=fsC+Md`v#M&W1lL*jBinn_9QzK1RMz4(xsTNsimGP_qU7ZqW)ygv z-H9UfChzaEiie_`z&0z*rY@+JpZhy4COyzXGe+})u1K^-I`Z|bj=@&Bs&mQQMb&S4Xbr`$g!3l*6y2uh!n46b zW}Xir3nGMLqh0dP6!F`}T~You==RjDLJnijE!}j|x}})9=9HB|DaR1*ABBTc!?E*d zT*LLLUjO#dqnaqHThU9%u1Lkb95hw^ZeE2c7og_;a%)-HwwjuK8u}$dd?0xw>M_Fw zs#a*ZTA?94DVuxrsti-?Wh_8wSJ}s|mu#XWeiCj{*s@v(>a$N0{JNd#1Xaucd#BiW z?Xwu2xC1ixLd!p6A`hORaf2- zcq>Ppbc`HYIN#*t&)$YQ)pSIXc^Oooi0^T`yPooSey>I$y%NU_U6VJ8kt$|t1 zihPrBp$9Dyjoewc=D}V2nil(jJ2qa2!p&5EwYADtyc+lPL}qTX7%}dA*B42_YueT73JuYp)lW=L#h2s~czNFA%ktA#-TrE_ z6sy#y228A2ToM)8N+eh0spls`x~DO9_nulJq}S5zmpX~2qQRE%SgsuM1x_gAp`p_Y z_B02b#x}>EUd^kx!C_(K(C@fM_MZY|coi-J$qT?vItVZ4*VQfpVOi4foc25K?lsU= zxEcQFENCL^kJ3OH6UEnS#~~{52;T!0OBSUcPuiW~_h$SrUTLm7Uck~0%*pki={_-a zK}~*u{wVTjx38QDKSV(emfP;{*}@NABb8o$`F=$AR2DeLAr%E1=Brpal9GJa88Ub4 z&;{|@%^o|}d0OM*fWQNkGiy$`W$+CT!UFjDebl>cMO;5>{c9&b5 zFQo+E+>UQJL()Lk(Xx-6g8xpu z-4}DlhL?>YL``<(4NK-+IeCkBmJ>>*0ANL`oKR&hU16EDp(TM3)Dog2n>>>hUA8mD z&M4fz&oFT1OyN99t2_q0?0(oiCJn?_T{7SM*g-ha6b8YDhW8BYWy zzQdP7XE&t#vkXe`oOFM%$@xEi3);PL*=@1`o1WP-50EH8vA>!)ouqsR-uwo2I<+0= z$)eEZ1nJHg7Z9rh0(EL{!of(M(%9v^oRI8!sj&JKRgXHfB$LOKcONa+yZ5MTnYBXd z_#N0y9`wu^C?0eD?TD;}^NTU9fTyz}&z|#vN$u61j~)5V##^|OvnFYIyJ{;W9f*&# z(Dq35=9;!ZOlhkv;BT*FcWd(SMMy=c{t5ieO`w-c$p1fzc+^; zePC_w8~?^4_0d|vLz0=-83@*1WX>0FLz!l5#Hxw)OZG(ct2GKHg&tB_6#@8KHRH#AdL4eKvk`=P*83PN#&PawVU`yOFV zan&_E7U;Sg(oDR(78D_acPC$ zk*X2~dgp-%DsZAT0MVKW+A~e7%Pz{0_b=Kr)#DBI0Vy1jr1<<+%2O!_m&m?rLaV}z zD@s*>sk?DpQ8iqd(;xUVDq;(J3>Lo4p8N=lnFeajNJjq~T@lDzY_tC5mG0hTNt5l; zT$~eqzi5kVGhVm1q3`S*mG#uXR(NEsK5(1|atk>ZD+(QBD=T(X`~Sw=T}QWyF=q_=e3#N*_}OmW@h(n|J?_w>sH-U zb)V1uK3a=~VKoOd!jkLGxy6G5-gF3sKJpaaz_m|Two19}Gkx_o5)~liud1%YUy#_& z(y1AL)ZNk~YmhCrA`OjUq^;(iI|T2c|3iWHc8%njdh=Oc-`Z zpwEqwcCTQhbd^R0?DxMZ?@KZ|w_;S03zS(TKaJP79e2|FL#DtgKRO= zDNC#IVcSp6F5iU*fM(K~YOj<#!~t{&Fr~+owYvQ&8BUdxPLtVYZAed(4?=gx?LbChbxJ(I2 zm0_1%HJTQTMTiHPvJoQ$ZMUWqM^8B@UvtPMOXS)FDM=&y{KcT+l6lrOvBZpKLz3Aj zH%kN}U|mZ=nQ(Asc{Jq%kxt`^&xZRS?A+Y8%*J6Eet=y*y{!8L5sZ^?5Srv_2ytoC zM|DW@Wp$vwv;j8~$ce}+WvS_f=*QSOxC8kw4HK=JK#B1;<^Ci=R%bea)#(?_ zkq8H1;vV&xXP|;`iMFG0iH098b-$ZCRxyQO+>*iJxdgoP6Ax4BzzTCHS{TXl-*UIM zER_~4E1c<{ibI>3FD5?-QU{&kF;JV>P=O4l@Getz2KaRj=-C+ozdnW!3OnJ)5lodJ zcKm+Id6?LAAAa~@W|&!9yhbqjgNLh&RP_{Z*YnCdQ~dqbkVu1fwLEAK&rz1`bPZ*} z)$#`ng;tK}P75p-W?O2)*Nd0I_oq|AJ#83(A$Z1CyJmkQ!wYq>}W|eK^$=~b>n1sQ(GGMWcU`+8w zoC2)?MN;476Gwo8L_?(-)k&Uhe391rBDWGn*f#HprVn2+JvaY zf&|Y}i7Ma)Gvpgt>mT`qrbS4W_wL^opg#i+_7bw>UZ0USk2&uyRVjkZDNJkCQs8Q< zyyH1rWC6d)aub4h5N#%=KbBYRHVmCbZYy*nUip~#jd>=fflxO^phr_WX`2tme#3Q_M1NrR$CB>2%MM^s)nK8CYFsf_hc_;O*X+v z|Lo)e9o59FtNN2cW1{hN?ESoXFDJb3f%-Io;2SFJ*3S~5L>p#z@`A=9nWkVnLNMrM zVq6&^Ze?J$Dr*7E!=7XvWA;o8dYLqjV)b~zjf6u-R8ULud25Z{tz==HSAbCUw? z)^S(Z=R#m@@agT^Z~I(#4@Um*-7^Pso;@KD!XQ*Bv)$Uac7Iu%2?`ip0wazO{BlH_ z8468{sx+Idd88U82*p5evGP?B`t+`Y*+Q>wOoZ@P&x6slY?g*zi}yf^2$ z5fFyTluj_yN_n?O<`%Qj%Uvhsza7)i`Nfs59!)GM-HW?4fvJi#xzTxB|Gu+XxJr1h zWpa_BVizvbPHhN~#!`t5JQ_NSK1+ByQCj|})X4gTp#tC24`*~xip*M=<~C)Z<0WSy z_QIMHB=2Tnd~>jgRYeX>-O8&iD%JXGy~+8#u7S4Ro%N5|QwcPT?&mL5sw(+9RYT;r z%`00=5f;=6kuo&Q6wRNP1VdhFu2_stg?`c-WKdWU&{eaKNybl;`lb-G7WAg76(S$& zDeE%6ukqREsd+TiHC0QV!-;0;*r6y=(wa@P|6{~`*BJ`g1)MsfDp+s_$s9WzG7VI@FVJ-;`DhX zwe!7!_PQ2z92+O)eNyorWp}^o#jG;`ft`IE*6C=O0~c%9XBrddx^`I~C}ZJg)b0#? zH2Bb2F0fvo;xaXu;9&AROIO0w@so;i*u53p!Cw-cna$Adk2)_0$8Kv%EW^);EEZM5 zQoiX~r}oT!!;E-LRWc^d=Md;4@$P36eVpU*ivoY+cC15TI)|hi&xhrztjhY_2r?y> zAqtm+U?6gUa@CYh*){L89lYIleiBn(1ioxP|DOaIiqzRZE->XO#rl!i0vVphaw)B^ zZ2%Wf;^@hACh$S-9pX8)wvtZ=G3)J-$NIXElI4d&(Q#7wf|pAT1#Mz08o@*00SBG_ z*vCDwiQ7#QM`>2GZMJL0Q=6~u*X2HVF|I-PZRS#Z4%^J3Af~N17g*1ShprQPBYW+G zspNTV_FiRo4mbbk4t-Ix-f#;dQ9F{wS}fCn*g({`1-dG(xRzVF=ezciBftK0M^~oY zGczcT#Mr=6Vn;uMmVi+y@$P9V42XSr76+d6ww$>BohVf)n7~$2?evV92cJ1#;0n5w zzOUw6ed^A^tpQ3&ufiLGr3CpoA`8>F?wtC@$~1;Hv7{x-xtHIQ(&QYnyjp1HAuSdV zS{bGsGr#b=mzEBr?{-<$)v3e&!b?{{P|cz-qgQnfNv~;2G082HkqPECqt?HOp#1&5 zU?Isg%_+<2fn39K&jw1+@@_ScOi}XAN4Q884LR1_%N8i9tXA`PA~NUyG@#-@ZRqV8 zRf*7g1AE#d)^I}7+fN7nN)g9F_8~0hTJ&nzZM$m|C%O2?X(4qc(Vz#X&96cu8X?{7 zVF~Zl3PDnQZ9Soj^ZBnA8WFU-naI|H5%1(0I+pzZNOPe5O3IE|throFMrO0HTaGgs z#G{w{hd1cvu|gAdAMOA3No!#t@WmL%aX0JAS1FUAoRP$|6?NkRQM0V&znKFcT79%Q z5d!bTOm}_5yc6MVT*(D`X4L+14qO;6I=wM?HOv&duKY`yJ~sIsb@q*2ulo6hJm9JA z$UXq3+7GE7l+Bx&Df>VhQGct-Dx=qfT$oROM>h;V!`fu%cgKxziFr;R9-(jnG4rHJN<**CFtLJe7%#rv7u4;Ppp3OK}$|4PR6P``s`18oV# znCWZHBwqgfs$?);PT!jVKMf~mtKVJ-X@*qLK-&%D-Qt+=(AWn!hz54**R?lHeH&w! zp@(+m%CG0nZ*PoD64IRseVqIr!3Vtbb2+a=DrFI@r}D}x0d+1tpnRqZ@;Le?+X|we z&a@;F333MsW8^{dF34w<)DxQ;OY87imy07WEDF0n%8NZ}8&m5PODEJ={f?3tt}CwM*^qWa+q?XXO#w z5d)NA(wg!&Hvg*|Vw74L-#j4rALQuWF4U$S64j$fOB&K*%MlP@%s9-e}H zOjvw!%jux1IPrS#s!p^``{PP=_CP5%2W_OyM48;5>ivaQ&Q+z1*)Hpdrw?mf-k8KK zF`BMK@_)n|EsT*{>pTQ!AZ={IWI+mg&}I4_j(>_5)MlC$bgkwaT`g=2PHo$qsXIp0 zI)1UCW6pHMoBHwWe@tkk`MKfq3oAQp4@esV_RXI z<{$-|5=&oUpR^8_NB8Br_mCn?!eM#eZJgPU(3{f*86G;vrcIUf^_J1LFuehAvx{ru z9Y0!o4$;^i*%lq*Jfv1UBshf>Z|BhfUBa3##tkR*T$MVRqqtVWZ=m5t*WSeRdZR(( zK?z^j4YU1?-_qa=1NJfS2k=ezq+rBGo3f{#sDTu&PKEeEp7eIlsx+LPleM9JX z(sKP(!8BbEif($)&|%hOOg)mff8n1n>Ws&nZ{FuZ5*ZOC*{+EiNP?>$vwdCqnkXz2 z{0@VadZRyIwjq)>kBs;u&`MV(aVw`d9hp0qb}uHD(S}uyctF7L|X#DGU2x zqEtV1GLR#ju}J;CO(dgnU+Ws}LHRLHYvA%B4&g{nUsWGNAYYb0r@M0OEdFjlDT|kb@w}LZA z%OA&xzgdD4O&ceB>3D~0Fcp``s<4_jVhUC9@0++=H)pGj67J&Tv&~lCj~hzdBgD%i zpx_cqftoUPk_T9&AEvW#kg=(6s~Fy-$(eeSU;;zg;|uf}5pz3yRQM+~WOL7Mj3kW~ z%kjE}3Ta2lkp}K=rF6}uK6AaS`Azx8RW?IagMDmTjQ^{N=ne*~B!V(k0@Xl4bUPSH z;-Ug4XCkg4Y65QNd_(=)TDOPhDU$UqfnTa8ffT!qSYvkfdr<-ykI4^UqYN2)isc;; zoXKt*qS2B{5|zu9a-q_cV9SrJvFQ%m05kTb2!?#B$D9ocbOswAz78Z0}Zm}AkC zb#2&XE2@9X3X^daDEZ`+xG#e!tPRA$Pm9BRKgZM>IxM#t?{{kV~!h{ z`^NJCap~SWL2Kmy-f@gTN>rc!BP(Y9Cy2)X434NM&-724T3_#6lKjsOg^PdeER3vf=tH$V<_@Ja}@ty{@A(OCa@zw#pCW-_ahIR_sY#vKED5&zfiA8ZSvluiN^e;q4=i zcTti(f-dKy9>FiVEFrCE^IZAsEU{9!zjgcxJALs>y$qJSY5k}3Z+}l>;=%lTy}~!~ul&6Jf;0RW&{1oGmN|4U=QL*UVUDPTCsWm7hBdFz@4n2NWXA@hHG2|q zc*B3iMle>B>x5I&hGxg+QP?dTT+7rpV7XMY{`OWB%mI0==0XLs3v zX)StmS+A>uPj2C1`QzVl`w8tQs;3+}>H5IKdynT)Rrj&_)V1$r<>Nlk326l%OPHKa ziq2Z0o%T@2bDXDX`%WH=7H?jzV)SH1^#Oh5?iJR(_^&G&jQHzHCa%I)Lct{NxhB`| zd@C0VY_yyGcJ#94n7-X0zrI4~?B+vr_6XT06hj}8$D_fC1)Ap$ir2MFYVcKdi1$)3 zNeUAHQXMG%DB#5nK>!!x565fr?=MIOk5aOB3USYRcF&17%z49xispY@I7<87 zQ=IA?KU&7FH1m+#lyGim9VP!t*YfPk4(+B10dl{kFa3iM1W2%lmU`u!#xKQN5%l`1pvVxA{sFC)Bu`2a#QcEoWDO?AI0d z#0Q~XK=a}Crua-=tpip9=$&+V{Rf|vPLViB#ae%_N1EZO);y{%hm+S6=k-jxnME&B z*Hv2neCmeuYmdD4--%<00cnE*owzxasruH?gSOzr(4;mmrx~9IAAfR(R$kG<5XlFO z+`(}INDTAwMkh?-QRwtzvdSYMDSaYe1<}Ea)bjZk0OAp9Exq~lJWV-8dc`MvDTnXv=MSpAj+q1bH%ZtOXA?qJ*2&e3s|^|Di#t`59DR+E&l zG&UtDzRTy!JOJgcqe{{sT7JA>l*iE7MdVOs3BwA0-_gsl4mQ}>Y;Yp_X|KIWIn%7y z_u9_pXgP2D*={*j_{|O1RKR2Nh5z%BJGOiwh{37rcIuc@q1fBh1XIAHv#$vN>YBT7 zZF_rl-F-{5V`n^iZME+ZAMe5y+SD|ql-J`w*;@L`ai$p>lbEV=?L81k3!MxZsKst$ z;aS;RekddcxIG^lp(ff8_jD35VjP0Ep1M-6yc{dPgyC9r`a%uZM6zG}r8+SOVbz_e zkm%|h6J_<-yM4zU)G);@d-1_0cl1Q|d#Mt-Nn+pT$np+v4^ARAv)$j84n4P9z9*G` z+CmsiCQo}*e78g={C2A^9>vl1)cudzsV>B}uTE_!XQyY&`B$R$WNn+q3OuK$EIQ)VFr4t+ZyF?)0wcsPE{u*e@mc2e&3zRxrlTG6iF zx(mPZf`otcv)x))Uz6V@sX%U%wPwbzs*B+qatGk@`X0R&jA{ve%JnIm*ZC1XTM!~3 zXz4~o`X^#_$7-mSF5YsayMcYiz0@T(o$CD5{`US_#st4z@uc%5fSRN!#DNHaIy7jD z^GZ4Ny`v{t?0H|C_}S&%o1gCCb)2og8KVdB^za@UC&2$yx0e-;R!#*G%1qyEiE7Qr4P38w|>+ z|1>?_HGE0G-8~>Jy1D&&x*W*Xcz+rt-2cb2)q z3!f`ToX{=sj2Cy*#QkTlJ%kNRSoPbf@EiAyUZ%6I=JrJD;WWp0c0gkTgAca$B<%0D zq8FdhPqXzz<7%D$8x#8BRSDIWQuTS;CUoGdOFmKNycb$$q}-^(l`na5?)yws7+fpf z2;(OuxJj0#0=HTN-}uXJCb;vR{c(efG4Kag#_<45$?GEEa@N@U4@hiVJGB7EfHI^f zlWZIaxRX!Cdv;+DzWmO?PlRH$zD$K4qi9y|N6+Y&Uc2GybD7e5Fsr)eV*c-_cf|E-_aB$Lqi(ea7Z#!*i?60;?#s6=#Hq_0)kA{@~uBF2TvEM zL9P5D)zbP|+&_I?eD2}S`c7Y{ib)+XPGMnjt-J}slvjVTB_b#N?d!m<_^HJ!mmRsOS^|Z z1$FCZwZl~L#VqX73w5O5T`1siR}~I{Sz)febD%ziUd8KihxooBi`45Xkk1aA+2~Yz zdkSh+RFz4cQeyDMSQ8CwWGd~kTZ|4tIM5ef+WfqWV=hAu2Rz?wDSS;nr(n4Vz!t$VGO$=?@vqUnGqqz5F&}+r!C&4{a6bP5NGj zWMc8>^b5dOZT14orwG+UK8_&m4v)K*9537 zHm~%fXZPd2CTn;4E^cZ5pp{-Yk8+#(oc{+99Uazak4UtjWyy#rT{m!M={`8nU{9Y> zLojMTS@o7wFZ1W>b#uEypq&ZRHmEw6<|==#?kiT9aYwz{pTOf>nv z@5B8ZM|rcN3O-o8$-%%G%YNUwvDA&{!90C%L@?uP$gmPH?+ey81uB_fstde+;2@DA z3)e(?c#Ys6N2gxCLCWXJ$&gLaw@h{X1X<#ErBeMGdw6s)Rj%ein+d{$?Y%#Gdm(sE zn0ni1e!QrFL z(Dg3teNyesI2oq{Z1)~E`MOaD)L2mGpkkA3mh5H!!|+5MU#JC;$XmZRqJ2oIQQY}R zI;v^AF9IorI0D-8dq&-t^jZEkz&Gv;F)iRi9F?k8dHUH=5KyQRjYsc^$hTaDQLNfG zI?j$iarxli_~>Y;|F3n5A7yfQb*jd{$mkWRa3WfGTKagBl(Nnrm^_Lhkv;0ki$x|i z97=oQ<4C0wE98idn3do+7p4s!Fn+Ok!A4#4$=5t2F%)2YeV}_+Fz^N0rL{VDa?!@h zO@&+99_R2XL5gqX%r{yzWuoI^t8S#@_%FrMGVHnDBd}0Iz<7=F8&H=rG%9N%n8(kw zNJeyK2GpU&$con#j+AQC(yi_Hy!CK^laiTP*n^+8?CP))-Aj&Iwh|FSXRAetIL zmUz+pGM{b^{PU{|N>616Ma%^{VJe+(NlDn6E8R_H^RD-4i0PTd7#GCkd!8g#@Y7I6 z#>!r~Eg$`nq0&Yha__|tCyC5Y52zRg-J}3++xPtbTs36%?=cCImg(BLMpR-oE(5z5 z#Q;NGdeCfpifur@4so)cNZYya6dB{MYoh*^> zERv$Giik=;FKAM{rtrq4bm}J4a10sCHT`Rd3>ligcORu#J6yjwlD)k?eHbXSdj-T=0gJ8FDa<`FQC>8xh`!}{ReU)WcW z?vw7=1Q1T`;i8Tc=4h#`qT>vkWp1MH)PGmnwM`*6+xU zkgBx{Q7VS7l;RW^DrA?;!7inXZBBT~EMp1Q;X@Xw;vadFOb_rCogm6B5=v=@SJXG0T6<}IX39- z7s8sPU|IJh+KC+MoCOkNu>^E?j`5~{5g{iMKCGZq&2Mkwd@eknAAxDBTPz+7aL#r8 zx$m0PdGLm#ZNIsH^~Yhu?b%-7INlY8xv8LlyZSUo^Uz8oBY^p4BkQv|@CoC%_$Ewa zB$$~Xmi|pLD{53fP{_vRsH3r>7gT^VV;fEc_A4$3wDg47nxv*`bNtbK!Cb*$^KGkw_D? zILiMR$KngRK$)cg1?y5h76Y0Xa4WA}+>J+pd*-CE`9>i0T3?jBq=^LX|9yC=Q z0d%!rYrDT>6=G5n_ai`N2qpLM{(P#`DB^~?3hazd4+4XEdANEl?Al@x{)(x-0xaaM z-90{rMwklyo1IFXvf~>Bx?hsjHf<@(hR+9$d3_$vVn?m@k^z#C6iFfGsoS@WmnzKh z%#7Y~8s9`(0g*(C*Uy1dCs=WIW+_i-V>?=yUF$*LC8YMhh;?Dfa{3n0JXsFmVOend z!tXgBh%2PGCHiQ!ommn&<@BL*IM?PKa%z!|-XDpXyNcSuQ4k{;srcv-G%>huD~z#O zXkkL`(;g^2CH94_rrSkYc!cnmblX?gOC=k#_B!kgf$k3I{^6f_``C}H+8+&r3oFy( zk=#xRlF8;N7j3?_I%i$o1P_VkwhZ+ule30xAv-;dOkpeHNv$%D?3%k$ z+*KOcd{szG{`_4Ew(n|m=F|E=O1ZXqgzpL|G>eTtDuls~~_Ee$l0(S5}G z){$aZYI6e!x+(!U!d@3hTjbBHDbr5v$^e^69+xz#oSpFO;wc&&4`XNh3+xVa&)e?( zj(Go=+PU{6?U-Z9%5lQ*N2Bngty3p`nddv2)I!t9$;2JjD^q`&valFG|F;FuZ+SKU z#kq}8>KP8qZ=UaOSL=*sg`m6dC$5mDumemyF--3t_VafwT*tZytY;#m*)Wo;_g1c) z8&`7VQ@F3$)qID*CHA6%pIukUf#vs3%2jMyjE~dN>a95BbQrzflDkKJLam4OvU_S7 zCQwW?%m)!9hVO{eJ`j_8>i*hjJf9#yT-(hbx&5TKxGz??n(m~gcE`Z(*8_5;G-ssF z2%s8+aIHhijZG>#mJ`>R?7jey%II2PAm(MN>v0{AzA%3(`JdpF{djCSGuSl;qus5a zEkmNo^(_*HkO91$sDnSpUS^yN?CW5Q{SnclQzO52)EA?1F%}4E6~C}PhntQYXzvq`vxPLRy7|z^uZ-|c}Q#M329IkXvjCqR6 zS6#PH&AwcFUK291#9!T=^$K8Y1ROA#icSU|7Mi2gsq$D?P&j?~-+_1(b$^=q;~<0w z)Zo6$;$qCoN8$(Ia4S|2VA6K;*g90uTem{}4wB{|M7d0#6l7MZQUDhzn-xiD69yMx ze4F7&|Amgq{c8zI8|ent>6uacXMJCnA^k;3r+g_iJTvzI9y53H^>(ZO*p?0?iv36& z;oAYs$JbbtLLWMmO_|y>K4_B9;MktQ*R*}DAkYhXK+71EUNir<3Y<$l$Pzd%#N{G=4p9%)Ao#X&;VTg)@- zS#N(bp!pm6>DqBZm8Y1FvTSP;teY-=!S@Jk3v|!3?-*L?IRnnmB*`Y_t%eFfYvOT^l&45O>Y@hJCl0i>_-^ zCaFlsrm8xZkx-LB(itE2wxE<~G7&*0Jeoe@SBW!N5hQ-if)bh}XLDlefZv6>mm}@3T}mlVr_hIPy=i()yC1w2B%K6mCE-c)`A)j++(&>g zL8|{COq}AI$TwX~LtM#Q3e=MRidwW4h{Daf4v}IwA0GSPSW5p&CQ{EiQ~I1O{@}SE znBNckV4L`VFch*a$@Sf4qP+9b>UszuRCM}IXZ3SmCW_lS@FFwC?3d`Fnc3lRix(O+ zSC=!dV<+z-h+cLn#Y-aRUg?DCF!&=Jl zm6|czdQBt)X08P4tqp1vaOg%Ugq>k_l}?lAx5g6XI*F#`PS?@(%;tWvyHh3^GmBaw zbsB7=hBaVXqfx^=L|ykrhFgZ+3=wO+vRMn9E1tZ!p|JZ6zqUB=+y2|YdMhQiujBwQ zPl|4&xq~gBs;YGf8ZOz%CKAgm`O%~=%v*SqRbIpD4YJ~sEN*B_RCe8XUhLi3r@v%x z)Hh*B#q7|Eaq9Q>sVUi~pUp$Qd^zN_aEV|f#%23FTL+`F8E<+1K$oN~g=zEg-@-Y6UR`(}>PZft_zD+YWe(TU@Gx<}9NRi5nOA7TK2)+W?CB3V28Ubigc zLGGVByO`h~o>#zkKK4tne424wjmz(qm;2dq9G%SgrKY8axJk*_NsRah&(=Ui|5ak@ z=jR~~2#!Kw%^hi|$H5#P|2SIWuE=$7A})Ah1StdRNJ27dhU--e8jd@Ua2|PlrvB}t zL}1@Zeg0zpf9Ip5W++UkXZnDNZ2$35==l9Pq(lP^w6+@H^dqOsc1+IWE-4(>FaIYW zwRLj`W9&fhxtfZ`Azihw&@!V5L@~~erCY8r%+O(n?8H$HHqaob>hS5Qh$39 zcd5eZ{2*?I9xJjxs##NdMqyFzM`%$}DKdUv;}uwb=9;R`;ac6-p^m?6PLTX5AWX^?tUXkPB8#|B-!gipNb%b#&5XTci(M=P+^+o z4UI$K5vu(`Dj|9#6g`b8xZLC|zFHZqLUJEuh3$4He$Ji&Z*gm#_T{-6KG%yLBiRe?9wEA zoKGaruZqFD2x;9Lndj&hBNqjOgD>}2LC`*UZ_Vx4Ve6Jjuu!f{=RK!?OQ4uVb4_`+ z;;J>Hww%Fa3H+9+n!)JzubrJ+RF{%>9`xaowpMzdq|ZsBM%U|V=C*f3p~OU%RqObo zYO~7k%kS$nu0{P)MNjT%&$bse>YDG)ER#H1YEgo+!3GemwRNe$!T6eO_nC?0A#bF? z3d2^$Jx(hLRD}tvjU@Qcj7;XR3+ppsnIu3b&G!}pCt!Drkg-|XN}#P&)tN#EkOE|x zCg@a4tA~q$*>B#R)A%7}6Aj#=zHvNqByF_t9tLm)6UQ1_0imk$1GY59E{I@lUt;_JGYm*j7`60TyT%hh1xF6l%up2 z2#y^5sEcSQ{7@CDgtXS2!U?Oo_gz>Q%c~l>G^o#0q{mRXz9l)m)0AxL`s$3?=OGA$ zY0n?%z&U-0OqqBht}Xo`rQ`s1NE(-cO!#m|?MWa72 z#*s)*rw_b7TerqCBpX=S!j{|Z<%;tV zB&mA4we%ysj>4CnOIu&GcZXs{!EP)9?DP*fMygHHK8J&{ebI;Evqzx#s&U~0zfBf( zf0`bymiYhAT%5`PEY&CZ%~fM!PU+L%>KG5^H>Q z{rxu?W{i)gmhW!ng>y|U4w9wQc+u}1S+>db$i8%EKbXu)R6cRdFA6-cW~f<; zRM`C5+WTsB-J}CSKwJ#P#dC`9GT4>~XMI}SHXrCS2{pF(1Kr1nLyG5e=>#H_#AmB0 zSx<(>8coK8IhVEqdm)*G%=^2`il7!k(;|%3|M0WbCkYm{lR~+Z#g^3z7wcKyUtVBb z-Z7<@^GCUvuQQxSV^CSK~8V1|w z{b@KYTrG{8fSl|KinZk3CX&6W4lUJb5LHaw%alsm!Z#jM1AdIFVHS&qMZqIqk43$v zWY)@~=vG_`+1kQ(>(qwM?1nNA%3jwWPP!ol?LD9TivB^<gC394AR%Mo z`=w9i+ZUyM3PQcxE~&I zQ!uQ(#9CIdwYT^;pGPVQ!}dH=xU7lQx&4znfgHoFJBc-y8;K7rWqMMNTF_oT8|8I4 z+z}H1k6LQOjwfl43DIm#SpHDlK9Z^4sZ^I<2H{6LS;sf;q%_~m8>`(`#|zoZq|M`z zJ4x%7_u{_il8^O!%5OOnx>_*$kk~Z?Hciw z={uAAI;?7I$f&kEVwVcovDh*}BECpM9^%$+ZcUHseTRt&eR^#qnc814etQ0Qylu%u zZDpS2e|wNm(*IJB&!NcwD?vV^Hk{+^EjfQ(o6f(|Vk{aZ{z2CYU@eT5vP3en8cZ;z zoJJS)l!iz#LZMwl>U7xA66Hc?_!yC$0MMSHKk6#jy*xt9@shttdG|HK;I!2?NWs3T znRB!~s@hEHDP2uRKW%UwsUN0J{_s+&k(+8i-Kk?O(j3aZYqO~NUg~c9p#Q}auL={5 zwc#iEZJF+e+ui&xnfv)PGnsnylJwqeWEv$Z`BZRBD*sijondZ|fIq63#fw%KPGqBj zrncmBW9Ci^J~d1c>7er{w*1|7rS-Cqc}tBGXFXe-t&7b^!@dM8Xan{vo{sulnhULe zd(*Q?IIJ|u&;du)Af5jMnn0+D)#KBXqPBMH(jN`>D?M+PG0{^BvGP^^#P%t(sdvuv zUx0sh`}zJyVLAWRK>e4mng2gZ+xf45;J;4=`rndsqXhYN>O3F+qMCnvXlCc;C;>jJ zOg#w2kPROH`p9g3()tfb`>)wV|Eovw|6+pCu@#j+%>B`L_V$>E$cz|GmOW31aAQTX z`Rd#HTB`?}XVJ^+x{%2i%0U003ApI_iXsI@l}7z@S5}Qg#Y9Vo6^-Vn>#b|E0z-}9 zRx{VpR`bfy*4Cvow-b$JA%aFS)-Oe3C`OUL@VTV=Fu%O4j+1(3QN5S={Jmm*T+34O zYNthh9zX@2KL*+9AL~1|n2UKDx#k?ch%NNmg9Q5fV-0U5X;Azeh+VDq`}bkjo9@r6 zLAf&Hs}^kzpMGVDbjQduxqbeIf$Haf{WIb~_*kDwIHO0_qjR$3PW4|ccb=^_)Lhyx zAHH&;_XOU!Tfp?f27NCCWYUTL#y3Fwa%)01*oK~*ce;r#9 z`;(Zea{Z1hN3`Yl15@wbs0Gg6T#(+@(~ewAa>NF}6#wXQL>gRxj^J?|OEkEK9ml#_ zc|JyTgE|`7S+UR{Aj<(*J7^8!c@h5M{WG&!%%t07EP#d;=ki`DHE7+L=&kIYFE*u0 zxbbB00?4OZ?+ky|>dw5AvIItynsS+MKtB>c-Yq}K*8AF#WgB>yg4SU8r~j_(7VG?5 z2h+#D`R3?1kU*lkIwwerrEicHOP+H%{^0UF)Q-u;+p0bm`D}a4lm13C3|f6p5~uVU z1*p|^-%xw+;-rbIkdH`r{7_O&)%IBGL(w?B#)#7TO^m@CEmz21E?c^Cxv)&c0{9;d zQRG&GnyyhmR0uWIR_#Zn@sj|_e~roEehbFMO155byjwZ0>)R`~mETdcQJ z08J=)BG_|C1ojz4OcX97Z-frVJoRFvexz-=DtOwpV-)LOYvX zu?A%g<4lsh*@omxVu^o|B@mWxCC~*odYSEO{7?sBu({qkV2Y}0q*PZlpRHf2oys3T z9@jvjB!9BFm~Zu>B^L8NSP4{kz3XJYY8Rqy0ZJ;}yA;}*U&D^)H(TDmPQ72`@~l}T z;`F#dqcu`0IDB-mMqYc$&bb+UOw!JWt)jR5e?PSbkrM`B{X* zwaUMt7Xv*em+tt^9?U~*`)aePDO(x0m0D2)^kt|QR>Kjg=u*}x6X3k%P6q+&Y)B(? zOr!iig(&jhwW-)@2;pzr+vPA#F_rCSZ+=0fm2XEj^~P$@z9MvQ3!jfu70lS8xhbs1@@rp# zT`Y6Y9w3po4QOgaUSGd9zO(!lM4_Z-t`>P;)%-wYcZ;;K8C{1WW!>s(4M+GsZc9NX z0OVTPjPmxX#^8I@9BtnkdMTk9d?`2;_4S{3+>YipLA(E&~43#^DO97$mZAi$G}g zfrXP$zTzj{vH0M8_J-ab3Q zC|f0rrH39l&ef<4tus6h(7qn%Z@b2GUw~%olG$InX@hPWZOfx>euV%ZJH2Bd)bv zEbcY&It>+iyw=wOVz?CG=MR+w?_V^B)kdqP{%wh2}!^2HN?O037C!!#05NX9Vw`8z=6JW^iNj-wHKRG1`< zx3DIh)fev_L!B3;&eG(zjDq8&yWtV!{OjTJ3kq5XL(KMg4=T_5i19s>IY#ayS1V_Lp;!l zN!qpHx_TIFtnEZ7#IR^##4vuHosR7&=x?3<9GrXHj+=%muE?1s0dABzkI_=yux zl@l>#xA-HPTN(b!3cFlt?bM!GRxpGoYJyDfKsfeAIh)@JG4zP+t<6n0dUnJ>$-8<@ zCZWB&8hTy<#6Bbx4%@=*re;3Mt+o5+J929};Hk7;iBwq3_&w&O9QWaz4f|n7YM=R2 z`vC%7Md?jpRw;1PIU3OhK)mFUoU>3}>!&F{ge7M|+Z`(#{TN?irOuqRS$<3%}d+^{EU&1F4>c9D%b z!qL~ln67~1MPjj8s+77`ejeO=BlO|^%;Ha0e#`ymF^1eddMj}Vpru>}Ay&W2MduQ#a)loIz2P>INS$W%{@B+) zDCZ->Ti^Y*eJ4b)W;E0BfStI>7u}xRxoHfhPTV{V5>Ldo_rNK*GqDv~Tnkz_uK7rS zNNT-pRA?t2GaZ{N@!^zzra7lawp4^VVioMZe`OfrHdc8Z+HU{t3}O> z0J`G>7zJVphVaUaCvnuW=(2_eycTL1?j ze?E#izGdgT6egV6QL4=wU~WGPqIa+6jJT@OCqlk@(4%yZ|8UsKk=ZYoD)CWuIhhP3 ziLHFZjuk7`YBAW|jydfx3cF5o#z?^U5`n|rVyTN1wKEyoHE4H!$!y6)>_P|8!^y6B zz$d|ceYg0b=; z+#>T&QMzn*M~vrw8}sibkts@e^L8h{@s!tY15wv#4i{kth}SUQs$;Zm)GkqG!i3k6 zY%zIJ4AAI^I^Vfr9u1UWr-TPa!baAR8qx~ARQ(^-y=7EfPq)SyAPMg7A-G%8I0Sch zcXxMp_uvrR-AUu_?h+bzcb(4vecyZUy7Ot)%$ixlH{f)gI(4dR?^Dn3?1yE|`{4(c z5ffKTF7%IixJh$xl}o8>78<%>dpAk>1EOFSV4@f|5MNH?9&2KroKeZD)VzmSQT5cR z58n7w-8HTK$!+3*MbU7Gst7~W?6vO0$rGeb!u70plU3|FY}3a>+)klmjjtxme4RJS z_Tm}Qn(}9MW$!im0=qE=Y96M)M#|i{8^@jwm*g};n6MiM}I=^T*6tu1n?sH0f>@eG{7`6xi?%r2N zXshTobCZx(V#_&`1l0NF0G+;pjXz#GsKFQJX~m!ed{c~de$Ufy6tOmx)K4~mD^6OV z<4%{LDzK@;I6znrs&Imip{&dA{y-#}ZRJNkxdb`;Q;S2(Rl^4mofaC#QB3mPE0qP0 z;f=Kx^c8erKr5k$a;}1?$c&WDgJ`Ox{L{2|brb(k#3e5BjYfgynzvl;nu!VJV=;Q#w3$J(U?DDj4Im^!uEQE?MHV` zBchcuX$+!t$?%%#<*#kW%PH*)W0BVD{+-b^2MkmE{mWR(b)3i@Q;&$QFl<%6j#$t6 zYEX2(aXBEYJBOIkjnbmNoo;NYWez(PbQR6~$MrD-03lvb|Hp`0w$Pw7F^MouKgMNv z#U^+z;Lt6lnvcA~PYu*h(5dEkd zyB>M!@(~KB*pwraaV4?i{%5}FH2XWU)-h2afCmcaQm23L{yg`okvqaf zn@O*T_naM5*pi-~k(z(BCV<2j{DMj(rnq@Mt(vLICuS@Km!1~LjS*~puyNDm2gMMk z_J<8#{d1g8-fEh_IOgv+ta`u{5+#6_ZYR)EcVmFt2FAL@su66Tb>~K1G(Rb#krl7s zVlQBpe?*8INv(a5TP*yN)gtYXqj_T2=U!c~fs`>BSlf+yDTIsRej*lB#2RK*er`XHw;Y)iu|;Du(u={T#lUIF+=*}KJQg#zn-^ZSuf$OB zyJ3$iE5nP{Dciwup~r^EldOBp(dV5fv{>m1ZQ=V2g$1?vRM~n4Yx=N7$`DWSR|`=f zbx9~7O&##)1@9&vADK0nZpW0nloU7~-zi&v~DE0=5#Bkaym}Bq$X- zt&n$|hXq>meav~rvsokTQc|Nn=mw!uxg=3 zK3|awPPtp}4~)_0IB~GqY*K?MM-L4wGUzRmAn-LNn0*I=gKEQ<>IOJb9gcvxqGDWS z%8iiMIOH=+Hak~6xRo0M;l=sm61V%0KlykTZC;wdFBr!!?+r4oQ2Iy~WX9Ql0=)IW zr`hMtz%8WhlK6~e@`aQMNh+zFafTg&U6@n|ixB~_&>a&lNhx%7-S7{6B5GEU8Iuu~ zN#n))3S3vt83Mwp*(I6R&!wWQqe8ErCdo=qq+L4O7@Ub9(=onoaCJ+R8O64~9%sEE&r|&_`R%jG0by z%IVA;DVZ+Rj|IMc6VezGS&Z$UI(@jwUx-=?95TMk51CPNGMB0YDeh~bQ&z5{b7Sjy zFFk%#ZL13sI&Vd0g6+Bh)rvNuJHhi-;+goytQQ=h9~hlq>J?1m4?eMyHjyk| z67K_1(cM*jz{`g2<8N>V5IOMKHH0PCL-Qu#n5p?6`}&)A8pInNSqCUs`Im>dN9d=# z7{F#adigj}Mgnkx7g~=5Y@+*qh^zKDzL~<(oE}R?{;y)_C(aN~y6==#o`drRmx>SI z%-W%F_;+2hrqc%5RwQSQJdQzI9y#IQm#o70xEE;$9VX*gzQ8o{kKBPJOswdQEePAS zE))=TfPGUP_B0;ijC!GYV|h~|e{(~4f!ORHT+k%Q3zf9=H3S17M7?}9cGfRA0P+gw z`K4u^D56$E)`Q~~xX@QOAsEdj#8B>*t4C?7*=wq|!R7P@IzI*85mITFxle8OuQ`h# zLe*HO)F;?d>B(DsKEa319UiY@s6^#Z=T<)Snms_a&w^JLb46h6g`0@g)?LL-5qMf< z)AxzguP_243>25PB5zy5zxZqm0e~`>oD-GS1shYe|i9WT#R0Y5QA;xtV;`s8t<4}ymqWBL~Vb@zIJtXnh|lC#ei68wQC2Y%w8gI`wA?sfS((!9EPZ5D7HRzVg1M>c*- zI79LDr~wpOEPTZdpMO0zbMN^0#jCE%5dhH5PK{l;2!0k~11PY!>BF4lz4vRN@O+#B z!u}ES8nC(UCPkpBm<`=;=vLWr{!3zEG>8X})ecA5c?_{jdCFPMw(Wt|0WFkZ+hGsl#$G|4+5A`HLb9~aC z5xL(_NzR&DQCAzjhHBssto5S%9{z4~9Lo{)^?P5+ zq(9tF$s`tq$JBIgqv0}uuA`yh@bM#UMz)XB`xhTQyrO*~Ads}SQ>kgAhAA|MG#P2~ z@9b1M?VW&JKVn`9_w{n=ZFviV#QDANe>{SH;D+L3UumtSf7l_F{ax3Trnwi3nkkH! zOLLl7(e#jP8{!cf8=M^KQY%dS-ZS|oRy^~_V`gs7pTTy7SIfF!n;}Uj&rGjae-*NZ z)o41NqHXYUK_lC@ptx=(aM@75vp2f<(PW;HL*1+H3!8%4!v&mZ=FSV&vZip^?>G7O zIX<<4%JQxDeALNRN;;H}EYF^`1q8xZas#-7^Asa8LAgH;SqcX+?D?1Y!{5+^ondh} zzc2ip39&E~-WACqYbEk$M!-ALuP8U@ZJSKO4&P6(TL@`9J5s}_rn6?i;px~xQ7o-0 z+t=jI+DNd(7~G1LMiX)$-o>X(IWo3noj5G%kj8HqRt6if+1KVxv_kQ`Jx8Q+vqicB9R)B4Y<&LMImmABtaU_ z{dLD@*CAt}L72(qvDsNYwBy)I_;A4Zy3}S&npE`Z!p;lNu@&jt^61RTt73FJm#yIs z`^ui4-qnYPUY(sG6`UR|rl3#df)cOAa<^!A>)w7b`r?pkUA?Qs+r1kE`VH`@$P*y* z0(_UQv?f7piFihp43a{0)En*oP;eJmgkRw-E{Po|!TFDBjEyqTAb=WPD+=Xhg^hnf)Fm=9^I#AgGhrG12F7>cFQ znR!#>sa;H6i7US#rfF|zZA#jB30Yyova0U0-+>SM0!R7oQD9FX*;8C4$)-9je1@@L z0FN!mmKe{ZI5pe7=Cq8z7j}Op+tk1q=ddlR>6jw5@)K3VP(Au=ew%MMn(n~UVQV{+ z>=?*gc?z%hH1;h@M;{*k8eh-%)SE-f&3iyL4})=DS^uJ(NJbwm|OFV~F0?X=j)^HToqp$>EKIdz5Ni8`ZVNm3F z!A_c?NX$~y7|qTEwS&k{h~Gc+mFS1S=YBCL!|9G_+ZJW^d89cTEen{#=FfLkl_9w! z<_hL9uQ$TCC>xpbG!#Qrj8Qb9S;D`N7{};1xT3vB2cUSBb$)@*po#f)X@(YI!;*Tp zIaeyq{WudS-*3mv#f*16pLvrl5AgV!ho@ zVb)QD*Kg~pM+E3Pldbi=kOOckdUEqE-%2-0Pq`gCnGYe)(}P6omj!$qsotXfi&S#- z!>Is(*U=p{1`=t}kzqQNY++@9JmGM(K>gX-WOQ1D0NKmm@>Q|!M+=Gv*}{Y9VJioC z88k&Br?VN0OR=Fg;J(_@CHJg(EI@2=da5jhLA-h;*PkR01r3*}S80!yHz)Mcswk-n z)74<$CXVq*vdaQ2A78h2XEZSKoAs@bOF&U~S4nUFjJk(&#^iIz@Z>+mw%+Z|>M-Pa z_-92Qgyg?>YDnV8#edDlD>AR`B1Zq2hM<2bgPo2)fu4p|W?cw=)OKGOpuiQ#KtUgg z=?He6>_jkihoIwFUeQ#iNWHcy;lB7<<_w)F<59i&?voecI`iGcaYujV_NM11_TW^f z?Q<}fOWw>+Xh*4Ka=SS;(7L0ue71nf+}rAL2`zRGEOv>G?X2is+KAmvrK|m$G35w6 z9n;1}6t^Zh5>PE#nd7%Ir`To|-=>r`xs`jH4{WpL9~;9~%}lq~EO_=aI{xfs3}&^% zO@ByF`iU11AwjiNHIjAZD;rQpwThMzp2Cqx!fI5Ul5u(Z(+fz7{^Y4cW%Zcb2jV=d zRJ>=KHW+O*W~fW~Nq2$=K^B2A)0x?N6fPGU0D+=QIMl85 z`IeUUP05OV-61;xK-;?z$_B0}w?uC7>^m_Z;^9=L>)XXojVAl`kqPF=wx7NBLoH{O zq0yA9;8Ht#$75LRvYpZQ=@!Y~HsbPGJGh9Q}e9AB8XAQU~^N zS8AUMwDiHIrJ-N?LSDq7%nq2vOXjtUgFcFACz3_bD_3jDB@0qPMNpO?Ewj!l1RYS2 z$0iL*pB>H#$}E1c&4BiaBm~RnHJ`w)U_;r$7y>a!PU>fpPyNaW2veCVGYc6*;!s_qOW95#ojF?Tb&L0`4+L!K_3M=@_k z>`nMzUf2~#Gr@^RbOl%J*3Cq|{U6D&QiRYyZpfi2z^SM$D9SjgS)-!~QvUBL{?BTWf0rN#@DRWI>PV)0QtIJ*Tw@cubGtE!;GOm z!+<}!?U!Y6as(t>QkV_mD=J%|Uyh+?fBOCYV+%J9h&Z`s);s@3O*N~yG?>=QBr{n( z?NF!+3x)WGVC_LsmXFC5n=Mi{tB4kX$4GV=$liY`IZrgJ?y_Te*kJETx}iJrCFN+; z=q#7A@;Hhx`rOyAUy`lcfG+@yEInIYI!A-;+Uo;%_-Dd3tf6S!=fuKy`bGE(r48BT z+Zk?D+L|e!Zq&rN(K8f$tC*u?c{c^D4jiF0-hK~>ryaWB%L}@Dx3!IIiOd<-QRa<8 z^}7pK1~nt5K*o&SjU>uc->f=0-_b%F2BVweI{4AgAWgH)`}BLBEBv??n)4*=cL~&W z?J35#o^B$ed~_9d{}_JE@M%+Q0BWQMGhB)?fd~|WCPx~F~h1g#yOc(@=)RoW#Ow4 zjKGk>O@y#gTDD2jDImfXt!RYX&I1j+Z(>9r2b9$!!Uls&q-5OTF7^d+(qf?Wc&&fH zB}C_NG=}4ANw5K#P70uvDCdNvAZR`Wxw=FCNx%d;5%VdKpm6BXR`LSg5l?*G(1u7?i~{)F)}WHl@eweQ|;!S=_G?ZXMv$Q zdtVRKk()7rL(qHpwX?`4+q!Mrhb5jef(X68h{^z&qtf4z42qK~1Q*vzPEJ17j#d_& zXk@e0RbgPR+qlc!k;u>%8uP}=m9ApA>5|0G7?03waHB(T1-)x$2j}NO2IGL)`dl@F z&rF2`X<>-{zwM_wVw}l$I1KAKSh$$iZr|jgKol57aiy$NgVYlU6&a^h1o5T^mP&OPc?q z*=s!{?tk}|q?6OBfBg49!~|$)X}3GxdKd$~SHb^}*2%N*E8>(vj~Evr>n#qBANdSPC60CbNmf0;l-KVn z->r>?2ggyHOs+k(>WB)4+~0Pu*F;Gs*}c_`X=F&WM9(N89na7mH&I_(P;M6lV7j|L ziWG{zqYN;<5DhL`Ge~k%UZ?$g_6((8Yr(mByPo~>HN#TCSuT1#R*T1FJKG=(&_$#0 zp;jLRpMmx4cMI3fU^Ou9ShNYYlR1N#*qtP(RS!nLotA4b3bD;9rIXpXT76!H^Dgmh z@=|z_Y7e2>q}#{?B6mvh6jSq)#ey=h*O4{nKbKd*GnwnR2>s{a#6wlUWPmHG)~q^D zmyq=WDHf#qXYAI<6Kdm4G4PI?rocsWJm;6>V{=G_-AQQmmgId6#fGu9fcm(7W<`DP z*GjG2478|WCkMSK{*I!%%fb1%sIl>`hiae^RRi)>#ibUkTem;{ z!-z9}AnL2lXPy+sJkd8U8HM}J5C8gdBQukFelzYiYBI14hJubI5)hUesYDs@X^Fw# zfWDB0W}@VRF(w_f;@1}@zf&R($QN^RH$&iS>FB=q=Cn6#fx>2Vq4E_atcw%so%1-l z3N+sDN-z~Xtg;~BQG#%syJhQW1xw!MA9o}oTz2>Jy;Kp8jtHqDn&7g&7;U(t`En{# z9i8{k|7p2$msiOi_s7=d3!%~G&#fiieA@H8IaG=U#Y9e}Kl;j>b*K*PIL- z@@4m6+0w3bbV9$M%(6pEQoVYuI}#(C2Efq&s0<{G2^6)ba?w+fvfHHS_&p!!AIb_N z@k!!wu|iWG#E!GtN!?7Dj`CFfhRAS^6TrBW_cFx+ly4?KwU%htma`h%9e4%7I?IR= zGn2YHGSl3h^@A*SS%+i24W7={28DLEIjAZS&r-|hg_>Y2zH)7py}}Zv zbP6wCkh<$ouulAE;rzMRigr=uwGj>~WK>Lb+OF^X&1@tFZ1j_}!z1N6eK6OO~ZSTKZq0PUWH^&-bB8Nj*JWhBQ3gok=WSML|kile8d57`%{)d6kwy6~# z(jvazK0@&A;5j9|K%57?r1jPYJUgflq!*idRiK|u^4K9y_ILXIXRWCl)_6+LMgC-L zOhr33-(Cli(Hy>5usGU8!g#en)?qnsZB$QBWl!*9otNv%At?nbK+vvveJbl^IT|Up zX?c>xH*)6n!v~ynaUp)C{d~1HTYCrxX$7`@gXc3mb)}KszWlBP zqev6G{P7mh&#SDoag&`A^NFib!t@LDtIZKMk4u>=q@*e~VFZ2sHtZ@!F7zBT&TYlM z-zNmE1c?&?SVhmEQ@CLKAnsDzX6umJG~;-e0oy$ckCkV%2<=|g&TnC^3HK=-?I@&7 zYmekrPiWu22vc+lmdgkYHzjr1|3Z2`ahH?Qhv+6@Td^TKs_kE`x1r0|W(5O328sYW zfH8r!fr8k2j&Xf{lahyRt6}waHx)&|iekAnmqenC7ECtnADq757eFTSkQklClmjWN zgNxyqc^xuEDPME*MiM< ziCcu=ppt+Ew5B&}or{UTtr{w03AmHY%d+0Mtpclxl%%IEb2E@K-KL@YBT(l{t&S2y zi*8HxgHc<7`%(J!Xx@MF&-LB*t@_Ut$Jv!jos_K)7tLB{Xl)I!U!V@Ih~;HFyrOcP z0|cixnlBdOYg}bf^6y_B#u;|gPN&M*UBzG*Ju!IQzxYy4WJxkFNLg)q`$&Hn0teYY z*~p$!;VkEO+u~^yo?|V~OgPKBnzhICe?Z@tp{Rpuk9`LRn~6tyme%5+-;c`s56eF8 z?ycBw-Ami0lZ#ST^7Ua6CH{k<5JBK0wR<3i?p&;jPNlmeMY1_U$mU2KPK?ytZ|bmH zsmP0A0Y=VmK@+dxVQ$U;P)hbfmp|Y<>>oQjgJtnF#4`_p{+!S8nES%V&mG9=)F%U_ zdx~;Wxmbm|&6^U{R;{waY85=;B_XrRv6pr*r`dt#_Z^xtzXt+2p|AmV zJ3W>#8DijAzvB-9G+Fd!RgD{y1zeMCYA$?at4PkaWru){c~M@EfI0sh24T z*_KM=G{bf?%;4Zc=grou9EY>WlgmC|CaQk~(HqxN2P2P1Ha@Utz^#rAKRLq=;4-8{ltu2GggWd&a&VYO{+soi7h8+b~OZRlI{f2RGwH_T-@$v?C6LQ z7K(w`p*+KWrj_WsE(fzU%a`z2h6ji8X&@eA(zAvw;m?-W>{hBf9!uMfEvD zA7jTqbuBZ@6LGs8$v4SI19R=Axoa>CMGF_Ci$(~kn!?5_xK$~cIAEyCq>-d%OqAEV zp3l8PXz`DxzwDQ?pzW%nuVsPnqaANH~fr+MBVR*T%1=)!Z+mvs4yJ^X?d zzWpuda!*1ubeq%vFa`C?!gI}`au-P*n8;^-fc)jcjpoc$!9bAuXoEAf%}hS;9pWY4 zf7vf#gjD0<*K+s~VKeBOW|uLFr;kU>VNSvgOixLR)M1?anZQvfol%7px_*wJmilS{ zH{3)?vb8bz2P<}W(aZklV$~WV=XaAk-nZLjXF6cPP6BHRH1j71l!92Dyl*O6KT|2Xo7{Y$68;g*bWX-3~Nek`4 zjRg^g6o(HaPw|wH=FYHIWG9gw$nfpIBZ= z1DUoO>a9BuRm0?5X%i%ji>(Vg6Ae$agZ|{mcG&8yoWvJ}0>lTM6T0)hE^lXiZnl`W zyGhXRtk{Tl(aVweIrNF&eC=T|?BdTAF%&>Xz;K}d;7TMuz;HB=IV6xt%VwDMtXo<$ zjy4#jTskM)o$4*)M;EJ`pfM;I8;jNz*NQ%x(M6gktqBxU@bIs$v+0yyrsnZsTZEHGyV3dfEO4BoXqu$g!yFl>Am#cZ%-7 zTLZZv`cCSv*Ix$8fDSqOFCusDv@4WfpEzU-ITn?E*dTgcjT;6-S zS)?|k;(uK>A^Ri1_>yp~5a9c9p20FP7)>*2-$49T{o9YLha(|RcX5+&G}1sE^iJ(a z1V&DKmTiP|I(RT)#t&f|{4sD_4p2{V!r}Z`)~7Y<+#4dO-j@Dj@#gUhc*8fD{qD(} zU3H&HzROC421(Au@n(Kie?2IyDjo+Ouv@HDpH!;>m(Vg26+Nx%_n7hJJBjpQV1XD4 zc$~hr-Wk!fxma^V)JI=G3^v+C2`AL^28GsmuX`Zg$BQ)T6d$7(bkZNEeN31q@gI!=xMX{{~Pc`9Kx15h&hu_CAlWQ&cRvJ zP7&22<1MT`zj=DY2cL&D9qj&9M*PQnF?ik7GU3cgk{@?ui~ZGVERuCRfWNmuCqj?u z$%2@OoE!$|ht0Bekod*mTUK~inFU_c(KWkD@)TO!bJUSjX~U?NGoX2kYS4t9p^q9kL7OGliM`aG|Im z`FB=POq{+moN)tJy5>Pg*we=}A~?zcQ8Zj9fq>>p>BBz>VBAZVf^riEQh`a;CQt6j z>yZB8cAFY>-$kChS`jWF!ZjT(KECz6HI}DkF54EtJM%Vt5z2vZ67Q%4U3Z7ujHtmq z%YloGvBE@hYb`8fVHh&>Tf_K>^HsaXR7eRgs>}J6m@y!dWxnnAir(}*Kbpk1T;YaR zL|n2B@uXiJ3o*>on-g~q)3OQl&zmVvEF&LYh*H+Dj31KTqH*y9wZq-F%>x(BG5R2R zvAOlRv=Y}l_Mq!>A$Plgt$zh3*BZyO=< z^q{ZfesW)^6kl*aT(%G<>giBqO%1m=2N&e2g;vjqx79WGe`HGUiF!ayiXbz!c?Tb57aqK#n81Cknyd2Ii`fO#zca&9zpEYr>c zyj(Ph5t-^cWvf5=Fc1gHV!2HW?2V#d%j0+0>GTn8_*pt9} zLCvasg&~QEd$_`zB0f0_yuYJzn)xu+?`)Su;UF;%@TePqjT#{gO5f$z@f zdX=fpec3$F)^fcU%06GwC}{NF;^k}yl?xuYx-(;lv;U0jse5=lSD<+Qgp+}5UT9{* zQaM-Kju0GwmN}?*?i>|t%X}E}ob6KaLuFd!L_@|KQOV%9G=Ar1Y?j$+Y-PO@WO+A+ zN)%3PIWegB-5C}8{a*J1`F>}HSUemYR{y*Ps+l=2rqL~3U&Zw4|Dwh7q&+GdiAQ(m z4cxHh<+q$8fR{nswDF{UyBsGx?bp_nFTicn*9m&kz5r)0Ydv)z(})y}cdykAxkkPT z4!-CyR#}E1HG_NPC!&Jd^sn6I?*^yQvKYsCddBpZEXck4UxkIAtT#$5`zF*ntr=>C zPHBrwb`e|YEhf_$fA>9rl(WMsi`%Ayw#-e3$5X0d$I3dXj4p=**2MHdy|e`O3D=rN zwwR@7PolR9?>_j=RT1|wBHZ98_2U-|Dz2nBN5oEU6l+YmbW#?Kp#O}qL@f1IKusXp zD|y5b8k3Vn1$`mn{6NG=G_SY=52PW^x4B+5)&3CY9BM|iNpesHqUHL0EtQV?iWZZH z*Dy(ug0}Kxvm0kS`65+JKXC?G*j2(Pn+(JJ=z>Y+th{#yz$~$R;CkO*m8PSHiLB`s zjsKy_Ck%O2m@Q~ePVSkQU6)d)$^%uo+4~@&{+3a%ZJ*YQeI?jh1zhx@SeAmBq9aJ4 zKlGAc*o}B88Wx+?~Zc~Fg^-)E@w2i2}V989(^ z#WngpBDw(Ye70xI53RqK(4BVo)p+C;ool`<=B)Pf6j*>O&E6|D+%xG^DKaz@l?uKl-I;)%?>aB`?+}O3G;dq=s2l{W7ZzxMYK;{e(Z-%6QR6Q#zGs-m5l_}NofO0a z@!ZO8=6|%g4{&}u=F@Wnqht9_k|(%O#t{t|2&(BQmXJ)fk3c^!B`^r>R~HKj)@qod zv#WXg%oYJuMSpF@2Kx+f1TI0ya`6CSb!6ZMGu3oyJE^TiV}Y=&m- z&|xcK{#;=WBLfem`|2Wt+>N5=+oqmcHs#JBygyW&A(-#HhkB{m$G+&Xbg2$?HB80J zbP{Zq#0^CJ*7H1CDhTULi~^4QLEi*Zo=JEL^m&g`UVtN$yiszeZ+Dd(`$*)aEHZ1%&)1(D~Z=Uc$}bS~8Z#B#w!XIjYOC&Rsl zSqBw@hSV`>Ie-S_&dTlHC~+U9V=pU}<#A`i9ZG_Qi3aMKhxx)I@UOGO1Y# zoh*`yQ-vI|@Df)g4N7yPDuW1);jCh#B1~?m;JiASiv>Ay#&hy zQLqLT=`#Rn7?x&0tVJre`?wBs@#VI~=>z~*t9y^0m z`DEZ1W0CyBrOsJEsq> z>N)MbCd?;&f(`%n6U$9FOY?a zA>%(eE_YCYTni05KRKIDkRFflO*3Dpp&u7;j)8#`4(ix$+LE*cdb5&Ud_GMD|0ev4M^pIBFCkW|ycEU42~76?7gy_X2soH=a%`Ssh-eM%5d3PA{Exk;-Fef5R}Qni}AHfC*?f{_%&mF&NM&-h(@`DTQD`ulB-y1eyQ_LcN%pTpQm?#{blu8A#33z$`rS!EFYBtl|Uah)R_6_x9+4wIZSDDo1!r2H`Z*O=wnsl3ZenbA6JaQm)MXCjRmN1j#C*%D*ugUHP zk3YfUjoSY}929%fMg*v7Trp1+K+h@$kq7O|B}wSsOm}2ov$AO2rW#GnU0#Anq7RC= zF**-W6LTww*I!4CM0CQ@2N{8(tcPqj$&;ppnwizxS@44(y6H+~i}z*A$xY;Q0#P(- z2t{h9{_p>2U*>|hpT%L_p^j9A*n2CZavcbr~#cmXz(dCb0@fB8)K zGNz++GI^^~kKKSW0s&k(Zhq&X>@+Y=#YXL3z-{9oTTJB8_StQf`vUxC&}{`_lb_Qs zVJq_de+(aOU=x=s3PiJjvLf-V*7@cKdCgBPq@7k0lxDa=CMsbyg`fIRP|u7 z<1^Cb@lrY>^H5-%^7*s%ld2z0`1-X86|!~2293j~P+@J57N3gWsh6FGQzIt--L^3H z@tVGjprHMY^>gK#;_J};BgrDuV zq%Xzppq%$F`3(ehR~QsDu76Vfa|7(-xy3l;%dLNq$Kp}P10S@1&J;0cmgr!6(5|nd zdwW!nWrs_b@-5;FP!ijb0B%|#=-;(>3dWp%N0;ORd9}5T?MaVVmeHqo{kMR5Dm|+q zk`SUMp1b13s!!H!oX^QnP`%;x2pnBl=Aj1}7M)w|uGGKWzaF*682s+8<^s(|HkoNA zB)-s8(L-T8B8Mzr9lJ|N8rR&TZztVt9YhpB?(wV zb}rH>eQlNWiBZ4)rxYvlG_Ns3nK!}u81IORel zfH@tcXok(xB@hf~C9^b7oGkt?N%q)p$9wClppg)XqPaUREWN zNp|Wvx}3NQ_iYWsw+}|hB;*wUFE`;+nxL-|99wvPl2u~bh0(r&?dS~N7#T^D5*=fy z(32|dGJ{c{=Mn>)`^K#)?+a@u6rLN7dkp+p&NLo$=^SvX$YAiS$R=7WKIOKVNzK)h zYYDC&_M_E$R|7su-da2qY!(hkp(bEYzEbXbT6K}PI2Gd*XH&{ulEJ4G{^BEXsto51 z25>hiMwk_HwS0BRb1>x^k!-lET`HF+(^(9WJ=ezKr3P4ODrn;CojVm0z2LGoCv;+4 zJJ^F!4BZFe8n}D%|7a}>(Qj`)N-8Q Date: Wed, 3 Aug 2016 18:50:57 +0800 Subject: [PATCH 176/290] spring-websocket --- pom.xml | 38 ++++++++++++ .../websocket/MySpringTextWsHandler.java | 39 ++++++++++++ .../websocket/SpringWebSocketConfig.java | 32 ++++++++++ src/main/resources/spring/spring-context.xml | 3 +- .../resources/spring/spring-websocket.xml | 22 +++++++ src/main/webapp/sockjs.html | 59 +++++++++++++++++++ 6 files changed, 192 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/websocket/MySpringTextWsHandler.java create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/websocket/SpringWebSocketConfig.java create mode 100644 src/main/resources/spring/spring-websocket.xml create mode 100644 src/main/webapp/sockjs.html diff --git a/pom.xml b/pom.xml index 8ea8ac32..1cd640b4 100644 --- a/pom.xml +++ b/pom.xml @@ -341,6 +341,22 @@ springfox-swagger-ui 2.5.0 + + javax.websocket + javax.websocket-api + 1.1 + provided + + + org.springframework + spring-websocket + ${spring.version} + + + org.springframework + spring-messaging + ${spring.version} + @@ -360,6 +376,28 @@ true + + spring-milestones + Spring Milestones + http://repo.spring.io/milestone + + false + + + + tomcat-snapshots + https://repository.apache.org/content/repositories/snapshots + + true + + + false + + + + java-net + https://maven.java.net/content/repositories/releases + ssmbootstrap_table diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/websocket/MySpringTextWsHandler.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/websocket/MySpringTextWsHandler.java new file mode 100644 index 00000000..90ad20f8 --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/websocket/MySpringTextWsHandler.java @@ -0,0 +1,39 @@ +package cn.com.ttblog.ssmbootstrap_table.websocket; + +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; +import org.springframework.web.socket.handler.TextWebSocketHandler; + +public class MySpringTextWsHandler extends TextWebSocketHandler +{ + + /** + * 方法用途:
    + * 实现步骤:
    + * @param session + * @param message + * @throws Exception + */ + @Override + protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception + { + if(session.isOpen()) + { + session.sendMessage(message); + } + } + + /** + * 方法用途:
    + * 实现步骤:
    + * @param session + * @throws Exception + */ + @Override + public void afterConnectionEstablished(WebSocketSession session) throws Exception + { + super.afterConnectionEstablished(session); +// SpringWebsocketConstant.map.put("1", session); + } + +} \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/websocket/SpringWebSocketConfig.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/websocket/SpringWebSocketConfig.java new file mode 100644 index 00000000..997319a9 --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/websocket/SpringWebSocketConfig.java @@ -0,0 +1,32 @@ +package cn.com.ttblog.ssmbootstrap_table.websocket; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.config.annotation.EnableWebSocket; +import org.springframework.web.socket.config.annotation.WebSocketConfigurer; +import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; + +@Configuration +@EnableWebSocket +public class SpringWebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer { + + @Override + public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { + registry.addHandler(myWsHandler(), "/ws"); + registry.addHandler(myWsHandler(), "/wsockjs").withSockJS(); + } + + @Bean + public WebSocketHandler myWsHandler() { + return new MySpringTextWsHandler(); + } + + // Allow serving HTML files through the default Servlet + @Override + public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { + configurer.enable(); + } +} \ No newline at end of file diff --git a/src/main/resources/spring/spring-context.xml b/src/main/resources/spring/spring-context.xml index 2646df83..b30a9a14 100644 --- a/src/main/resources/spring/spring-context.xml +++ b/src/main/resources/spring/spring-context.xml @@ -38,7 +38,8 @@ - + + diff --git a/src/main/resources/spring/spring-websocket.xml b/src/main/resources/spring/spring-websocket.xml new file mode 100644 index 00000000..06fef941 --- /dev/null +++ b/src/main/resources/spring/spring-websocket.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/sockjs.html b/src/main/webapp/sockjs.html new file mode 100644 index 00000000..ffe4c976 --- /dev/null +++ b/src/main/webapp/sockjs.html @@ -0,0 +1,59 @@ + + + + + +sockjs + + + + + + + +

    + + \ No newline at end of file From ca4f344309ef11cfbbad44a0ad752f6e26731ddc Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 4 Aug 2016 11:09:47 +0800 Subject: [PATCH 177/290] test websocket sockjs --- README.md | 6 +- .../controller/IndexController.java | 5 +- .../controller/TestController.java | 5 + .../interceptor/HandshakeInterceptor.java | 30 +++ .../websocket/MySpringTextWsHandler.java | 49 ++--- .../resources/spring/spring-websocket.xml | 5 + src/main/webapp/image/@Timed.png | Bin 0 -> 42596 bytes src/main/webapp/index.html | 8 +- src/main/webapp/sockjs.html | 59 ------ src/main/webapp/websocket.jsp | 171 ++++++++++++++++++ 10 files changed, 239 insertions(+), 99 deletions(-) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/HandshakeInterceptor.java create mode 100644 src/main/webapp/image/@Timed.png delete mode 100644 src/main/webapp/sockjs.html create mode 100644 src/main/webapp/websocket.jsp diff --git a/README.md b/README.md index a8b13353..1d3948f6 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ * ehcache * metrics * springfox +* spring-websocket ## How to run 项目采用maven构建,运行前请先执行src/main/java下的sql脚本到你的mysql数据库中,然后修改src/main/resource下的jdbc.properties配置文件中的数据库配置信息,进入项目目录,执行mvn tomcat7:run来运行 @@ -25,6 +26,9 @@ git->clone;eclipse->File->Import->Existing Maven projects,导入到eclipse后 #![数据列表页面](src/main/webapp/image/sys2.png) -#![metrics-servlet](src/main/webapp/image/metrics.png) +metrics | @Timed +---|--- +![metrics-servlet](src/main/webapp/image/metrics.png) | ![metrics-servlet](src/main/webapp/image/@Timed.png) + #![springfox](src/main/webapp/image/swagger.png) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java index 0ec25150..b48c59d5 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java @@ -133,14 +133,13 @@ public String newdata(HttpSession session, Model model) { @Timed @RequestMapping("/datacount") - public @ResponseBody Map datacount(HttpSession session, - Model model) { + 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").toString()); + categorys.add(m.get("adddate")==null?"":m.get("adddate").toString()); nums.add(m.get("num").toString()); } logger.debug("categorys:{},nums:{}", categorys, nums); diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java index a26ea8b6..35209edf 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java @@ -274,4 +274,9 @@ public String uri(ModelMap model){ return "redirect:/{no}/index";//springmvc会对模板变量中的值解析处理 // return "{no}/index"; } + + @RequestMapping(value={"/websocket"}) + public String websocket(ModelMap model){ + return "websocket"; + } } diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/HandshakeInterceptor.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/HandshakeInterceptor.java new file mode 100644 index 00000000..0aab5392 --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/HandshakeInterceptor.java @@ -0,0 +1,30 @@ +package cn.com.ttblog.ssmbootstrap_table.interceptor; + +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor; + +public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor { + + private static final Logger log=LoggerFactory.getLogger(HandshakeInterceptor.class); + + @Override + public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, + Map attributes) throws Exception { + log.warn("Before Handshake"); + return super.beforeHandshake(request, response, wsHandler, attributes); + } + + @Override + public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, + Exception ex) { + log.warn("After Handshake"); + super.afterHandshake(request, response, wsHandler, ex); + } + +} \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/websocket/MySpringTextWsHandler.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/websocket/MySpringTextWsHandler.java index 90ad20f8..75a05586 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/websocket/MySpringTextWsHandler.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/websocket/MySpringTextWsHandler.java @@ -1,39 +1,28 @@ package cn.com.ttblog.ssmbootstrap_table.websocket; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.TextWebSocketHandler; -public class MySpringTextWsHandler extends TextWebSocketHandler -{ +public class MySpringTextWsHandler extends TextWebSocketHandler { - /** - * 方法用途:
    - * 实现步骤:
    - * @param session - * @param message - * @throws Exception - */ - @Override - protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception - { - if(session.isOpen()) - { - session.sendMessage(message); - } - } - - /** - * 方法用途:
    - * 实现步骤:
    - * @param session - * @throws Exception - */ - @Override - public void afterConnectionEstablished(WebSocketSession session) throws Exception - { - super.afterConnectionEstablished(session); -// SpringWebsocketConstant.map.put("1", session); - } + private static final Logger log=LoggerFactory.getLogger(MySpringTextWsHandler.class); + + @Override + protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { + if (session.isOpen()) { + log.warn("receive websocket message:{} session:{}",ToStringBuilder.reflectionToString(message),ToStringBuilder.reflectionToString(session)); + TextMessage returnMessage = new TextMessage(message.getPayload() + " received at server"); + session.sendMessage(returnMessage); + } + } + @Override + public void afterConnectionEstablished(WebSocketSession session) throws Exception { + super.afterConnectionEstablished(session); + // SpringWebsocketConstant.map.put("1", session); + } } \ No newline at end of file diff --git a/src/main/resources/spring/spring-websocket.xml b/src/main/resources/spring/spring-websocket.xml index 06fef941..64a13fd3 100644 --- a/src/main/resources/spring/spring-websocket.xml +++ b/src/main/resources/spring/spring-websocket.xml @@ -10,8 +10,13 @@ http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket.xsd "> + + + + + diff --git a/src/main/webapp/image/@Timed.png b/src/main/webapp/image/@Timed.png new file mode 100644 index 0000000000000000000000000000000000000000..77798e2d1e6fc6fc09596f58bece31a15dea1d6f GIT binary patch literal 42596 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 IYqy{LKPCFs;{X5v literal 0 HcmV?d00001 diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html index 3780bcb6..f8e54a96 100644 --- a/src/main/webapp/index.html +++ b/src/main/webapp/index.html @@ -14,8 +14,10 @@ + @@ -83,11 +85,5 @@

    ...or login with:

    -
    - -
    \ No newline at end of file diff --git a/src/main/webapp/sockjs.html b/src/main/webapp/sockjs.html deleted file mode 100644 index ffe4c976..00000000 --- a/src/main/webapp/sockjs.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - -sockjs - - - - - - - -
    -
    - -
    - - \ No newline at end of file diff --git a/src/main/webapp/websocket.jsp b/src/main/webapp/websocket.jsp new file mode 100644 index 00000000..fe1322e0 --- /dev/null +++ b/src/main/webapp/websocket.jsp @@ -0,0 +1,171 @@ +<%@ page language="java" import="java.util.*" + contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> + + + +WebSocket/SockJS Echo Sample (Adapted from Tomcat's echo + sample) + + + + + + + + +
    +
    +
    + + +
    + + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + \ No newline at end of file From 70a768c5210de8fe215a3478bcc4fe8905d7474b Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 4 Aug 2016 16:13:43 +0800 Subject: [PATCH 178/290] cors-filter --- pom.xml | 6 ++++++ src/main/webapp/WEB-INF/web.xml | 18 ++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 1cd640b4..f1cb3612 100644 --- a/pom.xml +++ b/pom.xml @@ -357,6 +357,12 @@ spring-messaging ${spring.version} + + + com.thetransactioncompany + cors-filter + 2.5 + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index b010e053..9d40cca4 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -122,7 +122,7 @@ true enable - true + false refers @@ -189,6 +189,20 @@ INCLUDE REQUEST + + + + CORS + com.thetransactioncompany.cors.CORSFilter + + cors.allowOrigin + * + + + + CORS + /* + - + 30 From 6602f6b7a69f2d0818e38eac4746e533e7e8d5f6 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Fri, 5 Aug 2016 12:04:44 +0800 Subject: [PATCH 179/290] update --- src/main/resources/spring/spring-mvc.xml | 25 ++++++++++++++++-------- src/main/webapp/manage.html | 2 ++ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/main/resources/spring/spring-mvc.xml b/src/main/resources/spring/spring-mvc.xml index 86a5b88f..538667db 100644 --- a/src/main/resources/spring/spring-mvc.xml +++ b/src/main/resources/spring/spring-mvc.xml @@ -4,9 +4,9 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.1.xsd + http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.1.xsd + http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> @@ -18,7 +18,6 @@ class="cn.com.ttblog.ssmbootstrap_table.util.TestBeanPostProcessor" lazy-init="false" /> - @@ -111,8 +110,14 @@ - - + + + + + - + + + + + + - diff --git a/src/main/webapp/manage.html b/src/main/webapp/manage.html index a390654a..99dd0a83 100644 --- a/src/main/webapp/manage.html +++ b/src/main/webapp/manage.html @@ -325,10 +325,12 @@ 导出历史数据到excel

    支持中文首字母查询

    + Date: Fri, 5 Aug 2016 19:24:15 +0800 Subject: [PATCH 180/290] ant-path --- src/main/resources/spring/spring-context.xml | 2 +- src/main/resources/spring/spring-mvc.xml | 6 +- .../ssmbootstrap_table/TestAntPath.java | 87 +++++++++++++++++++ .../ssmbootstrap_table/TestStringFormat.java | 1 + 4 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 src/test/java/cn/com/ttblog/ssmbootstrap_table/TestAntPath.java diff --git a/src/main/resources/spring/spring-context.xml b/src/main/resources/spring/spring-context.xml index b30a9a14..05bb203a 100644 --- a/src/main/resources/spring/spring-context.xml +++ b/src/main/resources/spring/spring-context.xml @@ -36,7 +36,7 @@ - + diff --git a/src/main/resources/spring/spring-mvc.xml b/src/main/resources/spring/spring-mvc.xml index 538667db..6486ef48 100644 --- a/src/main/resources/spring/spring-mvc.xml +++ b/src/main/resources/spring/spring-mvc.xml @@ -155,8 +155,8 @@ - classpath:messages - classpath:i18n.messages + classpath*:messages + classpath*:i18n.messages --> @@ -204,5 +204,5 @@ - + \ No newline at end of file diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestAntPath.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestAntPath.java new file mode 100644 index 00000000..a5f27652 --- /dev/null +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestAntPath.java @@ -0,0 +1,87 @@ +package cn.com.ttblog.ssmbootstrap_table; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.Collections; +import java.util.Map; + +import org.apache.commons.lang3.math.NumberUtils; +import org.junit.Test; +import org.springframework.util.AntPathMatcher; + +public class TestAntPath { + AntPathMatcher ap = new AntPathMatcher(); + + @Test + public void String() { + System.out.println("NumberUtils.isNumber('aaa'):"+NumberUtils.isNumber("aaa")+" NumberUtils.isNumber('24234234142314'):"+NumberUtils.isNumber("24234234142314")); + System.out.println("ap.isPattern('/static/**'):" + ap.isPattern("/static/**")); + System.out.println("ap.isPattern('/static/*'):" + ap.isPattern("/static/*")); + System.out.println("ap.isPattern('/static*'):" + ap.isPattern("/static*")); + System.out.println("ap.isPattern('/static?'):" + ap.isPattern("/static?")); + System.out.println("ap.isPattern('/static'):" + ap.isPattern("/static")); + } + + @Test + public void match() { + // ... + assertFalse(ap.match("/x/x/**/bla", "/x/x/x/")); + assertTrue(ap.match("/static/**", "/static/a.js")); + assertTrue(ap.match("/static/**", "/static/a.css")); + assertTrue(ap.match("/static/**", "/static/a/a/b/a.css")); + // ... + } + + @Test + public void withMatchStart() { + // ... + assertTrue(ap.matchStart("/x/x/**/bla", "/x/x/x/")); + // ... + } + + @Test + public void extractPathWithinPattern() throws Exception { + // ... + assertEquals("", ap.extractPathWithinPattern("/docs/commit.html", "/docs/commit.html")); + assertEquals("cvs/commit", ap.extractPathWithinPattern("/docs/*", "/docs/cvs/commit")); + assertEquals("docs/cvs/commit", ap.extractPathWithinPattern("/d?cs/*", "/docs/cvs/commit")); + // ... + } + + @Test + public void extractUriTemplateVariables() throws Exception { + Map result = ap.extractUriTemplateVariables("/hotels/{hotel}", "/hotels/1"); + assertEquals(Collections.singletonMap("hotel", "1"), result); + // ... + result = ap.extractUriTemplateVariables("/{page}.*", "/42.html"); + assertEquals(Collections.singletonMap("page", "42"), result); + // ... + } + + /** + * SPR-7787 + */ + @Test + public void extractUriTemplateVarsRegexQualifiers() { + Map result = ap.extractUriTemplateVariables( + "{symbolicName:[\\p{L}\\.]+}-sources-{version:[\\p{N}\\.]+}.jar", "com.example-sources-1.0.0.jar"); + assertEquals("com.example", result.get("symbolicName")); + assertEquals("1.0.0", result.get("version")); + // ... + } + + @Test + public void combine() { + // ... + assertEquals("/hotels", ap.combine("/hotels", null)); + assertEquals("/hotels/booking", ap.combine("/hotels/*", "/booking")); + assertEquals("/hotels/**/booking", ap.combine("/hotels/**", "booking")); + assertEquals("/hotels/**/booking", ap.combine("/hotels/**", "/booking")); + assertEquals("/hotels/booking", ap.combine("/hotels", "/booking")); + assertEquals("/hotels/{hotel}", ap.combine("/hotels/*", "{hotel}")); + assertEquals("/hotels/**/{hotel}", ap.combine("/hotels/**", "{hotel}")); + assertEquals("/hotels/*/booking/{booking}", ap.combine("/hotels/*/booking", "{booking}")); + } +} diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestStringFormat.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestStringFormat.java index f1a9d356..46bdc8ff 100644 --- a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestStringFormat.java +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestStringFormat.java @@ -3,6 +3,7 @@ import java.util.Arrays; import org.junit.Test; +import org.springframework.util.AntPathMatcher; /** * http://blog.csdn.net/lonely_fireworks/article/details/7962171 From 38552108c84719eb1eee957637876ba61fd56905 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sun, 7 Aug 2016 22:29:19 +0800 Subject: [PATCH 181/290] zxing test --- README.md | 1 + pom.xml | 11 + .../controller/TestController.java | 83 +++++++- src/main/resources/logback.xml | 2 +- .../._spring-mvc.xml4116380028147889742.tmp | 199 ++++++++++++++++++ src/main/webapp/decodeqr.jsp | 20 ++ 6 files changed, 310 insertions(+), 6 deletions(-) create mode 100644 src/main/resources/spring/._spring-mvc.xml4116380028147889742.tmp create mode 100644 src/main/webapp/decodeqr.jsp diff --git a/README.md b/README.md index 1d3948f6..d0bcdb44 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ * metrics * springfox * spring-websocket +* zxing ## How to run 项目采用maven构建,运行前请先执行src/main/java下的sql脚本到你的mysql数据库中,然后修改src/main/resource下的jdbc.properties配置文件中的数据库配置信息,进入项目目录,执行mvn tomcat7:run来运行 diff --git a/pom.xml b/pom.xml index f1cb3612..edf9055f 100644 --- a/pom.xml +++ b/pom.xml @@ -363,6 +363,17 @@ cors-filter 2.5 + + com.google.zxing + core + 3.2.1 + + + com.google.zxing + javase + 3.2.1 + + diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java index 35209edf..40b77805 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java @@ -1,5 +1,8 @@ package cn.com.ttblog.ssmbootstrap_table.controller; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.Locale; @@ -8,12 +11,12 @@ import java.util.concurrent.TimeUnit; import javax.annotation.Resource; -import javax.management.RuntimeErrorException; +import javax.imageio.ImageIO; +import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; -import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.exception.ExceptionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,7 +27,6 @@ import org.springframework.http.HttpStatus; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; -import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -32,15 +34,31 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.SessionAttributes; +import org.springframework.web.multipart.commons.CommonsMultipartFile; import org.springframework.web.servlet.i18n.CookieLocaleResolver; import org.springframework.web.servlet.mvc.support.RedirectAttributes; -import com.alibaba.fastjson.JSONObject; - import cn.com.ttblog.ssmbootstrap_table.annotation.Token; import cn.com.ttblog.ssmbootstrap_table.model.User; import cn.com.ttblog.ssmbootstrap_table.util.AjaxUtils; +import com.alibaba.fastjson.JSONObject; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.Binarizer; +import com.google.zxing.BinaryBitmap; +import com.google.zxing.DecodeHintType; +import com.google.zxing.EncodeHintType; +import com.google.zxing.LuminanceSource; +import com.google.zxing.MultiFormatReader; +import com.google.zxing.MultiFormatWriter; +import com.google.zxing.NotFoundException; +import com.google.zxing.Result; +import com.google.zxing.WriterException; +import com.google.zxing.client.j2se.BufferedImageLuminanceSource; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.common.HybridBinarizer; + @Controller @RequestMapping("/test") @SessionAttributes("name") @@ -279,4 +297,59 @@ public String uri(ModelMap model){ public String websocket(ModelMap model){ return "websocket"; } + + /** + * 创建二维码 + * @param response + * @param param + * @throws IOException + * @throws WriterException + */ + @RequestMapping(value={"/qr"},method=RequestMethod.GET) + public void qr(HttpServletResponse response,@RequestParam(value="param",defaultValue="test",required=false) String param) + throws IOException, WriterException{ + logger.debug("使用zxing生成二维码,内容:{}",param); + int width = 200; // 图像宽度 + int height = 200; // 图像高度 + String format = "png";// 图像类型 + Map hints = new HashMap(); + hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); + BitMatrix bitMatrix = new MultiFormatWriter().encode(param, + BarcodeFormat.QR_CODE, width, height, hints);// 生成矩阵 + ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream(); + response.setHeader("Cache-Control", "no-store"); + response.setHeader("Pragma", "no-cache"); + response.setDateHeader("Expires", 0L); + response.setContentType("image/jpeg"); + ImageIO.write(MatrixToImageWriter.toBufferedImage(bitMatrix), "jpeg", jpegOutputStream); + byte[] captchaChallengeAsJpeg = jpegOutputStream.toByteArray(); + ServletOutputStream respOs = response.getOutputStream(); + respOs.write(captchaChallengeAsJpeg); + respOs.flush(); + respOs.close(); + } + + @RequestMapping(value={"/decodeqr"},method=RequestMethod.GET) + public String decodeqr(){ + logger.debug("二维码解析"); + return "decodeqr"; + } + + @RequestMapping(value={"/decodeqr"},method=RequestMethod.POST) + @ResponseBody + public String decodeqr(HttpServletRequest request,@RequestParam(value="qrimg",required=true)CommonsMultipartFile file) throws NotFoundException, IOException{ + if(file.isEmpty()){ + throw new RuntimeException("请上传文件"); + } + BufferedImage image = ImageIO.read(file.getInputStream()); + LuminanceSource source = new BufferedImageLuminanceSource(image); + Binarizer binarizer = new HybridBinarizer(source); + BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer); + Map hints = new HashMap(); + hints.put(DecodeHintType.CHARACTER_SET, "UTF-8"); + //对图像进行解码 + Result result = new MultiFormatReader().decode(binaryBitmap, hints); + logger.debug("zxing解析二维码结果:{}",result); + return result.getText(); + } } diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index a64c78b4..0d36b30e 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -71,7 +71,7 @@ - + diff --git a/src/main/resources/spring/._spring-mvc.xml4116380028147889742.tmp b/src/main/resources/spring/._spring-mvc.xml4116380028147889742.tmp new file mode 100644 index 00000000..86a5b88f --- /dev/null +++ b/src/main/resources/spring/._spring-mvc.xml4116380028147889742.tmp @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + cn.com.ttblog.ssmbootstrap_table.model.User + + + + + + + + + + + + + + + + + + + + + + + + + + application/json + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + messages + i18n/messages + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/decodeqr.jsp b/src/main/webapp/decodeqr.jsp new file mode 100644 index 00000000..22fc65a1 --- /dev/null +++ b/src/main/webapp/decodeqr.jsp @@ -0,0 +1,20 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ taglib prefix="l2d" uri="/WEB-INF/LongToDateTag.tld"%> +<%@ taglib prefix='fmt' uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %> + + + + +${test } + + +

    请上传要解析的二维码

    +
    + + + + + \ No newline at end of file From 1181bd92be6856c1d5018bb1dbce1bedacbfe5c2 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Mon, 8 Aug 2016 21:16:43 +0800 Subject: [PATCH 182/290] zxing config --- .../controller/TestController.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java index 40b77805..cc77db80 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java @@ -1,5 +1,6 @@ package cn.com.ttblog.ssmbootstrap_table.controller; +import java.awt.Color; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -55,9 +56,11 @@ import com.google.zxing.Result; import com.google.zxing.WriterException; import com.google.zxing.client.j2se.BufferedImageLuminanceSource; +import com.google.zxing.client.j2se.MatrixToImageConfig; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.common.HybridBinarizer; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; @Controller @RequestMapping("/test") @@ -312,7 +315,11 @@ public void qr(HttpServletResponse response,@RequestParam(value="param",defaultV int width = 200; // 图像宽度 int height = 200; // 图像高度 String format = "png";// 图像类型 - Map hints = new HashMap(); + Map hints = new HashMap(); +// http://www.tuicool.com/articles/vQFZNfq + hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); //编码 + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); //容错率 + hints.put(EncodeHintType.MARGIN, 0); //二维码边框宽度,这里文档说设置0-4 hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); BitMatrix bitMatrix = new MultiFormatWriter().encode(param, BarcodeFormat.QR_CODE, width, height, hints);// 生成矩阵 @@ -321,7 +328,9 @@ public void qr(HttpServletResponse response,@RequestParam(value="param",defaultV response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0L); response.setContentType("image/jpeg"); - ImageIO.write(MatrixToImageWriter.toBufferedImage(bitMatrix), "jpeg", jpegOutputStream); + //颜色 + MatrixToImageConfig config = new MatrixToImageConfig(Color.yellow.getRGB(),0xFFFFFFFF); + ImageIO.write(MatrixToImageWriter.toBufferedImage(bitMatrix,config), "jpeg", jpegOutputStream); byte[] captchaChallengeAsJpeg = jpegOutputStream.toByteArray(); ServletOutputStream respOs = response.getOutputStream(); respOs.write(captchaChallengeAsJpeg); From 16ca1fc8d3af76dd6e43ea7e482bbc232853e9c1 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 9 Aug 2016 22:32:12 +0800 Subject: [PATCH 183/290] test httpservletrequestwrapper --- .../controller/TestController.java | 6 ++++ .../filter/DomainFilter.java | 36 +++++++++++++++++++ .../DomainHttpServletRequestWrapper.java | 17 +++++++++ src/main/webapp/WEB-INF/web.xml | 29 +++++++++++++++ 4 files changed, 88 insertions(+) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/DomainFilter.java create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/DomainHttpServletRequestWrapper.java diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java index cc77db80..aa3bd5c3 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java @@ -361,4 +361,10 @@ public String decodeqr(HttpServletRequest request,@RequestParam(value="qrimg",re logger.debug("zxing解析二维码结果:{}",result); return result.getText(); } + + @RequestMapping(value={"/server"},method=RequestMethod.GET) + @ResponseBody + public String server(HttpServletRequest request){ + return request.getServerName(); + } } diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/DomainFilter.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/DomainFilter.java new file mode 100644 index 00000000..bb09b2d4 --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/DomainFilter.java @@ -0,0 +1,36 @@ +package cn.com.ttblog.ssmbootstrap_table.filter; + +import java.io.IOException; +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.http.HttpServletRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DomainFilter implements Filter { + private static final Logger log = LoggerFactory + .getLogger(DomainFilter.class); + private FilterConfig filterConfig; + + public void init(FilterConfig filterConfig) throws ServletException { + this.filterConfig = filterConfig; + } + + public void destroy() { + } + + public void doFilter(ServletRequest request, ServletResponse response, + FilterChain chain) throws IOException, ServletException { + boolean enable = Boolean.parseBoolean(filterConfig + .getInitParameter("enable")); + if (enable) { + chain.doFilter(new DomainHttpServletRequestWrapper((HttpServletRequest) request), response); + } else { + chain.doFilter(request, response); + } + } +} diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/DomainHttpServletRequestWrapper.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/DomainHttpServletRequestWrapper.java new file mode 100644 index 00000000..69f200e0 --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/DomainHttpServletRequestWrapper.java @@ -0,0 +1,17 @@ +package cn.com.ttblog.ssmbootstrap_table.filter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DomainHttpServletRequestWrapper extends HttpServletRequestWrapper { + private static final Logger log=LoggerFactory.getLogger(DomainHttpServletRequestWrapper.class); + public DomainHttpServletRequestWrapper(HttpServletRequest request) { + super(request); + } + public String getServerName() { + log.debug("wrapper-get servername"); + return "deny"; + } +} \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 9d40cca4..29fad796 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -41,6 +41,35 @@ INCLUDE REQUEST + + + domainFilter + /* + ASYNC + ERROR + FORWARD + INCLUDE + REQUEST + + + + domainFilter + cn.com.ttblog.ssmbootstrap_table.filter.DomainFilter + true + + enable + true + + + + domainFilter + /* + ASYNC + ERROR + FORWARD + INCLUDE + REQUEST + injectionAttackFilter From e40546952fc45c4f8bb6f6fc1faf33e875ae55d9 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 11 Aug 2016 13:39:18 +0800 Subject: [PATCH 184/290] remove osc-maven --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index edf9055f..318ab259 100644 --- a/pom.xml +++ b/pom.xml @@ -386,9 +386,9 @@ - osc - osc - http://maven.oschina.net/content/groups/public/ + aliyun + aliyun + http://maven.aliyun.com/nexus/content/groups/public/ true From 469e6a963d667a58bec961afbd4f73a6b4cf2c17 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 11 Aug 2016 17:44:47 +0800 Subject: [PATCH 185/290] field array --- .../cn/com/ttblog/ssmbootstrap_table/model/User.java | 10 ++++++++++ src/main/webapp/user/add.jsp | 3 +++ 2 files changed, 13 insertions(+) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/User.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/User.java index f430a4f9..3e2331c8 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/User.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/User.java @@ -36,6 +36,16 @@ public class User implements Serializable { private transient String comments; + private String[] img; + + public String[] getImg() { + return img; + } + + public void setImg(String[] img) { + this.img = img; + } + public String getComments() { return comments; } diff --git a/src/main/webapp/user/add.jsp b/src/main/webapp/user/add.jsp index 15b01e2a..b9728067 100644 --- a/src/main/webapp/user/add.jsp +++ b/src/main/webapp/user/add.jsp @@ -72,6 +72,9 @@
    0/200
    + + +
    From 4694ef7d92ceff0755811b2c68d68bed6c2179fe Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 11 Aug 2016 22:51:57 +0800 Subject: [PATCH 186/290] loginfilter use antpathmatch fix websocket fix filter async --- pom.xml | 10 ++++-- .../filter/LoginFilter.java | 34 +++++++++++++------ .../util/AntPathMatcherUtil.java | 27 +++++++++++++++ src/main/webapp/WEB-INF/web.xml | 25 +++++++------- .../ssmbootstrap_table/TestAntPath.java | 4 +++ .../ssmbootstrap_table/TestMyBatis.java | 13 +++++-- 6 files changed, 86 insertions(+), 27 deletions(-) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/util/AntPathMatcherUtil.java diff --git a/pom.xml b/pom.xml index 318ab259..6867feff 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ - 4.0.2.RELEASE + 4.1.6.RELEASE 3.3.0 1.7.7 1.1.3 @@ -373,7 +373,13 @@ javase 3.2.1 - + + + org.apache.tomcat.embed + tomcat-embed-websocket + 7.0.52 + test + diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/LoginFilter.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/LoginFilter.java index df3680f5..d7060f74 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/LoginFilter.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/LoginFilter.java @@ -1,6 +1,8 @@ package cn.com.ttblog.ssmbootstrap_table.filter; import java.io.IOException; +import java.util.Arrays; + import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -12,15 +14,21 @@ import javax.servlet.http.HttpServletResponse; import org.apache.commons.codec.binary.Base64; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.AntPathMatcher; +import com.alibaba.druid.support.logging.Log; import com.github.jscookie.javacookie.Cookies; + import cn.com.ttblog.ssmbootstrap_table.Constant.ConfigConstant; +import cn.com.ttblog.ssmbootstrap_table.util.AntPathMatcherUtil; public class LoginFilter implements Filter { private FilterConfig filterConfig; - + private static final Logger LOG=LoggerFactory.getLogger(LoginFilter.class); @Override public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; @@ -42,10 +50,16 @@ public void doFilter(ServletRequest servletRequest, httpServletResponse); return ; } - String[] noFilterTags = noFilterTagString.split(";"); - + String[] noFilterTags = noFilterTagString.split("\n"); + LOG.debug("放行路径:{}-{},访问路径:{}",Arrays.toString(noFilterTags),noFilterTags.length,httpServletRequest.getRequestURI()); + if(AntPathMatcherUtil.isMatch(noFilterTags,httpServletRequest.getRequestURI())){ + filterChain.doFilter(httpServletRequest, + httpServletResponse); + LOG.debug("非拦截uri"); + return ; + } String uri = httpServletRequest.getRequestURI(); - System.out.println("过滤路径:"+uri); + LOG.debug("过滤路径:{}",uri); // 配置文件中允许放行的关键字 if (noFilterTags != null) { for (String noFilterTag : noFilterTags) { @@ -53,7 +67,7 @@ public void doFilter(ServletRequest servletRequest, continue; } if (uri.indexOf(noFilterTag.trim()) != -1) { - System.out.println("uri:"+uri); + LOG.debug("uri:"+uri); filterChain.doFilter(httpServletRequest, httpServletResponse); return; @@ -63,11 +77,11 @@ public void doFilter(ServletRequest servletRequest, Cookie[] cookies=httpServletRequest.getCookies(); Cookies cs=Cookies.initFromServlet(httpServletRequest, httpServletResponse); - System.out.println("path:"+uri); - System.out.println("cookies:"+cs.get().toString()); + LOG.debug("path:"+uri); + LOG.debug("cookies:"+cs.get().toString()); Object islogin=httpServletRequest.getSession().getAttribute(ConfigConstant.ISLOGIN); if ( islogin!= null&&Boolean.parseBoolean(islogin.toString())) { - System.out.println("p1"); + LOG.debug("p1"); if(uri.endsWith(ConfigConstant.PROJECTNAME+"/")){ httpServletResponse.sendRedirect(httpServletRequest .getContextPath() + "/manage.html"); @@ -75,7 +89,7 @@ public void doFilter(ServletRequest servletRequest, filterChain.doFilter(httpServletRequest, httpServletResponse); } } else if(cookies!=null){ - System.out.println("p2"); + LOG.debug("p2"); boolean find=false; for(Cookie cookie:cookies){ if(cookie.getName().equals(ConfigConstant.USERNAME)&&cookie.getValue().length()>0){ @@ -102,7 +116,7 @@ public void doFilter(ServletRequest servletRequest, return ; } }else{ - System.out.println("^^^"); + LOG.debug("^^^"); } } diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/AntPathMatcherUtil.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/AntPathMatcherUtil.java new file mode 100644 index 00000000..23043bba --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/AntPathMatcherUtil.java @@ -0,0 +1,27 @@ +package cn.com.ttblog.ssmbootstrap_table.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.AntPathMatcher; + +public class AntPathMatcherUtil { + + private static final AntPathMatcher ap = new AntPathMatcher(); + private static final Logger LOG=LoggerFactory.getLogger(AntPathMatcherUtil.class); + + public static boolean isMatch(String[] mapping,String uri){ + if(mapping==null||mapping.length==0){ + throw new IllegalArgumentException("mapping不能为空"); + } + for(String m:mapping){ + if(m.length()>0){ + String ms=m.trim(); + if(ap.match(ms,uri)){ + LOG.warn("匹配:{}---{}",ms,uri); + return true; + } + } + } + return false; + } +} diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 29fad796..3c80f067 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -41,16 +41,6 @@ INCLUDE REQUEST - - - domainFilter - /* - ASYNC - ERROR - FORWARD - INCLUDE - REQUEST - domainFilter @@ -58,7 +48,7 @@ true enable - true + false @@ -108,7 +98,17 @@ true noFilterTags - index.html;login;register;captcha;.css;.js;.jpg;jsonp;/cxf + + /*/index.html* + /*/login/** + /*/register/** + /*/captcha/** + /*/css/** + /*/js/** + /*/image/** + /*/jsonp/** + /*/cxf/** + enable @@ -223,6 +223,7 @@ CORS com.thetransactioncompany.cors.CORSFilter + true cors.allowOrigin * diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestAntPath.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestAntPath.java index a5f27652..757630fb 100644 --- a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestAntPath.java +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestAntPath.java @@ -22,6 +22,10 @@ public void String() { System.out.println("ap.isPattern('/static*'):" + ap.isPattern("/static*")); System.out.println("ap.isPattern('/static?'):" + ap.isPattern("/static?")); System.out.println("ap.isPattern('/static'):" + ap.isPattern("/static")); + System.out.println("/*/index.html:"+ap.match("/*/index.html", "/ssmbootstrap_table/a/index.html")); + System.out.println("/*/index.html:"+ap.match("/*/index.html", "/ssmbootstrap_table/index.html")); + System.out.println("/*/index.html*:"+ap.match("/*/index.html*", "/ssmbootstrap_table/index.html?id=sss")); + System.out.println("/*/image/**:"+ap.match("/*/image/**", "/ssmbootstrap_table/image/backimg.jpg")); } @Test diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java index de8826f6..a827b058 100644 --- a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java @@ -7,6 +7,7 @@ import javax.annotation.Resource; import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.RandomUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Ignore; import org.junit.Test; @@ -25,7 +26,7 @@ @RunWith(SpringJUnit4ClassRunner.class) // 表示继承了SpringJUnit4ClassRunner类 -@ContextConfiguration(locations = { "classpath:spring/spring-context.xml","classpath:spring/spring-mybatis.xml" }) +@ContextConfiguration(locations = { "classpath:spring/spring-context.xml"}) public class TestMyBatis { private static Logger logger = LoggerFactory.getLogger(TestMyBatis.class); @@ -166,11 +167,16 @@ public void testForeach(){ } @Test - @Ignore +// @Ignore public void testInsert(){ //mybatis 开启BATCH处理,会导致insert返回值问题 http://www.cnblogs.com/seven7seven/p/4039622.html User u=new User(); - u.setName("ceshi"); + u.setAge(RandomUtils.nextInt(1, 20)); + u.setAdddate((int)(System.currentTimeMillis() / 1000)); + u.setName("用户:"+RandomStringUtils.randomAlphabetic(4)); + u.setDeliveryaddress(""); + u.setPhone("1324"); + u.setSex("男"); logger.debug("insert return:{}",sqlSession.insert("cn.com.ttblog.ssmbootstrap_table.dao.IUserDao.insert",u)); } @@ -185,6 +191,7 @@ public void testInsertSelectKey(){ } @Test + @Ignore public void testselectWhen(){ logger.debug("userDao.selectWhen(null):{}",userDao.selectWhen(null)); logger.debug("userDao.selectWhen(2):{}",userDao.selectWhen(2)); From d679fa6f61d4e3fff1b46e316ae69db2f97716b1 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Fri, 12 Aug 2016 10:55:36 +0800 Subject: [PATCH 187/290] test beancopy --- .../ssmbootstrap_table/model/ExtendUser.java | 20 ++++++++++++++ .../ssmbootstrap_table/TestCompareObject.java | 27 +++++++++++++++++++ .../ssmbootstrap_table/TestMyBatis.java | 6 +++++ 3 files changed, 53 insertions(+) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/model/ExtendUser.java diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/ExtendUser.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/ExtendUser.java new file mode 100644 index 00000000..a85d0395 --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/ExtendUser.java @@ -0,0 +1,20 @@ +package cn.com.ttblog.ssmbootstrap_table.model; + +import java.io.Serializable; +import org.apache.commons.lang3.builder.ToStringBuilder; + +public class ExtendUser extends User implements Serializable { + + private String[] photo; + + public String[] getPhoto() { + return photo; + } + public void setPhoto(String[] photo) { + this.photo = photo; + } + + public String toString() { + return ToStringBuilder.reflectionToString(this,null,true); + } +} \ No newline at end of file diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestCompareObject.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestCompareObject.java index d33bdf48..a8dfa704 100644 --- a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestCompareObject.java +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestCompareObject.java @@ -1,10 +1,15 @@ package cn.com.ttblog.ssmbootstrap_table; +import java.lang.reflect.InvocationTargetException; import java.util.Collections; import java.util.Map; +import org.apache.commons.beanutils.BeanUtils; +import org.junit.Ignore; import org.junit.Test; +import cn.com.ttblog.ssmbootstrap_table.model.ExtendUser; +import cn.com.ttblog.ssmbootstrap_table.model.User; import de.danielbechler.diff.ObjectDifferBuilder; import de.danielbechler.diff.node.DiffNode; @@ -14,9 +19,31 @@ public class TestCompareObject { @Test + @Ignore public void test() { Map working = Collections.singletonMap("item", "foo"); Map base = Collections.singletonMap("item", "bar"); DiffNode diff = ObjectDifferBuilder.buildDefault().compare(working, base); } + + @Test + public void testCopyProperties(){ + User u=new User("m", "男", 22, "", "s", (int)(System.currentTimeMillis()/1000), "comments",null, null); + ExtendUser eu=new ExtendUser(); + try { + long c=System.currentTimeMillis(); + BeanUtils.copyProperties(eu,u); + long e=System.currentTimeMillis(); + System.out.println("1execute:"+(e-c)+" ExtendUser1:"+eu.toString()); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + long c=System.currentTimeMillis(); + org.springframework.beans.BeanUtils.copyProperties(u, eu); + long e=System.currentTimeMillis(); + System.out.println("2execute:"+(e-c)+" ExtendUser2:"+eu.toString()); + } } diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java index a827b058..cad9035b 100644 --- a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestMyBatis.java @@ -14,6 +14,7 @@ import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.aop.support.AopUtils; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -120,6 +121,11 @@ public void testAddUserTran(){ u.setPhone("13833422322"); u.setAdddate((int)(System.currentTimeMillis() / 1000)); userService.addUser(u); + logger.info("AopUtils.isAopProxy(userService):{}",AopUtils.isAopProxy(userService)); + //cglib + logger.info("AopUtils.isCglibProxy(userService):{}",AopUtils.isCglibProxy(userService)); + //jdk动态代理 + logger.info("AopUtils.isJdkDynamicProxy(userService):{}",AopUtils.isJdkDynamicProxy(userService)); } @Test From daab915a63195a8791dcd586b0e6bddd50e70a7b Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sat, 13 Aug 2016 21:50:02 +0800 Subject: [PATCH 188/290] testThumbnailator --- pom.xml | 5 ++ .../ssmbootstrap_table/TestThumbnailator.java | 49 ++++++++++++++++++ .../ssmbootstrap_table/thumbnailator.jpg | Bin 0 -> 21232 bytes 3 files changed, 54 insertions(+) create mode 100644 src/test/java/cn/com/ttblog/ssmbootstrap_table/TestThumbnailator.java create mode 100644 src/test/java/cn/com/ttblog/ssmbootstrap_table/thumbnailator.jpg diff --git a/pom.xml b/pom.xml index 6867feff..3d1c4de8 100644 --- a/pom.xml +++ b/pom.xml @@ -380,6 +380,11 @@ 7.0.52 test + + net.coobird + thumbnailator + 0.4.8 + diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestThumbnailator.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestThumbnailator.java new file mode 100644 index 00000000..3def4f56 --- /dev/null +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestThumbnailator.java @@ -0,0 +1,49 @@ +package cn.com.ttblog.ssmbootstrap_table; + +import java.io.File; +import java.io.IOException; + +import net.coobird.thumbnailator.Thumbnails; + +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * http://rensanning.iteye.com/blog/1545708 + * Thumbnailator 图片裁切、缩放、水印等 + */ +public class TestThumbnailator { + + private static final String FILENAME="thumbnailator.jpg"; + private static final Logger LOG=LoggerFactory.getLogger(TestThumbnailator.class); + @Test + public void testThumbnailator() throws IOException{ +// 指定大小进行缩放 + /* + * 若图片横比200小,高比300小,不变 + * 若图片横比200小,高比300大,高缩小到300,图片比例不变 + * 若图片横比200大,高比300小,横缩小到200,图片比例不变 + * 若图片横比200大,高比300大,图片按比例缩小,横为200或高为300 + */ + String file=this.getClass().getResource(FILENAME).getFile(); + File f=new File(file); + LOG.debug("file-path:{},parent:{}",f.getAbsolutePath(),f.getParent()); + Thumbnails.of(f.getAbsolutePath()) + .size(200, 300) + .toFile("thumbnailator"+RandomStringUtils.randomAlphabetic(5)+".jpg"); + + Thumbnails.of(f.getAbsolutePath()) + .size(2560, 2048) + .toFile("thumbnailator"+RandomStringUtils.randomAlphabetic(5)+".jpg"); + + Thumbnails.of(f.getAbsolutePath()) + .scale(0.25f) + .toFile("thumbnailator"+RandomStringUtils.randomAlphabetic(5)+".jpg"); + + Thumbnails.of(f.getAbsolutePath()) + .scale(1.10f) + .toFile("thumbnailator"+RandomStringUtils.randomAlphabetic(5)+".jpg"); + } +} diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/thumbnailator.jpg b/src/test/java/cn/com/ttblog/ssmbootstrap_table/thumbnailator.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f213a756165ec4aae832508a66e1dd038493d262 GIT binary patch literal 21232 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 literal 0 HcmV?d00001 From 1f9b4ff39eeed12b8c0417b7d70b2c146bdcfb28 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sun, 14 Aug 2016 22:28:40 +0800 Subject: [PATCH 189/290] jquery ajax upload --- .../controller/FileUploadController.java | 30 +++++++++- .../ssmbootstrap_table/model/FileMsgBean.java | 55 +++++++++++++++++++ src/main/webapp/user/add.jsp | 40 ++++++++++++++ 3 files changed, 123 insertions(+), 2 deletions(-) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/model/FileMsgBean.java diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/FileUploadController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/FileUploadController.java index 9afa33e4..d0ae7202 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/FileUploadController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/FileUploadController.java @@ -3,6 +3,11 @@ import java.io.File; import java.io.IOException; +import javax.servlet.http.HttpServletRequest; + +import net.coobird.thumbnailator.Thumbnails; + +import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.builder.ToStringBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -12,15 +17,19 @@ 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.context.request.WebRequest; import org.springframework.web.multipart.MultipartFile; +import cn.com.ttblog.ssmbootstrap_table.model.FileMsgBean; import cn.com.ttblog.ssmbootstrap_table.util.AjaxUtils; @Controller @RequestMapping("/fileupload") public class FileUploadController { - private Logger log=LoggerFactory.getLogger(this.getClass()); + + private static final Logger log=LoggerFactory.getLogger(FileUploadController.class); + @ModelAttribute public void ajaxAttribute(WebRequest request, Model model) { model.addAttribute("ajaxRequest", AjaxUtils.isAjaxRequest(request)); @@ -30,7 +39,7 @@ public void ajaxAttribute(WebRequest request, Model model) { public void fileUploadForm() { } - @RequestMapping(method=RequestMethod.POST) + @RequestMapping(value="/upload",method=RequestMethod.POST) public void processUpload(@RequestParam MultipartFile file, Model model) throws IOException { log.info("文件上传信息:{}",ToStringBuilder.reflectionToString(file)); log.info("文件上传,存储路径:{}",System.getProperty("webapp.root")+file.getOriginalFilename()); @@ -38,4 +47,21 @@ public void processUpload(@RequestParam MultipartFile file, Model model) throws model.addAttribute("message", "File '" + file.getOriginalFilename() + "' uploaded successfully"); } + @RequestMapping(value="/ajaxupload",method=RequestMethod.POST) + @ResponseBody + public FileMsgBean ajaxUpload(@RequestParam MultipartFile file, HttpServletRequest request) throws IOException { + log.info("ajax文件上传信息:{}",ToStringBuilder.reflectionToString(file)); + String filename=System.getProperty("webapp.root")+File.separator+"image"+File.separator+file.getOriginalFilename(); + String url=request.getContextPath()+"/image/"+file.getOriginalFilename(); + //缩率图 +// Thumbnails.of(f.getAbsolutePath()).scale(1.10f).toFile("thumbnailator"+RandomStringUtils.randomAlphabetic(5)+".jpg"); + log.info("ajax文件上传,存储路径:{},url:{}",filename,url); + FileMsgBean bean=new FileMsgBean(); + bean.setName(file.getOriginalFilename()); + bean.setSize(file.getSize()); + bean.setUrl(url); + bean.setThumbnailUrl("url"); + bean.setDeleteUrl("url"); + return bean; + } } \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/FileMsgBean.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/FileMsgBean.java new file mode 100644 index 00000000..9c1f964c --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/model/FileMsgBean.java @@ -0,0 +1,55 @@ +package cn.com.ttblog.ssmbootstrap_table.model; + +import org.apache.commons.lang3.builder.ToStringBuilder; + +public class FileMsgBean { + private String name; + private long size; + private String url; + private String thumbnailUrl; + private String deleteUrl; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getThumbnailUrl() { + return thumbnailUrl; + } + + public void setThumbnailUrl(String thumbnailUrl) { + this.thumbnailUrl = thumbnailUrl; + } + + public String getDeleteUrl() { + return deleteUrl; + } + + public void setDeleteUrl(String deleteUrl) { + this.deleteUrl = deleteUrl; + } + + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} \ No newline at end of file diff --git a/src/main/webapp/user/add.jsp b/src/main/webapp/user/add.jsp index b9728067..0682c9b8 100644 --- a/src/main/webapp/user/add.jsp +++ b/src/main/webapp/user/add.jsp @@ -8,6 +8,39 @@ 添加用户 + + + + + + +
    @@ -72,6 +105,13 @@
    0/200
    + +
    + + +
    +
    + From b205fe96701e9ac0b36b7974ab9bf6672808b574 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Mon, 15 Aug 2016 21:36:46 +0800 Subject: [PATCH 190/290] jq ajax upload test --- .../controller/FileUploadController.java | 23 +++++++++++++++---- .../controller/IndexController.java | 4 ++-- .../controller/RegisterController.java | 9 ++++++++ src/main/webapp/user/add.jsp | 1 + .../SpringMvcControllerTests.java | 11 +++++---- .../ssmbootstrap_table/TestStringFormat.java | 8 +++++++ 6 files changed, 45 insertions(+), 11 deletions(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/FileUploadController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/FileUploadController.java index d0ae7202..bdeb842a 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/FileUploadController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/FileUploadController.java @@ -2,12 +2,13 @@ import java.io.File; import java.io.IOException; +import java.util.Arrays; import javax.servlet.http.HttpServletRequest; import net.coobird.thumbnailator.Thumbnails; -import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.builder.ToStringBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -52,15 +53,27 @@ public void processUpload(@RequestParam MultipartFile file, Model model) throws public FileMsgBean ajaxUpload(@RequestParam MultipartFile file, HttpServletRequest request) throws IOException { log.info("ajax文件上传信息:{}",ToStringBuilder.reflectionToString(file)); String filename=System.getProperty("webapp.root")+File.separator+"image"+File.separator+file.getOriginalFilename(); - String url=request.getContextPath()+"/image/"+file.getOriginalFilename(); + String relativePath=request.getServletContext().getRealPath("image")+File.separator; + String originName=file.getOriginalFilename(); + String ext=originName.split("\\.")[1]; + log.info("file.getName():{},file.getOriginalFilename():{},originName.split(\".\"):{}",file.getName(),file.getOriginalFilename(),Arrays.deepToString(originName.split("\\."))); + String usedName=Base64.encodeBase64String(originName.getBytes())+"."+ext; + String savePath=relativePath+usedName; + String host=request.getHeader("host"); + String contextPath=request.getContextPath(); + String url=request.getScheme()+"://"+host+contextPath+"/image/"+usedName; + log.info("host:{},contextPath:{},relativePath:{},savePath:{}",host,contextPath,relativePath,savePath); //缩率图 -// Thumbnails.of(f.getAbsolutePath()).scale(1.10f).toFile("thumbnailator"+RandomStringUtils.randomAlphabetic(5)+".jpg"); - log.info("ajax文件上传,存储路径:{},url:{}",filename,url); + File saveFile=new File(savePath); + log.info("ajax文件上传:{},存储路径:{},url:{}--name:{}",ToStringBuilder.reflectionToString(new File(filename)),filename,url,file.getName()); + file.transferTo(saveFile); + String thumbFileName=Base64.encodeBase64String((originName+"scale030").getBytes())+"."+ext; + Thumbnails.of(saveFile).scale(0.30f).toFile(relativePath+thumbFileName); FileMsgBean bean=new FileMsgBean(); bean.setName(file.getOriginalFilename()); bean.setSize(file.getSize()); bean.setUrl(url); - bean.setThumbnailUrl("url"); + bean.setThumbnailUrl(request.getScheme()+"://"+host+contextPath+"/image/"+thumbFileName); bean.setDeleteUrl("url"); return bean; } diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java index b48c59d5..fbc433a8 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java @@ -41,7 +41,7 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import com.alibaba.fastjson.JSONArray; -import com.codahale.metrics.annotation.Timed; +//import com.codahale.metrics.annotation.Timed; import cn.com.ttblog.ssmbootstrap_table.event.LoginEvent; import cn.com.ttblog.ssmbootstrap_table.model.User; import cn.com.ttblog.ssmbootstrap_table.service.IUserService; @@ -131,7 +131,7 @@ public String newdata(HttpSession session, Model model) { return "this is str"; } - @Timed +// @Timed @RequestMapping("/datacount") public @ResponseBody Map datacount() { logger.debug("获取datacount"); diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java index 571d83d9..440afb86 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/RegisterController.java @@ -3,7 +3,9 @@ import java.util.List; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; + import org.apache.commons.lang3.builder.ToStringBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -12,6 +14,7 @@ import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; + import cn.com.ttblog.ssmbootstrap_table.exception.CustomGenericException; import cn.com.ttblog.ssmbootstrap_table.model.User; import cn.com.ttblog.ssmbootstrap_table.model.UserListModel; @@ -92,4 +95,10 @@ public String testRedirect(Model model){ model.addAttribute("param", "test"); return "redirect:/register-success.html?id={param}"; } + + @RequestMapping("/req") + public void req(HttpServletRequest request){ + logger.info("Protocol:{}\r\n" + + "servername:{},\r\ngetScheme:{}",request.getProtocol(),request.getServerName(),request.getScheme()); + } } \ No newline at end of file diff --git a/src/main/webapp/user/add.jsp b/src/main/webapp/user/add.jsp index 0682c9b8..d3923a40 100644 --- a/src/main/webapp/user/add.jsp +++ b/src/main/webapp/user/add.jsp @@ -18,6 +18,7 @@ + + + + + + + + + + + + + + + + + + + +
    + + + + + + + +
    +
    + + + + Add files... + + + + + + + + +
    + +
    + +
    +
    +
    + +
     
    +
    +
    + +
    + + +
    + + + + + +
    + + +
    +
    + + + \ No newline at end of file diff --git a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestInt.java b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestInt.java index 4bcbf2c7..4a54abb4 100644 --- a/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestInt.java +++ b/src/test/java/cn/com/ttblog/ssmbootstrap_table/TestInt.java @@ -1,7 +1,7 @@ package cn.com.ttblog.ssmbootstrap_table; import java.math.BigInteger; - +import org.apache.commons.lang3.RandomUtils; import org.junit.Ignore; import org.junit.Test; @@ -20,6 +20,7 @@ public void testint() { } @Test + @Ignore public void testBigInteger() { BigInteger a=BigInteger.valueOf(Integer.MAX_VALUE); System.out.println(a); @@ -27,4 +28,10 @@ public void testBigInteger() { System.out.println(b); } + @Test + public void testRandom(){ + for (int i = 0; i <100; i++) { + System.out.println("RandomUtils.nextInt(2, 6):" + RandomUtils.nextInt(2, 6)); + } + } } \ No newline at end of file From b60014635f1cec2509e4698ea80296bf5c310e7a Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 18 Aug 2016 17:06:14 +0800 Subject: [PATCH 192/290] test multiupload --- src/main/java/README.md | 3 ++ .../controller/FileUploadController.java | 19 +++++----- src/main/webapp/user/photos.jsp | 36 ++++++++++--------- 3 files changed, 33 insertions(+), 25 deletions(-) create mode 100644 src/main/java/README.md diff --git a/src/main/java/README.md b/src/main/java/README.md new file mode 100644 index 00000000..4aaa1272 --- /dev/null +++ b/src/main/java/README.md @@ -0,0 +1,3 @@ +### 备注 + +* `FileUploadController`-文件上传测试,包括`jquery.fileupload`的使用 \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/FileUploadController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/FileUploadController.java index 905b07fb..1543bf4b 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/FileUploadController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/FileUploadController.java @@ -6,6 +6,7 @@ import java.util.Arrays; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.concurrent.TimeUnit; import javax.servlet.http.HttpServletRequest; @@ -87,14 +88,16 @@ public FileMsgBean ajaxUpload(@RequestParam MultipartFile file, HttpServletReque @RequestMapping(value="/multiupload", method = RequestMethod.POST) public @ResponseBody List upload(MultipartHttpServletRequest request, HttpServletResponse response) { - log.debug("ajax多文件上传:{}",ToStringBuilder.reflectionToString(request.getFileNames())); - int sleep=RandomUtils.nextInt(2, 6); - log.debug("upload-sleep:{}s",sleep); - try { - TimeUnit.SECONDS.sleep(sleep); - } catch (InterruptedException e) { - e.printStackTrace(); - } + log.debug("ajax多文件上传:1{},2{},getMultiFileMap:{}",request.getFiles("files"),request.getFiles("files[]"),request.getMultiFileMap()); + Map files=request.getFileMap(); + log.debug("files:",files); +// int sleep=RandomUtils.nextInt(2, 6); +// log.debug("upload-sleep:{}s",sleep); +// try { +// TimeUnit.SECONDS.sleep(sleep); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } List beans=new ArrayList(2); for(int i=0;i<2;i++){ FileMsgBean bean=new FileMsgBean(); diff --git a/src/main/webapp/user/photos.jsp b/src/main/webapp/user/photos.jsp index 5a9878f0..79f42207 100644 --- a/src/main/webapp/user/photos.jsp +++ b/src/main/webapp/user/photos.jsp @@ -79,11 +79,11 @@ }); $("#uploads").fileupload({ - url: '${pageContext.request.contextPath }/fileupload/ajaxupload' + url: '${pageContext.request.contextPath }/fileupload/multiupload' }); $('#uploads').fileupload('option', { - url: '${pageContext.request.contextPath }/fileupload/ajaxupload', + url: '${pageContext.request.contextPath }/fileupload/multiupload', // Enable image resizing, except for Android and Opera, // which actually support image resizing, but fail to // send Blob objects via XHR requests: @@ -98,7 +98,9 @@
    - + -
    + @@ -127,12 +129,12 @@ - Add files... - + 添加文件... +
    - +
    + +
    + +
    +
    + +
    \ No newline at end of file diff --git a/src/main/webapp/demolist.html b/src/main/webapp/demolist.html index b43652ec..aa7a9748 100644 --- a/src/main/webapp/demolist.html +++ b/src/main/webapp/demolist.html @@ -23,8 +23,8 @@

    demo list show demo!

  • user2.xml
  • ueditor
  • websocket
  • -
  • 二维码
  • - +
  • 二维码生成
  • +
  • 二维码解析
  • @@ -36,6 +36,7 @@

    demo list show demo!

  • session
  • sui
  • 用户ua
  • +
  • @ModelAttribute
  • diff --git a/src/main/webapp/test.jsp b/src/main/webapp/test.jsp index 8061f982..997bf482 100644 --- a/src/main/webapp/test.jsp +++ b/src/main/webapp/test.jsp @@ -16,6 +16,8 @@
    fmt:message key="header.language":
    spring:message code="header.language":

    - syn:${syn} + syn:${syn}
    + user:${user}
    + u:${u} \ No newline at end of file From 52e2902dae213f16a33a808d0f6a47008be7479f Mon Sep 17 00:00:00 2001 From: netbuffer Date: Tue, 11 Oct 2016 22:00:11 +0800 Subject: [PATCH 223/290] update --- .../controller/TestController.java | 18 ++++++--- .../ssmbootstrap_table/util/AjaxUtils.java | 37 ++++++++++++++++--- src/main/resources/jdbc.properties | 4 +- src/main/webapp/manage.html | 4 +- 4 files changed, 51 insertions(+), 12 deletions(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java index 4043ba63..e3f30002 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java @@ -12,14 +12,12 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; - import javax.annotation.Resource; import javax.imageio.ImageIO; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; - import org.apache.commons.lang3.exception.ExceptionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,7 +40,6 @@ import org.springframework.web.multipart.commons.CommonsMultipartFile; import org.springframework.web.servlet.i18n.CookieLocaleResolver; import org.springframework.web.servlet.mvc.support.RedirectAttributes; - import com.alibaba.fastjson.JSONObject; import com.google.zxing.BarcodeFormat; import com.google.zxing.Binarizer; @@ -61,14 +58,12 @@ import com.google.zxing.common.BitMatrix; import com.google.zxing.common.HybridBinarizer; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; - import cn.com.ttblog.ssmbootstrap_table.annotation.Token; import cn.com.ttblog.ssmbootstrap_table.model.Address; import cn.com.ttblog.ssmbootstrap_table.model.ExtendUser; import cn.com.ttblog.ssmbootstrap_table.model.User; import cn.com.ttblog.ssmbootstrap_table.util.AjaxUtils; import eu.bitwalker.useragentutils.UserAgent; -import lombok.val; @Controller @RequestMapping("/test") @@ -483,4 +478,17 @@ public String testmodelattr3(@ModelAttribute(value="u")User u){ return "test"; } + @RequestMapping(value="/serverip") + public @ResponseBody String getLocalIP(){ + String ip=AjaxUtils.getLocalIP(); + logger.debug("getLocalIP:{}",ip); + return ip; + } + + @RequestMapping(value="/indexurl") + public @ResponseBody String indexurl(HttpServletRequest request){ + String indexurl=request.getScheme()+"://"+AjaxUtils.getLocalIP()+":"+configProperties.getProperty("appport")+request.getContextPath(); + logger.debug("indexurl:{}",indexurl); + return indexurl; + } } diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/AjaxUtils.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/AjaxUtils.java index 27a0835f..06050d56 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/AjaxUtils.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/util/AjaxUtils.java @@ -1,5 +1,8 @@ package cn.com.ttblog.ssmbootstrap_table.util; +import java.net.InetAddress; +import java.net.UnknownHostException; + import javax.servlet.http.HttpServletRequest; import org.springframework.web.context.request.WebRequest; @@ -8,18 +11,42 @@ public class AjaxUtils { public static boolean isAjaxRequest(WebRequest webRequest) { String requestedWith = webRequest.getHeader("X-Requested-With"); - return requestedWith != null ? "XMLHttpRequest".equals(requestedWith) : false; + return requestedWith != null ? "XMLHttpRequest".equals(requestedWith) + : false; } public static boolean isAjaxRequest(HttpServletRequest webRequest) { String requestedWith = webRequest.getHeader("X-Requested-With"); - return requestedWith != null ? "XMLHttpRequest".equals(requestedWith) : false; + return requestedWith != null ? "XMLHttpRequest".equals(requestedWith) + : false; } - + public static boolean isAjaxUploadRequest(WebRequest webRequest) { return webRequest.getParameter("ajaxUpload") != null; } - - private AjaxUtils() {} + + public static String getLocalIP() { + InetAddress addr = null; + try { + addr = InetAddress.getLocalHost(); + } catch (UnknownHostException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + byte[] ipAddr = addr.getAddress(); + String ipAddrStr = ""; + for (int i = 0; i < ipAddr.length; i++) { + if (i > 0) { + ipAddrStr += "."; + } + ipAddrStr += ipAddr[i] & 0xFF; + } + // System.out.println(ipAddrStr); + return ipAddrStr; + } + + private AjaxUtils() { + } } \ No newline at end of file diff --git a/src/main/resources/jdbc.properties b/src/main/resources/jdbc.properties index 0ebb0d0d..54d36124 100644 --- a/src/main/resources/jdbc.properties +++ b/src/main/resources/jdbc.properties @@ -16,4 +16,6 @@ driver2=com.mysql.jdbc.Driver url2=jdbc:mysql://127.0.0.1:3306/u2 username2=root password2=root -mysql.connectTime=86400 \ No newline at end of file +mysql.connectTime=86400 +#程序使用的端口 +appport=8080 \ No newline at end of file diff --git a/src/main/webapp/manage.html b/src/main/webapp/manage.html index e137430e..0d7dcc5a 100644 --- a/src/main/webapp/manage.html +++ b/src/main/webapp/manage.html @@ -27,6 +27,9 @@ + + @@ -53,17 +84,17 @@

    登陆

    - - - - + + + +
    +

    单文件上传

    - +
    -
    +
    +
    +
    +

    多文件上传

    +
    + +
    +
    +
    +
    \ No newline at end of file From f415fe60b5c1b19aae16280fc4f9673aed666f5c Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sat, 2 Sep 2017 13:17:16 +0800 Subject: [PATCH 267/290] remove cxf && update spring version --- pom.xml | 14 +- .../cxfexample/data/LocationData.java | 66 ------- .../exception/DuplicateLocationException.java | 22 --- .../exception/LocationNotFoundException.java | 19 -- .../exception/ValidationException.java | 18 -- .../exception/meta/ExceptionData.java | 54 ------ .../exception/meta/LocationBaseException.java | 39 ---- .../meta/LocationResponseExceptionMapper.java | 49 ----- .../web/LocationClientController.java | 175 ------------------ .../cxfexample/webservice/LocationClient.java | 98 ---------- .../webservice/LocationService.java | 78 -------- .../webservice/LocationServiceEndpoint.java | 119 ------------ src/main/resources/cxf/cxf-handler-chain.xml | 10 - src/main/resources/cxf/cxf.xml | 88 --------- src/main/resources/spring/spring-context.xml | 1 - src/main/resources/spring/spring-mvc.xml | 13 +- 16 files changed, 9 insertions(+), 854 deletions(-) delete mode 100644 src/main/java/org/exampledriven/cxfexample/data/LocationData.java delete mode 100644 src/main/java/org/exampledriven/cxfexample/exception/DuplicateLocationException.java delete mode 100644 src/main/java/org/exampledriven/cxfexample/exception/LocationNotFoundException.java delete mode 100644 src/main/java/org/exampledriven/cxfexample/exception/ValidationException.java delete mode 100644 src/main/java/org/exampledriven/cxfexample/exception/meta/ExceptionData.java delete mode 100644 src/main/java/org/exampledriven/cxfexample/exception/meta/LocationBaseException.java delete mode 100644 src/main/java/org/exampledriven/cxfexample/exception/meta/LocationResponseExceptionMapper.java delete mode 100644 src/main/java/org/exampledriven/cxfexample/web/LocationClientController.java delete mode 100644 src/main/java/org/exampledriven/cxfexample/webservice/LocationClient.java delete mode 100644 src/main/java/org/exampledriven/cxfexample/webservice/LocationService.java delete mode 100644 src/main/java/org/exampledriven/cxfexample/webservice/LocationServiceEndpoint.java delete mode 100644 src/main/resources/cxf/cxf-handler-chain.xml delete mode 100644 src/main/resources/cxf/cxf.xml diff --git a/pom.xml b/pom.xml index 03b97805..9c6a9daa 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ - 4.1.6.RELEASE + 4.3.10.RELEASE 3.3.0 1.7.7 1.1.3 @@ -248,18 +248,6 @@ jackson-databind 2.7.4 - - - org.apache.cxf - cxf-rt-frontend-jaxrs - ${cxf.version} - - - - cxf-rt-frontend-jaxws - org.apache.cxf - ${cxf.version} - org.projectlombok lombok diff --git a/src/main/java/org/exampledriven/cxfexample/data/LocationData.java b/src/main/java/org/exampledriven/cxfexample/data/LocationData.java deleted file mode 100644 index ae814f3e..00000000 --- a/src/main/java/org/exampledriven/cxfexample/data/LocationData.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.exampledriven.cxfexample.data; - -import java.util.Date; -import java.util.Formatter; -import java.util.Locale; - -import javax.validation.constraints.Size; -import javax.xml.bind.annotation.XmlRootElement; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.sun.istack.NotNull; - -@XmlRootElement(name = "LocationData") -public class LocationData { - - private String id; - @DateTimeFormat(pattern="yyyy-mm-dd") - private Date date; - @NotNull - private String timezone; - @NotNull - @Size(max = 20, min = 5) - private String location; - - public void setTimezone(String timezone) { - this.timezone = timezone; - } - - public String getTimezone() { - return timezone; - } - - public void setLocation(String location) { - this.location = location; - } - - public String getLocation() { - return location; - } - - public void setDate(Date date) { - this.date = date; - } - - public Date getDate() { - return date; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - Formatter formatter = new Formatter(sb, Locale.US); - formatter.format("ID:%s\nLocation:%s\nDate:%s\nTime zone:%s\n", getId(), getLocation(), getDate(), getTimezone()); - - return sb.toString(); - } -} diff --git a/src/main/java/org/exampledriven/cxfexample/exception/DuplicateLocationException.java b/src/main/java/org/exampledriven/cxfexample/exception/DuplicateLocationException.java deleted file mode 100644 index 5842af0d..00000000 --- a/src/main/java/org/exampledriven/cxfexample/exception/DuplicateLocationException.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.exampledriven.cxfexample.exception; - -import javax.ws.rs.core.Response.Status; - -import org.exampledriven.cxfexample.exception.meta.LocationBaseException; - - -/** - * Indicates if a location is already created - * @author pszanto - */ -public class DuplicateLocationException extends LocationBaseException { - - private static final long serialVersionUID = -8212991366777389573L; - - public DuplicateLocationException() { - - super(Status.CONFLICT, "Location is already stored"); - - } - -} diff --git a/src/main/java/org/exampledriven/cxfexample/exception/LocationNotFoundException.java b/src/main/java/org/exampledriven/cxfexample/exception/LocationNotFoundException.java deleted file mode 100644 index 210e74cf..00000000 --- a/src/main/java/org/exampledriven/cxfexample/exception/LocationNotFoundException.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.exampledriven.cxfexample.exception; - -import javax.ws.rs.core.Response.Status; - -import org.exampledriven.cxfexample.exception.meta.LocationBaseException; - - -public class LocationNotFoundException extends LocationBaseException { - - private static final long serialVersionUID = 1154886234595592271L; - - public LocationNotFoundException() { - - super(Status.NOT_FOUND, "Location not found"); - - } - - -} diff --git a/src/main/java/org/exampledriven/cxfexample/exception/ValidationException.java b/src/main/java/org/exampledriven/cxfexample/exception/ValidationException.java deleted file mode 100644 index efeee5e6..00000000 --- a/src/main/java/org/exampledriven/cxfexample/exception/ValidationException.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.exampledriven.cxfexample.exception; - -import java.util.Map; - -import javax.ws.rs.core.Response.Status; - -import org.exampledriven.cxfexample.exception.meta.LocationBaseException; - - -public class ValidationException extends LocationBaseException { - - private static final long serialVersionUID = -6353144184095941148L; - - public ValidationException(Map data) { - super(Status.BAD_REQUEST, "Validation failed", data); - } - -} diff --git a/src/main/java/org/exampledriven/cxfexample/exception/meta/ExceptionData.java b/src/main/java/org/exampledriven/cxfexample/exception/meta/ExceptionData.java deleted file mode 100644 index ebf38347..00000000 --- a/src/main/java/org/exampledriven/cxfexample/exception/meta/ExceptionData.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.exampledriven.cxfexample.exception.meta; - -import java.util.HashMap; -import java.util.Map; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement(name = "Exception") -public class ExceptionData { - - private String message; - private Map data; - - public ExceptionData() { - } - - public ExceptionData(String message, Map data) { - this.setMessage(message); - this.setData(data); - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public static void main(String[] args) throws JAXBException { - Map map = new HashMap(); - map.put("key", "value"); - - ExceptionData em = new ExceptionData("hello", map); - - JAXBContext context = JAXBContext.newInstance(ExceptionData.class); - Marshaller m = context.createMarshaller(); - m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); - m.marshal(em, System.out); - } - - public Map getData() { - return data; - } - - public void setData(Map data) { - this.data = data; - } - - -} diff --git a/src/main/java/org/exampledriven/cxfexample/exception/meta/LocationBaseException.java b/src/main/java/org/exampledriven/cxfexample/exception/meta/LocationBaseException.java deleted file mode 100644 index 40f249ef..00000000 --- a/src/main/java/org/exampledriven/cxfexample/exception/meta/LocationBaseException.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.exampledriven.cxfexample.exception.meta; - -import java.util.Map; - -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; - -public class LocationBaseException extends WebApplicationException { - - private static final long serialVersionUID = 1154886234595592271L; - - private ExceptionData exceptionData; - - public LocationBaseException(Status status, String message, Map data) { - - super(Response.status(status).entity(new ExceptionData(message, data)).build()); - - setExceptionData((ExceptionData)getResponse().getEntity()); - - } - public LocationBaseException(Status status, String message) { - this(status, message, null); - } - - @Override - public String getMessage() { - return getExceptionData().getMessage(); - } - - public ExceptionData getExceptionData() { - return exceptionData; - } - public void setExceptionData(ExceptionData exceptionData) { - this.exceptionData = exceptionData; - } - - -} diff --git a/src/main/java/org/exampledriven/cxfexample/exception/meta/LocationResponseExceptionMapper.java b/src/main/java/org/exampledriven/cxfexample/exception/meta/LocationResponseExceptionMapper.java deleted file mode 100644 index 2f3eba72..00000000 --- a/src/main/java/org/exampledriven/cxfexample/exception/meta/LocationResponseExceptionMapper.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.exampledriven.cxfexample.exception.meta; - -import java.io.InputStream; - -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; - -import org.apache.cxf.jaxrs.client.ResponseExceptionMapper; -import org.exampledriven.cxfexample.exception.DuplicateLocationException; -import org.exampledriven.cxfexample.exception.LocationNotFoundException; -import org.exampledriven.cxfexample.exception.ValidationException; - - -public class LocationResponseExceptionMapper implements ResponseExceptionMapper { - - @Override - public LocationBaseException fromResponse(Response r) { - - if (r.getStatus() == Status.NOT_FOUND.getStatusCode()) { - return new LocationNotFoundException(); - } - - if (r.getStatus() == Status.CONFLICT.getStatusCode()) { - return new DuplicateLocationException(); - } - - if (r.getStatus() == Status.BAD_REQUEST.getStatusCode()) { - - JAXBContext context; - try { - context = JAXBContext.newInstance(ExceptionData.class); - Unmarshaller um = context.createUnmarshaller(); - ExceptionData ed = (ExceptionData) um.unmarshal((InputStream)r.getEntity()); - return new ValidationException(ed.getData()); - } catch (JAXBException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - - - } - - return null; - } - -} diff --git a/src/main/java/org/exampledriven/cxfexample/web/LocationClientController.java b/src/main/java/org/exampledriven/cxfexample/web/LocationClientController.java deleted file mode 100644 index a79ebc27..00000000 --- a/src/main/java/org/exampledriven/cxfexample/web/LocationClientController.java +++ /dev/null @@ -1,175 +0,0 @@ -package org.exampledriven.cxfexample.web; - -import java.util.Collection; -import java.util.LinkedList; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; - -import org.exampledriven.cxfexample.data.LocationData; -import org.exampledriven.cxfexample.exception.DuplicateLocationException; -import org.exampledriven.cxfexample.exception.LocationNotFoundException; -import org.exampledriven.cxfexample.exception.ValidationException; -import org.exampledriven.cxfexample.webservice.LocationClient; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.validation.BindingResult; -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.SessionAttributes; - - -@Controller -@RequestMapping("/cxftest") -@SessionAttributes("locationData") -public class LocationClientController { - - private Logger logger = LoggerFactory.getLogger(this.getClass()); - private String applicationURI; - - private LocationClient locationClientSOAP; - private LocationClient locationClientREST; - - private LocationClient getLocationClient(HttpServletRequest request, LocationClient.CLIENT_TYPE clientType) { - - if (clientType.equals(LocationClient.CLIENT_TYPE.SOAP)) { - if (locationClientSOAP == null) { - locationClientSOAP = new LocationClient(getApplicationURI(request), LocationClient.CLIENT_TYPE.SOAP); - } - - return locationClientSOAP; - } - - if (clientType.equals(LocationClient.CLIENT_TYPE.REST)) { - if (locationClientREST == null) { - locationClientREST = new LocationClient(getApplicationURI(request), LocationClient.CLIENT_TYPE.REST); - } - - return locationClientREST; - } - - - return null; - } - - @RequestMapping(method = RequestMethod.GET) - public String showForm(Model model) { - - model.addAttribute("locationData", new LocationData()); - - return "locationClient"; - - } - - /** - * returns the URI of the application - * @param req - * @return - */ - private String getApplicationURI(HttpServletRequest req) { - if (applicationURI == null) { - String port; - - if ("http".equalsIgnoreCase(req.getScheme()) && req.getServerPort() != 80 || - "https".equalsIgnoreCase(req.getScheme()) && req.getServerPort() != 443 ) { - port = ":" + req.getServerPort(); - } else { - port = ""; - } - - applicationURI = req.getScheme() + "://" + req.getServerName() + - port + req.getContextPath(); - - logger.debug("Application URL was set to " + applicationURI ); - } - - return applicationURI; - } - - @RequestMapping(value="/read", method = RequestMethod.GET) - public String readLocation(@RequestParam String protocol, @RequestParam("location") String location, Model model, HttpServletRequest request) throws LocationNotFoundException { - - logger.debug("location param is " + location); - - LocationData locationDataResp = getLocationClient(request, LocationClient.CLIENT_TYPE.fromString(protocol)).readLocation(location); - - logger.debug("location result is " + locationDataResp); - - List locationDataList = new LinkedList(); - locationDataList.add(locationDataResp); - model.addAttribute("locationDataList", locationDataList); - - return "locationClient"; - - } - - @RequestMapping(value="/create", method = RequestMethod.POST) - public String createLocation(@RequestParam String protocol, LocationData locationData, Model model, HttpServletRequest request, BindingResult bindingResult) throws DuplicateLocationException { - - logger.debug("location param is " + locationData); - - try { - LocationData locationDataResp = getLocationClient(request, LocationClient.CLIENT_TYPE.fromString(protocol)).createLocation(locationData); - List locationDataList = new LinkedList(); - locationDataList.add(locationDataResp); - model.addAttribute("locationDataList", locationDataList); - logger.debug("location result is " + locationDataResp); - } catch (ValidationException e) { - for (String field : e.getExceptionData().getData().keySet()) { - bindingResult.rejectValue(field, null, e.getExceptionData().getData().get(field)); - } - } - - return "locationClient"; - - } - - @RequestMapping(value="/update", method = RequestMethod.POST) - public String updateLocation(@RequestParam String protocol, LocationData locationData, Model model, HttpServletRequest request) throws DuplicateLocationException { - - logger.debug("location param is " + locationData); - - LocationData locationDataResp = getLocationClient(request, LocationClient.CLIENT_TYPE.fromString(protocol)).updateorCreateLocation(locationData); - /* - new JAXBElement(); - - LocationData locationDataResp = locationClient.createLocation(locationData.getLocation(), locationData); - */ - - logger.debug("location result is " + locationDataResp); - - List locationDataList = new LinkedList(); - locationDataList.add(locationDataResp); - model.addAttribute("locationDataList", locationDataList); - - return "locationClient"; - - } - - @RequestMapping(value="/readall", method = RequestMethod.GET) - public String readAllLocation(@RequestParam String protocol, Model model, HttpServletRequest request) throws DuplicateLocationException { - Collection locationDataList = getLocationClient(request, LocationClient.CLIENT_TYPE.fromString(protocol)).readAllLocations(); - - model.addAttribute("locationDataList", locationDataList); - - return "locationClient"; - } - - @RequestMapping(value="/deleteall", method = RequestMethod.GET) - public String deleteAllLocation(@RequestParam String protocol, Model model, HttpServletRequest request) throws DuplicateLocationException { - getLocationClient(request, LocationClient.CLIENT_TYPE.fromString(protocol)).deleteAllLocation(); - - return "locationClient"; - } - - @RequestMapping(value="/delete", method = RequestMethod.GET) - public String deleteAllLocation(@RequestParam String protocol, @RequestParam String location, Model model, HttpServletRequest request) throws DuplicateLocationException, LocationNotFoundException { - getLocationClient(request, LocationClient.CLIENT_TYPE.fromString(protocol)).deleteLocation(location); - - return "locationClient"; - } - -} diff --git a/src/main/java/org/exampledriven/cxfexample/webservice/LocationClient.java b/src/main/java/org/exampledriven/cxfexample/webservice/LocationClient.java deleted file mode 100644 index c66af464..00000000 --- a/src/main/java/org/exampledriven/cxfexample/webservice/LocationClient.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.exampledriven.cxfexample.webservice; - -import java.util.Collection; -import java.util.LinkedList; -import java.util.List; - -import org.apache.cxf.jaxrs.client.ClientConfiguration; -import org.apache.cxf.jaxrs.client.JAXRSClientFactory; -import org.apache.cxf.jaxrs.client.WebClient; -import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; -import org.exampledriven.cxfexample.data.LocationData; -import org.exampledriven.cxfexample.exception.DuplicateLocationException; -import org.exampledriven.cxfexample.exception.LocationNotFoundException; -import org.exampledriven.cxfexample.exception.meta.LocationResponseExceptionMapper; - - -public class LocationClient implements LocationService { - - private LocationService locationService; - - public static enum CLIENT_TYPE {REST("REST"), SOAP("SOAP"); - - private String value; - private CLIENT_TYPE(String value) { - this.value = value; - } - - public static CLIENT_TYPE fromString(String value) { - - if (REST.value.equalsIgnoreCase(value)) { - return REST; - } - - if (SOAP.value.equalsIgnoreCase(value)) { - return SOAP; - } - - return null; - } - }; - - public LocationClient(String applicationURI, CLIENT_TYPE clientType) { - - if (clientType == CLIENT_TYPE.REST) { - List providers = new LinkedList(); - providers.add(new LocationResponseExceptionMapper()); - locationService = JAXRSClientFactory.create(applicationURI + "/cxf/rest/", LocationService.class, providers, true); - ClientConfiguration cfgProxy = WebClient.getConfig(locationService); - cfgProxy.getHttpConduit().getAuthorization().setPassword("restuser"); - cfgProxy.getHttpConduit().getAuthorization().setUserName("restuser"); - } else { - JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); - factory.setServiceClass(LocationService.class); - factory.setAddress(applicationURI + "/cxf/soap/"); - factory.setUsername("restuser"); - factory.setPassword("restuser"); - locationService = (LocationService) factory.create(); - } - - - - } - - @Override - public LocationData createLocation(LocationData locationData) - throws DuplicateLocationException { - return locationService.createLocation(locationData); - } - - @Override - public LocationData updateorCreateLocation(LocationData locationData) { - return locationService.updateorCreateLocation(locationData); - } - - @Override - public LocationData readLocation(String location) throws LocationNotFoundException { - return locationService.readLocation(location); - } - - @Override - public Collection readAllLocations() { - return locationService.readAllLocations(); - } - - @Override - public void deleteLocation(String location) - throws LocationNotFoundException { - - locationService.deleteLocation(location); - - } - - @Override - public void deleteAllLocation() { - locationService.deleteAllLocation(); - } - -} \ No newline at end of file diff --git a/src/main/java/org/exampledriven/cxfexample/webservice/LocationService.java b/src/main/java/org/exampledriven/cxfexample/webservice/LocationService.java deleted file mode 100644 index 5c4529c7..00000000 --- a/src/main/java/org/exampledriven/cxfexample/webservice/LocationService.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.exampledriven.cxfexample.webservice; - -import java.util.Collection; - -import javax.jws.WebMethod; -import javax.jws.WebService; -import javax.validation.Valid; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import org.apache.cxf.jaxrs.model.wadl.Description; -import org.apache.cxf.jaxrs.model.wadl.Descriptions; -import org.apache.cxf.jaxrs.model.wadl.DocTarget; -import org.exampledriven.cxfexample.data.LocationData; -import org.exampledriven.cxfexample.exception.DuplicateLocationException; -import org.exampledriven.cxfexample.exception.LocationNotFoundException; - -@Path("/location/") -@WebService -public interface LocationService { - - @WebMethod - @GET - @Path("{location}") - @Descriptions({ - @Description(value = "returns a location data ", target = DocTarget.METHOD), - @Description(value = "the location data", target = DocTarget.RETURN) - }) - public LocationData readLocation(@Description(value = "the string representation of the location") @PathParam("location") @NotNull @Size(max=10, min=5) String location) throws LocationNotFoundException; - - @WebMethod - @GET - @Path("*") - @Descriptions({ - @Description(value = "returns all locations", target = DocTarget.METHOD), - @Description(value = "the location data", target = DocTarget.RETURN) - }) - public Collection readAllLocations(); - - @WebMethod - @POST - @Descriptions({ - @Description(value = "stores a new location data", target = DocTarget.METHOD), - @Description(value = "the newly created location data", target = DocTarget.RETURN) - }) - public LocationData createLocation(@Valid LocationData locationData) throws DuplicateLocationException; - - @WebMethod - @PUT - @Descriptions({ - @Description(value = "updates or creates a new location data", target = DocTarget.METHOD), - @Description(value = "the newly created location data", target = DocTarget.RETURN) - }) - public LocationData updateorCreateLocation(@Valid LocationData locationData); - - @WebMethod - @DELETE - @Path("{location}") - @Descriptions({ - @Description(value = "deletes a location data", target = DocTarget.METHOD), - @Description(value = "the location data", target = DocTarget.RETURN) - }) - public void deleteLocation(@Description(value = "the string representation of the location") @PathParam("location") @NotNull @Size(max=10, min=5) String location) throws LocationNotFoundException; - - @WebMethod - @DELETE - @Path("*") - @Descriptions({ - @Description(value = "deletes All location data", target = DocTarget.METHOD) - }) - public void deleteAllLocation(); - -} diff --git a/src/main/java/org/exampledriven/cxfexample/webservice/LocationServiceEndpoint.java b/src/main/java/org/exampledriven/cxfexample/webservice/LocationServiceEndpoint.java deleted file mode 100644 index aee0be9b..00000000 --- a/src/main/java/org/exampledriven/cxfexample/webservice/LocationServiceEndpoint.java +++ /dev/null @@ -1,119 +0,0 @@ -package org.exampledriven.cxfexample.webservice; - -import org.exampledriven.cxfexample.data.LocationData; -import org.exampledriven.cxfexample.exception.DuplicateLocationException; -import org.exampledriven.cxfexample.exception.LocationNotFoundException; -import org.exampledriven.cxfexample.exception.ValidationException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.validation.BeanPropertyBindingResult; -import org.springframework.validation.FieldError; -import org.springframework.validation.Validator; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -@Service("locationService") -public class LocationServiceEndpoint implements LocationService { - - private Logger logger = LoggerFactory.getLogger(this.getClass()); - - private Map locations = new HashMap(); - - @Autowired - private Validator validator; - - //security handled by URL mapping in the xml - //@Secured("ROLE_RESTCLIENT") - @Override - public LocationData readLocation(String location) throws LocationNotFoundException { - - LocationData locationData = locations.get(location); - - if (locationData == null) { - throw new LocationNotFoundException(); - } - - return locationData; - - } - - @Override - public LocationData createLocation(LocationData locationData) throws DuplicateLocationException { - - if (locations.get(locationData.getLocation()) != null) { - throw new DuplicateLocationException(); - } - - BeanPropertyBindingResult br = new BeanPropertyBindingResult(locationData, "locationData"); - validator.validate(locationData, br); - if (br.hasErrors()) { - Map errors = new HashMap(); - for (FieldError e : br.getFieldErrors()) { - logger.debug(e.getDefaultMessage()); - errors.put(e.getField(), e.getDefaultMessage()); - } - - throw new ValidationException(errors); - } - - setNewID(locationData); - storeLocation(locationData); - - return locationData; - } - - @Override - public LocationData updateorCreateLocation(LocationData locationData) { - - if (locations.get(locationData.getLocation()) == null) { - setNewID(locationData); - } - - storeLocation(locationData); - - return locationData; - - } - - private void setNewID(LocationData locationData) { - //setting the ID - String id = UUID.randomUUID().toString(); - locationData.setId(id); - - } - - private void storeLocation(LocationData locationData) { - - locations.put(locationData.getLocation(), locationData); - - } - - @Override - public Collection readAllLocations() { - return locations.values(); - } - - @Override - public void deleteLocation(String location) throws LocationNotFoundException { - LocationData locationData = locations.get(location); - - if (locationData == null) { - throw new LocationNotFoundException(); - } - - locations.remove(location); - - } - - @Override - public void deleteAllLocation() { - - locations.clear(); - - } - -} \ No newline at end of file diff --git a/src/main/resources/cxf/cxf-handler-chain.xml b/src/main/resources/cxf/cxf-handler-chain.xml deleted file mode 100644 index d2e88bfa..00000000 --- a/src/main/resources/cxf/cxf-handler-chain.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - cn.com.ttblog.ssmbootstrap_table.webservice.LicenseHandler - - - - \ No newline at end of file diff --git a/src/main/resources/cxf/cxf.xml b/src/main/resources/cxf/cxf.xml deleted file mode 100644 index 782c968c..00000000 --- a/src/main/resources/cxf/cxf.xml +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/resources/spring/spring-context.xml b/src/main/resources/spring/spring-context.xml index d50e86f3..1c0207d3 100644 --- a/src/main/resources/spring/spring-context.xml +++ b/src/main/resources/spring/spring-context.xml @@ -54,7 +54,6 @@ - diff --git a/src/main/resources/spring/spring-mvc.xml b/src/main/resources/spring/spring-mvc.xml index 894e6726..797088be 100644 --- a/src/main/resources/spring/spring-mvc.xml +++ b/src/main/resources/spring/spring-mvc.xml @@ -13,7 +13,7 @@ http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> - + @@ -36,9 +36,9 @@ - + + @@ -50,8 +50,11 @@ - - + + + + From dd154b8907e4887ff30abb1d421870f0bb48bc96 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Sun, 3 Sep 2017 20:11:31 +0800 Subject: [PATCH 268/290] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d4d4cd85..8465e1b6 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,7 @@ metrics | @Timed --- > > * develop开发分支 +> * cxf test `apache cxf` > * JdbcTemplate(test spring `jdbctemplate`/test `shiro`) > * springtask(test spring `task`/`quartz`) > * velocity(test `velocity` template) From 04b7c0de5d508d6ecbe5558136299510076dff43 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 26 Oct 2017 16:22:26 +0800 Subject: [PATCH 269/290] rename package --- .../{Constant => constant}/ConfigConstant.java | 2 +- .../cn/com/ttblog/ssmbootstrap_table/filter/LoginFilter.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/main/java/cn/com/ttblog/ssmbootstrap_table/{Constant => constant}/ConfigConstant.java (83%) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/Constant/ConfigConstant.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/constant/ConfigConstant.java similarity index 83% rename from src/main/java/cn/com/ttblog/ssmbootstrap_table/Constant/ConfigConstant.java rename to src/main/java/cn/com/ttblog/ssmbootstrap_table/constant/ConfigConstant.java index be3eacc2..733be5a5 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/Constant/ConfigConstant.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/constant/ConfigConstant.java @@ -1,4 +1,4 @@ -package cn.com.ttblog.ssmbootstrap_table.Constant; +package cn.com.ttblog.ssmbootstrap_table.constant; public class ConfigConstant { /** diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/LoginFilter.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/LoginFilter.java index 15f43217..1365d75d 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/LoginFilter.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/LoginFilter.java @@ -16,7 +16,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import com.github.jscookie.javacookie.Cookies; -import cn.com.ttblog.ssmbootstrap_table.Constant.ConfigConstant; +import cn.com.ttblog.ssmbootstrap_table.constant.ConfigConstant; import cn.com.ttblog.ssmbootstrap_table.service.IUserService; import cn.com.ttblog.ssmbootstrap_table.util.AntPathMatcherUtil; From 3fccb2c5a4249d0137ccfe404bf770c752400338 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 26 Oct 2017 19:02:47 +0800 Subject: [PATCH 270/290] update LoginFilter --- .../filter/LoginFilter.java | 154 +++++++++--------- 1 file changed, 77 insertions(+), 77 deletions(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/LoginFilter.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/LoginFilter.java index 1365d75d..c40f0f40 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/LoginFilter.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/LoginFilter.java @@ -11,7 +11,10 @@ import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; + +import cn.com.ttblog.ssmbootstrap_table.model.User; 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; @@ -25,7 +28,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 { @@ -34,110 +37,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 40ad97baf2e773c15ba2e9c7123357e22636c439 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 26 Oct 2017 19:05:57 +0800 Subject: [PATCH 271/290] update get static var --- .../ttblog/ssmbootstrap_table/controller/TestController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java index c91ce378..eaf6040c 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/TestController.java @@ -90,7 +90,7 @@ public class TestController { //注入静态属性值 private static String JDBCURL; //注入方法 - @Value("#{configProperties['url']}") + @Value("#{configProperties['jdbc.url']}") public void setJdbcUrl(String url) { JDBCURL = url; } From 1dbbaa8835f5bd2f49f81f952e825ec01de09f22 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 26 Oct 2017 19:08:03 +0800 Subject: [PATCH 272/290] remove cxf.version --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9c6a9daa..6dbbccbc 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,6 @@ 3.3.0 1.7.7 1.1.3 - 2.5.2 1.10.19 5.5.9 1.9.2 From 44d1e33b174d98aa820078f20a679b9c5da62f54 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Thu, 26 Oct 2017 22:18:27 +0800 Subject: [PATCH 273/290] fix login twice --- .../ssmbootstrap_table/controller/IndexController.java | 5 ++++- .../cn/com/ttblog/ssmbootstrap_table/filter/LoginFilter.java | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java index fe99d8ff..a05b2c02 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/IndexController.java @@ -20,6 +20,7 @@ import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -85,7 +86,9 @@ public String login(HttpSession session, HttpServletRequest request, logger.debug("request.getContextPath():{} decode-requri:{} touri:{}",request.getContextPath(),uri,touri); // /ssmbootstrap_table // /ssmbootstrap_table/test/form?null - 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/ssmbootstrap_table/filter/LoginFilter.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/LoginFilter.java index c40f0f40..a7482d58 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/LoginFilter.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/filter/LoginFilter.java @@ -54,7 +54,7 @@ public void doFilter(ServletRequest servletRequest, noFilterTags[i]=noFilterTags[i].trim(); } String uri = httpServletRequest.getRequestURI(); - LOG.debug("放行路径:{}-{},访问路径:{}",Arrays.toString(noFilterTags),noFilterTags.length,uri); + LOG.debug("访问路径:{},放行路径:{}-{}",uri,noFilterTags.length,Arrays.toString(noFilterTags)); if(AntPathMatcherUtil.isMatch(noFilterTags,uri)){ filterChain.doFilter(httpServletRequest, httpServletResponse); LOG.debug("非拦截uri"); From 5ad643dce1b835df674017030325c90a4085d67d Mon Sep 17 00:00:00 2001 From: netbuffer Date: Wed, 22 Nov 2017 11:49:23 +0800 Subject: [PATCH 274/290] add project encoding --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 6dbbccbc..5ef054fd 100644 --- a/pom.xml +++ b/pom.xml @@ -36,6 +36,7 @@ 1.10.19 5.5.9 1.9.2 + UTF-8 From 09907aa5300aeaba5012793d142f9c1f0e13a228 Mon Sep 17 00:00:00 2001 From: netbuffer Date: Mon, 27 Nov 2017 10:43:30 +0800 Subject: [PATCH 275/290] fastjson write null --- src/main/resources/spring/spring-mvc.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/resources/spring/spring-mvc.xml b/src/main/resources/spring/spring-mvc.xml index 797088be..164a256b 100644 --- a/src/main/resources/spring/spring-mvc.xml +++ b/src/main/resources/spring/spring-mvc.xml @@ -29,6 +29,19 @@ + + + + BrowserCompatible + WriteMapNullValue + WriteNullListAsEmpty + WriteNullStringAsEmpty + WriteNullNumberAsZero + WriteNullBooleanAsFalse + WriteNonStringKeyAsString + WriteNonStringValueAsString + + From 4b6ac3e4f075808c8b849280c9d6b27072f7ff2c Mon Sep 17 00:00:00 2001 From: netbuffer Date: Mon, 27 Nov 2017 10:45:18 +0800 Subject: [PATCH 276/290] test DeferredResult --- .../controller/JsonpController.java | 63 ++++++++++--------- .../interceptor/DefferedAsyncInterceptor.java | 38 +++++++++++ src/main/resources/spring/spring-mvc.xml | 3 + 3 files changed, 74 insertions(+), 30 deletions(-) create mode 100644 src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/DefferedAsyncInterceptor.java diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/JsonpController.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/JsonpController.java index 0d5d485a..0ebb625e 100644 --- a/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/JsonpController.java +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/controller/JsonpController.java @@ -1,36 +1,27 @@ package cn.com.ttblog.ssmbootstrap_table.controller; -import java.io.IOException; -import java.util.Arrays; -import java.util.Map; -import java.util.concurrent.Callable; -import java.util.concurrent.TimeUnit; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; - -import org.apache.commons.io.IOUtils; +import cn.com.ttblog.ssmbootstrap_table.model.User; +import cn.com.ttblog.ssmbootstrap_table.service.IUserService; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.google.common.collect.Maps; import org.apache.commons.lang3.builder.ToStringBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -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.bind.annotation.SessionAttributes; +import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.async.DeferredResult; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; - -import cn.com.ttblog.ssmbootstrap_table.model.User; -import cn.com.ttblog.ssmbootstrap_table.service.IUserService; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.util.Arrays; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.TimeUnit; /** * jsonp测试 @@ -73,6 +64,7 @@ public void testModelAttr(HttpSession session, Model model) { * 通过一个TaskExecutor,Spring * MVC可以在另外的线程中调用Callable。当Callable返回时,请求再携带Callable返回的值 * ,再次被分配到Servlet容器中恢复处理流程 + * spring mvc中配置默认的超时时间 * @param str * @return */ @@ -91,19 +83,21 @@ public String call() throws Exception { @RequestMapping(value = "/asyncd", method = RequestMethod.GET) @ResponseBody - public DeferredResult asyncd(final String str) { - DeferredResult dr = new DeferredResult(); - dr.onCompletion(new Runnable() { + public DeferredResult asyncd(final String str,@RequestParam(value = "sleep",required = false,defaultValue = "3")final Integer sleep) { + final DeferredResult dr = new DeferredResult(); + new Thread(new Runnable() { @Override public void run() { + logger.info("asyncd task start"); try { - TimeUnit.SECONDS.sleep(3); + TimeUnit.SECONDS.sleep(sleep); } catch (InterruptedException e) { e.printStackTrace(); } - logger.debug("run with:{}",str); + logger.info("asyncd task end"); + dr.setResult("hello:"+str); } - }); + },"deffered-execute-thread").start(); return dr; } @@ -282,4 +276,13 @@ Map receivejsonobj(@RequestBody Map user,HttpServletRequest request) { logger.debug("name:{}", name); return session.getAttribute("name").toString(); } + + @ExceptionHandler + @ResponseBody + public Map handleAllException(Exception ex) { + Map result= Maps.newHashMap(); + result.put("success",false); + result.put("msg",ex.getMessage()); + return result; + } } \ No newline at end of file diff --git a/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/DefferedAsyncInterceptor.java b/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/DefferedAsyncInterceptor.java new file mode 100644 index 00000000..6dd7ee77 --- /dev/null +++ b/src/main/java/cn/com/ttblog/ssmbootstrap_table/interceptor/DefferedAsyncInterceptor.java @@ -0,0 +1,38 @@ +package cn.com.ttblog.ssmbootstrap_table.interceptor; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.context.request.async.DeferredResult; +import org.springframework.web.context.request.async.DeferredResultProcessingInterceptor; + +public class DefferedAsyncInterceptor implements DeferredResultProcessingInterceptor { + + private static final Logger LOGGER=LoggerFactory.getLogger(DefferedAsyncInterceptor.class); + + @Override + public void beforeConcurrentHandling(NativeWebRequest nativeWebRequest, DeferredResult deferredResult) throws Exception { + LOGGER.info("before deffered request :{},deferredResult:{}",nativeWebRequest,deferredResult); + } + + @Override + public void preProcess(NativeWebRequest nativeWebRequest, DeferredResult deferredResult) throws Exception { + LOGGER.info("preProcess deffered request :{},deferredResult:{}",nativeWebRequest,deferredResult); + } + + @Override + public void postProcess(NativeWebRequest nativeWebRequest, DeferredResult deferredResult, Object o) throws Exception { + LOGGER.info("postProcess deffered request :{},deferredResult:{}",nativeWebRequest,deferredResult); + } + + @Override + public boolean handleTimeout(NativeWebRequest nativeWebRequest, DeferredResult deferredResult) throws Exception { + LOGGER.info("handleTimeout deffered request :{},deferredResult:{}",nativeWebRequest,deferredResult); + return true; + } + + @Override + public void afterCompletion(NativeWebRequest nativeWebRequest, DeferredResult deferredResult) throws Exception { + LOGGER.info("after deffered request :{},deferredResult:{}",nativeWebRequest,deferredResult); + } +} \ No newline at end of file diff --git a/src/main/resources/spring/spring-mvc.xml b/src/main/resources/spring/spring-mvc.xml index 164a256b..9e10bde8 100644 --- a/src/main/resources/spring/spring-mvc.xml +++ b/src/main/resources/spring/spring-mvc.xml @@ -122,6 +122,9 @@ + + + From f2c6cc25f12589861481e9ab291f7c313fa57fab Mon Sep 17 00:00:00 2001 From: netbuffer Date: Wed, 29 Nov 2017 21:27:17 +0800 Subject: [PATCH 277/290] update --- src/main/webapp/js/tableExport.js | 354 +++++++++++++++++++ src/main/webapp/manage.html | 558 +++++++++++++++--------------- 2 files changed, 629 insertions(+), 283 deletions(-) create mode 100644 src/main/webapp/js/tableExport.js diff --git a/src/main/webapp/js/tableExport.js b/src/main/webapp/js/tableExport.js new file mode 100644 index 00000000..4f21433d --- /dev/null +++ b/src/main/webapp/js/tableExport.js @@ -0,0 +1,354 @@ +/*The MIT License (MIT) +Copyright (c) 2014 https://github.com/kayalshri/ +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE.*/ + +(function($){ + $.fn.extend({ + tableExport: function(options) { + var defaults = { + separator: ',', + ignoreColumn: [], + tableName:'yourTableName', + type:'csv', + pdfFontSize:14, + pdfLeftMargin:20, + escape:'true', + htmlContent:'false', + consoleLog:'false' + }; + + var options = $.extend(defaults, options); + var el = this; + + if(defaults.type == 'csv' || defaults.type == 'txt'){ + + // Header + var tdData =""; + $(el).find('thead').find('tr').each(function() { + tdData += "\n"; + $(this).filter(':visible').find('th').each(function(index,data) { + if ($(this).css('display') != 'none'){ + if(defaults.ignoreColumn.indexOf(index) == -1){ + tdData += '"' + parseString($(this)) + '"' + defaults.separator; + } + } + + }); + tdData = $.trim(tdData); + tdData = $.trim(tdData).substring(0, tdData.length -1); + }); + + // Row vs Column + $(el).find('tbody').find('tr').each(function() { + tdData += "\n"; + $(this).filter(':visible').find('td').each(function(index,data) { + if ($(this).css('display') != 'none'){ + if(defaults.ignoreColumn.indexOf(index) == -1){ + tdData += '"'+ parseString($(this)) + '"'+ defaults.separator; + } + } + }); + //tdData = $.trim(tdData); + tdData = $.trim(tdData).substring(0, tdData.length -1); + }); + + //output + if(defaults.consoleLog == 'true'){ + console.log(tdData); + } + var base64data = "base64," + $.base64.encode(tdData); + window.open('data:application/'+defaults.type+';filename=exportData;' + base64data); + }else if(defaults.type == 'sql'){ + + // Header + var tdData ="INSERT INTO `"+defaults.tableName+"` ("; + $(el).find('thead').find('tr').each(function() { + + $(this).filter(':visible').find('th').each(function(index,data) { + if ($(this).css('display') != 'none'){ + if(defaults.ignoreColumn.indexOf(index) == -1){ + tdData += '`' + parseString($(this)) + '`,' ; + } + } + + }); + tdData = $.trim(tdData); + tdData = $.trim(tdData).substring(0, tdData.length -1); + }); + tdData += ") VALUES "; + // Row vs Column + $(el).find('tbody').find('tr').each(function() { + tdData += "("; + $(this).filter(':visible').find('td').each(function(index,data) { + if ($(this).css('display') != 'none'){ + if(defaults.ignoreColumn.indexOf(index) == -1){ + tdData += '"'+ parseString($(this)) + '",'; + } + } + }); + + tdData = $.trim(tdData).substring(0, tdData.length -1); + tdData += "),"; + }); + tdData = $.trim(tdData).substring(0, tdData.length -1); + tdData += ";"; + + //output + //console.log(tdData); + + if(defaults.consoleLog == 'true'){ + console.log(tdData); + } + + var base64data = "base64," + $.base64.encode(tdData); + window.open('data:application/sql;filename=exportData;' + base64data); + + + }else if(defaults.type == 'json'){ + + var jsonHeaderArray = []; + $(el).find('thead').find('tr').each(function() { + var tdData =""; + var jsonArrayTd = []; + + $(this).filter(':visible').find('th').each(function(index,data) { + if ($(this).css('display') != 'none'){ + if(defaults.ignoreColumn.indexOf(index) == -1){ + jsonArrayTd.push(parseString($(this))); + } + } + }); + jsonHeaderArray.push(jsonArrayTd); + + }); + + var jsonArray = []; + $(el).find('tbody').find('tr').each(function() { + var tdData =""; + var jsonArrayTd = []; + + $(this).filter(':visible').find('td').each(function(index,data) { + if ($(this).css('display') != 'none'){ + if(defaults.ignoreColumn.indexOf(index) == -1){ + jsonArrayTd.push(parseString($(this))); + } + } + }); + jsonArray.push(jsonArrayTd); + + }); + + var jsonExportArray =[]; + jsonExportArray.push({header:jsonHeaderArray,data:jsonArray}); + + //Return as JSON + //console.log(JSON.stringify(jsonExportArray)); + + //Return as Array + //console.log(jsonExportArray); + if(defaults.consoleLog == 'true'){ + console.log(JSON.stringify(jsonExportArray)); + } + var base64data = "base64," + $.base64.encode(JSON.stringify(jsonExportArray)); + window.open('data:application/json;filename=exportData;' + base64data); + }else if(defaults.type == 'xml'){ + + var xml = ''; + xml += ''; + + // Header + $(el).find('thead').find('tr').each(function() { + $(this).filter(':visible').find('th').each(function(index,data) { + if ($(this).css('display') != 'none'){ + if(defaults.ignoreColumn.indexOf(index) == -1){ + xml += "" + parseString($(this)) + ""; + } + } + }); + }); + xml += ''; + + // Row Vs Column + var rowCount=1; + $(el).find('tbody').find('tr').each(function() { + xml += ''; + var colCount=0; + $(this).filter(':visible').find('td').each(function(index,data) { + if ($(this).css('display') != 'none'){ + if(defaults.ignoreColumn.indexOf(index) == -1){ + xml += ""+parseString($(this))+""; + } + } + colCount++; + }); + rowCount++; + xml += ''; + }); + xml += '' + + if(defaults.consoleLog == 'true'){ + console.log(xml); + } + + var base64data = "base64," + $.base64.encode(xml); + window.open('data:application/xml;filename=exportData;' + base64data); + + }else if(defaults.type == 'excel' || defaults.type == 'doc'|| defaults.type == 'powerpoint' ){ + //console.log($(this).html()); + var excel=""; + // Header + $(el).find('thead').find('tr').each(function() { + excel += ""; + $(this).filter(':visible').find('th').each(function(index,data) { + if ($(this).css('display') != 'none'){ + if(defaults.ignoreColumn.indexOf(index) == -1){ + excel += ""; + } + } + }); + excel += ''; + + }); + + + // Row Vs Column + var rowCount=1; + $(el).find('tbody').find('tr').each(function() { + excel += ""; + var colCount=0; + $(this).filter(':visible').find('td').each(function(index,data) { + if ($(this).css('display') != 'none'){ + if(defaults.ignoreColumn.indexOf(index) == -1){ + excel += ""; + } + } + colCount++; + }); + rowCount++; + excel += ''; + }); + excel += '
    " + parseString($(this))+ "
    "+parseString($(this))+"
    ' + + if(defaults.consoleLog == 'true'){ + console.log(excel); + } + + var excelFile = ""; + excelFile += ""; + excelFile += ""; + excelFile += ""; + excelFile += ""; + excelFile += excel; + excelFile += ""; + excelFile += ""; + + var base64data = "base64," + $.base64.encode(excelFile); + window.open('data:application/vnd.ms-'+defaults.type+';filename=exportData.doc;' + base64data); + + }else if(defaults.type == 'png'){ + html2canvas($(el), { + onrendered: function(canvas) { + var img = canvas.toDataURL("image/png"); + window.open(img); + + + } + }); + }else if(defaults.type == 'pdf'){ + + var doc = new jsPDF('p','pt', 'a4', true); + doc.setFontSize(defaults.pdfFontSize); + + // Header + var startColPosition=defaults.pdfLeftMargin; + $(el).find('thead').find('tr').each(function() { + $(this).filter(':visible').find('th').each(function(index,data) { + if ($(this).css('display') != 'none'){ + if(defaults.ignoreColumn.indexOf(index) == -1){ + var colPosition = startColPosition+ (index * 50); + doc.text(colPosition,20, parseString($(this))); + } + } + }); + }); + + + // Row Vs Column + var startRowPosition = 20; var page =1;var rowPosition=0; + $(el).find('tbody').find('tr').each(function(index,data) { + rowCalc = index+1; + + if (rowCalc % 26 == 0){ + doc.addPage(); + page++; + startRowPosition=startRowPosition+10; + } + rowPosition=(startRowPosition + (rowCalc * 10)) - ((page -1) * 280); + + $(this).filter(':visible').find('td').each(function(index,data) { + if ($(this).css('display') != 'none'){ + if(defaults.ignoreColumn.indexOf(index) == -1){ + var colPosition = startColPosition+ (index * 50); + doc.text(colPosition,rowPosition, parseString($(this))); + } + } + + }); + + }); + + // Output as Data URI + doc.output('datauri'); + + } + + + function parseString(data){ + + if(defaults.htmlContent == 'true'){ + content_data = data.html().trim(); + }else{ + content_data = data.text().trim(); + } + + if(defaults.escape == 'true'){ + content_data = escape(content_data); + } + + + + return content_data; + } + + } + }); +})(jQuery); \ No newline at end of file diff --git a/src/main/webapp/manage.html b/src/main/webapp/manage.html index 557e44e3..b315fe3a 100644 --- a/src/main/webapp/manage.html +++ b/src/main/webapp/manage.html @@ -5,289 +5,8 @@ 信息管理页 - - - - - - - - - - - - - - + +